Load app usage events data in the hourly job.

Test: make RunSettingsRoboTests + manual
Bug: 260964679
Change-Id: Iaccaa77bd52fb7356cdcb786c64523f21040b128
This commit is contained in:
Kuan Wang
2022-12-08 10:21:43 +08:00
parent 52ad3ba925
commit 6c4f83f33d
29 changed files with 1590 additions and 93 deletions

View File

@@ -0,0 +1,102 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.fuelgauge.batteryusage;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.os.UserManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
public final class AppUsageDataLoaderTest {
private Context mContext;
@Mock
private ContentResolver mMockContentResolver;
@Mock
private UserManager mUserManager;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mMockContentResolver).when(mContext).getContentResolver();
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
doReturn(new Intent()).when(mContext).registerReceiver(any(), any());
}
@Test
public void loadAppUsageData_withData_insertFakeDataIntoProvider() {
final List<AppUsageEvent> AppUsageEventList = new ArrayList<>();
final AppUsageEvent appUsageEvent = AppUsageEvent.newBuilder().setUid(0).build();
AppUsageEventList.add(appUsageEvent);
AppUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
AppUsageDataLoader.sFakeUsageEventsListSupplier = () -> AppUsageEventList;
AppUsageDataLoader.loadAppUsageData(mContext);
verify(mMockContentResolver).bulkInsert(any(), any());
verify(mMockContentResolver).notifyChange(any(), any());
}
@Test
public void loadAppUsageData_nullAppUsageEvents_notInsertDataIntoProvider() {
AppUsageDataLoader.sFakeAppUsageEventsSupplier = () -> null;
AppUsageDataLoader.loadAppUsageData(mContext);
verifyNoMoreInteractions(mMockContentResolver);
}
@Test
public void loadAppUsageData_nullUsageEventsList_notInsertDataIntoProvider() {
AppUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
AppUsageDataLoader.sFakeUsageEventsListSupplier = () -> null;
AppUsageDataLoader.loadAppUsageData(mContext);
verifyNoMoreInteractions(mMockContentResolver);
}
@Test
public void loadAppUsageData_emptyUsageEventsList_notInsertDataIntoProvider() {
AppUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
AppUsageDataLoader.sFakeUsageEventsListSupplier = () -> new ArrayList<>();
AppUsageDataLoader.loadAppUsageData(mContext);
verifyNoMoreInteractions(mMockContentResolver);
}
}

View File

@@ -68,7 +68,7 @@ public final class BatteryHistEntryTest {
when(mMockBatteryEntry.getConsumerType())
.thenReturn(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
final ContentValues values =
ConvertUtils.convertToContentValues(
ConvertUtils.convertBatteryEntryToContentValues(
mMockBatteryEntry,
mBatteryUsageStats,
/*batteryLevel=*/ 12,

View File

@@ -30,6 +30,7 @@ import android.net.Uri;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
import com.android.settings.fuelgauge.batteryusage.db.BatteryState;
import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase;
import com.android.settings.testutils.BatteryTestUtils;
@@ -52,6 +53,8 @@ public final class BatteryUsageContentProviderTest {
private static final String PACKAGE_NAME1 = "com.android.settings1";
private static final String PACKAGE_NAME2 = "com.android.settings2";
private static final String PACKAGE_NAME3 = "com.android.settings3";
private static final long USER_ID1 = 1;
private static final long USER_ID2 = 2;
private Context mContext;
private BatteryUsageContentProvider mProvider;
@@ -177,6 +180,37 @@ public final class BatteryUsageContentProviderTest {
BootBroadcastReceiver.ACTION_PERIODIC_JOB_RECHECK);
}
@Test
public void query_appUsageTimestamp_returnsExpectedResult() throws Exception {
mProvider.onCreate();
final long timestamp1 = System.currentTimeMillis();
final long timestamp2 = timestamp1 + 2;
final long timestamp3 = timestamp1 + 4;
// Inserts some valid testing data.
BatteryTestUtils.insertDataToAppUsageEventTable(
mContext, USER_ID1, timestamp1, PACKAGE_NAME1);
BatteryTestUtils.insertDataToAppUsageEventTable(
mContext, USER_ID2, timestamp2, PACKAGE_NAME2);
BatteryTestUtils.insertDataToAppUsageEventTable(
mContext, USER_ID1, timestamp3, PACKAGE_NAME3);
final Cursor cursor1 = getCursorOfLatestTimestamp(USER_ID1);
assertThat(cursor1.getCount()).isEqualTo(1);
cursor1.moveToFirst();
assertThat(cursor1.getLong(0)).isEqualTo(timestamp3);
final Cursor cursor2 = getCursorOfLatestTimestamp(USER_ID2);
assertThat(cursor2.getCount()).isEqualTo(1);
cursor2.moveToFirst();
assertThat(cursor2.getLong(0)).isEqualTo(timestamp2);
final long notExistingUserId = 3;
final Cursor cursor3 = getCursorOfLatestTimestamp(notExistingUserId);
assertThat(cursor3.getCount()).isEqualTo(1);
cursor3.moveToFirst();
assertThat(cursor3.getLong(0)).isEqualTo(0);
}
@Test
public void insert_batteryState_returnsExpectedResult() {
mProvider.onCreate();
@@ -266,6 +300,34 @@ public final class BatteryUsageContentProviderTest {
assertThat(states.get(0).batteryInformation).isEqualTo(expectedBatteryInformationString);
}
@Test
public void insert_appUsageEvent_returnsExpectedResult() {
mProvider.onCreate();
ContentValues values = new ContentValues();
values.put(AppUsageEventEntity.KEY_UID, 101L);
values.put(AppUsageEventEntity.KEY_USER_ID, 1001L);
values.put(AppUsageEventEntity.KEY_TIMESTAMP, 10001L);
values.put(AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE, 1);
values.put(AppUsageEventEntity.KEY_PACKAGE_NAME, "com.android.settings1");
values.put(AppUsageEventEntity.KEY_INSTANCE_ID, 100001L);
values.put(AppUsageEventEntity.KEY_TASK_ROOT_PACKAGE_NAME, "com.android.settings2");
final Uri uri = mProvider.insert(DatabaseUtils.APP_USAGE_EVENT_URI, values);
assertThat(uri).isEqualTo(DatabaseUtils.APP_USAGE_EVENT_URI);
// Verifies the AppUsageEventEntity content.
final List<AppUsageEventEntity> entities =
BatteryStateDatabase.getInstance(mContext).appUsageEventDao().getAllAfter(0);
assertThat(entities).hasSize(1);
assertThat(entities.get(0).uid).isEqualTo(101L);
assertThat(entities.get(0).userId).isEqualTo(1001L);
assertThat(entities.get(0).timestamp).isEqualTo(10001L);
assertThat(entities.get(0).appUsageEventType).isEqualTo(1);
assertThat(entities.get(0).packageName).isEqualTo("com.android.settings1");
assertThat(entities.get(0).instanceId).isEqualTo(100001L);
assertThat(entities.get(0).taskRootPackageName).isEqualTo("com.android.settings2");
}
@Test
public void delete_throwsUnsupportedOperationException() {
assertThrows(
@@ -293,12 +355,12 @@ public final class BatteryUsageContentProviderTest {
mProvider.setClock(fakeClock);
final long currentTimestamp = currentTime.toMillis();
// Inserts some valid testing data.
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, currentTimestamp - 2, PACKAGE_NAME1,
/*isFullChargeStart=*/ true);
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, currentTimestamp - 1, PACKAGE_NAME2);
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, currentTimestamp, PACKAGE_NAME3);
final Uri batteryStateQueryContentUri =
@@ -307,7 +369,7 @@ public final class BatteryUsageContentProviderTest {
.authority(DatabaseUtils.AUTHORITY)
.appendPath(DatabaseUtils.BATTERY_STATE_TABLE)
.appendQueryParameter(
BatteryUsageContentProvider.QUERY_KEY_TIMESTAMP, queryTimestamp)
DatabaseUtils.QUERY_KEY_TIMESTAMP, queryTimestamp)
.build();
final Cursor cursor =
@@ -320,4 +382,22 @@ public final class BatteryUsageContentProviderTest {
return cursor;
}
private Cursor getCursorOfLatestTimestamp(final long userId) {
final Uri appUsageLatestTimestampQueryContentUri =
new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(DatabaseUtils.AUTHORITY)
.appendPath(DatabaseUtils.APP_USAGE_LATEST_TIMESTAMP_PATH)
.appendQueryParameter(
DatabaseUtils.QUERY_KEY_USERID, Long.toString(userId))
.build();
return mProvider.query(
appUsageLatestTimestampQueryContentUri,
/*strings=*/ null,
/*s=*/ null,
/*strings1=*/ null,
/*s1=*/ null);
}
}

View File

@@ -62,7 +62,7 @@ public final class BootBroadcastReceiverTest {
// Inserts fake data into database for testing.
final BatteryStateDatabase database = BatteryTestUtils.setUpBatteryStateDatabase(mContext);
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, Clock.systemUTC().millis(), "com.android.systemui");
mDao = database.batteryStateDao();
}
@@ -170,9 +170,9 @@ public final class BootBroadcastReceiverTest {
private void insertExpiredData(int shiftDay) {
final long expiredTimeInMs =
Clock.systemUTC().millis() - Duration.ofDays(shiftDay).toMillis();
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, expiredTimeInMs - 1, "com.android.systemui");
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, expiredTimeInMs, "com.android.systemui");
// Ensures the testing environment is correct.
assertThat(mDao.getAllAfter(0)).hasSize(3);

View File

@@ -17,16 +17,23 @@ package com.android.settings.fuelgauge.batteryusage;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.app.usage.UsageEvents;
import android.app.usage.UsageEvents.Event;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.BatteryManager;
import android.os.BatteryUsageStats;
import android.os.LocaleList;
import android.os.UserHandle;
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -43,6 +50,8 @@ public final class ConvertUtilsTest {
private Context mContext;
@Mock
private PackageManager mMockPackageManager;
@Mock
private BatteryUsageStats mBatteryUsageStats;
@Mock
@@ -52,10 +61,11 @@ public final class ConvertUtilsTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
}
@Test
public void convertToContentValues_returnsExpectedContentValues() {
public void convertBatteryEntryToContentValues_returnsExpectedContentValues() {
final int expectedType = 3;
when(mMockBatteryEntry.getUid()).thenReturn(1001);
when(mMockBatteryEntry.getLabel()).thenReturn("Settings");
@@ -76,7 +86,7 @@ public final class ConvertUtilsTest {
.thenReturn(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
final ContentValues values =
ConvertUtils.convertToContentValues(
ConvertUtils.convertBatteryEntryToContentValues(
mMockBatteryEntry,
mBatteryUsageStats,
/*batteryLevel=*/ 12,
@@ -121,9 +131,9 @@ public final class ConvertUtilsTest {
}
@Test
public void convertToContentValues_nullBatteryEntry_returnsExpectedContentValues() {
public void convertBatteryEntryToContentValues_nullBatteryEntry_returnsExpectedContentValues() {
final ContentValues values =
ConvertUtils.convertToContentValues(
ConvertUtils.convertBatteryEntryToContentValues(
/*entry=*/ null,
/*batteryUsageStats=*/ null,
/*batteryLevel=*/ 12,
@@ -151,6 +161,31 @@ public final class ConvertUtilsTest {
.isEqualTo(ConvertUtils.FAKE_PACKAGE_NAME);
}
@Test
public void convertAppUsageEventToContentValues_returnsExpectedContentValues() {
final AppUsageEvent appUsageEvent =
AppUsageEvent.newBuilder()
.setUid(101L)
.setUserId(1001L)
.setTimestamp(10001L)
.setType(AppUsageEventType.ACTIVITY_RESUMED)
.setPackageName("com.android.settings1")
.setInstanceId(100001)
.setTaskRootPackageName("com.android.settings2")
.build();
final ContentValues values =
ConvertUtils.convertAppUsageEventToContentValues(appUsageEvent);
assertThat(values.getAsLong(AppUsageEventEntity.KEY_UID)).isEqualTo(101L);
assertThat(values.getAsLong(AppUsageEventEntity.KEY_USER_ID)).isEqualTo(1001L);
assertThat(values.getAsLong(AppUsageEventEntity.KEY_TIMESTAMP)).isEqualTo(10001L);
assertThat(values.getAsInteger(AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE)).isEqualTo(1);
assertThat(values.getAsString(AppUsageEventEntity.KEY_PACKAGE_NAME))
.isEqualTo("com.android.settings1");
assertThat(values.getAsInteger(AppUsageEventEntity.KEY_INSTANCE_ID)).isEqualTo(100001);
assertThat(values.getAsString(AppUsageEventEntity.KEY_TASK_ROOT_PACKAGE_NAME))
.isEqualTo("com.android.settings2");
}
@Test
public void convertToBatteryHistEntry_returnsExpectedResult() {
final int expectedType = 3;
@@ -229,6 +264,77 @@ public final class ConvertUtilsTest {
.isEqualTo(ConvertUtils.FAKE_PACKAGE_NAME);
}
@Test
public void convertToAppUsageEvent_returnsExpectedResult()
throws PackageManager.NameNotFoundException {
final Event event = new Event();
event.mEventType = UsageEvents.Event.ACTIVITY_RESUMED;
event.mPackage = "com.android.settings1";
event.mTimeStamp = 101L;
event.mInstanceId = 100001;
event.mTaskRootPackage = "com.android.settings2";
when(mMockPackageManager.getPackageUidAsUser(any(), anyInt())).thenReturn(1001);
final long userId = 2;
final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEvent(
mContext, event, userId);
assertThat(appUsageEvent.getTimestamp()).isEqualTo(101L);
assertThat(appUsageEvent.getType()).isEqualTo(AppUsageEventType.ACTIVITY_RESUMED);
assertThat(appUsageEvent.getPackageName()).isEqualTo("com.android.settings1");
assertThat(appUsageEvent.getInstanceId()).isEqualTo(100001);
assertThat(appUsageEvent.getTaskRootPackageName()).isEqualTo("com.android.settings2");
assertThat(appUsageEvent.getUid()).isEqualTo(1001L);
assertThat(appUsageEvent.getUserId()).isEqualTo(userId);
}
@Test
public void convertToAppUsageEvent_emptyInstanceIdAndRootName_returnsExpectedResult()
throws PackageManager.NameNotFoundException {
final Event event = new Event();
event.mEventType = UsageEvents.Event.DEVICE_SHUTDOWN;
event.mPackage = "com.android.settings1";
event.mTimeStamp = 101L;
when(mMockPackageManager.getPackageUidAsUser(any(), anyInt())).thenReturn(1001);
final long userId = 1;
final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEvent(
mContext, event, userId);
assertThat(appUsageEvent.getTimestamp()).isEqualTo(101L);
assertThat(appUsageEvent.getType()).isEqualTo(AppUsageEventType.DEVICE_SHUTDOWN);
assertThat(appUsageEvent.getPackageName()).isEqualTo("com.android.settings1");
assertThat(appUsageEvent.getInstanceId()).isEqualTo(0);
assertThat(appUsageEvent.getTaskRootPackageName()).isEqualTo("");
assertThat(appUsageEvent.getUid()).isEqualTo(1001L);
assertThat(appUsageEvent.getUserId()).isEqualTo(userId);
}
@Test
public void convertToAppUsageEvent_emptyPackageName_returnsNull() {
final Event event = new Event();
event.mPackage = null;
final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEvent(
mContext, event, /*userId=*/ 0);
assertThat(appUsageEvent).isNull();
}
@Test
public void convertToAppUsageEvent_failToGetUid_returnsNull()
throws PackageManager.NameNotFoundException {
final Event event = new Event();
event.mEventType = UsageEvents.Event.DEVICE_SHUTDOWN;
event.mPackage = "com.android.settings1";
when(mMockPackageManager.getPackageUidAsUser(any(), anyInt()))
.thenThrow(new PackageManager.NameNotFoundException());
final long userId = 1;
final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEvent(
mContext, event, userId);
assertThat(appUsageEvent).isNull();
}
@Test
public void getLocale_nullContext_returnDefaultLocale() {
assertThat(ConvertUtils.getLocale(/*context=*/ null))

View File

@@ -18,6 +18,7 @@ package com.android.settings.fuelgauge.batteryusage;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doReturn;
@@ -25,12 +26,19 @@ import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.app.usage.IUsageStatsManager;
import android.app.usage.UsageEvents;
import android.app.usage.UsageEvents.Event;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.pm.UserInfo;
import android.os.BatteryConsumer;
import android.os.BatteryManager;
import android.os.BatteryUsageStats;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.UserManager;
import android.text.format.DateUtils;
import com.android.settings.fuelgauge.BatteryUtils;
@@ -65,10 +73,13 @@ public class DataProcessorTest {
@Mock private Intent mIntent;
@Mock private BatteryUsageStats mBatteryUsageStats;
@Mock private UserManager mUserManager;
@Mock private IUsageStatsManager mUsageStatsManager;
@Mock private BatteryEntry mMockBatteryEntry1;
@Mock private BatteryEntry mMockBatteryEntry2;
@Mock private BatteryEntry mMockBatteryEntry3;
@Mock private BatteryEntry mMockBatteryEntry4;
@Mock private UsageEvents mUsageEvents1;
@Before
@@ -80,9 +91,11 @@ public class DataProcessorTest {
mFeatureFactory = FakeFeatureFactory.setupForTest();
mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider;
DataProcessor.sUsageStatsManager = mUsageStatsManager;
doReturn(mIntent).when(mContext).registerReceiver(any(), any());
doReturn(100).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_SCALE), anyInt());
doReturn(66).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_LEVEL), anyInt());
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
}
@Test
@@ -145,6 +158,86 @@ public class DataProcessorTest {
expectedHourlyLevels);
}
@Test
public void getAppUsageEvents_returnExpectedResult() throws RemoteException {
UserInfo userInfo = new UserInfo(/*id=*/ 0, "user_0", /*flags=*/ 0);
final List<UserInfo> userInfoList = new ArrayList<>();
userInfoList.add(userInfo);
doReturn(userInfoList).when(mUserManager).getAliveUsers();
doReturn(true).when(mUserManager).isUserUnlocked(userInfo.id);
doReturn(mUsageEvents1)
.when(mUsageStatsManager)
.queryEventsForUser(anyLong(), anyLong(), anyInt(), any());
final Map<Long, UsageEvents> resultMap = DataProcessor.getAppUsageEvents(mContext);
assertThat(resultMap.size()).isEqualTo(1);
assertThat(resultMap.get(Long.valueOf(userInfo.id))).isEqualTo(mUsageEvents1);
}
@Test
public void getAppUsageEvents_lockedUser_returnNull() throws RemoteException {
UserInfo userInfo = new UserInfo(/*id=*/ 0, "user_0", /*flags=*/ 0);
final List<UserInfo> userInfoList = new ArrayList<>();
userInfoList.add(userInfo);
doReturn(userInfoList).when(mUserManager).getAliveUsers();
// Test locked user.
doReturn(false).when(mUserManager).isUserUnlocked(userInfo.id);
final Map<Long, UsageEvents> resultMap = DataProcessor.getAppUsageEvents(mContext);
assertThat(resultMap).isNull();
}
@Test
public void getAppUsageEvents_nullUsageEvents_returnNull() throws RemoteException {
UserInfo userInfo = new UserInfo(/*id=*/ 0, "user_0", /*flags=*/ 0);
final List<UserInfo> userInfoList = new ArrayList<>();
userInfoList.add(userInfo);
doReturn(userInfoList).when(mUserManager).getAliveUsers();
doReturn(true).when(mUserManager).isUserUnlocked(userInfo.id);
doReturn(null)
.when(mUsageStatsManager).queryEventsForUser(anyLong(), anyLong(), anyInt(), any());
final Map<Long, UsageEvents> resultMap = DataProcessor.getAppUsageEvents(mContext);
assertThat(resultMap).isNull();
}
@Test public void generateAppUsageEventListFromUsageEvents_returnExpectedResult() {
Event event1 = getUsageEvent(Event.NOTIFICATION_INTERRUPTION, /*timestamp=*/ 1);
Event event2 = getUsageEvent(Event.ACTIVITY_RESUMED, /*timestamp=*/ 2);
Event event3 = getUsageEvent(Event.ACTIVITY_STOPPED, /*timestamp=*/ 3);
Event event4 = getUsageEvent(Event.DEVICE_SHUTDOWN, /*timestamp=*/ 4);
Event event5 = getUsageEvent(Event.ACTIVITY_RESUMED, /*timestamp=*/ 5);
event5.mPackage = null;
List<Event> events1 = new ArrayList<>();
events1.add(event1);
events1.add(event2);
List<Event> events2 = new ArrayList<>();
events2.add(event3);
events2.add(event4);
events2.add(event5);
final long userId1 = 101L;
final long userId2 = 102L;
final long userId3 = 103L;
final Map<Long, UsageEvents> appUsageEvents = new HashMap();
appUsageEvents.put(userId1, getUsageEvents(events1));
appUsageEvents.put(userId2, getUsageEvents(events2));
appUsageEvents.put(userId3, getUsageEvents(new ArrayList<>()));
final List<AppUsageEvent> appUsageEventList =
DataProcessor.generateAppUsageEventListFromUsageEvents(mContext, appUsageEvents);
assertThat(appUsageEventList.size()).isEqualTo(3);
assetAppUsageEvent(
appUsageEventList.get(0), AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 2);
assetAppUsageEvent(
appUsageEventList.get(1), AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 3);
assetAppUsageEvent(
appUsageEventList.get(2), AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 4);
}
@Test
public void getHistoryMapWithExpectedTimestamps_emptyHistoryMap_returnEmptyMap() {
assertThat(DataProcessor
@@ -1213,6 +1306,30 @@ public class DataProcessorTest {
return new BatteryHistEntry(values);
}
private UsageEvents getUsageEvents(final List<Event> events) {
UsageEvents usageEvents = new UsageEvents(events, new String[] {"package"});
Parcel parcel = Parcel.obtain();
parcel.setDataPosition(0);
usageEvents.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
return UsageEvents.CREATOR.createFromParcel(parcel);
}
private Event getUsageEvent(
final int eventType, final long timestamp) {
final Event event = new Event();
event.mEventType = eventType;
event.mPackage = "package";
event.mTimeStamp = timestamp;
return event;
}
private void assetAppUsageEvent(
final AppUsageEvent event, final AppUsageEventType eventType, final long timestamp) {
assertThat(event.getType()).isEqualTo(eventType);
assertThat(event.getTimestamp()).isEqualTo(timestamp);
}
private static void verifyExpectedBatteryLevelData(
final BatteryLevelData resultData,
final List<Long> expectedDailyTimestamps,

View File

@@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.content.ContentResolver;
import android.content.ContentValues;
@@ -34,6 +35,7 @@ import android.os.BatteryUsageStats;
import android.os.UserHandle;
import android.os.UserManager;
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
import com.android.settings.testutils.BatteryTestUtils;
import org.junit.Before;
@@ -93,6 +95,53 @@ public final class DatabaseUtilsTest {
assertThat(DatabaseUtils.isWorkProfile(mContext)).isFalse();
}
@Test
public void sendAppUsageEventData_returnsExpectedList() {
// Configures the testing AppUsageEvent data.
final List<AppUsageEvent> appUsageEventList = new ArrayList<>();
final AppUsageEvent appUsageEvent1 =
AppUsageEvent.newBuilder()
.setUid(101L)
.setType(AppUsageEventType.ACTIVITY_RESUMED)
.build();
final AppUsageEvent appUsageEvent2 =
AppUsageEvent.newBuilder()
.setUid(1001L)
.setType(AppUsageEventType.ACTIVITY_STOPPED)
.build();
final AppUsageEvent appUsageEvent3 =
AppUsageEvent.newBuilder()
.setType(AppUsageEventType.DEVICE_SHUTDOWN)
.build();
appUsageEventList.add(appUsageEvent1);
appUsageEventList.add(appUsageEvent2);
appUsageEventList.add(appUsageEvent3);
final List<ContentValues> valuesList =
DatabaseUtils.sendAppUsageEventData(mContext, appUsageEventList);
assertThat(valuesList).hasSize(2);
assertThat(valuesList.get(0).getAsInteger(AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE))
.isEqualTo(1);
assertThat(valuesList.get(1).getAsInteger(AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE))
.isEqualTo(2);
// Verifies the inserted ContentValues into content provider.
final ContentValues[] valuesArray =
new ContentValues[] {valuesList.get(0), valuesList.get(1)};
verify(mMockContentResolver).bulkInsert(
DatabaseUtils.APP_USAGE_EVENT_URI, valuesArray);
verify(mMockContentResolver).notifyChange(
DatabaseUtils.APP_USAGE_EVENT_URI, /*observer=*/ null);
}
@Test
public void sendAppUsageEventData_emptyAppUsageEventList_notSend() {
final List<ContentValues> valuesList =
DatabaseUtils.sendAppUsageEventData(mContext, new ArrayList<>());
assertThat(valuesList).hasSize(0);
verifyNoMoreInteractions(mMockContentResolver);
}
@Test
public void sendBatteryEntryData_nullBatteryIntent_returnsNullValue() {
doReturn(null).when(mContext).registerReceiver(any(), any());
@@ -123,8 +172,8 @@ public final class DatabaseUtilsTest {
assertThat(valuesList).hasSize(2);
// Verifies the ContentValues content.
verifyContentValues(0.5, valuesList.get(0));
verifyContentValues(0.0, valuesList.get(1));
verifyBatteryEntryContentValues(0.5, valuesList.get(0));
verifyBatteryEntryContentValues(0.0, valuesList.get(1));
// Verifies the inserted ContentValues into content provider.
final ContentValues[] valuesArray =
new ContentValues[] {valuesList.get(0), valuesList.get(1)};
@@ -146,7 +195,7 @@ public final class DatabaseUtilsTest {
/*isFullChargeStart=*/ false);
assertThat(valuesList).hasSize(1);
verifyFakeContentValues(valuesList.get(0));
verifyFakeBatteryEntryContentValues(valuesList.get(0));
// Verifies the inserted ContentValues into content provider.
verify(mMockContentResolver).insert(any(), any());
verify(mMockContentResolver).notifyChange(
@@ -165,7 +214,7 @@ public final class DatabaseUtilsTest {
/*isFullChargeStart=*/ false);
assertThat(valuesList).hasSize(1);
verifyFakeContentValues(valuesList.get(0));
verifyFakeBatteryEntryContentValues(valuesList.get(0));
// Verifies the inserted ContentValues into content provider.
verify(mMockContentResolver).insert(any(), any());
verify(mMockContentResolver).notifyChange(
@@ -184,13 +233,49 @@ public final class DatabaseUtilsTest {
/*isFullChargeStart=*/ false);
assertThat(valuesList).hasSize(1);
verifyFakeContentValues(valuesList.get(0));
verifyFakeBatteryEntryContentValues(valuesList.get(0));
// Verifies the inserted ContentValues into content provider.
verify(mMockContentResolver).insert(any(), any());
verify(mMockContentResolver).notifyChange(
DatabaseUtils.BATTERY_CONTENT_URI, /*observer=*/ null);
}
@Test
public void getAppUsageStartTimestampOfUser_emptyCursorContent_returnEarliestTimestamp() {
final MatrixCursor cursor =
new MatrixCursor(new String[] {AppUsageEventEntity.KEY_TIMESTAMP});
DatabaseUtils.sFakeAppUsageLatestTimestampSupplier = () -> cursor;
final long earliestTimestamp = 10001L;
assertThat(DatabaseUtils.getAppUsageStartTimestampOfUser(
mContext, /*userId=*/ 0, earliestTimestamp)).isEqualTo(earliestTimestamp);
}
@Test
public void getAppUsageStartTimestampOfUser_nullCursor_returnEarliestTimestamp() {
DatabaseUtils.sFakeAppUsageLatestTimestampSupplier = () -> null;
final long earliestTimestamp = 10001L;
assertThat(DatabaseUtils.getAppUsageStartTimestampOfUser(
mContext, /*userId=*/ 0, earliestTimestamp)).isEqualTo(earliestTimestamp);
}
@Test
public void getAppUsageStartTimestampOfUser_returnExpectedResult() {
final long returnedTimestamp = 10001L;
final MatrixCursor cursor =
new MatrixCursor(new String[] {AppUsageEventEntity.KEY_TIMESTAMP});
// Adds fake data into the cursor.
cursor.addRow(new Object[] {returnedTimestamp});
DatabaseUtils.sFakeAppUsageLatestTimestampSupplier = () -> cursor;
final long earliestTimestamp1 = 1001L;
assertThat(DatabaseUtils.getAppUsageStartTimestampOfUser(
mContext, /*userId=*/ 0, earliestTimestamp1)).isEqualTo(returnedTimestamp);
final long earliestTimestamp2 = 100001L;
assertThat(DatabaseUtils.getAppUsageStartTimestampOfUser(
mContext, /*userId=*/ 0, earliestTimestamp2)).isEqualTo(earliestTimestamp2);
}
@Test
public void getHistoryMapSinceLastFullCharge_emptyCursorContent_returnEmptyMap() {
final MatrixCursor cursor = new MatrixCursor(
@@ -198,7 +283,7 @@ public final class DatabaseUtilsTest {
BatteryHistEntry.KEY_UID,
BatteryHistEntry.KEY_USER_ID,
BatteryHistEntry.KEY_TIMESTAMP});
doReturn(cursor).when(mMockContentResolver).query(any(), any(), any(), any());
DatabaseUtils.sFakeBatteryStateSupplier = () -> cursor;
assertThat(DatabaseUtils.getHistoryMapSinceLastFullCharge(
mContext, /*calendar=*/ null)).isEmpty();
@@ -206,7 +291,7 @@ public final class DatabaseUtilsTest {
@Test
public void getHistoryMapSinceLastFullCharge_nullCursor_returnEmptyMap() {
doReturn(null).when(mMockContentResolver).query(any(), any(), any(), any());
DatabaseUtils.sFakeBatteryStateSupplier = () -> null;
assertThat(DatabaseUtils.getHistoryMapSinceLastFullCharge(
mContext, /*calendar=*/ null)).isEmpty();
}
@@ -216,7 +301,6 @@ public final class DatabaseUtilsTest {
final Long timestamp1 = Long.valueOf(1001L);
final Long timestamp2 = Long.valueOf(1002L);
final MatrixCursor cursor = getMatrixCursor();
doReturn(cursor).when(mMockContentResolver).query(any(), any(), any(), any());
// Adds fake data into the cursor.
cursor.addRow(new Object[] {
"app name1", timestamp1, 1, ConvertUtils.CONSUMER_TYPE_UID_BATTERY});
@@ -226,6 +310,7 @@ public final class DatabaseUtilsTest {
"app name3", timestamp2, 3, ConvertUtils.CONSUMER_TYPE_UID_BATTERY});
cursor.addRow(new Object[] {
"app name4", timestamp2, 4, ConvertUtils.CONSUMER_TYPE_UID_BATTERY});
DatabaseUtils.sFakeBatteryStateSupplier = () -> cursor;
final Map<Long, Map<String, BatteryHistEntry>> batteryHistMap =
DatabaseUtils.getHistoryMapSinceLastFullCharge(
@@ -251,9 +336,7 @@ public final class DatabaseUtilsTest {
doReturn(mMockContext).when(mContext).createPackageContextAsUser(
"com.fake.package", /*flags=*/ 0, UserHandle.OWNER);
BatteryTestUtils.setWorkProfile(mContext);
doReturn(getMatrixCursor()).when(mMockContentResolver2)
.query(any(), any(), any(), any());
doReturn(null).when(mMockContentResolver).query(any(), any(), any(), any());
DatabaseUtils.sFakeBatteryStateSupplier = () -> getMatrixCursor();
final Map<Long, Map<String, BatteryHistEntry>> batteryHistMap =
DatabaseUtils.getHistoryMapSinceLastFullCharge(
@@ -262,7 +345,8 @@ public final class DatabaseUtilsTest {
assertThat(batteryHistMap).isEmpty();
}
private static void verifyContentValues(double consumedPower, ContentValues values) {
private static void verifyBatteryEntryContentValues(
double consumedPower, ContentValues values) {
final BatteryInformation batteryInformation =
ConvertUtils.getBatteryInformation(
values, BatteryHistEntry.KEY_BATTERY_INFORMATION);
@@ -275,7 +359,7 @@ public final class DatabaseUtilsTest {
.isEqualTo(BatteryManager.BATTERY_HEALTH_COLD);
}
private static void verifyFakeContentValues(ContentValues values) {
private static void verifyFakeBatteryEntryContentValues(ContentValues values) {
final BatteryInformation batteryInformation =
ConvertUtils.getBatteryInformation(
values, BatteryHistEntry.KEY_BATTERY_INFORMATION);

View File

@@ -62,7 +62,7 @@ public final class PeriodicJobReceiverTest {
// Inserts fake data into database for testing.
final BatteryStateDatabase database = BatteryTestUtils.setUpBatteryStateDatabase(mContext);
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, Clock.systemUTC().millis(), "com.android.systemui");
mDao = database.batteryStateDao();
}
@@ -122,9 +122,9 @@ public final class PeriodicJobReceiverTest {
private void insertExpiredData(int shiftDay) {
final long expiredTimeInMs =
Clock.systemUTC().millis() - Duration.ofDays(shiftDay).toMillis();
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, expiredTimeInMs - 1, "com.android.systemui");
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, expiredTimeInMs, "com.android.systemui");
// Ensures the testing environment is correct.
assertThat(mDao.getAllAfter(0)).hasSize(3);

View File

@@ -53,9 +53,9 @@ public final class BugReportContentProviderTest {
mBugReportContentProvider.attachInfo(mContext, /*info=*/ null);
// Inserts fake data into database for testing.
BatteryTestUtils.setUpBatteryStateDatabase(mContext);
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, System.currentTimeMillis(), PACKAGE_NAME1);
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, System.currentTimeMillis(), PACKAGE_NAME2);
}

View File

@@ -0,0 +1,127 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.fuelgauge.batteryusage.db;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.database.Cursor;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.testutils.BatteryTestUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import java.util.List;
/** Tests for {@link AppUsageEventDao}. */
@RunWith(RobolectricTestRunner.class)
public final class AppUsageEventDaoTest {
private static final long TIMESTAMP1 = System.currentTimeMillis();
private static final long TIMESTAMP2 = System.currentTimeMillis() + 2;
private static final long TIMESTAMP3 = System.currentTimeMillis() + 4;
private static final long USER_ID1 = 1;
private static final long USER_ID2 = 2;
private static final String PACKAGE_NAME1 = "com.android.apps.settings";
private static final String PACKAGE_NAME2 = "com.android.apps.calendar";
private static final String PACKAGE_NAME3 = "com.android.apps.gmail";
private Context mContext;
private BatteryStateDatabase mDatabase;
private AppUsageEventDao mAppUsageEventDao;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
mDatabase = BatteryTestUtils.setUpBatteryStateDatabase(mContext);
mAppUsageEventDao = mDatabase.appUsageEventDao();
BatteryTestUtils.insertDataToAppUsageEventTable(
mContext, USER_ID1, TIMESTAMP3, PACKAGE_NAME3);
BatteryTestUtils.insertDataToAppUsageEventTable(
mContext, USER_ID2, TIMESTAMP2, PACKAGE_NAME2);
BatteryTestUtils.insertDataToAppUsageEventTable(
mContext, USER_ID1, TIMESTAMP1, PACKAGE_NAME1, /*multiple=*/ true);
}
@After
public void closeDb() {
mDatabase.close();
BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
}
@Test
public void appUsageEventDao_insertAll() throws Exception {
final List<AppUsageEventEntity> entities = mAppUsageEventDao.getAllAfter(TIMESTAMP1);
assertThat(entities).hasSize(2);
// Verifies the queried battery states.
assertAppUsageEvent(entities.get(0), TIMESTAMP3, PACKAGE_NAME3);
assertAppUsageEvent(entities.get(1), TIMESTAMP2, PACKAGE_NAME2);
}
@Test
public void appUsageEventDao_getLatestTimestampOfUser() throws Exception {
final Cursor cursor1 = mAppUsageEventDao.getLatestTimestampOfUser(USER_ID1);
assertThat(cursor1.getCount()).isEqualTo(1);
cursor1.moveToFirst();
assertThat(cursor1.getLong(0)).isEqualTo(TIMESTAMP3);
final Cursor cursor2 = mAppUsageEventDao.getLatestTimestampOfUser(USER_ID2);
assertThat(cursor2.getCount()).isEqualTo(1);
cursor2.moveToFirst();
assertThat(cursor2.getLong(0)).isEqualTo(TIMESTAMP2);
final long notExistingUserId = 3;
final Cursor cursor3 = mAppUsageEventDao.getLatestTimestampOfUser(notExistingUserId);
assertThat(cursor3.getCount()).isEqualTo(1);
cursor3.moveToFirst();
assertThat(cursor3.getLong(0)).isEqualTo(0);
}
@Test
public void appUsageEventDao_clearAllBefore() throws Exception {
mAppUsageEventDao.clearAllBefore(TIMESTAMP2);
final List<AppUsageEventEntity> entities = mAppUsageEventDao.getAllAfter(0);
assertThat(entities).hasSize(1);
// Verifies the queried battery state.
assertAppUsageEvent(entities.get(0), TIMESTAMP3, PACKAGE_NAME3);
}
@Test
public void appUsageEventDao_clearAll() throws Exception {
assertThat(mAppUsageEventDao.getAllAfter(0)).hasSize(3);
mAppUsageEventDao.clearAll();
assertThat(mAppUsageEventDao.getAllAfter(0)).isEmpty();
}
@Test
public void getInstance_createNewInstance() throws Exception {
BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
assertThat(BatteryStateDatabase.getInstance(mContext)).isNotNull();
}
private static void assertAppUsageEvent(
AppUsageEventEntity entity, long timestamp, String packageName) {
assertThat(entity.timestamp).isEqualTo(timestamp);
assertThat(entity.packageName).isEqualTo(packageName);
}
}

View File

@@ -0,0 +1,58 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.fuelgauge.batteryusage.db;
import static com.google.common.truth.Truth.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link AppUsageEventEntity}. */
@RunWith(RobolectricTestRunner.class)
public final class AppUsageEventEntityTest {
@Test
public void testBuilder_returnsExpectedResult() {
final long uid = 101L;
final long userId = 1001L;
final long timestamp = 10001L;
final int appUsageEventType = 1;
final String packageName = "com.android.settings1";
final int instanceId = 100001;
final String taskRootPackageName = "com.android.settings2";
AppUsageEventEntity entity = AppUsageEventEntity
.newBuilder()
.setUid(uid)
.setUserId(userId)
.setTimestamp(timestamp)
.setAppUsageEventType(appUsageEventType)
.setPackageName(packageName)
.setInstanceId(instanceId)
.setTaskRootPackageName(taskRootPackageName)
.build();
// Verifies the app relative information.
assertThat(entity.uid).isEqualTo(uid);
assertThat(entity.userId).isEqualTo(userId);
assertThat(entity.timestamp).isEqualTo(timestamp);
assertThat(entity.appUsageEventType).isEqualTo(appUsageEventType);
assertThat(entity.packageName).isEqualTo(packageName);
assertThat(entity.instanceId).isEqualTo(instanceId);
assertThat(entity.taskRootPackageName).isEqualTo(taskRootPackageName);
}
}

View File

@@ -53,9 +53,9 @@ public final class BatteryStateDaoTest {
mContext = ApplicationProvider.getApplicationContext();
mDatabase = BatteryTestUtils.setUpBatteryStateDatabase(mContext);
mBatteryStateDao = mDatabase.batteryStateDao();
BatteryTestUtils.insertDataToBatteryStateDatabase(mContext, TIMESTAMP3, PACKAGE_NAME3);
BatteryTestUtils.insertDataToBatteryStateDatabase(mContext, TIMESTAMP2, PACKAGE_NAME2);
BatteryTestUtils.insertDataToBatteryStateDatabase(
BatteryTestUtils.insertDataToBatteryStateTable(mContext, TIMESTAMP3, PACKAGE_NAME3);
BatteryTestUtils.insertDataToBatteryStateTable(mContext, TIMESTAMP2, PACKAGE_NAME2);
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, TIMESTAMP1, PACKAGE_NAME1, /*multiple=*/ true,
/*isFullChargeStart=*/ true);
}
@@ -102,9 +102,9 @@ public final class BatteryStateDaoTest {
public void batteryStateDao_getCursorSinceLastFullCharge_noFullChargeData_returnSevenDaysData()
throws Exception {
mBatteryStateDao.clearAll();
BatteryTestUtils.insertDataToBatteryStateDatabase(mContext, TIMESTAMP3, PACKAGE_NAME3);
BatteryTestUtils.insertDataToBatteryStateDatabase(mContext, TIMESTAMP2, PACKAGE_NAME2);
BatteryTestUtils.insertDataToBatteryStateDatabase(mContext, TIMESTAMP1, PACKAGE_NAME1);
BatteryTestUtils.insertDataToBatteryStateTable(mContext, TIMESTAMP3, PACKAGE_NAME3);
BatteryTestUtils.insertDataToBatteryStateTable(mContext, TIMESTAMP2, PACKAGE_NAME2);
BatteryTestUtils.insertDataToBatteryStateTable(mContext, TIMESTAMP1, PACKAGE_NAME1);
final Cursor cursor = mBatteryStateDao.getCursorSinceLastFullCharge(TIMESTAMP2);
assertThat(cursor.getCount()).isEqualTo(2);
assertThat(cursor.getColumnCount()).isEqualTo(CURSOR_COLUMN_SIZE);

View File

@@ -26,6 +26,8 @@ import androidx.room.Room;
import com.android.settings.fuelgauge.batteryusage.BatteryInformation;
import com.android.settings.fuelgauge.batteryusage.ConvertUtils;
import com.android.settings.fuelgauge.batteryusage.DeviceBatteryState;
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventDao;
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
import com.android.settings.fuelgauge.batteryusage.db.BatteryState;
import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDao;
import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase;
@@ -70,21 +72,21 @@ public class BatteryTestUtils {
}
/** Inserts a fake data into the database for testing. */
public static void insertDataToBatteryStateDatabase(
public static void insertDataToBatteryStateTable(
Context context, long timestamp, String packageName) {
insertDataToBatteryStateDatabase(
insertDataToBatteryStateTable(
context, timestamp, packageName, /*multiple=*/ false, /*isFullChargeStart=*/ false);
}
/** Inserts a fake data into the database for testing. */
public static void insertDataToBatteryStateDatabase(
public static void insertDataToBatteryStateTable(
Context context, long timestamp, String packageName, boolean isFullChargeStart) {
insertDataToBatteryStateDatabase(
insertDataToBatteryStateTable(
context, timestamp, packageName, /*multiple=*/ false, isFullChargeStart);
}
/** Inserts a fake data into the database for testing. */
public static void insertDataToBatteryStateDatabase(
public static void insertDataToBatteryStateTable(
Context context, long timestamp, String packageName, boolean multiple,
boolean isFullChargeStart) {
DeviceBatteryState deviceBatteryState =
@@ -133,6 +135,34 @@ public class BatteryTestUtils {
}
}
/** Inserts a fake data into the database for testing. */
public static void insertDataToAppUsageEventTable(
Context context, long userId, long timestamp, String packageName) {
insertDataToAppUsageEventTable(
context, userId, timestamp, packageName, /*multiple=*/ false);
}
/** Inserts a fake data into the database for testing. */
public static void insertDataToAppUsageEventTable(
Context context, long userId, long timestamp, String packageName, boolean multiple) {
final AppUsageEventEntity entity =
new AppUsageEventEntity(
/*uid=*/ 101L,
userId,
timestamp,
/*appUsageEventType=*/ 2,
packageName,
/*instanceId=*/ 10001,
/*taskRootPackageName=*/ "com.android.settings");
AppUsageEventDao dao =
BatteryStateDatabase.getInstance(context).appUsageEventDao();
if (multiple) {
dao.insertAll(ImmutableList.of(entity));
} else {
dao.insert(entity);
}
}
public static Intent getCustomBatteryIntent(int plugged, int level, int scale, int status) {
Intent intent = new Intent();
intent.putExtra(BatteryManager.EXTRA_PLUGGED, plugged);