blob: f324ae53707556286cff87bb95a38ecd44cdc879 [file] [log] [blame]
/*
* Copyright (C) 2023 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 android.healthconnect.cts.logging;
import static com.google.common.truth.Truth.assertThat;
import android.cts.statsdatom.lib.ConfigUtils;
import android.cts.statsdatom.lib.DeviceUtils;
import android.cts.statsdatom.lib.ReportUtils;
import android.healthfitness.api.ApiMethod;
import android.healthfitness.api.ApiStatus;
import android.healthfitness.api.RateLimit;
import com.android.os.StatsLog;
import com.android.os.healthfitness.api.ApiExtensionAtoms;
import com.android.os.healthfitness.api.HealthConnectApiCalled;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.testtype.DeviceTestCase;
import com.android.tradefed.testtype.IBuildReceiver;
import com.google.protobuf.ExtensionRegistry;
import java.util.List;
public class HealthConnectServiceStatsTests extends DeviceTestCase implements IBuildReceiver {
public static final String TEST_APP_PKG_NAME = "android.healthconnect.cts.testhelper";
private IBuildInfo mCtsBuild;
@Override
protected void setUp() throws Exception {
super.setUp();
assertThat(mCtsBuild).isNotNull();
ConfigUtils.removeConfig(getDevice());
ReportUtils.clearReports(getDevice());
}
@Override
protected void tearDown() throws Exception {
ConfigUtils.removeConfig(getDevice());
ReportUtils.clearReports(getDevice());
super.tearDown();
}
@Override
public void setBuild(IBuildInfo buildInfo) {
mCtsBuild = buildInfo;
}
public void testInsertRecords() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectInsertRecords");
assertThat(data.size()).isAtLeast(2);
HealthConnectApiCalled atom =
data.get(1).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.INSERT_DATA);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
assertThat(atom.getErrorCode()).isEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getNumberOfRecords()).isEqualTo(2);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testInsertRecordsError() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectInsertRecordsError");
assertThat(data.size()).isAtLeast(2);
HealthConnectApiCalled atom =
data.get(1).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.INSERT_DATA);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
assertThat(atom.getErrorCode()).isNotEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getNumberOfRecords()).isEqualTo(2);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testUpdateRecords() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectUpdateRecords");
assertThat(data.size()).isAtLeast(3);
HealthConnectApiCalled atom =
data.get(2).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.UPDATE_DATA);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
assertThat(atom.getErrorCode()).isEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getNumberOfRecords()).isEqualTo(3);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testUpdateRecordsError() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectUpdateRecordsError");
assertThat(data.size()).isAtLeast(3);
HealthConnectApiCalled atom =
data.get(2).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.UPDATE_DATA);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
assertThat(atom.getErrorCode()).isNotEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getNumberOfRecords()).isEqualTo(1);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testDeleteRecords() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectDeleteRecords");
assertThat(data.size()).isAtLeast(3);
HealthConnectApiCalled atom =
data.get(2).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.DELETE_DATA);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
assertThat(atom.getErrorCode()).isEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getNumberOfRecords()).isEqualTo(2);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testDeleteRecordsError() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectDeleteRecordsError");
assertThat(data.size()).isAtLeast(3);
HealthConnectApiCalled atom =
data.get(2).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.DELETE_DATA);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
assertThat(atom.getErrorCode()).isNotEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testReadRecords() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectReadRecords");
assertThat(data.size()).isAtLeast(3);
HealthConnectApiCalled atom =
data.get(2).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.READ_DATA);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
assertThat(atom.getErrorCode()).isEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getNumberOfRecords()).isEqualTo(1);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testReadRecordsError() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectReadRecordsError");
assertThat(data.size()).isAtLeast(2);
HealthConnectApiCalled atom =
data.get(1).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.READ_DATA);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
assertThat(atom.getErrorCode()).isNotEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testChangeLogTokenRequest() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectGetChangeLogToken");
assertThat(data.size()).isAtLeast(2);
HealthConnectApiCalled atom =
data.get(1).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.GET_CHANGES_TOKEN);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
assertThat(atom.getErrorCode()).isEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getNumberOfRecords()).isEqualTo(0);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testChangeLogTokenRequestError() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectGetChangeLogTokenError");
assertThat(data.size()).isAtLeast(2);
HealthConnectApiCalled atom =
data.get(1).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.GET_CHANGES_TOKEN);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
assertThat(atom.getErrorCode()).isNotEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getNumberOfRecords()).isEqualTo(0);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testChangeLogsRequest() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectGetChangeLogs");
assertThat(data.size()).isAtLeast(5);
HealthConnectApiCalled atom =
data.get(4).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.GET_CHANGES);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
assertThat(atom.getErrorCode()).isEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getNumberOfRecords()).isEqualTo(1);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testChangeLogsRequestError() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectGetChangeLogsError");
assertThat(data.size()).isAtLeast(2);
HealthConnectApiCalled atom =
data.get(1).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.GET_CHANGES);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
assertThat(atom.getErrorCode()).isNotEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testAggregatedDataRequest() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectAggregatedData");
assertThat(data.size()).isAtLeast(2);
HealthConnectApiCalled atom =
data.get(1).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.READ_AGGREGATED_DATA);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.SUCCESS);
assertThat(atom.getErrorCode()).isEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getNumberOfRecords()).isEqualTo(1);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
public void testAggregatedDataRequestError() throws Exception {
List<StatsLog.EventMetricData> data =
uploadAtomConfigAndTriggerTest("testHealthConnectAggregatedDataError");
assertThat(data.size()).isAtLeast(2);
HealthConnectApiCalled atom =
data.get(1).getAtom().getExtension(ApiExtensionAtoms.healthConnectApiCalled);
assertThat(atom.getApiMethod()).isEqualTo(ApiMethod.READ_AGGREGATED_DATA);
assertThat(atom.getApiStatus()).isEqualTo(ApiStatus.ERROR);
assertThat(atom.getErrorCode()).isNotEqualTo(0);
assertThat(atom.getDurationMillis()).isAtLeast(0);
assertThat(atom.getNumberOfRecords()).isEqualTo(1);
assertThat(atom.getRateLimit()).isEqualTo(RateLimit.NOT_USED);
}
private List<StatsLog.EventMetricData> uploadAtomConfigAndTriggerTest(String testName)
throws Exception {
ConfigUtils.uploadConfigForPushedAtoms(
getDevice(),
DeviceUtils.STATSD_ATOM_TEST_PKG,
new int[] {ApiExtensionAtoms.HEALTH_CONNECT_API_CALLED_FIELD_NUMBER});
DeviceUtils.runDeviceTests(
getDevice(), TEST_APP_PKG_NAME, ".HealthConnectServiceLogsTests", testName);
ExtensionRegistry registry = ExtensionRegistry.newInstance();
ApiExtensionAtoms.registerAllExtensions(registry);
return ReportUtils.getEventMetricDataList(getDevice(), registry);
}
}