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