Load app usage events data in the hourly job.
Test: make RunSettingsRoboTests + manual Bug: 260964679 Change-Id: Iaccaa77bd52fb7356cdcb786c64523f21040b128
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
@@ -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,
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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))
|
||||
|
@@ -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,
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user