Merge "Use a single SharedLog for all mdns components" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
1234a80935
@@ -142,6 +142,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
|
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
|
||||||
private static final long CLEANUP_DELAY_MS = 10000;
|
private static final long CLEANUP_DELAY_MS = 10000;
|
||||||
private static final int IFACE_IDX_ANY = 0;
|
private static final int IFACE_IDX_ANY = 0;
|
||||||
|
private static final SharedLog LOGGER = new SharedLog("serviceDiscovery");
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final NsdStateMachine mNsdStateMachine;
|
private final NsdStateMachine mNsdStateMachine;
|
||||||
@@ -157,7 +158,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
private final MdnsSocketProvider mMdnsSocketProvider;
|
private final MdnsSocketProvider mMdnsSocketProvider;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MdnsAdvertiser mAdvertiser;
|
private final MdnsAdvertiser mAdvertiser;
|
||||||
private final SharedLog mServiceLogs = new SharedLog(TAG);
|
private final SharedLog mServiceLogs = LOGGER.forSubComponent(TAG);
|
||||||
// WARNING : Accessing these values in any thread is not safe, it must only be changed in the
|
// WARNING : Accessing these values in any thread is not safe, it must only be changed in the
|
||||||
// state machine thread. If change this outside state machine, it will need to introduce
|
// state machine thread. If change this outside state machine, it will need to introduce
|
||||||
// synchronization.
|
// synchronization.
|
||||||
@@ -1326,17 +1327,18 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
mMDnsEventCallback = new MDnsEventCallback(mNsdStateMachine);
|
mMDnsEventCallback = new MDnsEventCallback(mNsdStateMachine);
|
||||||
mDeps = deps;
|
mDeps = deps;
|
||||||
|
|
||||||
mMdnsSocketProvider = deps.makeMdnsSocketProvider(ctx, handler.getLooper());
|
mMdnsSocketProvider = deps.makeMdnsSocketProvider(ctx, handler.getLooper(),
|
||||||
|
LOGGER.forSubComponent("MdnsSocketProvider"));
|
||||||
// Netlink monitor starts on boot, and intentionally never stopped, to ensure that all
|
// Netlink monitor starts on boot, and intentionally never stopped, to ensure that all
|
||||||
// address events are received.
|
// address events are received.
|
||||||
handler.post(mMdnsSocketProvider::startNetLinkMonitor);
|
handler.post(mMdnsSocketProvider::startNetLinkMonitor);
|
||||||
mMdnsSocketClient =
|
mMdnsSocketClient =
|
||||||
new MdnsMultinetworkSocketClient(handler.getLooper(), mMdnsSocketProvider);
|
new MdnsMultinetworkSocketClient(handler.getLooper(), mMdnsSocketProvider);
|
||||||
mMdnsDiscoveryManager =
|
mMdnsDiscoveryManager = deps.makeMdnsDiscoveryManager(new ExecutorProvider(),
|
||||||
deps.makeMdnsDiscoveryManager(new ExecutorProvider(), mMdnsSocketClient);
|
mMdnsSocketClient, LOGGER.forSubComponent("MdnsDiscoveryManager"));
|
||||||
handler.post(() -> mMdnsSocketClient.setCallback(mMdnsDiscoveryManager));
|
handler.post(() -> mMdnsSocketClient.setCallback(mMdnsDiscoveryManager));
|
||||||
mAdvertiser = deps.makeMdnsAdvertiser(handler.getLooper(), mMdnsSocketProvider,
|
mAdvertiser = deps.makeMdnsAdvertiser(handler.getLooper(), mMdnsSocketProvider,
|
||||||
new AdvertiserCallback());
|
new AdvertiserCallback(), LOGGER.forSubComponent("MdnsAdvertiser"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1390,8 +1392,9 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
* @see MdnsDiscoveryManager
|
* @see MdnsDiscoveryManager
|
||||||
*/
|
*/
|
||||||
public MdnsDiscoveryManager makeMdnsDiscoveryManager(
|
public MdnsDiscoveryManager makeMdnsDiscoveryManager(
|
||||||
ExecutorProvider executorProvider, MdnsSocketClientBase socketClient) {
|
@NonNull ExecutorProvider executorProvider,
|
||||||
return new MdnsDiscoveryManager(executorProvider, socketClient);
|
@NonNull MdnsSocketClientBase socketClient, @NonNull SharedLog sharedLog) {
|
||||||
|
return new MdnsDiscoveryManager(executorProvider, socketClient, sharedLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1399,15 +1402,16 @@ 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 MdnsAdvertiser.AdvertiserCallback cb, @NonNull SharedLog sharedLog) {
|
||||||
return new MdnsAdvertiser(looper, socketProvider, cb);
|
return new MdnsAdvertiser(looper, socketProvider, cb, sharedLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see MdnsSocketProvider
|
* @see MdnsSocketProvider
|
||||||
*/
|
*/
|
||||||
public MdnsSocketProvider makeMdnsSocketProvider(Context context, Looper looper) {
|
public MdnsSocketProvider makeMdnsSocketProvider(@NonNull Context context,
|
||||||
return new MdnsSocketProvider(context, looper);
|
@NonNull Looper looper, @NonNull SharedLog sharedLog) {
|
||||||
|
return new MdnsSocketProvider(context, looper, sharedLog);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1769,30 +1773,10 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
|
|
||||||
// Dump service and clients logs
|
// Dump service and clients logs
|
||||||
pw.println();
|
pw.println();
|
||||||
|
pw.println("Logs:");
|
||||||
pw.increaseIndent();
|
pw.increaseIndent();
|
||||||
mServiceLogs.reverseDump(pw);
|
mServiceLogs.reverseDump(pw);
|
||||||
pw.decreaseIndent();
|
pw.decreaseIndent();
|
||||||
|
|
||||||
// Dump advertiser related logs
|
|
||||||
pw.println();
|
|
||||||
pw.println("Advertiser:");
|
|
||||||
pw.increaseIndent();
|
|
||||||
mAdvertiser.dump(pw);
|
|
||||||
pw.decreaseIndent();
|
|
||||||
|
|
||||||
// Dump discoverymanager related logs
|
|
||||||
pw.println();
|
|
||||||
pw.println("DiscoveryManager:");
|
|
||||||
pw.increaseIndent();
|
|
||||||
mMdnsDiscoveryManager.dump(pw);
|
|
||||||
pw.decreaseIndent();
|
|
||||||
|
|
||||||
// Dump socketprovider related logs
|
|
||||||
pw.println();
|
|
||||||
pw.println("SocketProvider:");
|
|
||||||
pw.increaseIndent();
|
|
||||||
mMdnsSocketProvider.dump(pw);
|
|
||||||
pw.decreaseIndent();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private abstract static class ClientRequest {
|
private abstract static class ClientRequest {
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ import com.android.internal.annotations.VisibleForTesting;
|
|||||||
import com.android.net.module.util.SharedLog;
|
import com.android.net.module.util.SharedLog;
|
||||||
import com.android.server.connectivity.mdns.util.MdnsUtils;
|
import com.android.server.connectivity.mdns.util.MdnsUtils;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@@ -51,7 +50,7 @@ public class MdnsAdvertiser {
|
|||||||
|
|
||||||
// Top-level domain for link-local queries, as per RFC6762 3.
|
// Top-level domain for link-local queries, as per RFC6762 3.
|
||||||
private static final String LOCAL_TLD = "local";
|
private static final String LOCAL_TLD = "local";
|
||||||
private static final SharedLog LOGGER = new SharedLog(TAG);
|
|
||||||
|
|
||||||
private final Looper mLooper;
|
private final Looper mLooper;
|
||||||
private final AdvertiserCallback mCb;
|
private final AdvertiserCallback mCb;
|
||||||
@@ -71,6 +70,7 @@ public class MdnsAdvertiser {
|
|||||||
private final Dependencies mDeps;
|
private final Dependencies mDeps;
|
||||||
|
|
||||||
private String[] mDeviceHostName;
|
private String[] mDeviceHostName;
|
||||||
|
@NonNull private final SharedLog mSharedLog;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dependencies for {@link MdnsAdvertiser}, useful for testing.
|
* Dependencies for {@link MdnsAdvertiser}, useful for testing.
|
||||||
@@ -84,11 +84,11 @@ public class MdnsAdvertiser {
|
|||||||
@NonNull List<LinkAddress> initialAddresses,
|
@NonNull List<LinkAddress> initialAddresses,
|
||||||
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer,
|
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer,
|
||||||
@NonNull MdnsInterfaceAdvertiser.Callback cb,
|
@NonNull MdnsInterfaceAdvertiser.Callback cb,
|
||||||
@NonNull String[] deviceHostName) {
|
@NonNull String[] deviceHostName,
|
||||||
|
@NonNull SharedLog sharedLog) {
|
||||||
// Note NetworkInterface is final and not mockable
|
// Note NetworkInterface is final and not mockable
|
||||||
final String logTag = socket.getInterface().getName();
|
return new MdnsInterfaceAdvertiser(socket, initialAddresses, looper,
|
||||||
return new MdnsInterfaceAdvertiser(logTag, socket, initialAddresses, looper,
|
packetCreationBuffer, cb, deviceHostName, sharedLog);
|
||||||
packetCreationBuffer, cb, deviceHostName, LOGGER.forSubComponent(logTag));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -135,7 +135,7 @@ public class MdnsAdvertiser {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onServiceConflict(@NonNull MdnsInterfaceAdvertiser advertiser, int serviceId) {
|
public void onServiceConflict(@NonNull MdnsInterfaceAdvertiser advertiser, int serviceId) {
|
||||||
LOGGER.i("Found conflict, restarted probing for service " + serviceId);
|
mSharedLog.i("Found conflict, restarted probing for service " + serviceId);
|
||||||
|
|
||||||
final Registration registration = mRegistrations.get(serviceId);
|
final Registration registration = mRegistrations.get(serviceId);
|
||||||
if (registration == null) return;
|
if (registration == null) return;
|
||||||
@@ -291,7 +291,8 @@ public class MdnsAdvertiser {
|
|||||||
MdnsInterfaceAdvertiser advertiser = mAllAdvertisers.get(socket);
|
MdnsInterfaceAdvertiser advertiser = mAllAdvertisers.get(socket);
|
||||||
if (advertiser == null) {
|
if (advertiser == null) {
|
||||||
advertiser = mDeps.makeAdvertiser(socket, addresses, mLooper, mPacketCreationBuffer,
|
advertiser = mDeps.makeAdvertiser(socket, addresses, mLooper, mPacketCreationBuffer,
|
||||||
mInterfaceAdvertiserCb, mDeviceHostName);
|
mInterfaceAdvertiserCb, mDeviceHostName,
|
||||||
|
mSharedLog.forSubComponent(socket.getInterface().getName()));
|
||||||
mAllAdvertisers.put(socket, advertiser);
|
mAllAdvertisers.put(socket, advertiser);
|
||||||
advertiser.start();
|
advertiser.start();
|
||||||
}
|
}
|
||||||
@@ -416,18 +417,20 @@ public class MdnsAdvertiser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public MdnsAdvertiser(@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider,
|
public MdnsAdvertiser(@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider,
|
||||||
@NonNull AdvertiserCallback cb) {
|
@NonNull AdvertiserCallback cb, @NonNull SharedLog sharedLog) {
|
||||||
this(looper, socketProvider, cb, new Dependencies());
|
this(looper, socketProvider, cb, new Dependencies(), sharedLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
@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) {
|
||||||
mLooper = looper;
|
mLooper = looper;
|
||||||
mCb = cb;
|
mCb = cb;
|
||||||
mSocketProvider = socketProvider;
|
mSocketProvider = socketProvider;
|
||||||
mDeps = deps;
|
mDeps = deps;
|
||||||
mDeviceHostName = deps.generateHostname();
|
mDeviceHostName = deps.generateHostname();
|
||||||
|
mSharedLog = sharedLog;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkThread() {
|
private void checkThread() {
|
||||||
@@ -450,7 +453,7 @@ public class MdnsAdvertiser {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGGER.i("Adding service " + service + " with ID " + id);
|
mSharedLog.i("Adding service " + service + " with ID " + id);
|
||||||
|
|
||||||
final Network network = service.getNetwork();
|
final Network network = service.getNetwork();
|
||||||
final Registration registration = new Registration(service);
|
final Registration registration = new Registration(service);
|
||||||
@@ -482,7 +485,7 @@ public class MdnsAdvertiser {
|
|||||||
public void removeService(int id) {
|
public void removeService(int id) {
|
||||||
checkThread();
|
checkThread();
|
||||||
if (!mRegistrations.contains(id)) return;
|
if (!mRegistrations.contains(id)) return;
|
||||||
LOGGER.i("Removing service with ID " + id);
|
mSharedLog.i("Removing service with ID " + id);
|
||||||
for (int i = mAdvertiserRequests.size() - 1; i >= 0; i--) {
|
for (int i = mAdvertiserRequests.size() - 1; i >= 0; i--) {
|
||||||
final InterfaceAdvertiserRequest advertiser = mAdvertiserRequests.valueAt(i);
|
final InterfaceAdvertiserRequest advertiser = mAdvertiserRequests.valueAt(i);
|
||||||
advertiser.removeService(id);
|
advertiser.removeService(id);
|
||||||
@@ -494,10 +497,6 @@ public class MdnsAdvertiser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Dump info to dumpsys */
|
|
||||||
public void dump(PrintWriter pw) {
|
|
||||||
LOGGER.reverseDump(pw);
|
|
||||||
}
|
|
||||||
private static <K, V> boolean any(@NonNull ArrayMap<K, V> map,
|
private static <K, V> boolean any(@NonNull ArrayMap<K, V> map,
|
||||||
@NonNull BiPredicate<K, V> predicate) {
|
@NonNull BiPredicate<K, V> predicate) {
|
||||||
for (int i = 0; i < map.size(); i++) {
|
for (int i = 0; i < map.size(); i++) {
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ import com.android.internal.annotations.VisibleForTesting;
|
|||||||
import com.android.net.module.util.SharedLog;
|
import com.android.net.module.util.SharedLog;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintWriter;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -43,10 +42,10 @@ import java.util.List;
|
|||||||
public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
||||||
private static final String TAG = MdnsDiscoveryManager.class.getSimpleName();
|
private static final String TAG = MdnsDiscoveryManager.class.getSimpleName();
|
||||||
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
|
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
|
||||||
private static final SharedLog LOGGER = new SharedLog(TAG);
|
|
||||||
|
|
||||||
private final ExecutorProvider executorProvider;
|
private final ExecutorProvider executorProvider;
|
||||||
private final MdnsSocketClientBase socketClient;
|
private final MdnsSocketClientBase socketClient;
|
||||||
|
@NonNull private final SharedLog sharedLog;
|
||||||
|
|
||||||
@GuardedBy("this")
|
@GuardedBy("this")
|
||||||
@NonNull private final PerNetworkServiceTypeClients perNetworkServiceTypeClients;
|
@NonNull private final PerNetworkServiceTypeClients perNetworkServiceTypeClients;
|
||||||
@@ -104,9 +103,10 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public MdnsDiscoveryManager(@NonNull ExecutorProvider executorProvider,
|
public MdnsDiscoveryManager(@NonNull ExecutorProvider executorProvider,
|
||||||
@NonNull MdnsSocketClientBase socketClient) {
|
@NonNull MdnsSocketClientBase socketClient, @NonNull SharedLog sharedLog) {
|
||||||
this.executorProvider = executorProvider;
|
this.executorProvider = executorProvider;
|
||||||
this.socketClient = socketClient;
|
this.socketClient = socketClient;
|
||||||
|
this.sharedLog = sharedLog;
|
||||||
perNetworkServiceTypeClients = new PerNetworkServiceTypeClients();
|
perNetworkServiceTypeClients = new PerNetworkServiceTypeClients();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,13 +124,13 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
|||||||
@NonNull String serviceType,
|
@NonNull String serviceType,
|
||||||
@NonNull MdnsServiceBrowserListener listener,
|
@NonNull MdnsServiceBrowserListener listener,
|
||||||
@NonNull MdnsSearchOptions searchOptions) {
|
@NonNull MdnsSearchOptions searchOptions) {
|
||||||
LOGGER.i("Registering listener for serviceType: " + serviceType);
|
sharedLog.i("Registering listener for serviceType: " + serviceType);
|
||||||
if (perNetworkServiceTypeClients.isEmpty()) {
|
if (perNetworkServiceTypeClients.isEmpty()) {
|
||||||
// First listener. Starts the socket client.
|
// First listener. Starts the socket client.
|
||||||
try {
|
try {
|
||||||
socketClient.startDiscovery();
|
socketClient.startDiscovery();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.e("Failed to start discover.", e);
|
sharedLog.e("Failed to start discover.", e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -159,7 +159,7 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
|||||||
@RequiresPermission(permission.CHANGE_WIFI_MULTICAST_STATE)
|
@RequiresPermission(permission.CHANGE_WIFI_MULTICAST_STATE)
|
||||||
public synchronized void unregisterListener(
|
public synchronized void unregisterListener(
|
||||||
@NonNull String serviceType, @NonNull MdnsServiceBrowserListener listener) {
|
@NonNull String serviceType, @NonNull MdnsServiceBrowserListener listener) {
|
||||||
LOGGER.i("Unregistering listener for serviceType:" + serviceType);
|
sharedLog.i("Unregistering listener for serviceType:" + serviceType);
|
||||||
final List<MdnsServiceTypeClient> serviceTypeClients =
|
final List<MdnsServiceTypeClient> serviceTypeClients =
|
||||||
perNetworkServiceTypeClients.getByServiceType(serviceType);
|
perNetworkServiceTypeClients.getByServiceType(serviceType);
|
||||||
if (serviceTypeClients.isEmpty()) {
|
if (serviceTypeClients.isEmpty()) {
|
||||||
@@ -199,19 +199,13 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Dump info to dumpsys */
|
|
||||||
public void dump(PrintWriter pw) {
|
|
||||||
LOGGER.reverseDump(pw);
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
|
MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
|
||||||
@Nullable Network network) {
|
@Nullable Network network) {
|
||||||
LOGGER.log("createServiceTypeClient for serviceType:" + serviceType
|
sharedLog.log("createServiceTypeClient for type:" + serviceType + ", net:" + network);
|
||||||
+ " network:" + network);
|
|
||||||
return new MdnsServiceTypeClient(
|
return new MdnsServiceTypeClient(
|
||||||
serviceType, socketClient,
|
serviceType, socketClient,
|
||||||
executorProvider.newServiceTypeClientSchedulerExecutor(), network,
|
executorProvider.newServiceTypeClientSchedulerExecutor(), network,
|
||||||
LOGGER.forSubComponent(serviceType + "-" + network));
|
sharedLog.forSubComponent(serviceType + "-" + network));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -170,29 +170,29 @@ public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHand
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public MdnsInterfaceAdvertiser(@NonNull String logTag,
|
public MdnsInterfaceAdvertiser(@NonNull MdnsInterfaceSocket socket,
|
||||||
@NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> initialAddresses,
|
@NonNull List<LinkAddress> initialAddresses, @NonNull Looper looper,
|
||||||
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
|
@NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
|
||||||
@NonNull String[] deviceHostName, @NonNull SharedLog sharedLog) {
|
@NonNull String[] deviceHostName, @NonNull SharedLog sharedLog) {
|
||||||
this(logTag, socket, initialAddresses, looper, packetCreationBuffer, cb,
|
this(socket, initialAddresses, looper, packetCreationBuffer, cb,
|
||||||
new Dependencies(), deviceHostName, sharedLog);
|
new Dependencies(), deviceHostName, sharedLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MdnsInterfaceAdvertiser(@NonNull String logTag,
|
public MdnsInterfaceAdvertiser(@NonNull MdnsInterfaceSocket socket,
|
||||||
@NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> initialAddresses,
|
@NonNull List<LinkAddress> initialAddresses, @NonNull Looper looper,
|
||||||
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
|
@NonNull byte[] packetCreationBuffer, @NonNull Callback cb, @NonNull Dependencies deps,
|
||||||
@NonNull Dependencies deps, @NonNull String[] deviceHostName,
|
@NonNull String[] deviceHostName, @NonNull SharedLog sharedLog) {
|
||||||
@NonNull SharedLog sharedLog) {
|
mTag = MdnsInterfaceAdvertiser.class.getSimpleName() + "/" + sharedLog.getTag();
|
||||||
mTag = MdnsInterfaceAdvertiser.class.getSimpleName() + "/" + logTag;
|
|
||||||
mRecordRepository = deps.makeRecordRepository(looper, deviceHostName);
|
mRecordRepository = deps.makeRecordRepository(looper, deviceHostName);
|
||||||
mRecordRepository.updateAddresses(initialAddresses);
|
mRecordRepository.updateAddresses(initialAddresses);
|
||||||
mSocket = socket;
|
mSocket = socket;
|
||||||
mCb = cb;
|
mCb = cb;
|
||||||
mCbHandler = new Handler(looper);
|
mCbHandler = new Handler(looper);
|
||||||
mReplySender = deps.makeReplySender(logTag, looper, socket, packetCreationBuffer);
|
mReplySender = deps.makeReplySender(sharedLog.getTag(), looper, socket,
|
||||||
mAnnouncer = deps.makeMdnsAnnouncer(logTag, looper, mReplySender,
|
packetCreationBuffer);
|
||||||
|
mAnnouncer = deps.makeMdnsAnnouncer(sharedLog.getTag(), looper, mReplySender,
|
||||||
mAnnouncingCallback);
|
mAnnouncingCallback);
|
||||||
mProber = deps.makeMdnsProber(logTag, looper, mReplySender, mProbingCallback);
|
mProber = deps.makeMdnsProber(sharedLog.getTag(), looper, mReplySender, mProbingCallback);
|
||||||
mSharedLog = sharedLog;
|
mSharedLog = sharedLog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -288,16 +288,16 @@ public class MdnsServiceTypeClient {
|
|||||||
if (!responseMatchesOptions(response, listeners.valueAt(i))) continue;
|
if (!responseMatchesOptions(response, listeners.valueAt(i))) continue;
|
||||||
final MdnsServiceBrowserListener listener = listeners.keyAt(i);
|
final MdnsServiceBrowserListener listener = listeners.keyAt(i);
|
||||||
if (newServiceFound) {
|
if (newServiceFound) {
|
||||||
sharedLog.log("onServiceNameDiscovered: " + serviceInstanceName);
|
sharedLog.log("onServiceNameDiscovered: " + serviceInfo);
|
||||||
listener.onServiceNameDiscovered(serviceInfo);
|
listener.onServiceNameDiscovered(serviceInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.isComplete()) {
|
if (response.isComplete()) {
|
||||||
if (newServiceFound || serviceBecomesComplete) {
|
if (newServiceFound || serviceBecomesComplete) {
|
||||||
sharedLog.log("onServiceFound: " + serviceInstanceName);
|
sharedLog.log("onServiceFound: " + serviceInfo);
|
||||||
listener.onServiceFound(serviceInfo);
|
listener.onServiceFound(serviceInfo);
|
||||||
} else {
|
} else {
|
||||||
sharedLog.log("onServiceUpdated: " + serviceInstanceName);
|
sharedLog.log("onServiceUpdated: " + serviceInfo);
|
||||||
listener.onServiceUpdated(serviceInfo);
|
listener.onServiceUpdated(serviceInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -315,10 +315,10 @@ public class MdnsServiceTypeClient {
|
|||||||
final MdnsServiceInfo serviceInfo =
|
final MdnsServiceInfo serviceInfo =
|
||||||
buildMdnsServiceInfoFromResponse(response, serviceTypeLabels);
|
buildMdnsServiceInfoFromResponse(response, serviceTypeLabels);
|
||||||
if (response.isComplete()) {
|
if (response.isComplete()) {
|
||||||
sharedLog.log("onServiceRemoved: " + serviceInstanceName);
|
sharedLog.log("onServiceRemoved: " + serviceInfo);
|
||||||
listener.onServiceRemoved(serviceInfo);
|
listener.onServiceRemoved(serviceInfo);
|
||||||
}
|
}
|
||||||
sharedLog.log("onServiceNameRemoved: " + serviceInstanceName);
|
sharedLog.log("onServiceNameRemoved: " + serviceInfo);
|
||||||
listener.onServiceNameRemoved(serviceInfo);
|
listener.onServiceNameRemoved(serviceInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -535,19 +535,17 @@ public class MdnsServiceTypeClient {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
final MdnsServiceBrowserListener listener = listeners.keyAt(i);
|
final MdnsServiceBrowserListener listener = listeners.keyAt(i);
|
||||||
String serviceInstanceName =
|
if (existingResponse.getServiceInstanceName() != null) {
|
||||||
existingResponse.getServiceInstanceName();
|
|
||||||
if (serviceInstanceName != null) {
|
|
||||||
final MdnsServiceInfo serviceInfo =
|
final MdnsServiceInfo serviceInfo =
|
||||||
buildMdnsServiceInfoFromResponse(
|
buildMdnsServiceInfoFromResponse(
|
||||||
existingResponse, serviceTypeLabels);
|
existingResponse, serviceTypeLabels);
|
||||||
if (existingResponse.isComplete()) {
|
if (existingResponse.isComplete()) {
|
||||||
sharedLog.log("TTL expired. onServiceRemoved: "
|
sharedLog.log("TTL expired. onServiceRemoved: "
|
||||||
+ serviceInstanceName);
|
+ serviceInfo);
|
||||||
listener.onServiceRemoved(serviceInfo);
|
listener.onServiceRemoved(serviceInfo);
|
||||||
}
|
}
|
||||||
sharedLog.log("TTL expired. onServiceNameRemoved: "
|
sharedLog.log("TTL expired. onServiceNameRemoved: "
|
||||||
+ serviceInstanceName);
|
+ serviceInfo);
|
||||||
listener.onServiceNameRemoved(serviceInfo);
|
listener.onServiceNameRemoved(serviceInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
|
|||||||
import com.android.net.module.util.SharedLog;
|
import com.android.net.module.util.SharedLog;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintWriter;
|
|
||||||
import java.net.NetworkInterface;
|
import java.net.NetworkInterface;
|
||||||
import java.net.SocketException;
|
import java.net.SocketException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -69,7 +68,6 @@ public class MdnsSocketProvider {
|
|||||||
// But 1440 should generally be enough because of standard Ethernet.
|
// But 1440 should generally be enough because of standard Ethernet.
|
||||||
// Note: mdnsresponder mDNSEmbeddedAPI.h uses 8940 for Ethernet jumbo frames.
|
// Note: mdnsresponder mDNSEmbeddedAPI.h uses 8940 for Ethernet jumbo frames.
|
||||||
private static final int READ_BUFFER_SIZE = 2048;
|
private static final int READ_BUFFER_SIZE = 2048;
|
||||||
private static final SharedLog LOGGER = new SharedLog(TAG);
|
|
||||||
private static final int IFACE_IDX_NOT_EXIST = -1;
|
private static final int IFACE_IDX_NOT_EXIST = -1;
|
||||||
@NonNull private final Context mContext;
|
@NonNull private final Context mContext;
|
||||||
@NonNull private final Looper mLooper;
|
@NonNull private final Looper mLooper;
|
||||||
@@ -78,6 +76,7 @@ public class MdnsSocketProvider {
|
|||||||
@NonNull private final NetworkCallback mNetworkCallback;
|
@NonNull private final NetworkCallback mNetworkCallback;
|
||||||
@NonNull private final TetheringEventCallback mTetheringEventCallback;
|
@NonNull private final TetheringEventCallback mTetheringEventCallback;
|
||||||
@NonNull private final AbstractSocketNetlink mSocketNetlinkMonitor;
|
@NonNull private final AbstractSocketNetlink mSocketNetlinkMonitor;
|
||||||
|
@NonNull private final SharedLog mSharedLog;
|
||||||
private final ArrayMap<Network, SocketInfo> mNetworkSockets = new ArrayMap<>();
|
private final ArrayMap<Network, SocketInfo> mNetworkSockets = new ArrayMap<>();
|
||||||
private final ArrayMap<String, SocketInfo> mTetherInterfaceSockets = new ArrayMap<>();
|
private final ArrayMap<String, SocketInfo> mTetherInterfaceSockets = new ArrayMap<>();
|
||||||
private final ArrayMap<Network, LinkProperties> mActiveNetworksLinkProperties =
|
private final ArrayMap<Network, LinkProperties> mActiveNetworksLinkProperties =
|
||||||
@@ -94,16 +93,18 @@ public class MdnsSocketProvider {
|
|||||||
private boolean mMonitoringSockets = false;
|
private boolean mMonitoringSockets = false;
|
||||||
private boolean mRequestStop = false;
|
private boolean mRequestStop = false;
|
||||||
|
|
||||||
public MdnsSocketProvider(@NonNull Context context, @NonNull Looper looper) {
|
public MdnsSocketProvider(@NonNull Context context, @NonNull Looper looper,
|
||||||
this(context, looper, new Dependencies());
|
@NonNull SharedLog sharedLog) {
|
||||||
|
this(context, looper, new Dependencies(), sharedLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
MdnsSocketProvider(@NonNull Context context, @NonNull Looper looper,
|
MdnsSocketProvider(@NonNull Context context, @NonNull Looper looper,
|
||||||
@NonNull Dependencies deps) {
|
@NonNull Dependencies deps, @NonNull SharedLog sharedLog) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mLooper = looper;
|
mLooper = looper;
|
||||||
mHandler = new Handler(looper);
|
mHandler = new Handler(looper);
|
||||||
mDependencies = deps;
|
mDependencies = deps;
|
||||||
|
mSharedLog = sharedLog;
|
||||||
mNetworkCallback = new NetworkCallback() {
|
mNetworkCallback = new NetworkCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onLost(Network network) {
|
public void onLost(Network network) {
|
||||||
@@ -135,8 +136,8 @@ public class MdnsSocketProvider {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
mSocketNetlinkMonitor = mDependencies.createSocketNetlinkMonitor(mHandler, LOGGER,
|
mSocketNetlinkMonitor = mDependencies.createSocketNetlinkMonitor(mHandler,
|
||||||
new NetLinkMessageProcessor());
|
mSharedLog.forSubComponent("NetlinkMonitor"), new NetLinkMessageProcessor());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -253,7 +254,7 @@ public class MdnsSocketProvider {
|
|||||||
Log.d(TAG, "Already monitoring sockets.");
|
Log.d(TAG, "Already monitoring sockets.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LOGGER.i("Start monitoring sockets.");
|
mSharedLog.i("Start monitoring sockets.");
|
||||||
mContext.getSystemService(ConnectivityManager.class).registerNetworkCallback(
|
mContext.getSystemService(ConnectivityManager.class).registerNetworkCallback(
|
||||||
new NetworkRequest.Builder().clearCapabilities().build(),
|
new NetworkRequest.Builder().clearCapabilities().build(),
|
||||||
mNetworkCallback, mHandler);
|
mNetworkCallback, mHandler);
|
||||||
@@ -282,7 +283,7 @@ public class MdnsSocketProvider {
|
|||||||
|
|
||||||
// Only unregister the network callback if there is no socket request.
|
// Only unregister the network callback if there is no socket request.
|
||||||
if (mCallbacksToRequestedNetworks.isEmpty()) {
|
if (mCallbacksToRequestedNetworks.isEmpty()) {
|
||||||
LOGGER.i("Stop monitoring sockets.");
|
mSharedLog.i("Stop monitoring sockets.");
|
||||||
mContext.getSystemService(ConnectivityManager.class)
|
mContext.getSystemService(ConnectivityManager.class)
|
||||||
.unregisterNetworkCallback(mNetworkCallback);
|
.unregisterNetworkCallback(mNetworkCallback);
|
||||||
|
|
||||||
@@ -420,7 +421,7 @@ public class MdnsSocketProvider {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGGER.log("Create socket on net:" + networkKey + ", ifName:" + interfaceName);
|
mSharedLog.log("Create socket on net:" + networkKey + ", ifName:" + interfaceName);
|
||||||
final MdnsInterfaceSocket socket = mDependencies.createMdnsInterfaceSocket(
|
final MdnsInterfaceSocket socket = mDependencies.createMdnsInterfaceSocket(
|
||||||
networkInterface.getNetworkInterface(), MdnsConstants.MDNS_PORT, mLooper,
|
networkInterface.getNetworkInterface(), MdnsConstants.MDNS_PORT, mLooper,
|
||||||
mPacketReadBuffer);
|
mPacketReadBuffer);
|
||||||
@@ -441,7 +442,7 @@ public class MdnsSocketProvider {
|
|||||||
notifySocketCreated(((NetworkAsKey) networkKey).mNetwork, socket, addresses);
|
notifySocketCreated(((NetworkAsKey) networkKey).mNetwork, socket, addresses);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.e("Create socket failed ifName:" + interfaceName, e);
|
mSharedLog.e("Create socket failed ifName:" + interfaceName, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -470,7 +471,7 @@ public class MdnsSocketProvider {
|
|||||||
// transports above in priority.
|
// transports above in priority.
|
||||||
return iface.supportsMulticast();
|
return iface.supportsMulticast();
|
||||||
} catch (SocketException e) {
|
} catch (SocketException e) {
|
||||||
LOGGER.e("Error checking interface flags", e);
|
mSharedLog.e("Error checking interface flags", e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -481,7 +482,7 @@ public class MdnsSocketProvider {
|
|||||||
|
|
||||||
socketInfo.mSocket.destroy();
|
socketInfo.mSocket.destroy();
|
||||||
notifyInterfaceDestroyed(network, socketInfo.mSocket);
|
notifyInterfaceDestroyed(network, socketInfo.mSocket);
|
||||||
LOGGER.log("Remove socket on net:" + network);
|
mSharedLog.log("Remove socket on net:" + network);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeTetherInterfaceSocket(String interfaceName) {
|
private void removeTetherInterfaceSocket(String interfaceName) {
|
||||||
@@ -489,7 +490,7 @@ public class MdnsSocketProvider {
|
|||||||
if (socketInfo == null) return;
|
if (socketInfo == null) return;
|
||||||
socketInfo.mSocket.destroy();
|
socketInfo.mSocket.destroy();
|
||||||
notifyInterfaceDestroyed(null /* network */, socketInfo.mSocket);
|
notifyInterfaceDestroyed(null /* network */, socketInfo.mSocket);
|
||||||
LOGGER.log("Remove socket on ifName:" + interfaceName);
|
mSharedLog.log("Remove socket on ifName:" + interfaceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notifySocketCreated(Network network, MdnsInterfaceSocket socket,
|
private void notifySocketCreated(Network network, MdnsInterfaceSocket socket,
|
||||||
@@ -561,6 +562,7 @@ public class MdnsSocketProvider {
|
|||||||
*/
|
*/
|
||||||
public void requestSocket(@Nullable Network network, @NonNull SocketCallback cb) {
|
public void requestSocket(@Nullable Network network, @NonNull SocketCallback cb) {
|
||||||
ensureRunningOnHandlerThread(mHandler);
|
ensureRunningOnHandlerThread(mHandler);
|
||||||
|
mSharedLog.log("requestSocket for net:" + network);
|
||||||
mCallbacksToRequestedNetworks.put(cb, network);
|
mCallbacksToRequestedNetworks.put(cb, network);
|
||||||
if (network == null) {
|
if (network == null) {
|
||||||
// Does not specify a required network, create sockets for all possible
|
// Does not specify a required network, create sockets for all possible
|
||||||
@@ -584,6 +586,7 @@ public class MdnsSocketProvider {
|
|||||||
/*** Unrequest the socket */
|
/*** Unrequest the socket */
|
||||||
public void unrequestSocket(@NonNull SocketCallback cb) {
|
public void unrequestSocket(@NonNull SocketCallback cb) {
|
||||||
ensureRunningOnHandlerThread(mHandler);
|
ensureRunningOnHandlerThread(mHandler);
|
||||||
|
mSharedLog.log("unrequestSocket");
|
||||||
mCallbacksToRequestedNetworks.remove(cb);
|
mCallbacksToRequestedNetworks.remove(cb);
|
||||||
if (hasAllNetworksRequest()) {
|
if (hasAllNetworksRequest()) {
|
||||||
// Still has a request for all networks (interfaces).
|
// Still has a request for all networks (interfaces).
|
||||||
@@ -598,7 +601,7 @@ public class MdnsSocketProvider {
|
|||||||
info.mSocket.destroy();
|
info.mSocket.destroy();
|
||||||
// Still notify to unrequester for socket destroy.
|
// Still notify to unrequester for socket destroy.
|
||||||
cb.onInterfaceDestroyed(network, info.mSocket);
|
cb.onInterfaceDestroyed(network, info.mSocket);
|
||||||
LOGGER.log("Remove socket on net:" + network + " after unrequestSocket");
|
mSharedLog.log("Remove socket on net:" + network + " after unrequestSocket");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove all sockets for tethering interface because these sockets do not have associated
|
// Remove all sockets for tethering interface because these sockets do not have associated
|
||||||
@@ -609,7 +612,7 @@ public class MdnsSocketProvider {
|
|||||||
info.mSocket.destroy();
|
info.mSocket.destroy();
|
||||||
// Still notify to unrequester for socket destroy.
|
// Still notify to unrequester for socket destroy.
|
||||||
cb.onInterfaceDestroyed(null /* network */, info.mSocket);
|
cb.onInterfaceDestroyed(null /* network */, info.mSocket);
|
||||||
LOGGER.log("Remove socket on ifName:" + mTetherInterfaceSockets.keyAt(i)
|
mSharedLog.log("Remove socket on ifName:" + mTetherInterfaceSockets.keyAt(i)
|
||||||
+ " after unrequestSocket");
|
+ " after unrequestSocket");
|
||||||
}
|
}
|
||||||
mTetherInterfaceSockets.clear();
|
mTetherInterfaceSockets.clear();
|
||||||
@@ -618,10 +621,6 @@ public class MdnsSocketProvider {
|
|||||||
maybeStopMonitoringSockets();
|
maybeStopMonitoringSockets();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Dump info to dumpsys */
|
|
||||||
public void dump(PrintWriter pw) {
|
|
||||||
LOGGER.reverseDump(pw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** Callbacks for listening socket changes */
|
/*** Callbacks for listening socket changes */
|
||||||
public interface SocketCallback {
|
public interface SocketCallback {
|
||||||
|
|||||||
@@ -175,9 +175,9 @@ public class NsdServiceTest {
|
|||||||
doReturn(true).when(mMockMDnsM).resolve(
|
doReturn(true).when(mMockMDnsM).resolve(
|
||||||
anyInt(), anyString(), anyString(), anyString(), anyInt());
|
anyInt(), anyString(), anyString(), anyString(), anyInt());
|
||||||
doReturn(false).when(mDeps).isMdnsDiscoveryManagerEnabled(any(Context.class));
|
doReturn(false).when(mDeps).isMdnsDiscoveryManagerEnabled(any(Context.class));
|
||||||
doReturn(mDiscoveryManager).when(mDeps).makeMdnsDiscoveryManager(any(), any());
|
doReturn(mDiscoveryManager).when(mDeps).makeMdnsDiscoveryManager(any(), any(), any());
|
||||||
doReturn(mSocketProvider).when(mDeps).makeMdnsSocketProvider(any(), any());
|
doReturn(mSocketProvider).when(mDeps).makeMdnsSocketProvider(any(), any(), any());
|
||||||
doReturn(mAdvertiser).when(mDeps).makeMdnsAdvertiser(any(), any(), any());
|
doReturn(mAdvertiser).when(mDeps).makeMdnsAdvertiser(any(), any(), any(), any());
|
||||||
|
|
||||||
mService = makeService();
|
mService = makeService();
|
||||||
}
|
}
|
||||||
@@ -1122,7 +1122,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());
|
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), 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"));
|
||||||
@@ -1161,7 +1161,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());
|
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), 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"));
|
||||||
@@ -1186,7 +1186,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());
|
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), 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"));
|
||||||
|
|||||||
@@ -23,11 +23,13 @@ import android.net.nsd.NsdServiceInfo
|
|||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.HandlerThread
|
import android.os.HandlerThread
|
||||||
|
import com.android.net.module.util.SharedLog
|
||||||
import com.android.server.connectivity.mdns.MdnsAdvertiser.AdvertiserCallback
|
import com.android.server.connectivity.mdns.MdnsAdvertiser.AdvertiserCallback
|
||||||
import com.android.server.connectivity.mdns.MdnsSocketProvider.SocketCallback
|
import com.android.server.connectivity.mdns.MdnsSocketProvider.SocketCallback
|
||||||
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
|
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
|
||||||
import com.android.testutils.DevSdkIgnoreRunner
|
import com.android.testutils.DevSdkIgnoreRunner
|
||||||
import com.android.testutils.waitForIdle
|
import com.android.testutils.waitForIdle
|
||||||
|
import java.net.NetworkInterface
|
||||||
import java.util.Objects
|
import java.util.Objects
|
||||||
import org.junit.After
|
import org.junit.After
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
@@ -89,6 +91,7 @@ class MdnsAdvertiserTest {
|
|||||||
private val handler by lazy { Handler(thread.looper) }
|
private val handler by lazy { Handler(thread.looper) }
|
||||||
private val socketProvider = mock(MdnsSocketProvider::class.java)
|
private val socketProvider = mock(MdnsSocketProvider::class.java)
|
||||||
private val cb = mock(AdvertiserCallback::class.java)
|
private val cb = mock(AdvertiserCallback::class.java)
|
||||||
|
private val sharedlog = mock(SharedLog::class.java)
|
||||||
|
|
||||||
private val mockSocket1 = mock(MdnsInterfaceSocket::class.java)
|
private val mockSocket1 = mock(MdnsInterfaceSocket::class.java)
|
||||||
private val mockSocket2 = mock(MdnsInterfaceSocket::class.java)
|
private val mockSocket2 = mock(MdnsInterfaceSocket::class.java)
|
||||||
@@ -101,13 +104,15 @@ class MdnsAdvertiserTest {
|
|||||||
thread.start()
|
thread.start()
|
||||||
doReturn(TEST_HOSTNAME).`when`(mockDeps).generateHostname()
|
doReturn(TEST_HOSTNAME).`when`(mockDeps).generateHostname()
|
||||||
doReturn(mockInterfaceAdvertiser1).`when`(mockDeps).makeAdvertiser(eq(mockSocket1),
|
doReturn(mockInterfaceAdvertiser1).`when`(mockDeps).makeAdvertiser(eq(mockSocket1),
|
||||||
any(), any(), any(), any(), eq(TEST_HOSTNAME)
|
any(), any(), any(), any(), eq(TEST_HOSTNAME), any()
|
||||||
)
|
)
|
||||||
doReturn(mockInterfaceAdvertiser2).`when`(mockDeps).makeAdvertiser(eq(mockSocket2),
|
doReturn(mockInterfaceAdvertiser2).`when`(mockDeps).makeAdvertiser(eq(mockSocket2),
|
||||||
any(), any(), any(), any(), eq(TEST_HOSTNAME)
|
any(), any(), any(), any(), eq(TEST_HOSTNAME), any()
|
||||||
)
|
)
|
||||||
doReturn(true).`when`(mockInterfaceAdvertiser1).isProbing(anyInt())
|
doReturn(true).`when`(mockInterfaceAdvertiser1).isProbing(anyInt())
|
||||||
doReturn(true).`when`(mockInterfaceAdvertiser2).isProbing(anyInt())
|
doReturn(true).`when`(mockInterfaceAdvertiser2).isProbing(anyInt())
|
||||||
|
doReturn(createEmptyNetworkInterface()).`when`(mockSocket1).getInterface()
|
||||||
|
doReturn(createEmptyNetworkInterface()).`when`(mockSocket2).getInterface()
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
@@ -116,9 +121,15 @@ class MdnsAdvertiserTest {
|
|||||||
thread.join()
|
thread.join()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun createEmptyNetworkInterface(): NetworkInterface {
|
||||||
|
val constructor = NetworkInterface::class.java.getDeclaredConstructor()
|
||||||
|
constructor.isAccessible = true
|
||||||
|
return constructor.newInstance()
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testAddService_OneNetwork() {
|
fun testAddService_OneNetwork() {
|
||||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
|
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
|
||||||
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
|
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
|
||||||
|
|
||||||
val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
|
val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
|
||||||
@@ -134,7 +145,8 @@ class MdnsAdvertiserTest {
|
|||||||
eq(thread.looper),
|
eq(thread.looper),
|
||||||
any(),
|
any(),
|
||||||
intAdvCbCaptor.capture(),
|
intAdvCbCaptor.capture(),
|
||||||
eq(TEST_HOSTNAME)
|
eq(TEST_HOSTNAME),
|
||||||
|
any()
|
||||||
)
|
)
|
||||||
|
|
||||||
doReturn(false).`when`(mockInterfaceAdvertiser1).isProbing(SERVICE_ID_1)
|
doReturn(false).`when`(mockInterfaceAdvertiser1).isProbing(SERVICE_ID_1)
|
||||||
@@ -148,7 +160,7 @@ class MdnsAdvertiserTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testAddService_AllNetworks() {
|
fun testAddService_AllNetworks() {
|
||||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
|
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
|
||||||
postSync { advertiser.addService(SERVICE_ID_1, ALL_NETWORKS_SERVICE) }
|
postSync { advertiser.addService(SERVICE_ID_1, ALL_NETWORKS_SERVICE) }
|
||||||
|
|
||||||
val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
|
val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
|
||||||
@@ -162,10 +174,10 @@ class MdnsAdvertiserTest {
|
|||||||
val intAdvCbCaptor1 = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
|
val intAdvCbCaptor1 = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
|
||||||
val intAdvCbCaptor2 = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
|
val intAdvCbCaptor2 = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
|
||||||
verify(mockDeps).makeAdvertiser(eq(mockSocket1), eq(listOf(TEST_LINKADDR)),
|
verify(mockDeps).makeAdvertiser(eq(mockSocket1), eq(listOf(TEST_LINKADDR)),
|
||||||
eq(thread.looper), any(), intAdvCbCaptor1.capture(), eq(TEST_HOSTNAME)
|
eq(thread.looper), any(), intAdvCbCaptor1.capture(), eq(TEST_HOSTNAME), any()
|
||||||
)
|
)
|
||||||
verify(mockDeps).makeAdvertiser(eq(mockSocket2), eq(listOf(TEST_LINKADDR)),
|
verify(mockDeps).makeAdvertiser(eq(mockSocket2), eq(listOf(TEST_LINKADDR)),
|
||||||
eq(thread.looper), any(), intAdvCbCaptor2.capture(), eq(TEST_HOSTNAME)
|
eq(thread.looper), any(), intAdvCbCaptor2.capture(), eq(TEST_HOSTNAME), any()
|
||||||
)
|
)
|
||||||
|
|
||||||
doReturn(false).`when`(mockInterfaceAdvertiser1).isProbing(SERVICE_ID_1)
|
doReturn(false).`when`(mockInterfaceAdvertiser1).isProbing(SERVICE_ID_1)
|
||||||
@@ -194,7 +206,7 @@ class MdnsAdvertiserTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testAddService_Conflicts() {
|
fun testAddService_Conflicts() {
|
||||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
|
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
|
||||||
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
|
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
|
||||||
|
|
||||||
val oneNetSocketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
|
val oneNetSocketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
|
||||||
@@ -233,7 +245,7 @@ class MdnsAdvertiserTest {
|
|||||||
|
|
||||||
val intAdvCbCaptor = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
|
val intAdvCbCaptor = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
|
||||||
verify(mockDeps).makeAdvertiser(eq(mockSocket1), eq(listOf(TEST_LINKADDR)),
|
verify(mockDeps).makeAdvertiser(eq(mockSocket1), eq(listOf(TEST_LINKADDR)),
|
||||||
eq(thread.looper), any(), intAdvCbCaptor.capture(), eq(TEST_HOSTNAME)
|
eq(thread.looper), any(), intAdvCbCaptor.capture(), eq(TEST_HOSTNAME), any()
|
||||||
)
|
)
|
||||||
verify(mockInterfaceAdvertiser1).addService(eq(SERVICE_ID_1),
|
verify(mockInterfaceAdvertiser1).addService(eq(SERVICE_ID_1),
|
||||||
argThat { it.matches(SERVICE_1) })
|
argThat { it.matches(SERVICE_1) })
|
||||||
@@ -264,7 +276,7 @@ class MdnsAdvertiserTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testRemoveService_whenAllServiceRemoved_thenUpdateHostName() {
|
fun testRemoveService_whenAllServiceRemoved_thenUpdateHostName() {
|
||||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
|
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
|
||||||
verify(mockDeps, times(1)).generateHostname()
|
verify(mockDeps, times(1)).generateHostname()
|
||||||
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
|
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
|
||||||
postSync { advertiser.removeService(SERVICE_ID_1) }
|
postSync { advertiser.removeService(SERVICE_ID_1) }
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import android.net.Network;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
|
||||||
|
import com.android.net.module.util.SharedLog;
|
||||||
import com.android.server.connectivity.mdns.MdnsSocketClientBase.SocketCreationCallback;
|
import com.android.server.connectivity.mdns.MdnsSocketClientBase.SocketCreationCallback;
|
||||||
import com.android.testutils.DevSdkIgnoreRule;
|
import com.android.testutils.DevSdkIgnoreRule;
|
||||||
import com.android.testutils.DevSdkIgnoreRunner;
|
import com.android.testutils.DevSdkIgnoreRunner;
|
||||||
@@ -74,13 +75,14 @@ public class MdnsDiscoveryManagerTests {
|
|||||||
|
|
||||||
@Mock MdnsServiceBrowserListener mockListenerOne;
|
@Mock MdnsServiceBrowserListener mockListenerOne;
|
||||||
@Mock MdnsServiceBrowserListener mockListenerTwo;
|
@Mock MdnsServiceBrowserListener mockListenerTwo;
|
||||||
|
@Mock SharedLog sharedLog;
|
||||||
private MdnsDiscoveryManager discoveryManager;
|
private MdnsDiscoveryManager discoveryManager;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
discoveryManager = new MdnsDiscoveryManager(executorProvider, socketClient) {
|
discoveryManager = new MdnsDiscoveryManager(executorProvider, socketClient, sharedLog) {
|
||||||
@Override
|
@Override
|
||||||
MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
|
MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
|
||||||
@Nullable Network network) {
|
@Nullable Network network) {
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ class MdnsInterfaceAdvertiserTest {
|
|||||||
private val replySender = mock(MdnsReplySender::class.java)
|
private val replySender = mock(MdnsReplySender::class.java)
|
||||||
private val announcer = mock(MdnsAnnouncer::class.java)
|
private val announcer = mock(MdnsAnnouncer::class.java)
|
||||||
private val prober = mock(MdnsProber::class.java)
|
private val prober = mock(MdnsProber::class.java)
|
||||||
private val sharedlog = mock(SharedLog::class.java)
|
private val sharedlog = SharedLog("MdnsInterfaceAdvertiserTest")
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
private val probeCbCaptor = ArgumentCaptor.forClass(PacketRepeaterCallback::class.java)
|
private val probeCbCaptor = ArgumentCaptor.forClass(PacketRepeaterCallback::class.java)
|
||||||
as ArgumentCaptor<PacketRepeaterCallback<ProbingInfo>>
|
as ArgumentCaptor<PacketRepeaterCallback<ProbingInfo>>
|
||||||
@@ -92,7 +92,6 @@ class MdnsInterfaceAdvertiserTest {
|
|||||||
|
|
||||||
private val advertiser by lazy {
|
private val advertiser by lazy {
|
||||||
MdnsInterfaceAdvertiser(
|
MdnsInterfaceAdvertiser(
|
||||||
LOG_TAG,
|
|
||||||
socket,
|
socket,
|
||||||
TEST_ADDRS,
|
TEST_ADDRS,
|
||||||
thread.looper,
|
thread.looper,
|
||||||
@@ -116,6 +115,7 @@ class MdnsInterfaceAdvertiserTest {
|
|||||||
val knownServices = mutableSetOf<Int>()
|
val knownServices = mutableSetOf<Int>()
|
||||||
doAnswer { inv ->
|
doAnswer { inv ->
|
||||||
knownServices.add(inv.getArgument(0))
|
knownServices.add(inv.getArgument(0))
|
||||||
|
|
||||||
-1
|
-1
|
||||||
}.`when`(repository).addService(anyInt(), any())
|
}.`when`(repository).addService(anyInt(), any())
|
||||||
doAnswer { inv ->
|
doAnswer { inv ->
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ public class MdnsSocketProviderTest {
|
|||||||
private MdnsSocketProvider mSocketProvider;
|
private MdnsSocketProvider mSocketProvider;
|
||||||
private NetworkCallback mNetworkCallback;
|
private NetworkCallback mNetworkCallback;
|
||||||
private TetheringEventCallback mTetheringEventCallback;
|
private TetheringEventCallback mTetheringEventCallback;
|
||||||
|
private SharedLog mLog = new SharedLog("MdnsSocketProviderTest");
|
||||||
|
|
||||||
private TestNetlinkMonitor mTestSocketNetLinkMonitor;
|
private TestNetlinkMonitor mTestSocketNetLinkMonitor;
|
||||||
@Before
|
@Before
|
||||||
@@ -153,7 +154,7 @@ public class MdnsSocketProviderTest {
|
|||||||
return mTestSocketNetLinkMonitor;
|
return mTestSocketNetLinkMonitor;
|
||||||
}).when(mDeps).createSocketNetlinkMonitor(any(), any(),
|
}).when(mDeps).createSocketNetlinkMonitor(any(), any(),
|
||||||
any());
|
any());
|
||||||
mSocketProvider = new MdnsSocketProvider(mContext, thread.getLooper(), mDeps);
|
mSocketProvider = new MdnsSocketProvider(mContext, thread.getLooper(), mDeps, mLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startMonitoringSockets() {
|
private void startMonitoringSockets() {
|
||||||
|
|||||||
Reference in New Issue
Block a user