Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9553855a authored by Lei Yu's avatar Lei Yu
Browse files

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
parent 78e2cad8
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -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);
    }
}
+6 −4
Original line number Diff line number Diff line
@@ -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;
        }
+54 −0
Original line number Diff line number Diff line
@@ -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<String> 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<StatsDimensionsValue> 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);
    }
}