/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.settings.slices; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import com.android.settings.slices.SlicesDatabaseHelper.IndexColumns; import com.android.settings.testutils.DatabaseTestUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) public class SlicesIndexerTest { private final String[] KEYS = new String[]{"key1", "key2", "key3"}; private final String[] TITLES = new String[]{"title1", "title2", "title3"}; private final String SUMMARY = "subtitle"; private final String SCREEN_TITLE = "screen title"; private final String KEYWORDS = "a, b, c"; private final String FRAGMENT_NAME = "fragment name"; private final int ICON = 1234; // I declare a thumb war private final Uri URI = Uri.parse("content://com.android.settings.slices/test"); private final String PREF_CONTROLLER = "com.android.settings.slices.tester"; private final boolean PLATFORM_DEFINED = true; private final int SLICE_TYPE = SliceData.SliceType.SLIDER; private final String UNAVAILABLE_SLICE_SUBTITLE = "subtitleOfUnavailableSlice"; private Context mContext; private SlicesIndexer mManager; @Before public void setUp() { mContext = RuntimeEnvironment.application; mManager = spy(new SlicesIndexer(mContext)); } @After public void cleanUp() { DatabaseTestUtils.clearDb(mContext); } @Test public void testAlreadyIndexed_doesNotIndexAgain() { String newKey = "newKey"; String newTitle = "newTitle"; SlicesDatabaseHelper.getInstance(mContext).setIndexedState(); insertSpecialCase(newKey, newTitle); // Attempt indexing - should not do anything. mManager.run(); final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase(); try (final Cursor cursor = db.rawQuery("SELECT * FROM slices_index", null)) { cursor.moveToFirst(); assertThat(cursor.getCount()).isEqualTo(1); assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY))).isEqualTo(newKey); assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE))) .isEqualTo(newTitle); } finally { db.close(); } } @Test public void testInsertSliceData_indexedStateSet() { final SlicesDatabaseHelper helper = SlicesDatabaseHelper.getInstance(mContext); helper.setIndexedState(); doReturn(new ArrayList()).when(mManager).getSliceData(); mManager.run(); assertThat(helper.isSliceDataIndexed()).isTrue(); } @Test public void testInsertSliceData_mockDataInserted() { final List sliceData = getDummyIndexableData(); doReturn(sliceData).when(mManager).getSliceData(); mManager.run(); final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase(); try (final Cursor cursor = db.rawQuery("SELECT * FROM slices_index", null)) { assertThat(cursor.getCount()).isEqualTo(sliceData.size()); cursor.moveToFirst(); for (int i = 0; i < sliceData.size(); i++) { assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY))) .isEqualTo(KEYS[i]); assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE))) .isEqualTo(TITLES[i]); assertThat( cursor.getString(cursor.getColumnIndex(IndexColumns.FRAGMENT))) .isEqualTo(FRAGMENT_NAME); assertThat(cursor.getString( cursor.getColumnIndex(IndexColumns.SCREENTITLE))).isEqualTo(SCREEN_TITLE); assertThat( cursor.getString(cursor.getColumnIndex(IndexColumns.KEYWORDS))) .isEqualTo(KEYWORDS); assertThat( cursor.getInt(cursor.getColumnIndex(IndexColumns.ICON_RESOURCE))) .isEqualTo(ICON); assertThat( cursor.getString(cursor.getColumnIndex(IndexColumns.CONTROLLER))) .isEqualTo(PREF_CONTROLLER); assertThat(cursor.getInt( cursor.getColumnIndex(IndexColumns.PLATFORM_SLICE))) .isEqualTo(1 /* true */); assertThat(cursor.getInt(cursor.getColumnIndex(IndexColumns.SLICE_TYPE))) .isEqualTo(SLICE_TYPE); assertThat(cursor.getString( cursor.getColumnIndex(IndexColumns.UNAVAILABLE_SLICE_SUBTITLE))) .isEqualTo(UNAVAILABLE_SLICE_SUBTITLE); cursor.moveToNext(); } } finally { db.close(); } } private void insertSpecialCase(String key, String title) { final ContentValues values = new ContentValues(); values.put(IndexColumns.KEY, key); values.put(IndexColumns.TITLE, title); final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase(); db.beginTransaction(); try { db.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values); db.setTransactionSuccessful(); } finally { db.endTransaction(); } db.close(); } private List getDummyIndexableData() { final List sliceData = new ArrayList<>(); final SliceData.Builder builder = new SliceData.Builder() .setSummary(SUMMARY) .setScreenTitle(SCREEN_TITLE) .setKeywords(KEYWORDS) .setFragmentName(FRAGMENT_NAME) .setIcon(ICON) .setUri(URI) .setPreferenceControllerClassName(PREF_CONTROLLER) .setPlatformDefined(PLATFORM_DEFINED) .setSliceType(SLICE_TYPE) .setUnavailableSliceSubtitle(UNAVAILABLE_SLICE_SUBTITLE); for (int i = 0; i < KEYS.length; i++) { builder.setKey(KEYS[i]).setTitle(TITLES[i]); sliceData.add(builder.build()); } return sliceData; } }