Merge "Add Chicken bit for the mDNS offload feature" into main

This commit is contained in:
Yuyang Huang
2023-09-08 13:25:53 +00:00
committed by Gerrit Code Review
5 changed files with 150 additions and 57 deletions

View File

@@ -26,7 +26,6 @@ import static android.net.nsd.NsdManager.MDNS_DISCOVERY_MANAGER_EVENT;
import static android.net.nsd.NsdManager.MDNS_SERVICE_EVENT; import static android.net.nsd.NsdManager.MDNS_SERVICE_EVENT;
import static android.net.nsd.NsdManager.RESOLVE_SERVICE_SUCCEEDED; import static android.net.nsd.NsdManager.RESOLVE_SERVICE_SUCCEEDED;
import static android.provider.DeviceConfig.NAMESPACE_TETHERING; import static android.provider.DeviceConfig.NAMESPACE_TETHERING;
import static com.android.modules.utils.build.SdkLevel.isAtLeastU; import static com.android.modules.utils.build.SdkLevel.isAtLeastU;
import static com.android.networkstack.apishim.ConstantsShim.REGISTER_NSD_OFFLOAD_ENGINE; import static com.android.networkstack.apishim.ConstantsShim.REGISTER_NSD_OFFLOAD_ENGINE;
import static com.android.server.connectivity.mdns.MdnsAdvertiser.AdvertiserMetrics; import static com.android.server.connectivity.mdns.MdnsAdvertiser.AdvertiserMetrics;
@@ -89,6 +88,7 @@ import com.android.net.module.util.SharedLog;
import com.android.server.connectivity.mdns.ExecutorProvider; import com.android.server.connectivity.mdns.ExecutorProvider;
import com.android.server.connectivity.mdns.MdnsAdvertiser; import com.android.server.connectivity.mdns.MdnsAdvertiser;
import com.android.server.connectivity.mdns.MdnsDiscoveryManager; import com.android.server.connectivity.mdns.MdnsDiscoveryManager;
import com.android.server.connectivity.mdns.MdnsFeatureFlags;
import com.android.server.connectivity.mdns.MdnsInterfaceSocket; import com.android.server.connectivity.mdns.MdnsInterfaceSocket;
import com.android.server.connectivity.mdns.MdnsMultinetworkSocketClient; import com.android.server.connectivity.mdns.MdnsMultinetworkSocketClient;
import com.android.server.connectivity.mdns.MdnsSearchOptions; import com.android.server.connectivity.mdns.MdnsSearchOptions;
@@ -1695,8 +1695,11 @@ public class NsdService extends INsdManager.Stub {
mMdnsDiscoveryManager = deps.makeMdnsDiscoveryManager(new ExecutorProvider(), mMdnsDiscoveryManager = deps.makeMdnsDiscoveryManager(new ExecutorProvider(),
mMdnsSocketClient, LOGGER.forSubComponent("MdnsDiscoveryManager")); mMdnsSocketClient, LOGGER.forSubComponent("MdnsDiscoveryManager"));
handler.post(() -> mMdnsSocketClient.setCallback(mMdnsDiscoveryManager)); handler.post(() -> mMdnsSocketClient.setCallback(mMdnsDiscoveryManager));
MdnsFeatureFlags flags = new MdnsFeatureFlags.Builder().setIsMdnsOffloadFeatureEnabled(
mDeps.isTetheringFeatureNotChickenedOut(
MdnsFeatureFlags.NSD_FORCE_DISABLE_MDNS_OFFLOAD)).build();
mAdvertiser = deps.makeMdnsAdvertiser(handler.getLooper(), mMdnsSocketProvider, mAdvertiser = deps.makeMdnsAdvertiser(handler.getLooper(), mMdnsSocketProvider,
new AdvertiserCallback(), LOGGER.forSubComponent("MdnsAdvertiser")); new AdvertiserCallback(), LOGGER.forSubComponent("MdnsAdvertiser"), flags);
mClock = deps.makeClock(); mClock = deps.makeClock();
} }
@@ -1744,6 +1747,13 @@ public class NsdService extends INsdManager.Stub {
return DeviceConfigUtils.isTetheringFeatureEnabled(context, feature); return DeviceConfigUtils.isTetheringFeatureEnabled(context, feature);
} }
/**
* @see DeviceConfigUtils#isTetheringFeatureNotChickenedOut
*/
public boolean isTetheringFeatureNotChickenedOut(String feature) {
return DeviceConfigUtils.isTetheringFeatureNotChickenedOut(feature);
}
/** /**
* @see MdnsDiscoveryManager * @see MdnsDiscoveryManager
*/ */
@@ -1758,8 +1768,9 @@ public class NsdService extends INsdManager.Stub {
*/ */
public MdnsAdvertiser makeMdnsAdvertiser( public MdnsAdvertiser makeMdnsAdvertiser(
@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider, @NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider,
@NonNull MdnsAdvertiser.AdvertiserCallback cb, @NonNull SharedLog sharedLog) { @NonNull MdnsAdvertiser.AdvertiserCallback cb, @NonNull SharedLog sharedLog,
return new MdnsAdvertiser(looper, socketProvider, cb, sharedLog); MdnsFeatureFlags featureFlags) {
return new MdnsAdvertiser(looper, socketProvider, cb, sharedLog, featureFlags);
} }
/** /**

View File

@@ -78,6 +78,7 @@ public class MdnsAdvertiser {
@NonNull private final SharedLog mSharedLog; @NonNull private final SharedLog mSharedLog;
private final Map<String, List<OffloadServiceInfoWrapper>> mInterfaceOffloadServices = private final Map<String, List<OffloadServiceInfoWrapper>> mInterfaceOffloadServices =
new ArrayMap<>(); new ArrayMap<>();
private final MdnsFeatureFlags mMdnsFeatureFlags;
/** /**
* Dependencies for {@link MdnsAdvertiser}, useful for testing. * Dependencies for {@link MdnsAdvertiser}, useful for testing.
@@ -140,22 +141,21 @@ public class MdnsAdvertiser {
mSharedLog.wtf("Register succeeded for unknown registration"); mSharedLog.wtf("Register succeeded for unknown registration");
return; return;
} }
if (mMdnsFeatureFlags.mIsMdnsOffloadFeatureEnabled) {
final String interfaceName = advertiser.getSocketInterfaceName();
final List<OffloadServiceInfoWrapper> existingOffloadServiceInfoWrappers =
mInterfaceOffloadServices.computeIfAbsent(interfaceName,
k -> new ArrayList<>());
// Remove existing offload services from cache for update.
existingOffloadServiceInfoWrappers.removeIf(item -> item.mServiceId == serviceId);
final String interfaceName = advertiser.getSocketInterfaceName(); byte[] rawOffloadPacket = advertiser.getRawOffloadPayload(serviceId);
final List<OffloadServiceInfoWrapper> existingOffloadServiceInfoWrappers = final OffloadServiceInfoWrapper newOffloadServiceInfoWrapper = createOffloadService(
mInterfaceOffloadServices.computeIfAbsent( serviceId, registration, rawOffloadPacket);
interfaceName, k -> new ArrayList<>()); existingOffloadServiceInfoWrappers.add(newOffloadServiceInfoWrapper);
// Remove existing offload services from cache for update. mCb.onOffloadStartOrUpdate(interfaceName,
existingOffloadServiceInfoWrappers.removeIf(item -> item.mServiceId == serviceId); newOffloadServiceInfoWrapper.mOffloadServiceInfo);
}
byte[] rawOffloadPacket = advertiser.getRawOffloadPayload(serviceId);
final OffloadServiceInfoWrapper newOffloadServiceInfoWrapper = createOffloadService(
serviceId,
registration,
rawOffloadPacket);
existingOffloadServiceInfoWrappers.add(newOffloadServiceInfoWrapper);
mCb.onOffloadStartOrUpdate(interfaceName,
newOffloadServiceInfoWrapper.mOffloadServiceInfo);
// Wait for all current interfaces to be done probing before notifying of success. // Wait for all current interfaces to be done probing before notifying of success.
if (any(mAllAdvertisers, (k, a) -> a.isProbing(serviceId))) return; if (any(mAllAdvertisers, (k, a) -> a.isProbing(serviceId))) return;
@@ -188,7 +188,9 @@ public class MdnsAdvertiser {
if (!a.maybeRestartProbingForConflict(serviceId)) { if (!a.maybeRestartProbingForConflict(serviceId)) {
return; return;
} }
maybeSendOffloadStop(a.getSocketInterfaceName(), serviceId); if (mMdnsFeatureFlags.mIsMdnsOffloadFeatureEnabled) {
maybeSendOffloadStop(a.getSocketInterfaceName(), serviceId);
}
}); });
return; return;
} }
@@ -280,12 +282,12 @@ public class MdnsAdvertiser {
*/ */
boolean onAdvertiserDestroyed(@NonNull MdnsInterfaceSocket socket) { boolean onAdvertiserDestroyed(@NonNull MdnsInterfaceSocket socket) {
final MdnsInterfaceAdvertiser removedAdvertiser = mAdvertisers.remove(socket); final MdnsInterfaceAdvertiser removedAdvertiser = mAdvertisers.remove(socket);
if (removedAdvertiser != null) { if (mMdnsFeatureFlags.mIsMdnsOffloadFeatureEnabled && removedAdvertiser != null) {
final String interfaceName = removedAdvertiser.getSocketInterfaceName(); final String interfaceName = removedAdvertiser.getSocketInterfaceName();
// If the interface is destroyed, stop all hardware offloading on that interface. // If the interface is destroyed, stop all hardware offloading on that
// interface.
final List<OffloadServiceInfoWrapper> offloadServiceInfoWrappers = final List<OffloadServiceInfoWrapper> offloadServiceInfoWrappers =
mInterfaceOffloadServices.remove( mInterfaceOffloadServices.remove(interfaceName);
interfaceName);
if (offloadServiceInfoWrappers != null) { if (offloadServiceInfoWrappers != null) {
for (OffloadServiceInfoWrapper offloadServiceInfoWrapper : for (OffloadServiceInfoWrapper offloadServiceInfoWrapper :
offloadServiceInfoWrappers) { offloadServiceInfoWrappers) {
@@ -359,7 +361,9 @@ public class MdnsAdvertiser {
final MdnsInterfaceAdvertiser advertiser = mAdvertisers.valueAt(i); final MdnsInterfaceAdvertiser advertiser = mAdvertisers.valueAt(i);
advertiser.removeService(id); advertiser.removeService(id);
maybeSendOffloadStop(advertiser.getSocketInterfaceName(), id); if (mMdnsFeatureFlags.mIsMdnsOffloadFeatureEnabled) {
maybeSendOffloadStop(advertiser.getSocketInterfaceName(), id);
}
} }
} }
@@ -419,25 +423,28 @@ public class MdnsAdvertiser {
return; return;
} }
advertiser.updateAddresses(addresses); advertiser.updateAddresses(addresses);
// Update address should trigger offload packet update.
final String interfaceName = advertiser.getSocketInterfaceName(); if (mMdnsFeatureFlags.mIsMdnsOffloadFeatureEnabled) {
final List<OffloadServiceInfoWrapper> existingOffloadServiceInfoWrappers = // Update address should trigger offload packet update.
mInterfaceOffloadServices.get(interfaceName); final String interfaceName = advertiser.getSocketInterfaceName();
if (existingOffloadServiceInfoWrappers == null) { final List<OffloadServiceInfoWrapper> existingOffloadServiceInfoWrappers =
return; mInterfaceOffloadServices.get(interfaceName);
if (existingOffloadServiceInfoWrappers == null) {
return;
}
final List<OffloadServiceInfoWrapper> updatedOffloadServiceInfoWrappers =
new ArrayList<>(existingOffloadServiceInfoWrappers.size());
for (OffloadServiceInfoWrapper oldWrapper : existingOffloadServiceInfoWrappers) {
OffloadServiceInfoWrapper newWrapper = new OffloadServiceInfoWrapper(
oldWrapper.mServiceId,
oldWrapper.mOffloadServiceInfo.withOffloadPayload(
advertiser.getRawOffloadPayload(oldWrapper.mServiceId))
);
updatedOffloadServiceInfoWrappers.add(newWrapper);
mCb.onOffloadStartOrUpdate(interfaceName, newWrapper.mOffloadServiceInfo);
}
mInterfaceOffloadServices.put(interfaceName, updatedOffloadServiceInfoWrappers);
} }
final List<OffloadServiceInfoWrapper> updatedOffloadServiceInfoWrappers =
new ArrayList<>(existingOffloadServiceInfoWrappers.size());
for (OffloadServiceInfoWrapper oldWrapper : existingOffloadServiceInfoWrappers) {
OffloadServiceInfoWrapper newWrapper = new OffloadServiceInfoWrapper(
oldWrapper.mServiceId,
oldWrapper.mOffloadServiceInfo.withOffloadPayload(
advertiser.getRawOffloadPayload(oldWrapper.mServiceId))
);
updatedOffloadServiceInfoWrappers.add(newWrapper);
mCb.onOffloadStartOrUpdate(interfaceName, newWrapper.mOffloadServiceInfo);
}
mInterfaceOffloadServices.put(interfaceName, updatedOffloadServiceInfoWrappers);
} }
} }
@@ -595,20 +602,22 @@ public class MdnsAdvertiser {
} }
public MdnsAdvertiser(@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider, public MdnsAdvertiser(@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider,
@NonNull AdvertiserCallback cb, @NonNull SharedLog sharedLog) { @NonNull AdvertiserCallback cb, @NonNull SharedLog sharedLog,
this(looper, socketProvider, cb, new Dependencies(), sharedLog); @NonNull MdnsFeatureFlags mDnsFeatureFlags) {
this(looper, socketProvider, cb, new Dependencies(), sharedLog, mDnsFeatureFlags);
} }
@VisibleForTesting @VisibleForTesting
MdnsAdvertiser(@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider, MdnsAdvertiser(@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider,
@NonNull AdvertiserCallback cb, @NonNull Dependencies deps, @NonNull AdvertiserCallback cb, @NonNull Dependencies deps,
@NonNull SharedLog sharedLog) { @NonNull SharedLog sharedLog, @NonNull MdnsFeatureFlags mDnsFeatureFlags) {
mLooper = looper; mLooper = looper;
mCb = cb; mCb = cb;
mSocketProvider = socketProvider; mSocketProvider = socketProvider;
mDeps = deps; mDeps = deps;
mDeviceHostName = deps.generateHostname(); mDeviceHostName = deps.generateHostname();
mSharedLog = sharedLog; mSharedLog = sharedLog;
mMdnsFeatureFlags = mDnsFeatureFlags;
} }
private void checkThread() { private void checkThread() {

View File

@@ -0,0 +1,71 @@
/*
* Copyright (C) 2021 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.server.connectivity.mdns;
/**
* The class that contains mDNS feature flags;
*/
public class MdnsFeatureFlags {
/**
* The feature flag for control whether the mDNS offload is enabled or not.
*/
public static final String NSD_FORCE_DISABLE_MDNS_OFFLOAD = "nsd_force_disable_mdns_offload";
// Flag for offload feature
public final boolean mIsMdnsOffloadFeatureEnabled;
/**
* The constructor for {@link MdnsFeatureFlags}.
*/
public MdnsFeatureFlags(boolean isOffloadFeatureEnabled) {
mIsMdnsOffloadFeatureEnabled = isOffloadFeatureEnabled;
}
/** Returns a {@link Builder} for {@link MdnsFeatureFlags}. */
public static Builder newBuilder() {
return new Builder();
}
/** A builder to create {@link MdnsFeatureFlags}. */
public static final class Builder {
private boolean mIsMdnsOffloadFeatureEnabled;
/**
* The constructor for {@link Builder}.
*/
public Builder() {
mIsMdnsOffloadFeatureEnabled = false;
}
/**
* Set if the mDNS offload feature is enabled.
*/
public Builder setIsMdnsOffloadFeatureEnabled(boolean isMdnsOffloadFeatureEnabled) {
mIsMdnsOffloadFeatureEnabled = isMdnsOffloadFeatureEnabled;
return this;
}
/**
* Builds a {@link MdnsFeatureFlags} with the arguments supplied to this builder.
*/
public MdnsFeatureFlags build() {
return new MdnsFeatureFlags(mIsMdnsOffloadFeatureEnabled);
}
}
}

View File

@@ -35,17 +35,14 @@ import static android.net.connectivity.ConnectivityCompatChanges.RUN_NATIVE_NSD_
import static android.net.nsd.NsdManager.FAILURE_BAD_PARAMETERS; import static android.net.nsd.NsdManager.FAILURE_BAD_PARAMETERS;
import static android.net.nsd.NsdManager.FAILURE_INTERNAL_ERROR; import static android.net.nsd.NsdManager.FAILURE_INTERNAL_ERROR;
import static android.net.nsd.NsdManager.FAILURE_OPERATION_NOT_RUNNING; import static android.net.nsd.NsdManager.FAILURE_OPERATION_NOT_RUNNING;
import static com.android.networkstack.apishim.api33.ConstantsShim.REGISTER_NSD_OFFLOAD_ENGINE; import static com.android.networkstack.apishim.api33.ConstantsShim.REGISTER_NSD_OFFLOAD_ENGINE;
import static com.android.server.NsdService.DEFAULT_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF; import static com.android.server.NsdService.DEFAULT_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF;
import static com.android.server.NsdService.MdnsListener; import static com.android.server.NsdService.MdnsListener;
import static com.android.server.NsdService.NO_TRANSACTION; import static com.android.server.NsdService.NO_TRANSACTION;
import static com.android.server.NsdService.parseTypeAndSubtype; import static com.android.server.NsdService.parseTypeAndSubtype;
import static com.android.testutils.ContextUtils.mockService; import static com.android.testutils.ContextUtils.mockService;
import static libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges; import static libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges;
import static libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges; import static libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges;
import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
@@ -229,7 +226,7 @@ public class NsdServiceTest {
doReturn(mSocketProvider).when(mDeps).makeMdnsSocketProvider(any(), any(), any(), any()); doReturn(mSocketProvider).when(mDeps).makeMdnsSocketProvider(any(), any(), any(), any());
doReturn(DEFAULT_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF).when(mDeps).getDeviceConfigInt( doReturn(DEFAULT_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF).when(mDeps).getDeviceConfigInt(
eq(NsdService.MDNS_CONFIG_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF), anyInt()); eq(NsdService.MDNS_CONFIG_RUNNING_APP_ACTIVE_IMPORTANCE_CUTOFF), anyInt());
doReturn(mAdvertiser).when(mDeps).makeMdnsAdvertiser(any(), any(), any(), any()); doReturn(mAdvertiser).when(mDeps).makeMdnsAdvertiser(any(), any(), any(), any(), any());
doReturn(mMetrics).when(mDeps).makeNetworkNsdReportedMetrics(anyBoolean(), anyInt()); doReturn(mMetrics).when(mDeps).makeNetworkNsdReportedMetrics(anyBoolean(), anyInt());
doReturn(mClock).when(mDeps).makeClock(); doReturn(mClock).when(mDeps).makeClock();
doReturn(TEST_TIME_MS).when(mClock).elapsedRealtime(); doReturn(TEST_TIME_MS).when(mClock).elapsedRealtime();
@@ -1289,7 +1286,7 @@ public class NsdServiceTest {
// final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local"; // final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor = final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor =
ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class); ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class);
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any()); verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any(), any());
final NsdServiceInfo regInfo = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE); final NsdServiceInfo regInfo = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
regInfo.setHost(parseNumericAddress("192.0.2.123")); regInfo.setHost(parseNumericAddress("192.0.2.123"));
@@ -1339,7 +1336,7 @@ public class NsdServiceTest {
// final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local"; // final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor = final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor =
ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class); ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class);
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any()); verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any(), any());
final NsdServiceInfo regInfo = new NsdServiceInfo(SERVICE_NAME, "invalid_type"); final NsdServiceInfo regInfo = new NsdServiceInfo(SERVICE_NAME, "invalid_type");
regInfo.setHost(parseNumericAddress("192.0.2.123")); regInfo.setHost(parseNumericAddress("192.0.2.123"));
@@ -1365,7 +1362,7 @@ public class NsdServiceTest {
// final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local"; // final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor = final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor =
ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class); ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class);
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any()); verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any(), any());
final NsdServiceInfo regInfo = new NsdServiceInfo("a".repeat(70), SERVICE_TYPE); final NsdServiceInfo regInfo = new NsdServiceInfo("a".repeat(70), SERVICE_TYPE);
regInfo.setHost(parseNumericAddress("192.0.2.123")); regInfo.setHost(parseNumericAddress("192.0.2.123"));

View File

@@ -146,6 +146,7 @@ class MdnsAdvertiserTest {
private val mockInterfaceAdvertiser1 = mock(MdnsInterfaceAdvertiser::class.java) private val mockInterfaceAdvertiser1 = mock(MdnsInterfaceAdvertiser::class.java)
private val mockInterfaceAdvertiser2 = mock(MdnsInterfaceAdvertiser::class.java) private val mockInterfaceAdvertiser2 = mock(MdnsInterfaceAdvertiser::class.java)
private val mockDeps = mock(MdnsAdvertiser.Dependencies::class.java) private val mockDeps = mock(MdnsAdvertiser.Dependencies::class.java)
private val flags = MdnsFeatureFlags.newBuilder().setIsMdnsOffloadFeatureEnabled(true).build()
@Before @Before
fun setUp() { fun setUp() {
@@ -183,7 +184,8 @@ class MdnsAdvertiserTest {
@Test @Test
fun testAddService_OneNetwork() { fun testAddService_OneNetwork() {
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog) val advertiser =
MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog, flags)
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1, null /* subtype */) } postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1, null /* subtype */) }
val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java) val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
@@ -242,7 +244,8 @@ class MdnsAdvertiserTest {
@Test @Test
fun testAddService_AllNetworks() { fun testAddService_AllNetworks() {
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog) val advertiser =
MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog, flags)
postSync { advertiser.addService(SERVICE_ID_1, ALL_NETWORKS_SERVICE, TEST_SUBTYPE) } postSync { advertiser.addService(SERVICE_ID_1, ALL_NETWORKS_SERVICE, TEST_SUBTYPE) }
val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java) val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
@@ -312,7 +315,8 @@ class MdnsAdvertiserTest {
@Test @Test
fun testAddService_Conflicts() { fun testAddService_Conflicts() {
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog) val advertiser =
MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog, flags)
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1, null /* subtype */) } postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1, null /* subtype */) }
val oneNetSocketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java) val oneNetSocketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
@@ -396,7 +400,8 @@ class MdnsAdvertiserTest {
@Test @Test
fun testRemoveService_whenAllServiceRemoved_thenUpdateHostName() { fun testRemoveService_whenAllServiceRemoved_thenUpdateHostName() {
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog) val advertiser =
MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog, flags)
verify(mockDeps, times(1)).generateHostname() verify(mockDeps, times(1)).generateHostname()
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1, null /* subtype */) } postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1, null /* subtype */) }
postSync { advertiser.removeService(SERVICE_ID_1) } postSync { advertiser.removeService(SERVICE_ID_1) }