| /* |
| * Copyright (C) 2018 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.search; |
| |
| import static org.mockito.ArgumentMatchers.any; |
| import static org.mockito.ArgumentMatchers.eq; |
| import static org.mockito.Mockito.atLeast; |
| import static org.mockito.Mockito.doAnswer; |
| import static org.mockito.Mockito.doNothing; |
| import static org.mockito.Mockito.doReturn; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.spy; |
| import static org.mockito.Mockito.times; |
| import static org.mockito.Mockito.verify; |
| import static org.mockito.Mockito.when; |
| |
| import android.app.Activity; |
| import android.content.ContentResolver; |
| import android.net.Uri; |
| |
| import com.android.settings.slices.SettingsSliceProvider; |
| import com.android.settings.testutils.FakeFeatureFactory; |
| import com.android.settings.testutils.SettingsRobolectricTestRunner; |
| |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.mockito.invocation.InvocationOnMock; |
| import org.mockito.stubbing.Answer; |
| import org.robolectric.Robolectric; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import androidx.slice.Slice; |
| import androidx.slice.SliceViewManager; |
| import androidx.slice.SliceMetadata; |
| |
| @RunWith(SettingsRobolectricTestRunner.class) |
| public class DeviceIndexUpdateJobServiceTest { |
| private static final Uri BASE_URI = new Uri.Builder() |
| .scheme(ContentResolver.SCHEME_CONTENT) |
| .authority(SettingsSliceProvider.SLICE_AUTHORITY) |
| .build(); |
| |
| private Activity mActivity; |
| private DeviceIndexUpdateJobService mJob; |
| private SliceViewManager mSliceManager; |
| |
| @Before |
| public void setup() { |
| FakeFeatureFactory.setupForTest(); |
| mActivity = spy(Robolectric.buildActivity(Activity.class).create().visible().get()); |
| mJob = spy(new DeviceIndexUpdateJobService()); |
| mSliceManager = mock(SliceViewManager.class); |
| |
| doReturn(mActivity.getPackageName()).when(mJob).getPackageName(); |
| doReturn(mSliceManager).when(mJob).getSliceViewManager(); |
| doNothing().when(mJob).jobFinished(null, false); |
| } |
| |
| @Test |
| public void testGetsSlices() { |
| setSlices(); |
| |
| mJob.updateIndex(null); |
| verify(mSliceManager).getSliceDescendants(eq(BASE_URI)); |
| } |
| |
| @Test |
| public void testIndexesSlices() { |
| setSlices(genSlice("path1"), genSlice("path2")); |
| |
| mJob.mRunningJob = true; |
| mJob.updateIndex(null); |
| verify(mSliceManager).getSliceDescendants(eq(BASE_URI)); |
| |
| DeviceIndexFeatureProvider indexFeatureProvider = FakeFeatureFactory.getFactory(mActivity) |
| .getDeviceIndexFeatureProvider(); |
| verify(indexFeatureProvider, times(2)).index(any(), any(), any(), any(), any()); |
| } |
| |
| @Test |
| public void testDoNotIndexWithoutTitle() { |
| Slice testSlice = genSlice("path2"); |
| setSlices(genSlice("path1"), testSlice); |
| doReturn(null).when(mJob).findTitle(testSlice, mJob.getMetadata(testSlice)); |
| |
| mJob.mRunningJob = true; |
| mJob.updateIndex(null); |
| verify(mSliceManager).getSliceDescendants(eq(BASE_URI)); |
| |
| DeviceIndexFeatureProvider indexFeatureProvider = FakeFeatureFactory.getFactory(mActivity) |
| .getDeviceIndexFeatureProvider(); |
| verify(indexFeatureProvider, times(1)).index(any(), any(), any(), any(), any()); |
| } |
| |
| @Test |
| public void testStopIndexing() { |
| Slice testSlice = genSlice("path1"); |
| setSlices(testSlice, genSlice("path2")); |
| mJob.mRunningJob = true; |
| |
| doAnswer(invocation -> { |
| // Stop running after the first iteration |
| mJob.mRunningJob = false; |
| return testSlice; |
| }).when(mJob).bindSliceSynchronous(mSliceManager, testSlice.getUri()); |
| |
| mJob.updateIndex(null); |
| verify(mSliceManager).getSliceDescendants(eq(BASE_URI)); |
| |
| DeviceIndexFeatureProvider indexFeatureProvider = FakeFeatureFactory.getFactory(mActivity) |
| .getDeviceIndexFeatureProvider(); |
| verify(indexFeatureProvider).clearIndex(any()); |
| verify(indexFeatureProvider, times(1)).index(any(), any(), any(), any(), any()); |
| } |
| |
| private Slice genSlice(String path) { |
| return new Slice.Builder(BASE_URI.buildUpon().path(path).build()).build(); |
| } |
| |
| private void setSlices(Slice... slice) { |
| List<Uri> mUris = new ArrayList<>(); |
| for (Slice slouse : slice) { |
| SliceMetadata m = mock(SliceMetadata.class); |
| mUris.add(slouse.getUri()); |
| doReturn(slouse).when(mJob).bindSliceSynchronous(mSliceManager, slouse.getUri()); |
| doReturn(m).when(mJob).getMetadata(slouse); |
| doReturn(slouse.getUri().getPath()).when(mJob).findTitle(slouse, m); |
| } |
| when(mSliceManager.getSliceDescendants(BASE_URI)).thenReturn(mUris); |
| } |
| |
| } |