diff options
4 files changed, 497 insertions, 35 deletions
diff --git a/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java b/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java index 6aca2fdc0f7f..496f4f6c6680 100644 --- a/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java +++ b/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java @@ -365,6 +365,11 @@ public class WallpaperBackupAgent extends BackupAgent { final int sysWhich = FLAG_SYSTEM | (lockImageStage.exists() ? 0 : FLAG_LOCK); try { + // First parse the live component name so that we know for logging if we care about + // logging errors with the image restore. + ComponentName wpService = parseWallpaperComponent(infoStage, "wp"); + mSystemHasLiveComponent = wpService != null; + // It is valid for the imagery to be absent; it means that we were not permitted // to back up the original image on the source device, or there was no user-supplied // wallpaper image present. @@ -372,10 +377,10 @@ public class WallpaperBackupAgent extends BackupAgent { restoreFromStage(lockImageStage, infoStage, "kwp", FLAG_LOCK); // And reset to the wallpaper service we should be using - ComponentName wpService = parseWallpaperComponent(infoStage, "wp"); updateWallpaperComponent(wpService, !lockImageStage.exists()); } catch (Exception e) { Slog.e(TAG, "Unable to restore wallpaper: " + e.getMessage()); + mEventLogger.onRestoreException(e); } finally { Slog.v(TAG, "Restore finished; clearing backup bookkeeping"); infoStage.delete(); @@ -399,12 +404,15 @@ public class WallpaperBackupAgent extends BackupAgent { // We have a live wallpaper and no static lock image, // allow live wallpaper to show "through" on lock screen. mWallpaperManager.clear(FLAG_LOCK); + mEventLogger.onLockLiveWallpaperRestored(wpService); } + mEventLogger.onSystemLiveWallpaperRestored(wpService); } else { // If we've restored a live wallpaper, but the component doesn't exist, // we should log it as an error so we can easily identify the problem // in reports from users if (wpService != null) { + // TODO(b/268471749): Handle delayed case applyComponentAtInstall(wpService, applyToLock); Slog.w(TAG, "Wallpaper service " + wpService + " isn't available. " + " Will try to apply later"); @@ -424,13 +432,37 @@ public class WallpaperBackupAgent extends BackupAgent { try (FileInputStream in = new FileInputStream(stage)) { mWallpaperManager.setStream(in, cropHint.isEmpty() ? null : cropHint, true, which); + + // And log the success + if ((which & FLAG_SYSTEM) > 0) { + mEventLogger.onSystemImageWallpaperRestored(); + } else { + mEventLogger.onLockImageWallpaperRestored(); + } } + } else { + logRestoreError(which, ERROR_NO_METADATA); } } else { Slog.d(TAG, "Restore data doesn't exist for file " + stage.getPath()); + logRestoreErrorIfNoLiveComponent(which, ERROR_NO_WALLPAPER); + } + } + + private void logRestoreErrorIfNoLiveComponent(int which, String error) { + if (mSystemHasLiveComponent) { + return; } + logRestoreError(which, error); } + private void logRestoreError(int which, String error) { + if ((which & FLAG_SYSTEM) == FLAG_SYSTEM) { + mEventLogger.onSystemImageWallpaperRestoreFailed(error); + } else if ((which & FLAG_LOCK) == FLAG_LOCK) { + mEventLogger.onLockImageWallpaperRestoreFailed(error); + } + } private Rect parseCropHint(File wallpaperInfo, String sectionTag) { Rect cropHint = new Rect(); try (FileInputStream stream = new FileInputStream(wallpaperInfo)) { diff --git a/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperEventLogger.java b/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperEventLogger.java index 64944b3ff54f..47c45ac7e775 100644 --- a/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperEventLogger.java +++ b/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperEventLogger.java @@ -22,6 +22,7 @@ import android.app.backup.BackupManager; import android.app.backup.BackupRestoreEventLogger; import android.app.backup.BackupRestoreEventLogger.BackupRestoreDataType; import android.app.backup.BackupRestoreEventLogger.BackupRestoreError; +import android.content.ComponentName; import com.android.internal.annotations.VisibleForTesting; @@ -101,6 +102,39 @@ public class WallpaperEventLogger { logBackupFailureInternal(WALLPAPER_LIVE_LOCK, error); } + void onSystemImageWallpaperRestored() { + logRestoreSuccessInternal(WALLPAPER_IMG_SYSTEM, /* liveComponentWallpaperInfo */ null); + } + + void onLockImageWallpaperRestored() { + logRestoreSuccessInternal(WALLPAPER_IMG_LOCK, /* liveComponentWallpaperInfo */ null); + } + + void onSystemLiveWallpaperRestored(ComponentName wpService) { + logRestoreSuccessInternal(WALLPAPER_LIVE_SYSTEM, wpService); + } + + void onLockLiveWallpaperRestored(ComponentName wpService) { + logRestoreSuccessInternal(WALLPAPER_LIVE_LOCK, wpService); + } + + void onSystemImageWallpaperRestoreFailed(@BackupRestoreError String error) { + logRestoreFailureInternal(WALLPAPER_IMG_SYSTEM, error); + } + + void onLockImageWallpaperRestoreFailed(@BackupRestoreError String error) { + logRestoreFailureInternal(WALLPAPER_IMG_LOCK, error); + } + + void onSystemLiveWallpaperRestoreFailed(@BackupRestoreError String error) { + logRestoreFailureInternal(WALLPAPER_LIVE_SYSTEM, error); + } + + void onLockLiveWallpaperRestoreFailed(@BackupRestoreError String error) { + logRestoreFailureInternal(WALLPAPER_LIVE_LOCK, error); + } + + /** * Called when the whole backup flow is interrupted by an exception. @@ -117,6 +151,20 @@ public class WallpaperEventLogger { } } + /** + * Called when the whole restore flow is interrupted by an exception. + */ + void onRestoreException(Exception exception) { + String error = exception.getClass().getName(); + if (!mProcessedDataTypes.contains(WALLPAPER_IMG_SYSTEM) && !mProcessedDataTypes.contains( + WALLPAPER_LIVE_SYSTEM)) { + mLogger.logItemsRestoreFailed(WALLPAPER_IMG_SYSTEM, /* count */ 1, error); + } + if (!mProcessedDataTypes.contains(WALLPAPER_IMG_LOCK) && !mProcessedDataTypes.contains( + WALLPAPER_LIVE_LOCK)) { + mLogger.logItemsRestoreFailed(WALLPAPER_IMG_LOCK, /* count */ 1, error); + } + } private void logBackupSuccessInternal(@BackupRestoreDataType String which, @Nullable WallpaperInfo liveComponentWallpaperInfo) { mLogger.logItemsBackedUp(which, /* count */ 1); @@ -130,10 +178,30 @@ public class WallpaperEventLogger { mProcessedDataTypes.add(which); } + private void logRestoreSuccessInternal(@BackupRestoreDataType String which, + @Nullable ComponentName liveComponentWallpaperInfo) { + mLogger.logItemsRestored(which, /* count */ 1); + logRestoredLiveWallpaperNameIfPresent(which, liveComponentWallpaperInfo); + mProcessedDataTypes.add(which); + } + + private void logRestoreFailureInternal(@BackupRestoreDataType String which, + @BackupRestoreError String error) { + mLogger.logItemsRestoreFailed(which, /* count */ 1, error); + mProcessedDataTypes.add(which); + } + private void logLiveWallpaperNameIfPresent(@BackupRestoreDataType String wallpaperType, WallpaperInfo wallpaperInfo) { if (wallpaperInfo != null) { mLogger.logBackupMetadata(wallpaperType, wallpaperInfo.getComponent().getClassName()); } } + + private void logRestoredLiveWallpaperNameIfPresent(@BackupRestoreDataType String wallpaperType, + ComponentName wpService) { + if (wpService != null) { + mLogger.logRestoreMetadata(wallpaperType, wpService.getClassName()); + } + } } diff --git a/packages/WallpaperBackup/test/src/com/android/wallpaperbackup/WallpaperBackupAgentTest.java b/packages/WallpaperBackup/test/src/com/android/wallpaperbackup/WallpaperBackupAgentTest.java index 89459f6e6772..58f6477ed082 100644 --- a/packages/WallpaperBackup/test/src/com/android/wallpaperbackup/WallpaperBackupAgentTest.java +++ b/packages/WallpaperBackup/test/src/com/android/wallpaperbackup/WallpaperBackupAgentTest.java @@ -24,6 +24,7 @@ import static com.android.wallpaperbackup.WallpaperBackupAgent.LOCK_WALLPAPER_ST import static com.android.wallpaperbackup.WallpaperBackupAgent.SYSTEM_WALLPAPER_STAGE; import static com.android.wallpaperbackup.WallpaperBackupAgent.WALLPAPER_INFO_STAGE; import static com.android.wallpaperbackup.WallpaperEventLogger.ERROR_INELIGIBLE; +import static com.android.wallpaperbackup.WallpaperEventLogger.ERROR_NO_METADATA; import static com.android.wallpaperbackup.WallpaperEventLogger.ERROR_NO_WALLPAPER; import static com.android.wallpaperbackup.WallpaperEventLogger.ERROR_QUOTA_EXCEEDED; import static com.android.wallpaperbackup.WallpaperEventLogger.WALLPAPER_IMG_LOCK; @@ -34,6 +35,8 @@ import static com.android.wallpaperbackup.WallpaperEventLogger.WALLPAPER_LIVE_SY import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; @@ -55,12 +58,14 @@ import android.os.FileUtils; import android.os.ParcelFileDescriptor; import android.os.UserHandle; import android.service.wallpaper.WallpaperService; +import android.util.Xml; import androidx.test.InstrumentationRegistry; import androidx.test.core.app.ApplicationProvider; import androidx.test.runner.AndroidJUnit4; import com.android.internal.content.PackageMonitor; +import com.android.modules.utils.TypedXmlSerializer; import com.android.wallpaperbackup.utils.ContextWithServiceOverrides; import org.junit.After; @@ -592,6 +597,123 @@ public class WallpaperBackupAgentTest { assertThat(result.getSuccessCount()).isEqualTo(1); } + @Test + public void testOnRestore_systemWallpaperImgSuccess_logsSuccess() throws Exception { + mockStagedWallpaperFile(WALLPAPER_INFO_STAGE); + mockStagedWallpaperFile(SYSTEM_WALLPAPER_STAGE); + mWallpaperBackupAgent.onCreate(USER_HANDLE, BackupAnnotations.BackupDestination.CLOUD, + BackupAnnotations.OperationType.RESTORE); + + mWallpaperBackupAgent.onRestoreFinished(); + + DataTypeResult result = getLoggingResult(WALLPAPER_IMG_SYSTEM, + mWallpaperBackupAgent.getBackupRestoreEventLogger().getLoggingResults()); + assertThat(result).isNotNull(); + assertThat(result.getSuccessCount()).isEqualTo(1); + } + + @Test + public void testOnRestore_lockWallpaperImgSuccess_logsSuccess() throws Exception { + mockStagedWallpaperFile(WALLPAPER_INFO_STAGE); + mockStagedWallpaperFile(LOCK_WALLPAPER_STAGE); + mWallpaperBackupAgent.onCreate(USER_HANDLE, BackupAnnotations.BackupDestination.CLOUD, + BackupAnnotations.OperationType.RESTORE); + + mWallpaperBackupAgent.onRestoreFinished(); + + DataTypeResult result = getLoggingResult(WALLPAPER_IMG_LOCK, + mWallpaperBackupAgent.getBackupRestoreEventLogger().getLoggingResults()); + assertThat(result).isNotNull(); + assertThat(result.getSuccessCount()).isEqualTo(1); + } + + @Test + public void testOnRestore_systemWallpaperImgMissingAndNoLive_logsFailure() throws Exception { + mockStagedWallpaperFile(WALLPAPER_INFO_STAGE); + mockStagedWallpaperFile(LOCK_WALLPAPER_STAGE); + mWallpaperBackupAgent.onCreate(USER_HANDLE, BackupAnnotations.BackupDestination.CLOUD, + BackupAnnotations.OperationType.RESTORE); + + mWallpaperBackupAgent.onRestoreFinished(); + + DataTypeResult result = getLoggingResult(WALLPAPER_IMG_SYSTEM, + mWallpaperBackupAgent.getBackupRestoreEventLogger().getLoggingResults()); + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + assertThat(result.getErrors()).containsKey(ERROR_NO_WALLPAPER); + + } + + @Test + public void testOnRestore_lockWallpaperImgMissingAndNoLive_logsFailure() throws Exception { + mockStagedWallpaperFile(WALLPAPER_INFO_STAGE); + mockStagedWallpaperFile(SYSTEM_WALLPAPER_STAGE); + mWallpaperBackupAgent.onCreate(USER_HANDLE, BackupAnnotations.BackupDestination.CLOUD, + BackupAnnotations.OperationType.RESTORE); + + mWallpaperBackupAgent.onRestoreFinished(); + + DataTypeResult result = getLoggingResult(WALLPAPER_IMG_LOCK, + mWallpaperBackupAgent.getBackupRestoreEventLogger().getLoggingResults()); + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + assertThat(result.getErrors()).containsKey(ERROR_NO_WALLPAPER); + } + + @Test + public void testOnRestore_wallpaperInfoMissing_logsFailure() throws Exception { + mockStagedWallpaperFile(SYSTEM_WALLPAPER_STAGE); + mWallpaperBackupAgent.onCreate(USER_HANDLE, BackupAnnotations.BackupDestination.CLOUD, + BackupAnnotations.OperationType.RESTORE); + + mWallpaperBackupAgent.onRestoreFinished(); + + DataTypeResult result = getLoggingResult(WALLPAPER_IMG_SYSTEM, + mWallpaperBackupAgent.getBackupRestoreEventLogger().getLoggingResults()); + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + assertThat(result.getErrors()).containsKey(ERROR_NO_METADATA); + } + + @Test + public void testOnRestore_imgMissingButWallpaperInfoHasLive_doesNotLogImg() throws Exception { + mockRestoredLiveWallpaperFile(); + mWallpaperBackupAgent.onCreate(USER_HANDLE, BackupAnnotations.BackupDestination.CLOUD, + BackupAnnotations.OperationType.RESTORE); + + mWallpaperBackupAgent.onRestoreFinished(); + + DataTypeResult system = getLoggingResult(WALLPAPER_IMG_SYSTEM, + mWallpaperBackupAgent.getBackupRestoreEventLogger().getLoggingResults()); + DataTypeResult lock = getLoggingResult(WALLPAPER_IMG_LOCK, + mWallpaperBackupAgent.getBackupRestoreEventLogger().getLoggingResults()); + assertThat(system).isNull(); + assertThat(lock).isNull(); + } + + @Test + public void testOnRestore_throwsException_logsErrors() throws Exception { + when(mWallpaperManager.setStream(any(), any(), anyBoolean(), anyInt())).thenThrow( + new RuntimeException()); + mockStagedWallpaperFile(SYSTEM_WALLPAPER_STAGE); + mockStagedWallpaperFile(WALLPAPER_INFO_STAGE); + mWallpaperBackupAgent.onCreate(USER_HANDLE, BackupAnnotations.BackupDestination.CLOUD, + BackupAnnotations.OperationType.RESTORE); + + mWallpaperBackupAgent.onRestoreFinished(); + + DataTypeResult system = getLoggingResult(WALLPAPER_IMG_SYSTEM, + mWallpaperBackupAgent.getBackupRestoreEventLogger().getLoggingResults()); + DataTypeResult lock = getLoggingResult(WALLPAPER_IMG_LOCK, + mWallpaperBackupAgent.getBackupRestoreEventLogger().getLoggingResults()); + assertThat(system).isNotNull(); + assertThat(system.getFailCount()).isEqualTo(1); + assertThat(system.getErrors()).containsKey(RuntimeException.class.getName()); + assertThat(lock).isNotNull(); + assertThat(lock.getFailCount()).isEqualTo(1); + assertThat(lock.getErrors()).containsKey(RuntimeException.class.getName()); + } + private void mockCurrentWallpaperIds(int systemWallpaperId, int lockWallpaperId) { when(mWallpaperManager.getWallpaperId(eq(FLAG_SYSTEM))).thenReturn(systemWallpaperId); when(mWallpaperManager.getWallpaperId(eq(FLAG_LOCK))).thenReturn(lockWallpaperId); @@ -636,6 +758,27 @@ public class WallpaperBackupAgentTest { ParcelFileDescriptor.open(fakeLockWallpaperFile, MODE_READ_ONLY)); } + private void mockStagedWallpaperFile(String location) throws Exception { + File wallpaperFile = new File(mContext.getFilesDir(), location); + wallpaperFile.createNewFile(); + } + + private void mockRestoredLiveWallpaperFile() throws Exception { + File wallpaperFile = new File(mContext.getFilesDir(), WALLPAPER_INFO_STAGE); + wallpaperFile.createNewFile(); + FileOutputStream fstream = new FileOutputStream(wallpaperFile, false); + TypedXmlSerializer out = Xml.resolveSerializer(fstream); + out.startDocument(null, true); + out.startTag(null, "wp"); + out.attribute(null, "component", + getFakeWallpaperInfo().getComponent().flattenToShortString()); + out.endTag(null, "wp"); + out.endDocument(); + fstream.flush(); + FileUtils.sync(fstream); + fstream.close(); + } + private WallpaperInfo getFakeWallpaperInfo() throws Exception { Context context = InstrumentationRegistry.getTargetContext(); Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE); diff --git a/packages/WallpaperBackup/test/src/com/android/wallpaperbackup/WallpaperEventLoggerTest.java b/packages/WallpaperBackup/test/src/com/android/wallpaperbackup/WallpaperEventLoggerTest.java index 3816a3ccc1eb..383bf2f68217 100644 --- a/packages/WallpaperBackup/test/src/com/android/wallpaperbackup/WallpaperEventLoggerTest.java +++ b/packages/WallpaperBackup/test/src/com/android/wallpaperbackup/WallpaperEventLoggerTest.java @@ -21,16 +21,14 @@ import static com.android.wallpaperbackup.WallpaperEventLogger.WALLPAPER_IMG_SYS import static com.android.wallpaperbackup.WallpaperEventLogger.WALLPAPER_LIVE_LOCK; import static com.android.wallpaperbackup.WallpaperEventLogger.WALLPAPER_LIVE_SYSTEM; +import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.WallpaperInfo; +import android.app.backup.BackupAnnotations; import android.app.backup.BackupManager; import android.app.backup.BackupRestoreEventLogger; import android.content.Context; @@ -42,8 +40,6 @@ import android.service.wallpaper.WallpaperService; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; -import com.android.wallpaperbackup.utils.TestWallpaperService; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -55,8 +51,7 @@ import java.util.List; @RunWith(AndroidJUnit4.class) public class WallpaperEventLoggerTest { - @Mock - private BackupRestoreEventLogger mMockLogger; + private BackupRestoreEventLogger mEventLogger; @Mock private BackupManager mMockBackupManager; @@ -73,8 +68,8 @@ public class WallpaperEventLoggerTest { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - when(mMockBackupAgent.getBackupRestoreEventLogger()).thenReturn(mMockLogger); - when(mMockBackupManager.getBackupRestoreEventLogger(any())).thenReturn(mMockLogger); + when(mMockBackupAgent.getBackupRestoreEventLogger()).thenReturn(mEventLogger); + when(mMockBackupManager.getBackupRestoreEventLogger(any())).thenReturn(mEventLogger); mWallpaperInfo = getWallpaperInfo(); mWallpaperEventLogger = new WallpaperEventLogger(mMockBackupManager, mMockBackupAgent); @@ -82,115 +77,339 @@ public class WallpaperEventLoggerTest { @Test public void onSystemImgWallpaperBackedUp_logsSuccess() { + setUpLoggerForBackup(); + mWallpaperEventLogger.onSystemImageWallpaperBackedUp(); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM); - verify(mMockLogger).logItemsBackedUp(eq(WALLPAPER_IMG_SYSTEM), eq(1)); + assertThat(result).isNotNull(); + assertThat(result.getSuccessCount()).isEqualTo(1); } @Test public void onLockImgWallpaperBackedUp_logsSuccess() { + setUpLoggerForBackup(); + mWallpaperEventLogger.onLockImageWallpaperBackedUp(); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK); - verify(mMockLogger).logItemsBackedUp(eq(WALLPAPER_IMG_LOCK), eq(1)); + assertThat(result).isNotNull(); + assertThat(result.getSuccessCount()).isEqualTo(1); } @Test public void onSystemLiveWallpaperBackedUp_logsSuccess() { + setUpLoggerForBackup(); + mWallpaperEventLogger.onSystemLiveWallpaperBackedUp(mWallpaperInfo); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM); - verify(mMockLogger).logItemsBackedUp(eq(WALLPAPER_LIVE_SYSTEM), eq(1)); + assertThat(result).isNotNull(); + assertThat(result.getSuccessCount()).isEqualTo(1); } @Test public void onLockLiveWallpaperBackedUp_logsSuccess() { + setUpLoggerForBackup(); + mWallpaperEventLogger.onLockLiveWallpaperBackedUp(mWallpaperInfo); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_LOCK); - verify(mMockLogger).logItemsBackedUp(eq(WALLPAPER_LIVE_LOCK), eq(1)); + assertThat(result).isNotNull(); + assertThat(result.getSuccessCount()).isEqualTo(1); } @Test public void onImgWallpaperBackedUp_nullInfo_doesNotLogMetadata() { + setUpLoggerForBackup(); + mWallpaperEventLogger.onSystemImageWallpaperBackedUp(); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM); - verify(mMockLogger, never()).logBackupMetadata(eq(WALLPAPER_IMG_SYSTEM), anyString()); + assertThat(result).isNotNull(); + assertThat(result.getMetadataHash()).isNull(); } @Test public void onLiveWallpaperBackedUp_logsMetadata() { + setUpLoggerForBackup(); + mWallpaperEventLogger.onSystemLiveWallpaperBackedUp(mWallpaperInfo); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM); - verify(mMockLogger).logBackupMetadata(eq(WALLPAPER_LIVE_SYSTEM), - eq(TestWallpaperService.class.getName())); + assertThat(result).isNotNull(); + assertThat(result.getMetadataHash()).isNotNull(); } @Test public void onSystemImgWallpaperBackupFailed_logsFail() { + setUpLoggerForBackup(); + mWallpaperEventLogger.onSystemImageWallpaperBackupFailed(WALLPAPER_ERROR); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM); - verify(mMockLogger).logItemsBackupFailed(eq(WALLPAPER_IMG_SYSTEM), eq(1), - eq(WALLPAPER_ERROR)); + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR); } @Test public void onLockImgWallpaperBackupFailed_logsFail() { + setUpLoggerForBackup(); + mWallpaperEventLogger.onLockImageWallpaperBackupFailed(WALLPAPER_ERROR); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK); - verify(mMockLogger).logItemsBackupFailed(eq(WALLPAPER_IMG_LOCK), eq(1), - eq(WALLPAPER_ERROR)); + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR); } @Test public void onSystemLiveWallpaperBackupFailed_logsFail() { + setUpLoggerForBackup(); + mWallpaperEventLogger.onSystemLiveWallpaperBackupFailed(WALLPAPER_ERROR); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM); - verify(mMockLogger).logItemsBackupFailed(eq(WALLPAPER_LIVE_SYSTEM), eq(1), - eq(WALLPAPER_ERROR)); + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR); } @Test public void onLockLiveWallpaperBackupFailed_logsFail() { + setUpLoggerForBackup(); + mWallpaperEventLogger.onLockLiveWallpaperBackupFailed(WALLPAPER_ERROR); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_LOCK); - verify(mMockLogger).logItemsBackupFailed(eq(WALLPAPER_LIVE_LOCK), eq(1), - eq(WALLPAPER_ERROR)); + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR); } @Test public void onWallpaperBackupException_someProcessed_doesNotLogErrorForProcessedType() { + setUpLoggerForBackup(); mWallpaperEventLogger.onSystemImageWallpaperBackedUp(); mWallpaperEventLogger.onBackupException(new Exception()); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM); - verify(mMockLogger, never()).logItemsBackupFailed(eq(WALLPAPER_IMG_SYSTEM), anyInt(), - anyString()); + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(0); } @Test public void onWallpaperBackupException_someProcessed_logsErrorForUnprocessedType() { + setUpLoggerForBackup(); mWallpaperEventLogger.onSystemImageWallpaperBackedUp(); mWallpaperEventLogger.onBackupException(new Exception()); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK); - verify(mMockLogger).logItemsBackupFailed(eq(WALLPAPER_IMG_LOCK), eq(1), - eq(Exception.class.getName())); - + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); } @Test - public void onWallpaperBackupException_liveTypeProcessed_doesNotLogErrorForSameImgType() { + public void onWallpaperBackupException_liveTypeProcessed_doesNotLogForSameImgType() { + setUpLoggerForBackup(); mWallpaperEventLogger.onSystemLiveWallpaperBackedUp(mWallpaperInfo); mWallpaperEventLogger.onBackupException(new Exception()); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM); + + assertThat(result).isNull(); + } + + @Test + public void onSystemImgWallpaperRestored_logsSuccess() { + setUpLoggerForRestore(); + + mWallpaperEventLogger.onSystemImageWallpaperRestored(); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM); + + assertThat(result).isNotNull(); + assertThat(result.getSuccessCount()).isEqualTo(1); + } + + @Test + public void onLockImgWallpaperRestored_logsSuccess() { + setUpLoggerForRestore(); + + mWallpaperEventLogger.onLockImageWallpaperRestored(); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK); - verify(mMockLogger, never()).logItemsBackupFailed(eq(WALLPAPER_IMG_SYSTEM), anyInt(), - anyString()); + assertThat(result).isNotNull(); + assertThat(result.getSuccessCount()).isEqualTo(1); } + @Test + public void onSystemLiveWallpaperRestored_logsSuccess() { + setUpLoggerForRestore(); + + mWallpaperEventLogger.onSystemLiveWallpaperRestored(mWallpaperInfo.getComponent()); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM); + + assertThat(result).isNotNull(); + assertThat(result.getSuccessCount()).isEqualTo(1); + } + + @Test + public void onLockLiveWallpaperRestored_logsSuccess() { + setUpLoggerForRestore(); + + mWallpaperEventLogger.onLockLiveWallpaperRestored(mWallpaperInfo.getComponent()); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_LOCK); + + assertThat(result).isNotNull(); + assertThat(result.getSuccessCount()).isEqualTo(1); + } + + @Test + public void onImgWallpaperRestored_nullInfo_doesNotLogMetadata() { + setUpLoggerForRestore(); + + mWallpaperEventLogger.onSystemImageWallpaperRestored(); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM); + + assertThat(result).isNotNull(); + assertThat(result.getMetadataHash()).isNull(); + } + + + @Test + public void onLiveWallpaperRestored_logsMetadata() { + setUpLoggerForRestore(); + + mWallpaperEventLogger.onSystemLiveWallpaperRestored(mWallpaperInfo.getComponent()); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM); + + assertThat(result).isNotNull(); + assertThat(result.getMetadataHash()).isNotNull(); + } + + + @Test + public void onSystemImgWallpaperRestoreFailed_logsFail() { + setUpLoggerForRestore(); + + mWallpaperEventLogger.onSystemImageWallpaperRestoreFailed(WALLPAPER_ERROR); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM); + + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR); + } + + @Test + public void onLockImgWallpaperRestoreFailed_logsFail() { + setUpLoggerForRestore(); + + mWallpaperEventLogger.onLockImageWallpaperRestoreFailed(WALLPAPER_ERROR); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK); + + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR); + } + + + @Test + public void onSystemLiveWallpaperRestoreFailed_logsFail() { + setUpLoggerForRestore(); + + mWallpaperEventLogger.onSystemLiveWallpaperRestoreFailed(WALLPAPER_ERROR); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM); + + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR); + } + + @Test + public void onLockLiveWallpaperRestoreFailed_logsFail() { + setUpLoggerForRestore(); + + mWallpaperEventLogger.onLockLiveWallpaperRestoreFailed(WALLPAPER_ERROR); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_LOCK); + + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR); + } + + + @Test + public void onWallpaperRestoreException_someProcessed_doesNotLogErrorForProcessedType() { + setUpLoggerForRestore(); + mWallpaperEventLogger.onSystemImageWallpaperRestored(); + + mWallpaperEventLogger.onRestoreException(new Exception()); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM); + + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(0); + } + + + @Test + public void onWallpaperRestoreException_someProcessed_logsErrorForUnprocessedType() { + setUpLoggerForRestore(); + mWallpaperEventLogger.onSystemImageWallpaperRestored(); + + mWallpaperEventLogger.onRestoreException(new Exception()); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK); + + assertThat(result).isNotNull(); + assertThat(result.getFailCount()).isEqualTo(1); + } + + @Test + public void onWallpaperRestoreException_liveTypeProcessed_doesNotLogForSameImgType() { + setUpLoggerForRestore(); + mWallpaperEventLogger.onSystemLiveWallpaperRestored(mWallpaperInfo.getComponent()); + + mWallpaperEventLogger.onRestoreException(new Exception()); + BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM); + + assertThat(result).isNull(); + } + + private BackupRestoreEventLogger.DataTypeResult getLogsForType(String dataType) { + for (BackupRestoreEventLogger.DataTypeResult result : mEventLogger.getLoggingResults()) { + if ((result.getDataType()).equals(dataType)) { + return result; + } + } + return null; + } + + private void setUpLoggerForBackup() { + mEventLogger = new BackupRestoreEventLogger(BackupAnnotations.OperationType.BACKUP); + createEventLogger(); + } + + private void setUpLoggerForRestore() { + mEventLogger = new BackupRestoreEventLogger(BackupAnnotations.OperationType.RESTORE); + createEventLogger(); + } + + private void createEventLogger() { + when(mMockBackupAgent.getBackupRestoreEventLogger()).thenReturn(mEventLogger); + when(mMockBackupManager.getBackupRestoreEventLogger(any())).thenReturn(mEventLogger); + + mWallpaperEventLogger = new WallpaperEventLogger(mMockBackupManager, mMockBackupAgent); + } + + private WallpaperInfo getWallpaperInfo() throws Exception { Context context = InstrumentationRegistry.getTargetContext(); Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE); |