diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/src/com/android/providers/media/MediaProviderChangeIdTest.java | 168 | ||||
-rw-r--r-- | tests/src/com/android/providers/media/photopicker/sync/PickerSyncManagerTest.java | 126 |
2 files changed, 126 insertions, 168 deletions
diff --git a/tests/src/com/android/providers/media/MediaProviderChangeIdTest.java b/tests/src/com/android/providers/media/MediaProviderChangeIdTest.java deleted file mode 100644 index 6bf5ce2aa..000000000 --- a/tests/src/com/android/providers/media/MediaProviderChangeIdTest.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2025 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.providers.media; - -import android.compat.testing.PlatformCompatChangeRule; -import android.content.Context; -import android.os.Build; -import android.os.Environment; -import android.os.Parcel; -import android.os.UserHandle; -import android.os.storage.StorageManager; -import android.os.storage.StorageVolume; -import android.platform.test.annotations.RequiresFlagsEnabled; -import android.platform.test.flag.junit.CheckFlagsRule; -import android.platform.test.flag.junit.DeviceFlagsValueProvider; -import android.provider.MediaStore; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.SdkSuppress; -import androidx.test.platform.app.InstrumentationRegistry; - -import com.android.providers.media.flags.Flags; - -import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges; -import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges; - -import junit.framework.Assert; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TestRule; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Set; - -@RunWith(AndroidJUnit4.class) -@RequiresFlagsEnabled({Flags.FLAG_EXCLUDE_UNRELIABLE_VOLUMES}) -@SdkSuppress(minSdkVersion = Build.VERSION_CODES.TIRAMISU) -public class MediaProviderChangeIdTest { - @Rule - public TestRule compatChangeRule = new PlatformCompatChangeRule(); - - @Rule - public final CheckFlagsRule mCheckFlagsRule = - DeviceFlagsValueProvider.createCheckFlagsRule(); - - @Mock - private Context mContext; - - private static final String RELIABLE_STORAGE = "reliable"; - private static final String UNRELIABLE_STORAGE = "unreliable"; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - - // create a testing storage volume which behaves as a reliable storage and hence have a - // directory starting with storage/. Naming this volume as reliable. - Parcel parcel = Parcel.obtain(); - parcel.writeString8("1"); // id - parcel.writeString8("Storage/emulated/testDir"); // path - parcel.writeString8("Storage/emulated/testDir"); // internalPath - parcel.writeString8(""); // description - parcel.writeInt(0); // removable (boolean) - parcel.writeInt(1); // primary (boolean) - parcel.writeInt(0); // emulated (boolean) - parcel.writeInt(0); // allowMassStorage (boolean) - parcel.writeInt(0); // allowFullBackup (boolean) - parcel.writeLong(1000); // maxFileSize - parcel.writeParcelable(UserHandle.CURRENT, 0); // owner (UserHandle) - parcel.writeInt(0); // uuid - parcel.writeString8(RELIABLE_STORAGE); // name - parcel.writeString8(Environment.MEDIA_MOUNTED); // state - - parcel.setDataPosition(0); - - StorageVolume reliableStorage = StorageVolume.CREATOR.createFromParcel(parcel); - - // create a testing storage volume which behaves as a unreliable storage and hence have a - // directory starting with mnt/. Naming this volume as unreliable. - Parcel parcel2 = Parcel.obtain(); - parcel2.writeString8("2"); // id - parcel2.writeString8("mnt/testDir"); // path - parcel2.writeString8("mnt/testDir"); // internalPath - parcel2.writeString8(""); // description - parcel2.writeInt(0); // removable (boolean) - parcel2.writeInt(1); // primary (boolean) - parcel2.writeInt(0); // emulated (boolean) - parcel2.writeInt(0); // allowMassStorage (boolean) - parcel2.writeInt(0); // allowFullBackup (boolean) - parcel2.writeLong(1000); // maxFileSize - parcel2.writeParcelable(UserHandle.CURRENT, 0); // owner (UserHandle) - parcel2.writeInt(0); // uuid - parcel2.writeString8(UNRELIABLE_STORAGE); // name - parcel2.writeString8(Environment.MEDIA_MOUNTED); // state - - parcel2.setDataPosition(0); - - StorageVolume unreliableStorage = StorageVolume.CREATOR.createFromParcel(parcel2); - - // Creating a mock storage manager which on being queried for storage volumes return the - // list of both reliable and unreliable storage. - StorageManager mockedStorageManager = Mockito.mock(StorageManager.class); - Mockito.when(mockedStorageManager.getStorageVolumes()).thenReturn(new ArrayList<>( - Arrays.asList(reliableStorage, unreliableStorage))); - - // Creating a mock for context so that it returns the mocked storage manager. - mContext = Mockito.mock(Context.class); - Mockito.when(mContext.getSystemServiceName(StorageManager.class)).thenReturn( - Context.STORAGE_SERVICE); - Mockito.when(mContext.getApplicationInfo()).thenReturn( - InstrumentationRegistry.getInstrumentation().getContext().getApplicationInfo()); - Mockito.when(mContext.getSystemService(StorageManager.class)).thenReturn( - mockedStorageManager); - } - - /** - * This test verifies the behaviour of MediaStore.getExternalVolumeNames() before enabling the - * EXCLUDE_UNRELIABLE_STORAGE_VOLUMES appcompat flag. - */ - @Test - @DisableCompatChanges({MediaProvider.EXCLUDE_UNRELIABLE_STORAGE_VOLUMES}) - public void test_getExternalVolumes_returnsAllVolumes() { - Set<String> result = MediaStore.getExternalVolumeNames(mContext); - - // Verify result is not null and both unreliable and reliable storage is returned. - Assert.assertNotNull(result); - Assert.assertEquals(2, result.size()); - Assert.assertTrue(result.contains(RELIABLE_STORAGE)); - Assert.assertTrue(result.contains(UNRELIABLE_STORAGE)); - } - - /** - * This test verifies the behaviour of MediaStore.getExternalVolumeNames() before enabling the - * EXCLUDE_UNRELIABLE_STORAGE_VOLUMES appcompat flag. - */ - @Test - @EnableCompatChanges({MediaProvider.EXCLUDE_UNRELIABLE_STORAGE_VOLUMES}) - public void test_getExternalVolumes_returnsFilteredVolumes() { - Set<String> result = MediaStore.getExternalVolumeNames(mContext); - - // Verify result is not null and only reliable storage is returned. - Assert.assertNotNull(result); - Assert.assertEquals(1, result.size()); - Assert.assertTrue(result.contains(RELIABLE_STORAGE)); - Assert.assertFalse(result.contains(UNRELIABLE_STORAGE)); - } -} - diff --git a/tests/src/com/android/providers/media/photopicker/sync/PickerSyncManagerTest.java b/tests/src/com/android/providers/media/photopicker/sync/PickerSyncManagerTest.java index bb71d4638..60e43e934 100644 --- a/tests/src/com/android/providers/media/photopicker/sync/PickerSyncManagerTest.java +++ b/tests/src/com/android/providers/media/photopicker/sync/PickerSyncManagerTest.java @@ -18,6 +18,8 @@ package com.android.providers.media.photopicker.sync; import static com.android.providers.media.photopicker.sync.PickerSyncManager.EXPIRED_SUGGESTIONS_RESET; import static com.android.providers.media.photopicker.sync.PickerSyncManager.EXTRA_MIME_TYPES; +import static com.android.providers.media.photopicker.sync.PickerSyncManager.IMMEDIATE_CLOUD_MEDIA_IN_MEDIA_SET_SYNC_WORK_NAME; +import static com.android.providers.media.photopicker.sync.PickerSyncManager.IMMEDIATE_CLOUD_SEARCH_SYNC_WORK_NAME; import static com.android.providers.media.photopicker.sync.PickerSyncManager.SEARCH_RESULTS_FULL_CACHE_RESET; import static com.android.providers.media.photopicker.sync.PickerSyncManager.SEARCH_PARTIAL_CACHE_RESET; import static com.android.providers.media.photopicker.sync.PickerSyncManager.SEARCH_RESULTS_RESET_DELAY; @@ -37,6 +39,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; @@ -59,6 +62,7 @@ import androidx.work.OneTimeWorkRequest; import androidx.work.Operation; import androidx.work.PeriodicWorkRequest; import androidx.work.WorkContinuation; +import androidx.work.WorkInfo; import androidx.work.WorkManager; import androidx.work.WorkRequest; @@ -71,6 +75,7 @@ import com.android.providers.media.photopicker.v2.model.MediaInMediaSetSyncReque import com.android.providers.media.photopicker.v2.model.MediaSetsSyncRequestParams; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.SettableFuture; import org.junit.Before; import org.junit.Rule; @@ -81,7 +86,10 @@ import org.mockito.Mock; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Locale; +import java.util.UUID; import java.util.concurrent.TimeUnit; public class PickerSyncManagerTest { @@ -116,6 +124,9 @@ public class PickerSyncManagerTest { mConfigStore = new TestConfigStore(); mConfigStore.enableCloudMediaFeatureAndSetAllowedCloudProviderPackages( "com.hooli.super.awesome.cloudpicker"); + final SettableFuture<List<WorkInfo>> listenableFuture = SettableFuture.create(); + listenableFuture.set(List.of()); + doReturn(listenableFuture).when(mMockWorkManager).getWorkInfosByTag(anyString()); } @@ -606,6 +617,121 @@ public class PickerSyncManagerTest { } @Test + public void testExistingSearchResultsSync() { + setupPickerSyncManager(/* schedulePeriodicSyncs */ false); + + final int searchRequestId = 10; + final String authority = PickerSyncController.LOCAL_PICKER_PROVIDER_AUTHORITY; + + final SettableFuture<List<WorkInfo>> listenableFuture = SettableFuture.create(); + final WorkInfo workInfo = new WorkInfo( + UUID.randomUUID(), WorkInfo.State.RUNNING, new HashSet<>()); + final String tag = String.format(Locale.ROOT, "%s-%s-%s", + IMMEDIATE_CLOUD_SEARCH_SYNC_WORK_NAME, authority, searchRequestId); + listenableFuture.set(List.of(workInfo)); + doReturn(listenableFuture).when(mMockWorkManager).getWorkInfosByTag(eq(tag)); + + mPickerSyncManager.syncSearchResultsForProvider( + searchRequestId, + SYNC_CLOUD_ONLY, + authority + ); + verify(mMockWorkManager, times(0)) + .enqueueUniqueWork(anyString(), any(), any(OneTimeWorkRequest.class)); + } + + @Test + public void testExistingMediaSetContentsSync() { + setupPickerSyncManager(/* schedulePeriodicSyncs */ false); + + final int pickerMediaSetId = 10; + final String authority = PickerSyncController.LOCAL_PICKER_PROVIDER_AUTHORITY; + + final SettableFuture<List<WorkInfo>> listenableFuture = SettableFuture.create(); + final WorkInfo workInfo = new WorkInfo( + UUID.randomUUID(), WorkInfo.State.RUNNING, new HashSet<>()); + final String tag = String.format(Locale.ROOT, "%s-%s-%s", + IMMEDIATE_CLOUD_MEDIA_IN_MEDIA_SET_SYNC_WORK_NAME, authority, pickerMediaSetId); + listenableFuture.set(List.of(workInfo)); + doReturn(listenableFuture).when(mMockWorkManager).getWorkInfosByTag(eq(tag)); + + Bundle extras = new Bundle(); + extras.putString(MediaInMediaSetSyncRequestParams.KEY_PARENT_MEDIA_SET_AUTHORITY, + authority); + extras.putLong(MediaInMediaSetSyncRequestParams.KEY_PARENT_MEDIA_SET_PICKER_ID, + pickerMediaSetId); + extras.putStringArrayList("providers", new ArrayList<>(List.of(authority))); + + MediaInMediaSetSyncRequestParams requestParams = new MediaInMediaSetSyncRequestParams( + extras); + mPickerSyncManager.syncMediaInMediaSetForProvider( + requestParams, + SYNC_CLOUD_ONLY + ); + + verify(mMockWorkManager, times(0)) + .enqueueUniqueWork(anyString(), any(), any(OneTimeWorkRequest.class)); + } + + @Test + public void testSearchResultsSyncIsScheduled() { + setupPickerSyncManager(/* schedulePeriodicSyncs */ false); + + final int searchRequestId = 10; + final String authority = PickerSyncController.LOCAL_PICKER_PROVIDER_AUTHORITY; + + final SettableFuture<List<WorkInfo>> listenableFuture = SettableFuture.create(); + final WorkInfo workInfo = new WorkInfo( + UUID.randomUUID(), WorkInfo.State.RUNNING, new HashSet<>()); + final String tag = String.format(Locale.ROOT, "%s-%s-%s", + IMMEDIATE_CLOUD_SEARCH_SYNC_WORK_NAME, authority, searchRequestId + 1); + listenableFuture.set(List.of(workInfo)); + doReturn(listenableFuture).when(mMockWorkManager).getWorkInfosByTag(eq(tag)); + + mPickerSyncManager.syncSearchResultsForProvider( + searchRequestId, + SYNC_CLOUD_ONLY, + authority + ); + verify(mMockWorkManager, times(1)) + .enqueueUniqueWork(anyString(), any(), any(OneTimeWorkRequest.class)); + } + + @Test + public void testMediaSetContentsSyncIsScheduled() { + setupPickerSyncManager(/* schedulePeriodicSyncs */ false); + + final int pickerMediaSetId = 10; + final String authority = PickerSyncController.LOCAL_PICKER_PROVIDER_AUTHORITY; + + final SettableFuture<List<WorkInfo>> listenableFuture = SettableFuture.create(); + final WorkInfo workInfo = new WorkInfo( + UUID.randomUUID(), WorkInfo.State.RUNNING, new HashSet<>()); + final String tag = String.format(Locale.ROOT, "%s-%s-%s", + IMMEDIATE_CLOUD_MEDIA_IN_MEDIA_SET_SYNC_WORK_NAME, + authority, pickerMediaSetId + 1); + listenableFuture.set(List.of(workInfo)); + doReturn(listenableFuture).when(mMockWorkManager).getWorkInfosByTag(eq(tag)); + + Bundle extras = new Bundle(); + extras.putString(MediaInMediaSetSyncRequestParams.KEY_PARENT_MEDIA_SET_AUTHORITY, + authority); + extras.putLong(MediaInMediaSetSyncRequestParams.KEY_PARENT_MEDIA_SET_PICKER_ID, + pickerMediaSetId); + extras.putStringArrayList("providers", new ArrayList<>(List.of(authority))); + + MediaInMediaSetSyncRequestParams requestParams = new MediaInMediaSetSyncRequestParams( + extras); + mPickerSyncManager.syncMediaInMediaSetForProvider( + requestParams, + SYNC_CLOUD_ONLY + ); + + verify(mMockWorkManager, times(1)) + .enqueueUniqueWork(anyString(), any(), any(OneTimeWorkRequest.class)); + } + + @Test public void testSearchResultsCloudSync() { setupPickerSyncManager(/* schedulePeriodicSyncs */ false); |