1 /*
2  * Copyright (C) 2019 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 
17 package com.android.documentsui.queries;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import android.content.Context;
22 
23 import androidx.test.InstrumentationRegistry;
24 import androidx.test.filters.MediumTest;
25 import androidx.test.runner.AndroidJUnit4;
26 
27 import org.junit.After;
28 import org.junit.Before;
29 import org.junit.Ignore;
30 import org.junit.Test;
31 import org.junit.runner.RunWith;
32 
33 import java.util.List;
34 import java.util.concurrent.CountDownLatch;
35 import java.util.concurrent.TimeUnit;
36 
37 @RunWith(AndroidJUnit4.class)
38 @MediumTest
39 public final class SearchHistoryManagerTest {
40 
41     private Context mContext;
42     private CountDownLatch mLatch ;
43     private SearchHistoryManager mManager;
44     private SearchHistoryManager.DatabaseChangedListener mListener;
45     private int mIntResult;
46     private long mLongResult;
47 
48     @Before
setUp()49     public void setUp() throws Exception {
50         mContext = InstrumentationRegistry.getTargetContext();
51         mManager = SearchHistoryManager.getInstance(mContext);
52         //clearData();
53         mIntResult = -1;
54         mLongResult = -1;
55     }
56 
57     @After
tearDown()58     public void tearDown() {
59         mListener = null;
60         //clearData();
61     }
62 
clearData()63     private void clearData() {
64         final List<String> list = mManager.getHistoryList(null);
65         for (int i = 0; i < list.size(); i++) {
66             mManager.deleteHistory(list.get(i));
67         }
68     }
69 
70     @Test
71     @Ignore
testAddHistory()72     public void testAddHistory() throws Exception {
73         mLatch = new CountDownLatch(2);
74         mListener = new SearchHistoryManager.DatabaseChangedListener() {
75             @Override
76             public void onAddChangedListener(long longResult) {
77                 mLongResult = longResult;
78                 mLatch.countDown();
79             }
80             @Override
81             public void onDeleteChangedListener(int intResult) { }
82             @Override
83             public void onPostExecute() { }
84 
85             };
86         mManager.setDatabaseListener(mListener);
87         mManager.addHistory("testKeyword");
88         mLatch.await(1, TimeUnit.SECONDS);
89 
90         assertThat(mLongResult).isGreaterThan(0L);
91     }
92 
93     @Test
94     @Ignore
testDeleteHistory()95     public void testDeleteHistory() throws Exception {
96         mLatch = new CountDownLatch(2);
97         mListener = new SearchHistoryManager.DatabaseChangedListener() {
98             @Override
99             public void onAddChangedListener(long longResult) {
100                 mLongResult = longResult;
101                 mLatch.countDown();
102             }
103             @Override
104             public void onPostExecute() { }
105 
106             @Override public void onDeleteChangedListener(int intResult) {
107                 mIntResult = intResult;
108                 mLatch.countDown();
109             }
110         };
111         mManager.setDatabaseListener(mListener);
112 
113         mManager.addHistory("testDeleteKeyword");
114         mLatch.await(1, TimeUnit.SECONDS);
115         assertThat(mLongResult).isGreaterThan(0L);
116 
117         // TODO: Solving this tricky usage of new CountDownLatch(2) count with bg/127610355
118         // Using this tricky way is for making sure the result synchronization of public APIs
119         // getHistoryList()/addHistory()/deleteHistory() with database processing.
120         // From design contract and non-blocking UI design, not necessarily doing synchronization
121         // from code level, therefore doing this tricky usage of new CountDownLatch in test case for
122         // guarantee the synchronization.
123         mLatch = new CountDownLatch(2);
124         mManager.deleteHistory("testDeleteKeyword");
125         mLatch.await(1, TimeUnit.SECONDS);
126         assertThat(mIntResult).isGreaterThan(0);
127     }
128 
129     @Test
130     @Ignore
testGetHistoryList()131     public void testGetHistoryList() throws Exception {
132         mLatch = new CountDownLatch(2);
133         mListener = new SearchHistoryManager.DatabaseChangedListener() {
134             @Override
135             public void onAddChangedListener(long longResult) { }
136             @Override
137             public void onDeleteChangedListener(int intResult) { }
138             @Override
139             public void onPostExecute() {
140                 mLatch.countDown();
141             }
142         };
143         mManager.setDatabaseListener(mListener);
144 
145         mManager.addHistory("abcdefghijk");
146         mLatch.await(1, TimeUnit.SECONDS);
147 
148         mLatch = new CountDownLatch(2);
149         mManager.addHistory("lmnop");
150         mLatch.await(1, TimeUnit.SECONDS);
151 
152         mLatch = new CountDownLatch(2);
153         mManager.addHistory("qrstuv");
154         mLatch.await(1, TimeUnit.SECONDS);
155 
156         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
157         assertThat(mManager.getHistoryList(null).size()).isEqualTo(3);
158 
159         // Test the last adding history should be the first item in the list.
160         assertThat(mManager.getHistoryList(null).get(0)).contains("qrstuv");
161 
162         assertThat(mManager.getHistoryList(null).get(2)).contains("abcdefghijk");
163     }
164 }
165