Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff23d0bc authored by Takamasa Kuramitsu's avatar Takamasa Kuramitsu
Browse files

Make CancelFromNotificationUiTest more stable

CancelFromNotificationUiTest sometimes fails due to UiAutomator
opens floating options menu before file selection finished and
shows options menu for no item selection.

This CL fix to ensure to open options menu after the select file
operation finished.

Also made refactoring on CancelFromNotificationUiTest and
FileDeleteUiTest to use NotificationsBot for maintainability.

Bug: 80216781
Change-Id: Id8900b0be3168cbbf5281560733707c5a08238d0
parent 6b69cbb2
Loading
Loading
Loading
Loading
+25 −69
Original line number Diff line number Diff line
@@ -20,29 +20,19 @@ import static com.android.documentsui.StubProvider.EXTRA_SIZE;
import static com.android.documentsui.StubProvider.ROOT_0_ID;
import static com.android.documentsui.StubProvider.ROOT_1_ID;

import static android.provider.DocumentsContract.buildDocumentUri;
import android.provider.DocumentsContract;
import com.android.documentsui.archives.ResourcesProvider;

import android.content.ComponentName;
import android.content.Context;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.BroadcastReceiver;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
import android.provider.Settings;
import android.support.test.filters.LargeTest;
import android.support.test.filters.Suppress;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.util.Log;

import com.android.documentsui.files.FilesActivity;
import com.android.documentsui.services.TestNotificationService;
import com.android.documentsui.R;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -54,6 +44,8 @@ import java.util.concurrent.TimeUnit;
*/
@LargeTest
public class CancelFromNotificationUiTest extends ActivityTest<FilesActivity> {
    private static final String TAG = "CancelFromNotificationUiTest";

    private static final String PACKAGE_NAME = "com.android.documentsui.tests";

    private static final String TARGET_FILE = "dummy.data";
@@ -62,14 +54,12 @@ public class CancelFromNotificationUiTest extends ActivityTest<FilesActivity> {

    private static final String ACCESS_APP_NAME = "DocumentsUI Tests";

    private static final String ALLOW = "ALLOW";

    private static final String TURN_OFF = "TURN OFF";

    private static final String COPY = "Copy to…";

    private static final String MOVE = "Move to…";

    private static final int WAIT_TIME_SECONDS = 60;

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
@@ -106,6 +96,15 @@ public class CancelFromNotificationUiTest extends ActivityTest<FilesActivity> {
        bundle.putLong(EXTRA_SIZE, 500L);
        mDocsHelper.configure(null, bundle);

        try {
            if (!bots.notifications.isNotificationAccessEnabled(
                    context.getContentResolver(), PACKAGE_NAME)) {
                bots.notifications.setNotificationAccess(getActivity(), ACCESS_APP_NAME, true);
            }
        } catch (Exception e) {
            Log.d(TAG, "Cannot set notification access. ", e);
        }

        initTestFiles();

        IntentFilter filter = new IntentFilter();
@@ -126,11 +125,12 @@ public class CancelFromNotificationUiTest extends ActivityTest<FilesActivity> {

        context.unregisterReceiver(mReceiver);
        try {
            if (isEnableAccessNotification()) {
                disallowNotificationAccess();
            if (bots.notifications.isNotificationAccessEnabled(
                    context.getContentResolver(), PACKAGE_NAME)) {
                bots.notifications.setNotificationAccess(getActivity(), ACCESS_APP_NAME, false);
            }
        } catch (Exception e) {
            // ignore
            Log.d(TAG, "Cannot set notification access. ", e);
        }
        super.tearDown();
    }
@@ -138,9 +138,6 @@ public class CancelFromNotificationUiTest extends ActivityTest<FilesActivity> {
    @Override
    public void initTestFiles() throws RemoteException {
        try {
            if (!isEnableAccessNotification()) {
               allowNotificationAccess();
            }
            createDummyFile();
        } catch (Exception e) {
            fail("Initialization failed. " + e.toString());
@@ -158,54 +155,13 @@ public class CancelFromNotificationUiTest extends ActivityTest<FilesActivity> {
        }
    }

    private void allowNotificationAccess() throws Exception {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
        getActivity().startActivity(intent);
        device.waitForIdle();

        bots.main.findMenuLabelWithName(ACCESS_APP_NAME).click();
        device.waitForIdle();

        bots.main.findMenuLabelWithName(ALLOW).click();
        bots.keyboard.pressKey(KeyEvent.KEYCODE_BACK);
    }

    private void disallowNotificationAccess() throws Exception {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
        getActivity().startActivity(intent);
        device.waitForIdle();

        bots.main.findMenuLabelWithName(ACCESS_APP_NAME).click();
        device.waitForIdle();

        bots.main.findMenuLabelWithName(TURN_OFF).click();
        bots.keyboard.pressKey(KeyEvent.KEYCODE_BACK);
    }

    private boolean isEnableAccessNotification() {
        ContentResolver resolver = getActivity().getContentResolver();
        String listeners = Settings.Secure.getString(resolver,"enabled_notification_listeners");

        if (!TextUtils.isEmpty(listeners)) {
            String[] list = listeners.split(":");
            for(String item : list) {
                if(item.startsWith(PACKAGE_NAME)) {
                    return true;
                }
            }
        }
        return false;
    }

    public void testCopyDocument_Cancel() throws Exception {
        bots.roots.openRoot(ROOT_0_ID);

        bots.directory.findDocument(TARGET_FILE);
        device.waitForIdle();

        bots.directory.selectDocument(TARGET_FILE);
        bots.directory.selectDocument(TARGET_FILE, 1);
        device.waitForIdle();

        bots.main.clickToolbarOverflowItem(COPY);
@@ -222,7 +178,7 @@ public class CancelFromNotificationUiTest extends ActivityTest<FilesActivity> {
        bots.directory.findDocument(TARGET_FILE);
        device.waitForIdle();

        bots.directory.selectDocument(TARGET_FILE);
        bots.directory.selectDocument(TARGET_FILE, 1);
        device.waitForIdle();

        bots.main.clickToolbarOverflowItem(COPY);
@@ -233,7 +189,7 @@ public class CancelFromNotificationUiTest extends ActivityTest<FilesActivity> {
        device.waitForIdle();

        try {
            mCountDownLatch.await(60, TimeUnit.SECONDS);
            mCountDownLatch.await(WAIT_TIME_SECONDS, TimeUnit.SECONDS);
        } catch (Exception e) {
            fail("Cannot wait because of error." + e.toString());
        }
@@ -255,7 +211,7 @@ public class CancelFromNotificationUiTest extends ActivityTest<FilesActivity> {
        bots.directory.findDocument(TARGET_FILE);
        device.waitForIdle();

        bots.directory.selectDocument(TARGET_FILE);
        bots.directory.selectDocument(TARGET_FILE, 1);
        device.waitForIdle();

        bots.main.clickToolbarOverflowItem(MOVE);
@@ -272,7 +228,7 @@ public class CancelFromNotificationUiTest extends ActivityTest<FilesActivity> {
        bots.directory.findDocument(TARGET_FILE);
        device.waitForIdle();

        bots.directory.selectDocument(TARGET_FILE);
        bots.directory.selectDocument(TARGET_FILE, 1);
        device.waitForIdle();

        bots.main.clickToolbarOverflowItem(MOVE);
@@ -283,7 +239,7 @@ public class CancelFromNotificationUiTest extends ActivityTest<FilesActivity> {
        device.waitForIdle();

        try {
            mCountDownLatch.await(60, TimeUnit.SECONDS);
            mCountDownLatch.await(WAIT_TIME_SECONDS, TimeUnit.SECONDS);
        } catch (Exception e) {
            fail("Cannot wait because of error." + e.toString());
        }
+20 −65
Original line number Diff line number Diff line
@@ -17,23 +17,17 @@
package com.android.documentsui;

import static com.android.documentsui.StubProvider.ROOT_0_ID;
import static com.android.documentsui.StubProvider.ROOT_1_ID;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.BroadcastReceiver;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
import android.provider.Settings;
import android.support.test.filters.LargeTest;
import android.support.test.filters.Suppress;
import android.support.test.uiautomator.Configurator;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.util.Log;

import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.files.FilesActivity;
@@ -41,7 +35,6 @@ import com.android.documentsui.services.TestNotificationService;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.List;
@@ -53,22 +46,18 @@ import java.util.ArrayList;
*/
@LargeTest
public class FileDeleteUiTest extends ActivityTest<FilesActivity> {
    private static final String TAG = "FileDeleteUiTest";

    private static final String PACKAGE_NAME = "com.android.documentsui.tests";

    private static final String ACCESS_APP_NAME = "DocumentsUI Tests";

    private static final String ALLOW = "ALLOW";

    private static final String TURN_OFF = "TURN OFF";

    private static final String COPY = "Copy to…";

    private static final String MOVE = "Move to…";

    private static final String SELECT_ALL = "Select all";

    private static final int DUMMY_FILE_COUNT = 1000;

    private static final int WAIT_TIME_SECONDS = 60;

    private final List<String> mCopyFileList = new ArrayList<String>();

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -106,6 +95,15 @@ public class FileDeleteUiTest extends ActivityTest<FilesActivity> {
        bundle.putBoolean(StubProvider.EXTRA_ENABLE_ROOT_NOTIFICATION, false);
        mDocsHelper.configure(null, bundle);

        try {
            if (!bots.notifications.isNotificationAccessEnabled(
                    context.getContentResolver(), PACKAGE_NAME)) {
                bots.notifications.setNotificationAccess(getActivity(), ACCESS_APP_NAME, true);
            }
        } catch (Exception e) {
            Log.d(TAG, "Cannot set notification access. ", e);
        }

        initTestFiles();

        IntentFilter filter = new IntentFilter();
@@ -126,11 +124,12 @@ public class FileDeleteUiTest extends ActivityTest<FilesActivity> {

        context.unregisterReceiver(mReceiver);
        try {
            if (isEnableAccessNotification()) {
                disallowNotificationAccess();
            if (bots.notifications.isNotificationAccessEnabled(
                    context.getContentResolver(), PACKAGE_NAME)) {
                bots.notifications.setNotificationAccess(getActivity(), ACCESS_APP_NAME, false);
            }
        } catch (Exception e) {
            // ignore
            Log.d(TAG, "Cannot set notification access. ", e);
        }
        super.tearDown();
    }
@@ -138,9 +137,6 @@ public class FileDeleteUiTest extends ActivityTest<FilesActivity> {
    @Override
    public void initTestFiles() throws RemoteException {
        try {
            if (!isEnableAccessNotification()) {
                allowNotificationAccess();
            }
            createDummyFiles();
        } catch (Exception e) {
            fail("Initialization failed");
@@ -172,47 +168,6 @@ public class FileDeleteUiTest extends ActivityTest<FilesActivity> {
        exec.shutdown();
    }

    private void allowNotificationAccess() throws Exception {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
        getActivity().startActivity(intent);
        device.waitForIdle();

        bots.main.findMenuLabelWithName(ACCESS_APP_NAME).click();
        device.waitForIdle();

        bots.main.findMenuLabelWithName(ALLOW).click();
        bots.keyboard.pressKey(KeyEvent.KEYCODE_BACK);
    }

    private void disallowNotificationAccess() throws Exception {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
        getActivity().startActivity(intent);
        device.waitForIdle();

        bots.main.findMenuLabelWithName(ACCESS_APP_NAME).click();
        device.waitForIdle();

        bots.main.findMenuLabelWithName(TURN_OFF).click();
        bots.keyboard.pressKey(KeyEvent.KEYCODE_BACK);
    }

    private boolean isEnableAccessNotification() {
        ContentResolver resolver = getActivity().getContentResolver();
        String listeners = Settings.Secure.getString(
                resolver,"enabled_notification_listeners");
        if (!TextUtils.isEmpty(listeners)) {
            String[] list = listeners.split(":");
            for(String item : list) {
                if(item.startsWith(PACKAGE_NAME)) {
                    return true;
                }
            }
        }
        return false;
    }

    public void testDeleteAllDocument() throws Exception {
        bots.roots.openRoot(ROOT_0_ID);
        bots.main.clickToolbarOverflowItem(SELECT_ALL);
@@ -223,7 +178,7 @@ public class FileDeleteUiTest extends ActivityTest<FilesActivity> {
        device.waitForIdle();

        try {
            mCountDownLatch.await(60, TimeUnit.SECONDS);
            mCountDownLatch.await(WAIT_TIME_SECONDS, TimeUnit.SECONDS);
        } catch (Exception e) {
            fail("Cannot wait because of error." + e.toString());
        }