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