Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35895da3 authored by Will Brockman's avatar Will Brockman
Browse files

Statsd TestDrive tool: Write output to stdout.

Also: Option for less verbose output.

Bug: 149914234
Test: atest --host test/com/android/statsd/shelltools/testdrive/TestDriveTest.java
Test: out/host/linux-x86/bin/statsd_testdrive -terse -one 29 33 48 62 63 64 90 149 244 245 246 259 260
Change-Id: I4ed4cfdd85eb5382ce28846ed6ed81b4dd3f5334
parent 8862ee38
Loading
Loading
Loading
Loading
+55 −4
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.internal.os.StatsdConfigProto.SimpleAtomMatcher;
import com.android.internal.os.StatsdConfigProto.StatsdConfig;
import com.android.internal.os.StatsdConfigProto.TimeUnit;
import com.android.os.AtomsProto.Atom;
import com.android.os.StatsLog;
import com.android.os.StatsLog.ConfigMetricsReport;
import com.android.os.StatsLog.ConfigMetricsReportList;
import com.android.os.StatsLog.StatsLogReport;
@@ -78,11 +79,12 @@ public class TestDrive {

    @VisibleForTesting
    String mDeviceSerial = null;
    @VisibleForTesting
    Dumper mDumper = new BasicDumper();

    public static void main(String[] args) {
        final Configuration configuration = new Configuration();

        TestDrive testDrive = new TestDrive();
        final TestDrive testDrive = new TestDrive();
        Utils.setUpLogger(LOGGER, false);

        if (!testDrive.processArgs(configuration, args,
@@ -94,7 +96,7 @@ public class TestDrive {
                configuration.createConfig(), configuration.hasPulledAtoms(),
                configuration.hasPushedAtoms());
        if (reports != null) {
            configuration.dumpMetrics(reports);
            configuration.dumpMetrics(reports, testDrive.mDumper);
        }
    }

@@ -116,6 +118,9 @@ public class TestDrive {
            if (remaining_args >= 2 && arg.equals("-one")) {
                LOGGER.info("Creating one event metric to catch all pushed atoms.");
                configuration.mOnePushedAtomEvent = true;
            } else if (remaining_args >= 2 && arg.equals("-terse")) {
                LOGGER.info("Terse output format.");
                mDumper = new TerseDumper();
            } else if (remaining_args >= 3 && arg.equals("-p")) {
                configuration.mAdditionalAllowedPackage = args[++first_arg];
            } else if (remaining_args >= 3 && arg.equals("-s")) {
@@ -198,12 +203,13 @@ public class TestDrive {
        String mAdditionalAllowedPackage = null;
        private final Set<Long> mTrackedMetrics = new HashSet<>();

        private void dumpMetrics(ConfigMetricsReportList reportList) {
        private void dumpMetrics(ConfigMetricsReportList reportList, Dumper dumper) {
            // We may get multiple reports. Take the last one.
            ConfigMetricsReport report = reportList.getReports(reportList.getReportsCount() - 1);
            for (StatsLogReport statsLog : report.getMetricsList()) {
                if (isTrackedMetric(statsLog.getMetricId())) {
                    LOGGER.info(statsLog.toString());
                    dumper.dump(statsLog);
                }
            }
        }
@@ -341,6 +347,51 @@ public class TestDrive {
        }
    }

    interface Dumper {
        void dump(StatsLogReport report);
    }

    static class BasicDumper implements Dumper {
        @Override
        public void dump(StatsLogReport report) {
            System.out.println(report.toString());
        }
    }

    static class TerseDumper extends BasicDumper {
        @Override
        public void dump(StatsLogReport report) {
            if (report.hasGaugeMetrics()) {
                dumpGaugeMetrics(report);
            }
            if (report.hasEventMetrics()) {
                dumpEventMetrics(report);
            }
        }
        void dumpEventMetrics(StatsLogReport report) {
            final List<StatsLog.EventMetricData> data = report.getEventMetrics().getDataList();
            if (data.isEmpty()) {
                return;
            }
            long firstTimestampNanos = data.get(0).getElapsedTimestampNanos();
            for (StatsLog.EventMetricData event : data) {
                final double deltaSec = (event.getElapsedTimestampNanos() - firstTimestampNanos)
                        / 1e9;
                System.out.println(
                        String.format("+%.3fs: %s", deltaSec, event.getAtom().toString()));
            }
        }
        void dumpGaugeMetrics(StatsLogReport report) {
            final List<StatsLog.GaugeMetricData> data = report.getGaugeMetrics().getDataList();
            if (data.isEmpty()) {
                return;
            }
            for (StatsLog.GaugeMetricData gauge : data) {
                System.out.println(gauge.toString());
            }
        }
    }

    private static String pushConfig(StatsdConfig config, String deviceSerial)
            throws IOException, InterruptedException {
        File configFile = File.createTempFile("statsdconfig", ".config");
+36 −10
Original line number Diff line number Diff line
@@ -41,24 +41,21 @@ public class TestDriveTest {
    static class Expect {
        public boolean success;
        public Integer[] atoms;
        public boolean onePushedAtomEvent;
        public String extraPackage;
        public boolean onePushedAtomEvent = false;
        public String extraPackage = null;
        public String target;
        public boolean terse = false;

        static Expect success(Integer... atoms) {
            return new Expect(true, atoms, false, null,
            return new Expect(true, atoms,
                    TARGET);
        }
        Expect(boolean success, Integer[] atoms, boolean onePushedAtomEvent, String extraPackage,
                String target) {
        Expect(boolean success, Integer[] atoms, String target) {
            this.success = success;
            this.atoms = atoms;
            this.onePushedAtomEvent = onePushedAtomEvent;
            this.extraPackage = extraPackage;
            this.target = target;
        }
        static final Expect FAILURE = new Expect(false, null,
                false, null, null);
        static final Expect FAILURE = new Expect(false, null, null);
        Expect onePushedAtomEvent() {
            this.onePushedAtomEvent = true;
            return this;
@@ -67,6 +64,10 @@ public class TestDriveTest {
            this.extraPackage = TestDriveTest.PACKAGE;
            return this;
        }
        Expect terse() {
            this.terse = true;
            return this;
        }
    }

    @Parameterized.Parameter(0)
@@ -118,6 +119,10 @@ public class TestDriveTest {
                        Expect.FAILURE},  // Two connected devices, no indication of which to use
                new Object[]{new String[]{"-one", "244", "245"}, TARGET_ONLY, null,
                        Expect.success(244, 245).onePushedAtomEvent()},
                new Object[]{new String[]{"-terse", "-one", "244", "245"}, TARGET_ONLY, null,
                        Expect.success(244, 245).onePushedAtomEvent().terse()},
                new Object[]{new String[]{"-one", "-terse", "244", "245"}, TARGET_ONLY, null,
                        Expect.success(244, 245).onePushedAtomEvent().terse()},
                new Object[]{new String[]{"-p", PACKAGE, "244", "245"}, TARGET_ONLY, null,
                        Expect.success(244, 245).extraPackage()},
                new Object[]{new String[]{"-p", PACKAGE, "-one", "244", "245"}, TARGET_ONLY, null,
@@ -132,7 +137,23 @@ public class TestDriveTest {
                        Expect.success(244, 245).extraPackage().onePushedAtomEvent()},
                new Object[]{new String[]{"-one", "-p", PACKAGE, "-s", TARGET, "244", "245"},
                        TARGET_AND_OTHER, null,
                        Expect.success(244, 245).extraPackage().onePushedAtomEvent()}
                        Expect.success(244, 245).extraPackage().onePushedAtomEvent()},
                new Object[]{new String[]{"-terse", "-one", "-p", PACKAGE, "-s", TARGET,
                        "244", "245"},
                        TARGET_AND_OTHER, null,
                        Expect.success(244, 245).extraPackage().onePushedAtomEvent().terse()},
                new Object[]{new String[]{"-one", "-terse", "-p", PACKAGE, "-s", TARGET,
                        "244", "245"},
                        TARGET_AND_OTHER, null,
                        Expect.success(244, 245).extraPackage().onePushedAtomEvent().terse()},
                new Object[]{new String[]{"-one", "-p", PACKAGE, "-terse", "-s", TARGET,
                        "244", "245"},
                        TARGET_AND_OTHER, null,
                        Expect.success(244, 245).extraPackage().onePushedAtomEvent().terse()},
                new Object[]{new String[]{"-one", "-p", PACKAGE, "-s", TARGET, "-terse",
                        "244", "245"},
                        TARGET_AND_OTHER, null,
                        Expect.success(244, 245).extraPackage().onePushedAtomEvent().terse()}
        );
    }

@@ -162,6 +183,11 @@ public class TestDriveTest {
            assertArrayEquals(mExpect.atoms, collectAtoms(mConfiguration));
            assertEquals(mExpect.onePushedAtomEvent, mConfiguration.mOnePushedAtomEvent);
            assertEquals(mExpect.target, mTestDrive.mDeviceSerial);
            if (mExpect.terse) {
                assertEquals(TestDrive.TerseDumper.class, mTestDrive.mDumper.getClass());
            } else {
                assertEquals(TestDrive.BasicDumper.class, mTestDrive.mDumper.getClass());
            }
        } else {
            assertFalse(result);
        }