Merge "Hook up the anomaly policy to wakelockanomaly"

This commit is contained in:
TreeHugger Robot
2017-05-23 18:12:16 +00:00
committed by Android (Google) Code Review
6 changed files with 49 additions and 7 deletions

View File

@@ -31,6 +31,7 @@ import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.anomaly.Anomaly; import com.android.settings.fuelgauge.anomaly.Anomaly;
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -40,17 +41,24 @@ import java.util.List;
*/ */
public class WakeLockAnomalyDetector implements AnomalyDetector { public class WakeLockAnomalyDetector implements AnomalyDetector {
private static final String TAG = "WakeLockAnomalyChecker"; private static final String TAG = "WakeLockAnomalyChecker";
// TODO: get threshold form server side
private static final long WAKE_LOCK_THRESHOLD_MS = 2 * DateUtils.MINUTE_IN_MILLIS;
private PackageManager mPackageManager; private PackageManager mPackageManager;
private Context mContext; private Context mContext;
@VisibleForTesting @VisibleForTesting
BatteryUtils mBatteryUtils; BatteryUtils mBatteryUtils;
@VisibleForTesting
long mWakeLockThresholdMs;
public WakeLockAnomalyDetector(Context context) { public WakeLockAnomalyDetector(Context context) {
this(context, new AnomalyDetectionPolicy(context));
}
@VisibleForTesting
WakeLockAnomalyDetector(Context context, AnomalyDetectionPolicy policy) {
mContext = context; mContext = context;
mPackageManager = context.getPackageManager(); mPackageManager = context.getPackageManager();
mBatteryUtils = BatteryUtils.getInstance(context); mBatteryUtils = BatteryUtils.getInstance(context);
mWakeLockThresholdMs = policy.wakeLockThreshold;
} }
@Override @Override
@@ -82,7 +90,7 @@ public class WakeLockAnomalyDetector implements AnomalyDetector {
// Report it if wakelock time is too long and it is not a hidden batterysipper // Report it if wakelock time is too long and it is not a hidden batterysipper
// TODO: add more attributes to detect wakelock anomaly // TODO: add more attributes to detect wakelock anomaly
if (maxPartialWakeLockMs > WAKE_LOCK_THRESHOLD_MS if (maxPartialWakeLockMs > mWakeLockThresholdMs
&& !mBatteryUtils.shouldHideSipper(sipper)) { && !mBatteryUtils.shouldHideSipper(sipper)) {
final String packageName = mBatteryUtils.getPackageName(uid.getUid()); final String packageName = mBatteryUtils.getPackageName(uid.getUid());
final CharSequence displayName = Utils.getApplicationLabel(mContext, final CharSequence displayName = Utils.getApplicationLabel(mContext,

View File

@@ -49,6 +49,7 @@ public class AnomalyLoaderTest {
private Context mContext; private Context mContext;
@Mock @Mock
private BatteryStatsHelper mBatteryStatsHelper; private BatteryStatsHelper mBatteryStatsHelper;
@Mock
private WakeLockAnomalyDetector mWakeLockAnomalyDetector; private WakeLockAnomalyDetector mWakeLockAnomalyDetector;
private Anomaly mWakeLockAnomaly; private Anomaly mWakeLockAnomaly;
private List<Anomaly> mWakeLockAnomalies; private List<Anomaly> mWakeLockAnomalies;
@@ -62,7 +63,6 @@ public class AnomalyLoaderTest {
FakeFeatureFactory.setupForTest(mContext); FakeFeatureFactory.setupForTest(mContext);
mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
mWakeLockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext));
mWakeLockAnomalies = new ArrayList<>(); mWakeLockAnomalies = new ArrayList<>();
mWakeLockAnomaly = new Anomaly.Builder() mWakeLockAnomaly = new Anomaly.Builder()
.setType(Anomaly.AnomalyType.WAKE_LOCK) .setType(Anomaly.AnomalyType.WAKE_LOCK)

View File

@@ -22,6 +22,7 @@ import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.fuelgauge.anomaly.action.ForceStopAction; import com.android.settings.fuelgauge.anomaly.action.ForceStopAction;
import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector; import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
import com.android.settings.testutils.shadow.ShadowKeyValueListParserWrapperImpl;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -30,7 +31,8 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {
ShadowKeyValueListParserWrapperImpl.class})
public class AnomalyUtilsTest { public class AnomalyUtilsTest {
private AnomalyUtils mAnomalyUtils; private AnomalyUtils mAnomalyUtils;

View File

@@ -39,6 +39,7 @@ import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.anomaly.Anomaly; import com.android.settings.fuelgauge.anomaly.Anomaly;
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -47,6 +48,7 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -54,8 +56,9 @@ import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class WakeLockAnomalyDetectorTest { public class WakeLockAnomalyDetectorTest {
private static final long ANOMALY_WAKELOCK_TIME_MS = DateUtils.HOUR_IN_MILLIS; private static final long ANOMALY_WAKELOCK_TIME_MS = 2 * DateUtils.HOUR_IN_MILLIS;
private static final long NORMAL_WAKELOCK_TIME_MS = DateUtils.SECOND_IN_MILLIS; private static final long NORMAL_WAKELOCK_TIME_MS = DateUtils.SECOND_IN_MILLIS;
private static final long WAKELOCK_THRESHOLD_MS = DateUtils.HOUR_IN_MILLIS;
private static final int ANOMALY_UID = 111; private static final int ANOMALY_UID = 111;
private static final int NORMAL_UID = 222; private static final int NORMAL_UID = 222;
@Mock @Mock
@@ -82,6 +85,8 @@ public class WakeLockAnomalyDetectorTest {
private PackageManager mPackageManager; private PackageManager mPackageManager;
@Mock @Mock
private ApplicationInfo mApplicationInfo; private ApplicationInfo mApplicationInfo;
@Mock
private AnomalyDetectionPolicy mPolicy;
private ArrayMap<String, BatteryStats.Uid.Wakelock> mAnomalyWakelocks; private ArrayMap<String, BatteryStats.Uid.Wakelock> mAnomalyWakelocks;
private ArrayMap<String, BatteryStats.Uid.Wakelock> mNormalWakelocks; private ArrayMap<String, BatteryStats.Uid.Wakelock> mNormalWakelocks;
@@ -94,6 +99,7 @@ public class WakeLockAnomalyDetectorTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
ReflectionHelpers.setField(mPolicy, "wakeLockThreshold", WAKELOCK_THRESHOLD_MS);
doReturn(false).when(mBatteryUtils).shouldHideSipper(any()); doReturn(false).when(mBatteryUtils).shouldHideSipper(any());
doReturn(mPackageManager).when(mContext).getPackageManager(); doReturn(mPackageManager).when(mContext).getPackageManager();
@@ -118,7 +124,7 @@ public class WakeLockAnomalyDetectorTest {
mUsageList.add(mNormalSipper); mUsageList.add(mNormalSipper);
doReturn(mUsageList).when(mBatteryStatsHelper).getUsageList(); doReturn(mUsageList).when(mBatteryStatsHelper).getUsageList();
mWakelockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext)); mWakelockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext, mPolicy));
mWakelockAnomalyDetector.mBatteryUtils = mBatteryUtils; mWakelockAnomalyDetector.mBatteryUtils = mBatteryUtils;
doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector).getTotalDurationMs( doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector).getTotalDurationMs(
eq(mAnomalyTimer), anyLong()); eq(mAnomalyTimer), anyLong());
@@ -137,4 +143,9 @@ public class WakeLockAnomalyDetectorTest {
assertThat(mAnomalies).containsExactly(anomaly); assertThat(mAnomalies).containsExactly(anomaly);
} }
@Test
public void testContainsThresholdFromPolicy() {
assertThat(mWakelockAnomalyDetector.mWakeLockThresholdMs).isEqualTo(WAKELOCK_THRESHOLD_MS);
}
} }

View File

@@ -37,6 +37,7 @@ import com.android.settings.core.PreferenceController;
import com.android.settings.dashboard.SummaryLoader; import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.XmlTestUtils; import com.android.settings.testutils.XmlTestUtils;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowSecureSettings; import com.android.settings.testutils.shadow.ShadowSecureSettings;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.LifecycleObserver;

View File

@@ -0,0 +1,20 @@
package com.android.settings.testutils.shadow;
import com.android.settings.fuelgauge.anomaly.KeyValueListParserWrapperImpl;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
/**
* Shadow for {@link KeyValueListParserWrapperImpl} so we could implement
* {@link #getBoolean(String, boolean)} that doesn't support in the current
* robolectric
*/
@Implements(KeyValueListParserWrapperImpl.class)
public class ShadowKeyValueListParserWrapperImpl {
@Implementation
public boolean getBoolean(String key, boolean defaultValue) {
return defaultValue;
}
}