SearchViewUiTest.java revision d0086a4960bf36e60ccb73526b8a52a50c445223
1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.documentsui; 18 19import static com.android.documentsui.StubProvider.DEFAULT_AUTHORITY; 20import static com.android.documentsui.StubProvider.ROOT_0_ID; 21import static com.android.documentsui.StubProvider.ROOT_1_ID; 22 23import android.app.Instrumentation; 24import android.content.ContentProviderClient; 25import android.content.ContentResolver; 26import android.content.Context; 27import android.content.Intent; 28import android.os.RemoteException; 29import android.support.test.uiautomator.By; 30import android.support.test.uiautomator.Configurator; 31import android.support.test.uiautomator.UiDevice; 32import android.support.test.uiautomator.UiObject; 33import android.support.test.uiautomator.UiObjectNotFoundException; 34import android.support.test.uiautomator.Until; 35import android.test.InstrumentationTestCase; 36import android.test.suitebuilder.annotation.LargeTest; 37import android.util.Log; 38import android.view.MotionEvent; 39 40import com.android.documentsui.model.RootInfo; 41 42@LargeTest 43public class SearchViewUiTest extends InstrumentationTestCase { 44 45 private static final int TIMEOUT = 5000; 46 private static final String TAG = "SearchViewUiTest"; 47 private static final String TARGET_PKG = "com.android.documentsui"; 48 private static final String LAUNCHER_PKG = "com.android.launcher"; 49 50 private UiBot mBot; 51 private UiDevice mDevice; 52 private Context mContext; 53 private ContentResolver mResolver; 54 private DocumentsProviderHelper mDocsHelper; 55 private ContentProviderClient mClient; 56 private RootInfo mRoot_0; 57 private RootInfo mRoot_1; 58 59 private UiObject mSearchView; 60 private UiObject mSearchTextField; 61 private UiObject mDocsList; 62 private UiObject mMessageTextView; 63 private UiObject mSearchIcon; 64 65 public void setUp() throws Exception { 66 // Initialize UiDevice instance. 67 Instrumentation instrumentation = getInstrumentation(); 68 69 mDevice = UiDevice.getInstance(instrumentation); 70 71 Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); 72 73 // Start from the home screen. 74 mDevice.pressHome(); 75 mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), TIMEOUT); 76 77 // NOTE: Must be the "target" context, else security checks in content provider will fail. 78 mContext = instrumentation.getTargetContext(); 79 mResolver = mContext.getContentResolver(); 80 81 mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY); 82 mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient); 83 84 // Launch app. 85 Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(TARGET_PKG); 86 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 87 mContext.startActivity(intent); 88 // Wait for the app to appear. 89 mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), TIMEOUT); 90 mDevice.waitForIdle(); 91 92 mBot = new UiBot(mDevice, TIMEOUT); 93 94 resetStorage(); // Just incase a test failed and tearDown didn't happen. 95 96 initUiObjects(); 97 } 98 99 @Override 100 protected void tearDown() throws Exception { 101 super.tearDown(); 102 mDevice.pressBack(); 103 resetStorage(); 104 mClient.release(); 105 } 106 107 private void resetStorage() throws RemoteException { 108 mClient.call("clear", null, null); 109 // TODO: Would be nice to have an event to wait on here. 110 mDevice.waitForIdle(); 111 } 112 113 private void initTestFiles() throws RemoteException { 114 mRoot_0 = mDocsHelper.getRoot(ROOT_0_ID); 115 mRoot_1 = mDocsHelper.getRoot(ROOT_1_ID); 116 117 mDocsHelper.createDocument(mRoot_0, "text/plain", "file10.log"); 118 mDocsHelper.createDocument(mRoot_0, "image/png", "file1.png"); 119 mDocsHelper.createDocument(mRoot_0, "text/csv", "file2.csv"); 120 121 mDocsHelper.createDocument(mRoot_1, "text/plain", "anotherFile0.log"); 122 mDocsHelper.createDocument(mRoot_1, "text/plain", "poodles.text"); 123 } 124 125 private void initUiObjects() { 126 mSearchView = mBot.findSearchView(); 127 mSearchTextField = mBot.findSearchViewTextField(); 128 mDocsList = mBot.findDocumentsList(); 129 mMessageTextView = mBot.findMessageTextView(); 130 mSearchIcon = mBot.findSearchViewIcon(); 131 } 132 133 public void testSearchViewExpandsOnClick() throws Exception { 134 assertTrue(mSearchIcon.exists()); 135 assertFalse(mSearchTextField.exists()); 136 137 mSearchView.click(); 138 139 assertTrue(mSearchTextField.exists()); 140 assertTrue(mSearchTextField.isFocused()); 141 assertFalse(mSearchIcon.exists()); 142 } 143 144 public void testSearchViewCollapsesOnBack() throws Exception { 145 assertTrue(mSearchIcon.exists()); 146 assertFalse(mSearchTextField.exists()); 147 148 mSearchView.click(); 149 150 mDevice.pressBack(); 151 152 assertTrue(mSearchIcon.exists()); 153 assertFalse(mSearchTextField.exists()); 154 } 155 156 public void testSearchViewClearsTextOnBack() throws Exception { 157 assertTrue(mSearchIcon.exists()); 158 assertFalse(mSearchTextField.exists()); 159 160 String query = "file2"; 161 mSearchView.click(); 162 mSearchTextField.setText(query); 163 164 assertSearchTextField(true, query); 165 166 mDevice.pressBack(); 167 168 assertTrue(mSearchIcon.exists()); 169 assertFalse(mSearchTextField.exists()); 170 } 171 172 public void testSearchFound() throws Exception { 173 initTestFiles(); 174 175 mBot.openRoot(ROOT_0_ID); 176 177 assertDefaultTestDir0(); 178 179 String query = "file1"; 180 mSearchView.click(); 181 mSearchTextField.setText(query); 182 183 assertTrue(mDocsList.exists()); 184 assertSearchTextField(true, query); 185 186 mDevice.pressEnter(); 187 188 assertTrue(mDocsList.exists()); 189 assertEquals(2, mDocsList.getChildCount()); 190 mBot.assertHasDocuments("file1.png", "file10.log"); 191 assertSearchTextField(false, query); 192 } 193 194 public void testSearchFoundClearsOnBack() throws Exception { 195 initTestFiles(); 196 197 mBot.openRoot(ROOT_0_ID); 198 199 assertDefaultTestDir0(); 200 201 String query = "file1"; 202 mSearchView.click(); 203 mSearchTextField.setText(query); 204 205 mDevice.pressEnter(); 206 mDevice.pressBack(); 207 208 assertDefaultTestDir0(); 209 } 210 211 public void testSearchNoResults() throws Exception { 212 initTestFiles(); 213 214 mBot.openRoot(ROOT_0_ID); 215 216 assertDefaultTestDir0(); 217 218 String query = "chocolate"; 219 mSearchView.click(); 220 mSearchTextField.setText(query); 221 222 mDevice.pressEnter(); 223 224 assertFalse(mDocsList.exists()); 225 assertTrue(mMessageTextView.exists()); 226 String msg = String.valueOf(mContext.getString(R.string.no_results)); 227 assertEquals(String.format(msg, "TEST_ROOT_0"), mMessageTextView.getText()); 228 assertSearchTextField(false, query); 229 } 230 231 public void testSearchNoResultsClearsOnBack() throws Exception { 232 initTestFiles(); 233 234 mBot.openRoot(ROOT_0_ID); 235 236 assertDefaultTestDir0(); 237 238 String query = "chocolate"; 239 mSearchView.click(); 240 mSearchTextField.setText(query); 241 242 mDevice.pressEnter(); 243 mDevice.pressBack(); 244 245 assertDefaultTestDir0(); 246 } 247 248 public void testSearchFoundClearsDirectoryChange() throws Exception { 249 initTestFiles(); 250 251 mBot.openRoot(ROOT_0_ID); 252 253 assertDefaultTestDir0(); 254 255 String query = "file1"; 256 mSearchView.click(); 257 mSearchTextField.setText(query); 258 259 mDevice.pressEnter(); 260 261 mBot.openRoot(ROOT_1_ID); 262 263 assertDefaultTestDir1(); 264 265 mBot.openRoot(ROOT_0_ID); 266 267 assertDefaultTestDir0(); 268 } 269 270 private void assertDefaultTestDir0() throws UiObjectNotFoundException { 271 assertTrue(mSearchIcon.exists()); 272 assertTrue(mDocsList.exists()); 273 assertFalse(mSearchTextField.exists()); 274 assertEquals(3, mDocsList.getChildCount()); 275 mBot.assertHasDocuments("file2.csv", "file1.png", "file10.log"); 276 } 277 278 private void assertDefaultTestDir1() throws UiObjectNotFoundException { 279 assertTrue(mSearchIcon.exists()); 280 assertFalse(mSearchTextField.exists()); 281 assertTrue(mDocsList.exists()); 282 assertEquals(2, mDocsList.getChildCount()); 283 mBot.assertHasDocuments("anotherFile0.log", "poodles.text"); 284 } 285 286 private void assertSearchTextField(boolean isFocused, String query) 287 throws UiObjectNotFoundException { 288 assertFalse(mSearchIcon.exists()); 289 assertTrue(mSearchTextField.exists()); 290 assertEquals(isFocused, mSearchTextField.isFocused()); 291 assertEquals(query, mSearchTextField.getText()); 292 } 293} 294