diff options
author | 2025-02-19 17:31:11 +0000 | |
---|---|---|
committer | 2025-02-24 12:07:17 +0000 | |
commit | bf2153a5dee6fe0ef8096577808c6f741c543087 (patch) | |
tree | 13a19b5ea562f5648eabce4409760412eeb97b8b /tests | |
parent | e7bc086e385da29c1b73d6400177485909a43be0 (diff) |
Don't resume search syncs to mitigate partial sync issue
* There is an issue in CMP where resuming of syncs causes their
pagination logic to break. This change makes sure that we never resume
search results sync with the CMP.
Bug: 397368798
Test: atest PickerSyncManagerTest
Test: atest SearchResultsSyncWorkerTest
Flag: EXEMPT bug fix
Change-Id: I527cb6579acca8b39e81a5a83c8bb5ec884f933c
Diffstat (limited to 'tests')
-rw-r--r-- | tests/src/com/android/providers/media/photopicker/sync/PickerSyncManagerTest.java | 126 |
1 files changed, 126 insertions, 0 deletions
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); |