Setting up Metrics CTS Tests

This begins testing the metrics via CTS Tests in detail. Further tests
are to follow.

Bug: 273339663
Test: Build Test
Change-Id: I40da0400b827555a2fd84910b9e361c17c1d2c1f
diff --git a/hostsidetests/statsdatom/Android.bp b/hostsidetests/statsdatom/Android.bp
index f9c1d7f..15006a9 100644
--- a/hostsidetests/statsdatom/Android.bp
+++ b/hostsidetests/statsdatom/Android.bp
@@ -31,6 +31,7 @@
         "src/**/binderstats/*.java",
         "src/**/bluetooth/*.java",
         "src/**/cpu/*.java",
+        "src/**/credentials/*.java",
         "src/**/devicepower/*.java",
         "src/**/devicestate/*.java",
         "src/**/display/*.java",
@@ -88,6 +89,7 @@
         ":CtsStatsdAlarmHelper",
         ":CtsStatsdAlarmHelper2",
         ":CtsVoiceInteractionTestCases",
+        ":CtsCredentialManagerTestCases",
     ],
     per_testcase_directory: true,
 }
diff --git a/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java b/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
index 368fcc6..327ca10 100644
--- a/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
+++ b/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
@@ -23,7 +23,6 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assume.assumeNotNull;
 import static org.junit.Assume.assumeTrue;
-import static org.junit.Assert.assertEquals;
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/credentials/CredentialsStatsTest.java b/hostsidetests/statsdatom/src/android/cts/statsdatom/credentials/CredentialsStatsTest.java
new file mode 100644
index 0000000..d4ef9bc
--- /dev/null
+++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/credentials/CredentialsStatsTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.cts.statsdatom.credentials;
+
+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.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
+
+import com.android.os.StatsLog;
+import com.android.os.credentials.ApiName;
+import com.android.os.credentials.CredentialManagerInitialPhaseReported;
+import com.android.os.credentials.CredentialsExtensionAtoms;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.RunUtil;
+
+import com.google.protobuf.ExtensionRegistry;
+
+import java.util.List;
+
+/**
+ * CTS Tests for Atoms in the Credential Manager flows.
+ *
+ * atest CtsStatsdAtomHostTestCases:CredentialsStatsTest
+ */
+public class CredentialsStatsTest extends DeviceTestCase implements IBuildReceiver {
+    private static final String TAG = "CredentialsStats";
+
+    public static final String TEST_PKG = "android.credentials.cts";
+    public static final String TEST_APK = "CtsCredentialManagerTestCases.apk";
+    public static final String TEST_CLASS =
+            "android.credentials.cts.CtsCredentialProviderServiceDeviceTest";
+
+    private IBuildInfo mCtsBuild;
+    private int mStatsdAtomTestUid;
+
+    private static final String TEST_GET_PASSWORD_NO_CREDENTIAL =
+            "testGetPasswordCredentialRequest_invalidAllowedProviders_onErrorForEmptyResponse";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        assertThat(mCtsBuild).isNotNull();
+        ConfigUtils.removeConfig(getDevice());
+        ReportUtils.clearReports(getDevice());
+        DeviceUtils.installStatsdTestApp(getDevice(), mCtsBuild);
+        DeviceUtils.installTestApp(getDevice(), TEST_APK, TEST_PKG, mCtsBuild);
+        RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG);
+        mStatsdAtomTestUid = DeviceUtils.getAppUid(getDevice(), DeviceUtils.STATSD_ATOM_TEST_PKG);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        ConfigUtils.removeConfig(getDevice());
+        ReportUtils.clearReports(getDevice());
+        DeviceUtils.uninstallStatsdTestApp(getDevice());
+        DeviceUtils.uninstallTestApp(getDevice(), TEST_PKG);
+        super.tearDown();
+    }
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mCtsBuild = buildInfo;
+    }
+
+    public void testInitialPhaseKnownCaller() throws Exception {
+        ConfigUtils.uploadConfigForPushedAtom(getDevice(), TEST_PKG,
+                CredentialsExtensionAtoms.CREDENTIAL_MANAGER_INIT_PHASE_REPORTED_FIELD_NUMBER);
+        ExtensionRegistry registry = ExtensionRegistry.newInstance();
+        CredentialsExtensionAtoms.registerAllExtensions(registry);
+
+        DeviceUtils.runDeviceTests(getDevice(), TEST_PKG, TEST_CLASS,
+                TEST_GET_PASSWORD_NO_CREDENTIAL);
+
+        RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG);
+
+        List<StatsLog.EventMetricData> data = ReportUtils.getEventMetricDataList(
+                getDevice(), registry);
+
+        assertThat(data.size()).isAtLeast(1);
+
+        CredentialManagerInitialPhaseReported actualInitialMetric =
+                data.get(0).getAtom().getExtension(
+                        CredentialsExtensionAtoms.credentialManagerInitPhaseReported);
+
+        assertThat(actualInitialMetric.getApiName().getNumber()).isEqualTo(
+                ApiName.API_NAME_GET_CREDENTIAL_VALUE);
+        assertThat(actualInitialMetric.getCallerUid()).isNotEqualTo(-1);
+        assertThat(actualInitialMetric.getSessionId()).isNotEqualTo(0);
+        assertThat(actualInitialMetric.getInitialTimestampReferenceNanoseconds()).isGreaterThan(0);
+        assertThat(actualInitialMetric.getRequestUniqueClasstypesList()).hasSize(1);
+        assertThat(actualInitialMetric.getPerClasstypeCountsList().get(0)).isEqualTo(1);
+        assertThat(actualInitialMetric.getOriginSpecified()).isEqualTo(false);
+    }
+}
diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/credentials/OWNERS b/hostsidetests/statsdatom/src/android/cts/statsdatom/credentials/OWNERS
new file mode 100644
index 0000000..ffef4ee
--- /dev/null
+++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/credentials/OWNERS
@@ -0,0 +1,2 @@
+# Bug component:  1218609
+include platform/frameworks/base:/core/java/android/credentials/OWNERS
\ No newline at end of file