summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/src/com/android/providers/media/MediaProviderChangeIdTest.java168
-rw-r--r--tests/src/com/android/providers/media/photopicker/sync/PickerSyncManagerTest.java126
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);