Report registration metrics data
Collect information about registration successes, failures, and unregistrations, then build metrics data from this information and report it. Bug: 287546772 Test: atest FrameworksNetTestCases NsdManagerTest Change-Id: I6324279b479da2e61b7519d96df5ad24a432e54a
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* 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 com.android.metrics
|
||||
|
||||
import android.os.Build
|
||||
import android.stats.connectivity.MdnsQueryResult
|
||||
import android.stats.connectivity.NsdEventType
|
||||
import com.android.testutils.DevSdkIgnoreRule
|
||||
import com.android.testutils.DevSdkIgnoreRunner
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertFalse
|
||||
import kotlin.test.assertTrue
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mockito.ArgumentCaptor
|
||||
import org.mockito.Mockito.mock
|
||||
import org.mockito.Mockito.verify
|
||||
|
||||
@RunWith(DevSdkIgnoreRunner::class)
|
||||
@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
|
||||
class NetworkNsdReportedMetricsTest {
|
||||
private val deps = mock(NetworkNsdReportedMetrics.Dependencies::class.java)
|
||||
|
||||
@Test
|
||||
fun testReportServiceRegistrationSucceeded() {
|
||||
val clientId = 99
|
||||
val transactionId = 100
|
||||
val durationMs = 10L
|
||||
val metrics = NetworkNsdReportedMetrics(true /* isLegacy */, clientId, deps)
|
||||
metrics.reportServiceRegistrationSucceeded(transactionId, durationMs)
|
||||
|
||||
val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java)
|
||||
verify(deps).statsWrite(eventCaptor.capture())
|
||||
eventCaptor.value.let {
|
||||
assertTrue(it.isLegacy)
|
||||
assertEquals(clientId, it.clientId)
|
||||
assertEquals(transactionId, it.transactionId)
|
||||
assertEquals(NsdEventType.NET_REGISTER, it.type)
|
||||
assertEquals(MdnsQueryResult.MQR_SERVICE_REGISTERED, it.queryResult)
|
||||
assertEquals(durationMs, it.eventDurationMillisec)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testReportServiceRegistrationFailed() {
|
||||
val clientId = 99
|
||||
val transactionId = 100
|
||||
val durationMs = 10L
|
||||
val metrics = NetworkNsdReportedMetrics(false /* isLegacy */, clientId, deps)
|
||||
metrics.reportServiceRegistrationFailed(transactionId, durationMs)
|
||||
|
||||
val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java)
|
||||
verify(deps).statsWrite(eventCaptor.capture())
|
||||
eventCaptor.value.let {
|
||||
assertFalse(it.isLegacy)
|
||||
assertEquals(clientId, it.clientId)
|
||||
assertEquals(transactionId, it.transactionId)
|
||||
assertEquals(NsdEventType.NET_REGISTER, it.type)
|
||||
assertEquals(MdnsQueryResult.MQR_SERVICE_REGISTRATION_FAILED, it.queryResult)
|
||||
assertEquals(durationMs, it.eventDurationMillisec)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testReportServiceUnregistration() {
|
||||
val clientId = 99
|
||||
val transactionId = 100
|
||||
val durationMs = 10L
|
||||
val metrics = NetworkNsdReportedMetrics(true /* isLegacy */, clientId, deps)
|
||||
metrics.reportServiceUnregistration(transactionId, durationMs)
|
||||
|
||||
val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java)
|
||||
verify(deps).statsWrite(eventCaptor.capture())
|
||||
eventCaptor.value.let {
|
||||
assertTrue(it.isLegacy)
|
||||
assertEquals(clientId, it.clientId)
|
||||
assertEquals(transactionId, it.transactionId)
|
||||
assertEquals(NsdEventType.NET_REGISTER, it.type)
|
||||
assertEquals(MdnsQueryResult.MQR_SERVICE_UNREGISTERED, it.queryResult)
|
||||
assertEquals(durationMs, it.eventDurationMillisec)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -43,7 +43,9 @@ import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertThrows;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.anyLong;
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
import static org.mockito.ArgumentMatchers.argThat;
|
||||
import static org.mockito.Mockito.any;
|
||||
@@ -95,6 +97,7 @@ import android.util.Pair;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.metrics.NetworkNsdReportedMetrics;
|
||||
import com.android.server.NsdService.Dependencies;
|
||||
import com.android.server.connectivity.mdns.MdnsAdvertiser;
|
||||
import com.android.server.connectivity.mdns.MdnsDiscoveryManager;
|
||||
@@ -104,6 +107,7 @@ import com.android.server.connectivity.mdns.MdnsServiceBrowserListener;
|
||||
import com.android.server.connectivity.mdns.MdnsServiceInfo;
|
||||
import com.android.server.connectivity.mdns.MdnsSocketProvider;
|
||||
import com.android.server.connectivity.mdns.MdnsSocketProvider.SocketRequestMonitor;
|
||||
import com.android.server.connectivity.mdns.util.MdnsUtils;
|
||||
import com.android.testutils.DevSdkIgnoreRule;
|
||||
import com.android.testutils.DevSdkIgnoreRunner;
|
||||
import com.android.testutils.HandlerUtils;
|
||||
@@ -138,6 +142,7 @@ public class NsdServiceTest {
|
||||
static final int PROTOCOL = NsdManager.PROTOCOL_DNS_SD;
|
||||
private static final long CLEANUP_DELAY_MS = 500;
|
||||
private static final long TIMEOUT_MS = 500;
|
||||
private static final long TEST_TIME_MS = 123L;
|
||||
private static final String SERVICE_NAME = "a_name";
|
||||
private static final String SERVICE_TYPE = "_test._tcp";
|
||||
private static final String SERVICE_FULL_NAME = SERVICE_NAME + "." + SERVICE_TYPE;
|
||||
@@ -164,6 +169,8 @@ public class NsdServiceTest {
|
||||
@Mock WifiManager mWifiManager;
|
||||
@Mock WifiManager.MulticastLock mMulticastLock;
|
||||
@Mock ActivityManager mActivityManager;
|
||||
@Mock NetworkNsdReportedMetrics mMetrics;
|
||||
@Mock MdnsUtils.Clock mClock;
|
||||
SocketRequestMonitor mSocketRequestMonitor;
|
||||
OnUidImportanceListener mUidImportanceListener;
|
||||
HandlerThread mThread;
|
||||
@@ -210,6 +217,9 @@ public class NsdServiceTest {
|
||||
doReturn(DEFAULT_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF).when(mDeps).getDeviceConfigInt(
|
||||
eq(NsdService.MDNS_CONFIG_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF), anyInt());
|
||||
doReturn(mAdvertiser).when(mDeps).makeMdnsAdvertiser(any(), any(), any(), any());
|
||||
doReturn(mMetrics).when(mDeps).makeNetworkNsdReportedMetrics(anyBoolean(), anyInt());
|
||||
doReturn(mClock).when(mDeps).makeClock();
|
||||
doReturn(TEST_TIME_MS).when(mClock).elapsedRealtime();
|
||||
mService = makeService();
|
||||
final ArgumentCaptor<SocketRequestMonitor> cbMonitorCaptor =
|
||||
ArgumentCaptor.forClass(SocketRequestMonitor.class);
|
||||
@@ -512,14 +522,16 @@ public class NsdServiceTest {
|
||||
eq(SERVICE_NAME), eq(SERVICE_TYPE), eq(PORT), any(), eq(IFACE_IDX_ANY));
|
||||
|
||||
// Register service successfully.
|
||||
final int regId = regIdCaptor.getValue();
|
||||
final RegistrationInfo registrationInfo = new RegistrationInfo(
|
||||
regIdCaptor.getValue(),
|
||||
regId,
|
||||
IMDnsEventListener.SERVICE_REGISTERED,
|
||||
SERVICE_NAME,
|
||||
SERVICE_TYPE,
|
||||
PORT,
|
||||
new byte[0] /* txtRecord */,
|
||||
IFACE_IDX_ANY);
|
||||
doReturn(TEST_TIME_MS + 10L).when(mClock).elapsedRealtime();
|
||||
eventListener.onServiceRegistrationStatus(registrationInfo);
|
||||
|
||||
final ArgumentCaptor<NsdServiceInfo> registeredInfoCaptor =
|
||||
@@ -528,19 +540,22 @@ public class NsdServiceTest {
|
||||
.onServiceRegistered(registeredInfoCaptor.capture());
|
||||
final NsdServiceInfo registeredInfo = registeredInfoCaptor.getValue();
|
||||
assertEquals(SERVICE_NAME, registeredInfo.getServiceName());
|
||||
verify(mMetrics).reportServiceRegistrationSucceeded(regId, 10L /* durationMs */);
|
||||
|
||||
// Fail to register service.
|
||||
final RegistrationInfo registrationFailedInfo = new RegistrationInfo(
|
||||
regIdCaptor.getValue(),
|
||||
regId,
|
||||
IMDnsEventListener.SERVICE_REGISTRATION_FAILED,
|
||||
null /* serviceName */,
|
||||
null /* registrationType */,
|
||||
0 /* port */,
|
||||
new byte[0] /* txtRecord */,
|
||||
IFACE_IDX_ANY);
|
||||
doReturn(TEST_TIME_MS + 20L).when(mClock).elapsedRealtime();
|
||||
eventListener.onServiceRegistrationStatus(registrationFailedInfo);
|
||||
verify(regListener, timeout(TIMEOUT_MS))
|
||||
.onRegistrationFailed(any(), eq(FAILURE_INTERNAL_ERROR));
|
||||
verify(mMetrics).reportServiceRegistrationFailed(regId, 20L /* durationMs */);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1215,17 +1230,22 @@ public class NsdServiceTest {
|
||||
|
||||
// Verify onServiceRegistered callback
|
||||
final MdnsAdvertiser.AdvertiserCallback cb = cbCaptor.getValue();
|
||||
cb.onRegisterServiceSucceeded(idCaptor.getValue(), regInfo);
|
||||
final int regId = idCaptor.getValue();
|
||||
doReturn(TEST_TIME_MS + 10L).when(mClock).elapsedRealtime();
|
||||
cb.onRegisterServiceSucceeded(regId, regInfo);
|
||||
|
||||
verify(regListener, timeout(TIMEOUT_MS)).onServiceRegistered(argThat(info -> matches(info,
|
||||
new NsdServiceInfo(regInfo.getServiceName(), null))));
|
||||
verify(mMetrics).reportServiceRegistrationSucceeded(regId, 10L /* durationMs */);
|
||||
|
||||
doReturn(TEST_TIME_MS + 100L).when(mClock).elapsedRealtime();
|
||||
client.unregisterService(regListener);
|
||||
waitForIdle();
|
||||
verify(mAdvertiser).removeService(idCaptor.getValue());
|
||||
verify(regListener, timeout(TIMEOUT_MS)).onServiceUnregistered(
|
||||
argThat(info -> matches(info, regInfo)));
|
||||
verify(mSocketProvider, timeout(TIMEOUT_MS)).requestStopWhenInactive();
|
||||
verify(mMetrics).reportServiceUnregistration(regId, 100L /* durationMs */);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1251,6 +1271,7 @@ public class NsdServiceTest {
|
||||
|
||||
verify(regListener, timeout(TIMEOUT_MS)).onRegistrationFailed(
|
||||
argThat(info -> matches(info, regInfo)), eq(FAILURE_INTERNAL_ERROR));
|
||||
verify(mMetrics).reportServiceRegistrationFailed(anyInt(), anyLong());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1280,10 +1301,13 @@ public class NsdServiceTest {
|
||||
|
||||
// Verify onServiceRegistered callback
|
||||
final MdnsAdvertiser.AdvertiserCallback cb = cbCaptor.getValue();
|
||||
cb.onRegisterServiceSucceeded(idCaptor.getValue(), regInfo);
|
||||
final int regId = idCaptor.getValue();
|
||||
doReturn(TEST_TIME_MS + 10L).when(mClock).elapsedRealtime();
|
||||
cb.onRegisterServiceSucceeded(regId, regInfo);
|
||||
|
||||
verify(regListener, timeout(TIMEOUT_MS)).onServiceRegistered(
|
||||
argThat(info -> matches(info, new NsdServiceInfo(regInfo.getServiceName(), null))));
|
||||
verify(mMetrics).reportServiceRegistrationSucceeded(regId, 10L /* durationMs */);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user