1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.fuelgauge.anomaly; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.mockito.Matchers.any; 21 import static org.mockito.Matchers.anyInt; 22 import static org.mockito.Matchers.anyString; 23 import static org.mockito.Mockito.doReturn; 24 import static org.mockito.Mockito.spy; 25 import static org.mockito.Mockito.when; 26 27 import android.content.Context; 28 import android.content.pm.PackageManager; 29 import android.os.UserManager; 30 31 import com.android.internal.os.BatteryStatsHelper; 32 import com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector; 33 import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector; 34 import com.android.settings.fuelgauge.anomaly.checker.WakeupAlarmAnomalyDetector; 35 import com.android.settings.testutils.FakeFeatureFactory; 36 import com.android.settings.testutils.SettingsRobolectricTestRunner; 37 38 import org.junit.Before; 39 import org.junit.Test; 40 import org.junit.runner.RunWith; 41 import org.mockito.Answers; 42 import org.mockito.Mock; 43 import org.mockito.MockitoAnnotations; 44 45 import java.util.ArrayList; 46 import java.util.List; 47 48 @RunWith(SettingsRobolectricTestRunner.class) 49 public class AnomalyLoaderTest { 50 51 private static final String PACKAGE_NAME = "com.android.settings"; 52 private static final CharSequence DISPLAY_NAME = "Settings"; 53 private static final int UID = 0; 54 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 55 private Context mContext; 56 @Mock 57 private BatteryStatsHelper mBatteryStatsHelper; 58 @Mock 59 private WakeLockAnomalyDetector mWakeLockAnomalyDetector; 60 @Mock 61 private WakeupAlarmAnomalyDetector mWakeupAlarmAnomalyDetector; 62 @Mock 63 private BluetoothScanAnomalyDetector mBluetoothScanAnomalyDetector; 64 @Mock 65 private AnomalyDetectionPolicy mAnomalyDetectionPolicy; 66 @Mock 67 private UserManager mUserManager; 68 private Anomaly mWakeLockAnomaly; 69 private Anomaly mWakeupAlarmAnomaly; 70 private Anomaly mBluetoothScanAnomaly; 71 private List<Anomaly> mWakeLockAnomalies; 72 private List<Anomaly> mWakeupAlarmAnomalies; 73 private List<Anomaly> mBluetoothScanAnomalies; 74 private AnomalyLoader mAnomalyLoader; 75 76 @Before 77 public void setUp() throws PackageManager.NameNotFoundException { 78 MockitoAnnotations.initMocks(this); 79 80 FakeFeatureFactory.setupForTest(); 81 doReturn(true).when(mAnomalyDetectionPolicy).isAnomalyDetectorEnabled(anyInt()); 82 doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE); 83 when(mContext.getPackageManager().getPackageUid(anyString(), anyInt())).thenReturn(UID); 84 85 mWakeLockAnomalies = new ArrayList<>(); 86 mWakeLockAnomaly = createAnomaly(Anomaly.AnomalyType.WAKE_LOCK); 87 mWakeLockAnomalies.add(mWakeLockAnomaly); 88 doReturn(mWakeLockAnomalies).when(mWakeLockAnomalyDetector).detectAnomalies(any(), any()); 89 90 mWakeupAlarmAnomalies = new ArrayList<>(); 91 mWakeupAlarmAnomaly = createAnomaly(Anomaly.AnomalyType.WAKEUP_ALARM); 92 mWakeupAlarmAnomalies.add(mWakeupAlarmAnomaly); 93 doReturn(mWakeupAlarmAnomalies) 94 .when(mWakeupAlarmAnomalyDetector).detectAnomalies(any(), any()); 95 96 mBluetoothScanAnomalies = new ArrayList<>(); 97 mBluetoothScanAnomaly = createAnomaly(Anomaly.AnomalyType.BLUETOOTH_SCAN); 98 mBluetoothScanAnomalies.add(mBluetoothScanAnomaly); 99 doReturn(mBluetoothScanAnomalies) 100 .when(mBluetoothScanAnomalyDetector).detectAnomalies(any(), any()); 101 102 mAnomalyLoader = new AnomalyLoader(mContext, mBatteryStatsHelper, null, 103 mAnomalyDetectionPolicy); 104 mAnomalyLoader.mAnomalyUtils = spy(new AnomalyUtils(mContext)); 105 } 106 107 @Test 108 public void testLoadInBackground_containsValidAnomalies() { 109 doReturn(mWakeLockAnomalyDetector).when(mAnomalyLoader.mAnomalyUtils).getAnomalyDetector( 110 Anomaly.AnomalyType.WAKE_LOCK); 111 doReturn(mWakeupAlarmAnomalyDetector).when(mAnomalyLoader.mAnomalyUtils).getAnomalyDetector( 112 Anomaly.AnomalyType.WAKEUP_ALARM); 113 doReturn(mBluetoothScanAnomalyDetector).when( 114 mAnomalyLoader.mAnomalyUtils).getAnomalyDetector( 115 Anomaly.AnomalyType.BLUETOOTH_SCAN); 116 117 List<Anomaly> anomalies = mAnomalyLoader.loadInBackground(); 118 119 assertThat(anomalies) 120 .containsExactly(mWakeLockAnomaly, mWakeupAlarmAnomaly, mBluetoothScanAnomaly); 121 } 122 123 private Anomaly createAnomaly(@Anomaly.AnomalyType int type) { 124 return new Anomaly.Builder() 125 .setType(type) 126 .setUid(UID) 127 .setPackageName(PACKAGE_NAME) 128 .setDisplayName(DISPLAY_NAME) 129 .build(); 130 } 131 132 @Test 133 public void testGenerateFakeData() { 134 List<Anomaly> anomalies = mAnomalyLoader.generateFakeData(); 135 136 assertThat(anomalies) 137 .containsExactly(mWakeLockAnomaly, mWakeupAlarmAnomaly, mBluetoothScanAnomaly); 138 } 139 } 140