blob: 31ecb808ae1a782c8b7b88fa2498923a6da9ca97 [file]
/*
* Copyright (C) 2024 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 test;
import static com.google.common.truth.Truth.assertThat;
import android.cts.statsdatom.lib.AtomTestUtils;
import android.cts.statsdatom.lib.ConfigUtils;
import android.cts.statsdatom.lib.ReportUtils;
import com.android.internal.os.StatsdConfigProto;
import com.android.os.framework.FrameworkExtensionAtoms;
import com.android.os.uprobestats.UprobestatsExtensionAtoms;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.util.RunUtil;
import com.google.protobuf.ExtensionRegistry;
import com.google.protobuf.TextFormat;
import uprobestats.protos.Config.UprobestatsConfig;
import java.io.File;
import java.nio.file.Files;
import java.util.Scanner;
/** Collection of utilities to set up statsd and start uprobestats for a test. */
public class SmokeTestSetup {
private static final String CONFIG_DIR = "/data/misc/uprobestats-configs/";
private static final String CONFIG_NAME = "config";
private static final String CMD_SETPROP_UPROBESTATS = "setprop ctl.start uprobestats";
/** Initializes and then sets up the statsd extension registry */
public static ExtensionRegistry initializeStatsD(ITestDevice device) throws Exception {
ConfigUtils.removeConfig(device);
ReportUtils.clearReports(device);
ExtensionRegistry registry = ExtensionRegistry.newInstance();
UprobestatsExtensionAtoms.registerAllExtensions(registry);
FrameworkExtensionAtoms.registerAllExtensions(registry);
return registry;
}
/** Cleans up any pre-existing uprobestats execution. */
public static void initializeUprobeStats(ITestDevice device) throws Exception {
device.deleteFile(CONFIG_DIR + CONFIG_NAME);
RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG);
device.executeShellCommand("killall uprobestats");
}
/**
* Starts UprobeStats with the given config and configures statsd to collect the given atomIds.
*/
public static void configureStatsDAndStartUprobeStats(
Class clazz, ITestDevice device, String textprotoFilename, int... atomIds)
throws Exception {
// 1. Parse config from resources
String textProto =
new Scanner(clazz.getResourceAsStream(textprotoFilename))
.useDelimiter("\\A")
.next();
UprobestatsConfig.Builder builder = UprobestatsConfig.newBuilder();
TextFormat.getParser().merge(textProto, builder);
UprobestatsConfig config = builder.build();
// 2. Write config to a file and drop it on the device
File tmp = File.createTempFile("uprobestats", CONFIG_NAME);
assertThat(tmp.setWritable(true)).isTrue();
Files.write(tmp.toPath(), config.toByteArray());
assertThat(device.enableAdbRoot()).isTrue();
assertThat(device.pushFile(tmp, CONFIG_DIR + CONFIG_NAME)).isTrue();
// 3. Configure StatsD
StatsdConfigProto.StatsdConfig.Builder configBuilder =
ConfigUtils.createConfigBuilder("AID_UPROBESTATS");
for (int atomId : atomIds) {
ConfigUtils.addEventMetric(configBuilder, atomId);
}
ConfigUtils.uploadConfig(device, configBuilder);
// 4. Start UprobeStats
device.executeShellCommand(CMD_SETPROP_UPROBESTATS);
// Allow UprobeStats time to attach probe
RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG);
}
}