diff options
2 files changed, 209 insertions, 8 deletions
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index c1c3e04d46fd..14b2dfe414a4 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -214,6 +214,17 @@ public class SettingsBackupAgent extends BackupAgentHelper { "failed_to_restore_softap_config"; private static final String ERROR_FAILED_TO_RESTORE_WIFI_CONFIG = "failed_to_restore_wifi_config"; + private static final String ERROR_FAILED_TO_RESTORE_SIM_SPECIFIC_SETTINGS = + "failed_to_restore_sim_specific_settings"; + private static final String ERROR_FAILED_TO_CONVERT_NETWORK_POLICIES = + "failed_to_convert_network_policies"; + private static final String ERROR_UNKNOWN_BACKUP_SERIALIZATION_VERSION = + "unknown_backup_serialization_version"; + private static final String INTERRUPTED_EXCEPTION = "interrupted_exception"; + private static final String ERROR_FAILED_TO_RETRIEVE_WIFI_SETTINGS_BACKUP_DATA = + "failed_to_retrieve_wifi_settings_backup_data"; + private static final String ERROR_FAILED_TO_RESTORE_WIFI_SETTINGS_BACKUP_DATA = + "failed_to_restore_wifi_settings_backup_data"; // Name of the temporary file we use during full backup/restore. This is @@ -1436,6 +1447,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { try { out.writeInt(NETWORK_POLICIES_BACKUP_VERSION); out.writeInt(policies.length); + int numberOfPoliciesBackedUp = 0; for (NetworkPolicy policy : policies) { // We purposefully only backup policies that the user has // defined; any inferred policies might include @@ -1445,13 +1457,25 @@ public class SettingsBackupAgent extends BackupAgentHelper { out.writeByte(BackupUtils.NOT_NULL); out.writeInt(marshaledPolicy.length); out.write(marshaledPolicy); + if (areAgentMetricsEnabled) { + numberOfPoliciesBackedUp++; + } } else { out.writeByte(BackupUtils.NULL); } } + if (areAgentMetricsEnabled) { + numberOfSettingsPerKey.put(KEY_NETWORK_POLICIES, numberOfPoliciesBackedUp); + } } catch (IOException ioe) { Log.e(TAG, "Failed to convert NetworkPolicies to byte array " + ioe.getMessage()); baos.reset(); + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger.logItemsBackupFailed( + KEY_NETWORK_POLICIES, + policies.length, + ERROR_FAILED_TO_CONVERT_NETWORK_POLICIES); + } } } return baos.toByteArray(); @@ -1502,6 +1526,12 @@ public class SettingsBackupAgent extends BackupAgentHelper { try { int version = in.readInt(); if (version < 1 || version > NETWORK_POLICIES_BACKUP_VERSION) { + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger.logItemsRestoreFailed( + KEY_NETWORK_POLICIES, + /* count= */ 1, + ERROR_UNKNOWN_BACKUP_SERIALIZATION_VERSION); + } throw new BackupUtils.BadVersionException( "Unknown Backup Serialization Version"); } @@ -1518,10 +1548,20 @@ public class SettingsBackupAgent extends BackupAgentHelper { } // Only set the policies if there was no error in the restore operation networkPolicyManager.setNetworkPolicies(policies); + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger + .logItemsRestored(KEY_NETWORK_POLICIES, policies.length); + } } catch (NullPointerException | IOException | BackupUtils.BadVersionException | DateTimeException e) { // NPE can be thrown when trying to instantiate a NetworkPolicy Log.e(TAG, "Failed to convert byte array to NetworkPolicies " + e.getMessage()); + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger.logItemsRestoreFailed( + KEY_NETWORK_POLICIES, + /* count= */ 1, + ERROR_FAILED_TO_CONVERT_NETWORK_POLICIES); + } } } } @@ -1592,7 +1632,8 @@ public class SettingsBackupAgent extends BackupAgentHelper { return true; } - private byte[] getSimSpecificSettingsData() { + @VisibleForTesting + byte[] getSimSpecificSettingsData() { byte[] simSpecificData = new byte[0]; PackageManager packageManager = getBaseContext().getPackageManager(); if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { @@ -1600,17 +1641,36 @@ public class SettingsBackupAgent extends BackupAgentHelper { simSpecificData = subManager.getAllSimSpecificSettingsForBackup(); Log.i(TAG, "sim specific data of length + " + simSpecificData.length + " successfully retrieved"); + if (areAgentMetricsEnabled) { + // We're unable to determine how many settings this includes, so we'll just log 1. + numberOfSettingsPerKey.put(KEY_SIM_SPECIFIC_SETTINGS_2, 1); + } } return simSpecificData; } - private void restoreSimSpecificSettings(byte[] data) { + @VisibleForTesting + void restoreSimSpecificSettings(byte[] data) { PackageManager packageManager = getBaseContext().getPackageManager(); boolean hasTelephony = packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); if (hasTelephony) { SubscriptionManager subManager = SubscriptionManager.from(getBaseContext()); - subManager.restoreAllSimSpecificSettingsFromBackup(data); + if (areAgentMetricsEnabled) { + try { + subManager.restoreAllSimSpecificSettingsFromBackup(data); + mBackupRestoreEventLogger + .logItemsRestored(KEY_SIM_SPECIFIC_SETTINGS_2, /* count= */ 1); + } catch (Exception e) { + mBackupRestoreEventLogger + .logItemsRestoreFailed( + KEY_SIM_SPECIFIC_SETTINGS_2, + /* count= */ 1, + ERROR_FAILED_TO_RESTORE_SIM_SPECIFIC_SETTINGS); + } + } else { + subManager.restoreAllSimSpecificSettingsFromBackup(data); + } } } @@ -1637,20 +1697,49 @@ public class SettingsBackupAgent extends BackupAgentHelper { }); // cts requires B&R with 10 seconds if (latch.await(10, TimeUnit.SECONDS) && backupWifiData.value != null) { + if (areAgentMetricsEnabled) { + numberOfSettingsPerKey.put(KEY_WIFI_SETTINGS_BACKUP_DATA, 1); + } return backupWifiData.value; } } catch (InterruptedException ie) { Log.e(TAG, "fail to retrieveWifiBackupData, " + ie); + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger.logItemsBackupFailed( + KEY_WIFI_SETTINGS_BACKUP_DATA, + /* count= */ 1, + INTERRUPTED_EXCEPTION); + } } Log.e(TAG, "fail to retrieveWifiBackupData"); + if (areAgentMetricsEnabled) { + mBackupRestoreEventLogger.logItemsBackupFailed( + KEY_WIFI_SETTINGS_BACKUP_DATA, + /* count= */ 1, + ERROR_FAILED_TO_RETRIEVE_WIFI_SETTINGS_BACKUP_DATA); + } return new byte[0]; } - private void restoreWifiData(byte[] data) { + @VisibleForTesting + void restoreWifiData(byte[] data) { if (DEBUG_BACKUP) { Log.v(TAG, "Applying restored all wifi data"); } - mWifiManager.restoreWifiBackupData(data); + if (areAgentMetricsEnabled) { + try { + mWifiManager.restoreWifiBackupData(data); + mBackupRestoreEventLogger.logItemsRestored( + KEY_WIFI_SETTINGS_BACKUP_DATA, /* count= */ 1); + } catch (Exception e) { + mBackupRestoreEventLogger.logItemsRestoreFailed( + KEY_WIFI_SETTINGS_BACKUP_DATA, + /* count= */ 1, + ERROR_FAILED_TO_RESTORE_WIFI_SETTINGS_BACKUP_DATA); + } + } else { + mWifiManager.restoreWifiBackupData(data); + } } private void updateWindowManagerIfNeeded(Integer previousDensity) { diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java index 6e5b602c02c5..48c360b635ea 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java @@ -18,6 +18,8 @@ package com.android.providers.settings; import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_WIFI_NEW_CONFIG; import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_SOFTAP_CONFIG; +import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_SIM_SPECIFIC_SETTINGS_2; +import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_WIFI_SETTINGS_BACKUP_DATA; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; @@ -59,6 +61,7 @@ import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.provider.settings.validators.SettingsValidators; import android.provider.settings.validators.Validator; +import android.telephony.SubscriptionManager; import android.test.mock.MockContentProvider; import android.test.mock.MockContentResolver; @@ -136,6 +139,7 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest { @Mock private BackupDataInput mBackupDataInput; @Mock private BackupDataOutput mBackupDataOutput; @Mock private static WifiManager mWifiManager; + @Mock private static SubscriptionManager mSubscriptionManager; private TestFriendlySettingsBackupAgent mAgentUnderTest; private Context mContext; @@ -906,6 +910,110 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest { assertNull(getLoggingResultForDatatype(KEY_WIFI_NEW_CONFIG, mAgentUnderTest)); } + @Test + @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + getSimSpecificSettingsData_agentMetricsAreEnabled_numberOfSettingsInKeyAreRecorded() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.BACKUP); + when(mSubscriptionManager.getAllSimSpecificSettingsForBackup()).thenReturn(new byte[0]); + + mAgentUnderTest.getSimSpecificSettingsData(); + + assertEquals(mAgentUnderTest.getNumberOfSettingsPerKey(KEY_SIM_SPECIFIC_SETTINGS_2), 1); + } + + @Test + @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + restoreSimSpecificSettings_agentMetricsAreEnabled_restoreIsSuccessful_successMetricsAreLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doNothing().when(mSubscriptionManager).restoreAllSimSpecificSettingsFromBackup(any()); + + mAgentUnderTest.restoreSimSpecificSettings(new byte[0]); + + DataTypeResult loggingResult = + getLoggingResultForDatatype(KEY_SIM_SPECIFIC_SETTINGS_2, mAgentUnderTest); + assertNotNull(loggingResult); + assertEquals(loggingResult.getSuccessCount(), 1); + } + + @Test + @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + restoreSimSpecificSettings_agentMetricsAreEnabled_restoreIsNotSuccessful_failureMetricsAreLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doThrow(new RuntimeException()) + .when(mSubscriptionManager) + .restoreAllSimSpecificSettingsFromBackup(any()); + + mAgentUnderTest.restoreSimSpecificSettings(new byte[0]); + + DataTypeResult loggingResult = + getLoggingResultForDatatype(KEY_SIM_SPECIFIC_SETTINGS_2, mAgentUnderTest); + assertNotNull(loggingResult); + assertEquals(loggingResult.getFailCount(), 1); + } + + @Test + @DisableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + restoreSimSpecificSettings_agentMetricsAreNotEnabled_metricsAreNotLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doNothing().when(mSubscriptionManager).restoreAllSimSpecificSettingsFromBackup(any()); + + mAgentUnderTest.restoreSimSpecificSettings(new byte[0]); + + assertNull(getLoggingResultForDatatype(KEY_SIM_SPECIFIC_SETTINGS_2, mAgentUnderTest)); + } + + @Test + @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + restoreWifiData_agentMetricsAreEnabled_restoreIsSuccessful_successMetricsAreLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doNothing().when(mWifiManager).restoreWifiBackupData(any()); + + mAgentUnderTest.restoreWifiData(new byte[0]); + + DataTypeResult loggingResult = + getLoggingResultForDatatype(KEY_WIFI_SETTINGS_BACKUP_DATA, mAgentUnderTest); + assertNotNull(loggingResult); + assertEquals(loggingResult.getSuccessCount(), 1); + } + + @Test + @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void + restoreWifiData_agentMetricsAreEnabled_restoreIsNotSuccessful_failureMetricsAreLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doThrow(new RuntimeException()).when(mWifiManager).restoreWifiBackupData(any()); + + mAgentUnderTest.restoreWifiData(new byte[0]); + + DataTypeResult loggingResult = + getLoggingResultForDatatype(KEY_WIFI_SETTINGS_BACKUP_DATA, mAgentUnderTest); + assertNotNull(loggingResult); + assertEquals(loggingResult.getFailCount(), 1); + } + + @Test + @DisableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS) + public void restoreWifiData_agentMetricsAreDisabled_metricsAreNotLogged() { + mAgentUnderTest.onCreate( + UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE); + doNothing().when(mWifiManager).restoreWifiBackupData(any()); + + mAgentUnderTest.restoreWifiData(new byte[0]); + + assertNull(getLoggingResultForDatatype(KEY_WIFI_SETTINGS_BACKUP_DATA, mAgentUnderTest)); + } + private byte[] generateBackupData(Map<String, String> keyValueData) { int totalBytes = 0; for (String key : keyValueData.keySet()) { @@ -1106,10 +1214,14 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest { @Override public Object getSystemService(String name) { - if (name.equals(Context.WIFI_SERVICE)) { - return mWifiManager; + switch (name) { + case Context.WIFI_SERVICE: + return mWifiManager; + case Context.TELEPHONY_SUBSCRIPTION_SERVICE: + return mSubscriptionManager; + default: + return super.getSystemService(name); } - return super.getSystemService(name); } } |