NsdService: disentangle NativeDaemonConnector from ctor

This patch disentangles the creation of NativeDaemonConnector from the
creation of NsdService by introducing a wrapper type DaemonConnection.

This allows to mock this dependency in unit tests.

Test: enhanced previously introduced new tests.
Bug: 37013369, 33298084
Change-Id: I894b7cddfc509f86d0134d214c88c063b81b5e0a
diff --git a/tests/net/java/android/net/nsd/NsdServiceTest.java b/tests/net/java/android/net/nsd/NsdServiceTest.java
index 64466bf..acc390c 100644
--- a/tests/net/java/android/net/nsd/NsdServiceTest.java
+++ b/tests/net/java/android/net/nsd/NsdServiceTest.java
@@ -16,6 +16,11 @@
 
 package com.android.server;
 
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.os.Handler;
@@ -25,6 +30,9 @@
 import android.content.Context;
 import android.content.ContentResolver;
 import android.net.nsd.NsdManager;
+import com.android.server.NsdService.DaemonConnection;
+import com.android.server.NsdService.DaemonConnectionSupplier;
+import com.android.server.NsdService.NativeCallbackReceiver;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 import org.junit.Before;
@@ -34,7 +42,6 @@
 import org.mockito.MockitoAnnotations;
 
 // TODOs:
-//  - test daemon connection
 //  - test client disconnects
 //  - test client can send requests and receive replies
 //  - test NSD_ON ENABLE/DISABLED listening
@@ -45,6 +52,8 @@
     @Mock Context mContext;
     @Mock ContentResolver mResolver;
     @Mock NsdService.NsdSettings mSettings;
+    @Mock DaemonConnection mDaemon;
+    NativeCallbackReceiver mDaemonCallback;
     TestLooper mLooper;
     TestHandler mHandler;
 
@@ -58,8 +67,13 @@
 
     @Test
     public void testClientsCanConnect() {
+        when(mSettings.isEnabled()).thenReturn(true);
+
         NsdService service = makeService();
+
         NsdManager client1 = connectClient(service);
+        verify(mDaemon, timeout(100).times(1)).execute("start-service");
+
         NsdManager client2 = connectClient(service);
 
         // TODO: disconnect client1
@@ -67,7 +81,13 @@
     }
 
     NsdService makeService() {
-        return new NsdService(mContext, mSettings, mHandler);
+        DaemonConnectionSupplier supplier = (callback) -> {
+            mDaemonCallback = callback;
+            return mDaemon;
+        };
+        NsdService service = new NsdService(mContext, mSettings, mHandler, supplier);
+        verify(mDaemon, never()).execute(any(String.class));
+        return service;
     }
 
     NsdManager connectClient(NsdService service) {