• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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.settings.slices;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.Mockito.doReturn;
22 import static org.mockito.Mockito.spy;
23 
24 import android.content.ContentValues;
25 import android.content.Context;
26 import android.database.Cursor;
27 import android.database.sqlite.SQLiteDatabase;
28 import android.net.Uri;
29 
30 import com.android.settings.slices.SlicesDatabaseHelper.IndexColumns;
31 import com.android.settings.testutils.DatabaseTestUtils;
32 
33 import org.junit.After;
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.junit.runner.RunWith;
37 import org.robolectric.RobolectricTestRunner;
38 import org.robolectric.RuntimeEnvironment;
39 
40 import java.util.ArrayList;
41 import java.util.List;
42 
43 @RunWith(RobolectricTestRunner.class)
44 public class SlicesIndexerTest {
45 
46     private final String[] KEYS = new String[]{"key1", "key2", "key3"};
47     private final String[] TITLES = new String[]{"title1", "title2", "title3"};
48     private final String SUMMARY = "subtitle";
49     private final String SCREEN_TITLE = "screen title";
50     private final String KEYWORDS = "a, b, c";
51     private final String FRAGMENT_NAME = "fragment name";
52     private final int ICON = 1234; // I declare a thumb war
53     private final Uri URI = Uri.parse("content://com.android.settings.slices/test");
54     private final String PREF_CONTROLLER = "com.android.settings.slices.tester";
55     private final boolean PLATFORM_DEFINED = true;
56     private final int SLICE_TYPE = SliceData.SliceType.SLIDER;
57     private final String UNAVAILABLE_SLICE_SUBTITLE = "subtitleOfUnavailableSlice";
58 
59     private Context mContext;
60 
61     private SlicesIndexer mManager;
62 
63 
64     @Before
setUp()65     public void setUp() {
66         mContext = RuntimeEnvironment.application;
67         mManager = spy(new SlicesIndexer(mContext));
68     }
69 
70     @After
cleanUp()71     public void cleanUp() {
72         DatabaseTestUtils.clearDb(mContext);
73     }
74 
75     @Test
testAlreadyIndexed_doesNotIndexAgain()76     public void testAlreadyIndexed_doesNotIndexAgain() {
77         String newKey = "newKey";
78         String newTitle = "newTitle";
79         SlicesDatabaseHelper.getInstance(mContext).setIndexedState();
80         insertSpecialCase(newKey, newTitle);
81 
82         // Attempt indexing - should not do anything.
83         mManager.run();
84 
85         final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase();
86         try (final Cursor cursor = db.rawQuery("SELECT * FROM slices_index", null)) {
87             cursor.moveToFirst();
88             assertThat(cursor.getCount()).isEqualTo(1);
89             assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY))).isEqualTo(newKey);
90             assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE)))
91                     .isEqualTo(newTitle);
92         } finally {
93             db.close();
94         }
95     }
96 
97     @Test
testInsertSliceData_indexedStateSet()98     public void testInsertSliceData_indexedStateSet() {
99         final SlicesDatabaseHelper helper = SlicesDatabaseHelper.getInstance(mContext);
100         helper.setIndexedState();
101         doReturn(new ArrayList<SliceData>()).when(mManager).getSliceData();
102 
103         mManager.run();
104 
105         assertThat(helper.isSliceDataIndexed()).isTrue();
106     }
107 
108     @Test
testInsertSliceData_mockDataInserted()109     public void testInsertSliceData_mockDataInserted() {
110         final List<SliceData> sliceData = getDummyIndexableData();
111         doReturn(sliceData).when(mManager).getSliceData();
112 
113         mManager.run();
114 
115         final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase();
116         try (final Cursor cursor = db.rawQuery("SELECT * FROM slices_index", null)) {
117             assertThat(cursor.getCount()).isEqualTo(sliceData.size());
118 
119             cursor.moveToFirst();
120             for (int i = 0; i < sliceData.size(); i++) {
121                 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY)))
122                         .isEqualTo(KEYS[i]);
123                 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE)))
124                         .isEqualTo(TITLES[i]);
125                 assertThat(
126                         cursor.getString(cursor.getColumnIndex(IndexColumns.FRAGMENT)))
127                         .isEqualTo(FRAGMENT_NAME);
128                 assertThat(cursor.getString(
129                         cursor.getColumnIndex(IndexColumns.SCREENTITLE))).isEqualTo(SCREEN_TITLE);
130                 assertThat(
131                         cursor.getString(cursor.getColumnIndex(IndexColumns.KEYWORDS)))
132                         .isEqualTo(KEYWORDS);
133                 assertThat(
134                         cursor.getInt(cursor.getColumnIndex(IndexColumns.ICON_RESOURCE)))
135                         .isEqualTo(ICON);
136                 assertThat(
137                         cursor.getString(cursor.getColumnIndex(IndexColumns.CONTROLLER)))
138                         .isEqualTo(PREF_CONTROLLER);
139                 assertThat(cursor.getInt(
140                         cursor.getColumnIndex(IndexColumns.PLATFORM_SLICE)))
141                         .isEqualTo(1 /* true */);
142                 assertThat(cursor.getInt(cursor.getColumnIndex(IndexColumns.SLICE_TYPE)))
143                         .isEqualTo(SLICE_TYPE);
144                 assertThat(cursor.getString(
145                         cursor.getColumnIndex(IndexColumns.UNAVAILABLE_SLICE_SUBTITLE)))
146                         .isEqualTo(UNAVAILABLE_SLICE_SUBTITLE);
147                 cursor.moveToNext();
148             }
149         } finally {
150             db.close();
151         }
152     }
153 
insertSpecialCase(String key, String title)154     private void insertSpecialCase(String key, String title) {
155         final ContentValues values = new ContentValues();
156         values.put(IndexColumns.KEY, key);
157         values.put(IndexColumns.TITLE, title);
158         final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase();
159         db.beginTransaction();
160         try {
161             db.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
162             db.setTransactionSuccessful();
163         } finally {
164             db.endTransaction();
165         }
166         db.close();
167     }
168 
getDummyIndexableData()169     private List<SliceData> getDummyIndexableData() {
170         final List<SliceData> sliceData = new ArrayList<>();
171         final SliceData.Builder builder = new SliceData.Builder()
172                 .setSummary(SUMMARY)
173                 .setScreenTitle(SCREEN_TITLE)
174                 .setKeywords(KEYWORDS)
175                 .setFragmentName(FRAGMENT_NAME)
176                 .setIcon(ICON)
177                 .setUri(URI)
178                 .setPreferenceControllerClassName(PREF_CONTROLLER)
179                 .setPlatformDefined(PLATFORM_DEFINED)
180                 .setSliceType(SLICE_TYPE)
181                 .setUnavailableSliceSubtitle(UNAVAILABLE_SLICE_SUBTITLE);
182 
183         for (int i = 0; i < KEYS.length; i++) {
184             builder.setKey(KEYS[i]).setTitle(TITLES[i]);
185             sliceData.add(builder.build());
186         }
187 
188         return sliceData;
189     }
190 }