From 9553855af4f6532c2499309f5c6318c01f4b4ace Mon Sep 17 00:00:00 2001 From: Lei Yu Date: Wed, 4 Apr 2018 12:16:18 -0700 Subject: [PATCH] Add test for anomaly detection in P Lot of tests have been added already, this CL adds the missing tests after robolectric upgrade. Also add UID_NULL check in AnomalyDetectionJobService. It is almost impossible to happen however we better catch it. Bug: 73172999 Test: RunSettingsRoboTests Change-Id: I950537efb166b0900393df1321ca64151b43e906 --- .../batterytip/AnomalyConfigReceiver.java | 9 ---- .../AnomalyDetectionJobService.java | 10 ++-- .../AnomalyDetectionJobServiceTest.java | 54 +++++++++++++++++++ 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java index dcacaae3f06..bad1c11b4fb 100644 --- a/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java +++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java @@ -48,13 +48,4 @@ public class AnomalyConfigReceiver extends BroadcastReceiver { } } } - - @VisibleForTesting - void uploadPendingIntent(StatsManager statsManager, PendingIntent pendingIntent) { - Log.i(TAG, "Upload PendingIntent to StatsManager. configKey: " - + StatsManagerConfig.ANOMALY_CONFIG_KEY + " subId: " - + StatsManagerConfig.SUBSCRIBER_ID); - statsManager.setBroadcastSubscriber(StatsManagerConfig.ANOMALY_CONFIG_KEY, - StatsManagerConfig.SUBSCRIBER_ID, pendingIntent); - } } diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java index 2b041734b80..7720dcc12e2 100644 --- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java +++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java @@ -59,9 +59,11 @@ import java.util.concurrent.TimeUnit; /** A JobService to store anomaly data to anomaly database */ public class AnomalyDetectionJobService extends JobService { private static final String TAG = "AnomalyDetectionService"; - private static final int UID_NULL = 0; - private static final int STATSD_UID_FILED = 1; private static final int ON = 1; + @VisibleForTesting + static final int UID_NULL = -1; + @VisibleForTesting + static final int STATSD_UID_FILED = 1; @VisibleForTesting static final long MAX_DELAY_MS = TimeUnit.MINUTES.toMillis(30); @@ -143,7 +145,8 @@ public class AnomalyDetectionJobService extends JobService { : Settings.Global.getInt(contentResolver, Settings.Global.APP_AUTO_RESTRICTION_ENABLED, ON) == ON; final String packageName = batteryUtils.getPackageName(uid); - if (!isSystemUid(uid) && !powerWhitelistBackend.isSysWhitelistedExceptIdle( + if (uid != UID_NULL && !isSystemUid(uid) + && !powerWhitelistBackend.isSysWhitelistedExceptIdle( packageManager.getPackagesForUid(uid))) { boolean anomalyDetected = true; if (anomalyInfo.anomalyType @@ -191,7 +194,6 @@ public class AnomalyDetectionJobService extends JobService { */ @VisibleForTesting int extractUidFromStatsDimensionsValue(StatsDimensionsValue statsDimensionsValue) { - //TODO(b/73172999): Add robo test for this method if (statsDimensionsValue == null) { return UID_NULL; } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java index dbca602a567..55a8f4ea08e 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java @@ -16,6 +16,10 @@ package com.android.settings.fuelgauge.batterytip; +import static android.os.StatsDimensionsValue.FLOAT_VALUE_TYPE; +import static android.os.StatsDimensionsValue.INT_VALUE_TYPE; +import static android.os.StatsDimensionsValue.TUPLE_VALUE_TYPE; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; @@ -24,9 +28,11 @@ import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.robolectric.RuntimeEnvironment.application; import android.app.StatsManager; @@ -35,6 +41,8 @@ import android.app.job.JobScheduler; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.os.Parcel; +import android.os.Parcelable; import android.os.Process; import android.os.StatsDimensionsValue; import android.os.UserManager; @@ -148,6 +156,21 @@ public class AnomalyDetectionJobServiceTest { anyInt(), anyLong()); } + @Test + public void testSaveAnomalyToDatabase_uidNull_doNotSave() { + doReturn(AnomalyDetectionJobService.UID_NULL).when( + mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any()); + + mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper, + mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy, + mPowerWhitelistBackend, mContext.getContentResolver(), + mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider, + mBundle); + + verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(), + anyInt(), anyLong()); + } + @Test public void testSaveAnomalyToDatabase_normalAppWithAutoRestriction_save() { final ArrayList cookies = new ArrayList<>(); @@ -196,4 +219,35 @@ public class AnomalyDetectionJobServiceTest { SYSTEM_PACKAGE, Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, ANOMALY_TYPE)); } + + @Test + public void testExtractUidFromStatsDimensionsValue_extractCorrectUid() { + // Build an integer dimensions value. + final StatsDimensionsValue intValue = mock(StatsDimensionsValue.class); + when(intValue.isValueType(INT_VALUE_TYPE)).thenReturn(true); + when(intValue.getField()).thenReturn(AnomalyDetectionJobService.STATSD_UID_FILED); + when(intValue.getIntValue()).thenReturn(UID); + + // Build a tuple dimensions value and put the previous integer dimensions value inside. + final StatsDimensionsValue tupleValue = mock(StatsDimensionsValue.class); + when(tupleValue.isValueType(TUPLE_VALUE_TYPE)).thenReturn(true); + final List statsDimensionsValues = new ArrayList<>(); + statsDimensionsValues.add(intValue); + when(tupleValue.getTupleValueList()).thenReturn(statsDimensionsValues); + + assertThat(mAnomalyDetectionJobService.extractUidFromStatsDimensionsValue( + tupleValue)).isEqualTo(UID); + } + + @Test + public void testExtractUidFromStatsDimensionsValue_wrongFormat_returnNull() { + // Build a float dimensions value + final StatsDimensionsValue floatValue = mock(StatsDimensionsValue.class); + when(floatValue.isValueType(FLOAT_VALUE_TYPE)).thenReturn(true); + when(floatValue.getField()).thenReturn(AnomalyDetectionJobService.STATSD_UID_FILED); + when(floatValue.getFloatValue()).thenReturn(0f); + + assertThat(mAnomalyDetectionJobService.extractUidFromStatsDimensionsValue( + floatValue)).isEqualTo(AnomalyDetectionJobService.UID_NULL); + } }