summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java99
-rw-r--r--packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java118
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);
}
}