ActivityTest.java revision c7b832202a8f1f91e378e255e61c4aa703f53394
1c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski/*
2c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * Copyright (C) 2016 The Android Open Source Project
3c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski *
4c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * Licensed under the Apache License, Version 2.0 (the "License");
5c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * you may not use this file except in compliance with the License.
6c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * You may obtain a copy of the License at
7c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski *
8c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski *      http://www.apache.org/licenses/LICENSE-2.0
9c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski *
10c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * Unless required by applicable law or agreed to in writing, software
11c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * distributed under the License is distributed on an "AS IS" BASIS,
12c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * See the License for the specific language governing permissions and
14c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * limitations under the License.
15c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski */
16c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
17c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskipackage com.android.documentsui;
18c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
19c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport static com.android.documentsui.StubProvider.DEFAULT_AUTHORITY;
20c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport static com.android.documentsui.StubProvider.ROOT_0_ID;
21c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport static com.android.documentsui.StubProvider.ROOT_1_ID;
22c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
23c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.app.Activity;
24c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.app.Instrumentation;
25c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.content.ContentProviderClient;
26c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.content.ContentResolver;
27c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.content.Context;
28c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.content.Intent;
29c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.os.RemoteException;
30c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.provider.DocumentsContract.Document;
31c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.support.test.uiautomator.By;
32c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.support.test.uiautomator.Configurator;
33c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.support.test.uiautomator.UiDevice;
34c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.support.test.uiautomator.UiObjectNotFoundException;
35c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.support.test.uiautomator.Until;
36c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.test.ActivityInstrumentationTestCase2;
37c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport android.view.MotionEvent;
38c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
39c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskiimport com.android.documentsui.model.RootInfo;
40c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
41c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski/**
42c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * Provides basic test environment for UI tests:
43c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * - Launches activity
44c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * - Creates and gives access to test root directories and test files
45c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski * - Cleans up the test environment
46c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski */
47c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewskipublic abstract class ActivityTest<T extends Activity> extends ActivityInstrumentationTestCase2<T> {
48c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
49c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    static final int TIMEOUT = 5000;
50c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
51c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    // Testing files. For custom ones, override initTestFiles().
52c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public static final String dirName1 = "Dir1";
53c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public static final String fileName1 = "file1.log";
54c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public static final String fileName2 = "file12.png";
55c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public static final String fileName3 = "anotherFile0.log";
56c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public static final String fileName4 = "poodles.text";
57c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public static final String fileNameNoRename = "NO_RENAMEfile.txt";
58c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
59c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public UiBot bot;
60c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public UiDevice device;
61c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public Context context;
62c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
63c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public RootInfo rootDir0;
64c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public RootInfo rootDir1;
65c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
66c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    ContentResolver mResolver;
67c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    DocumentsProviderHelper mDocsHelper;
68c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    ContentProviderClient mClient;
69c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
70c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public ActivityTest(Class<T> activityClass) {
71c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        super(activityClass);
72c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    }
73c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
74c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    @Override
75c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public void setUp() throws Exception {
76c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        device = UiDevice.getInstance(getInstrumentation());
77c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        // NOTE: Must be the "target" context, else security checks in content provider will fail.
78c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        context = getInstrumentation().getTargetContext();
79c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        bot = new UiBot(device, context, TIMEOUT);
80c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
81c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE);
82c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        bot.revealLauncher();
83c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
84c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        mResolver = context.getContentResolver();
85c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY);
86c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient);
87c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
88c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        rootDir0 = mDocsHelper.getRoot(ROOT_0_ID);
89c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        rootDir1 = mDocsHelper.getRoot(ROOT_1_ID);
90c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
91c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        launchActivity();
92c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
93c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        bot.revealApp();
94c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        resetStorage();
95c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    }
96c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
97c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    @Override
98c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    public void tearDown() throws Exception {
99c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        mClient.release();
100c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        super.tearDown();
101c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    }
102c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
103c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    void launchActivity() {
104c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        final Intent intent = context.getPackageManager().getLaunchIntentForPackage(
105c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski                UiBot.TARGET_PKG);
106c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
107c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        setActivityIntent(intent);
108c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        getActivity();  // Launch the activity.
109c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    }
110c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
111c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    void resetStorage() throws RemoteException {
112c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        mClient.call("clear", null, null);
113c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        device.waitForIdle();
114c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    }
115c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
116c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    void initTestFiles() throws RemoteException {
117c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        mDocsHelper.createFolder(rootDir0, dirName1);
118c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        mDocsHelper.createDocument(rootDir0, "text/plain", fileName1);
119c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        mDocsHelper.createDocument(rootDir0, "image/png", fileName2);
120c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        mDocsHelper.createDocumentWithFlags(rootDir0.documentId, "text/plain", fileNameNoRename,
121c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski                Document.FLAG_SUPPORTS_WRITE);
122c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
123c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        mDocsHelper.createDocument(rootDir1, "text/plain", fileName3);
124c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        mDocsHelper.createDocument(rootDir1, "text/plain", fileName4);
125c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    }
126c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
127c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    void assertDefaultContentOfTestDir0() throws UiObjectNotFoundException {
128c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        bot.assertDocumentsCount(ROOT_0_ID, 4);
129c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        bot.assertHasDocuments(fileName1, fileName2, dirName1, fileNameNoRename);
130c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    }
131c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski
132c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    void assertDefaultContentOfTestDir1() throws UiObjectNotFoundException {
133c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        bot.assertDocumentsCount(ROOT_1_ID, 2);
134c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski        bot.assertHasDocuments(fileName3, fileName4);
135c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski    }
136c7b832202a8f1f91e378e255e61c4aa703f53394Tomasz Mikolajewski}
137