NsdManagerTest.java revision 8c5eeb0afc5dad35ee8ce11b9e82f7219a1a609d
1db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi/* 2db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * Copyright (C) 2017 The Android Open Source Project 3db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * 4db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * Licensed under the Apache License, Version 2.0 (the "License"); 5db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * you may not use this file except in compliance with the License. 6db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * You may obtain a copy of the License at 7db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * 8db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * http://www.apache.org/licenses/LICENSE-2.0 9db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * 10db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * Unless required by applicable law or agreed to in writing, software 11db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * distributed under the License is distributed on an "AS IS" BASIS, 12db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * See the License for the specific language governing permissions and 14db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi * limitations under the License. 15db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi */ 16db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 17db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichipackage android.net.nsd; 18db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 19db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport static org.junit.Assert.assertEquals; 20db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport static org.junit.Assert.assertNotNull; 2152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichiimport static org.junit.Assert.fail; 22db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport static org.mockito.Mockito.when; 23db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport static org.mockito.Mockito.any; 24db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport static org.mockito.Mockito.reset; 25db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport static org.mockito.Mockito.spy; 26db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport static org.mockito.Mockito.verify; 27db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport static org.mockito.Mockito.mock; 28db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport static org.mockito.Mockito.timeout; 29db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport static org.mockito.Mockito.times; 30db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 31db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport android.os.HandlerThread; 32db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport android.os.Handler; 33db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport android.os.Looper; 34db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport android.content.Context; 35db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport android.support.test.filters.SmallTest; 36db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport android.support.test.runner.AndroidJUnit4; 37db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport android.os.Message; 38db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport android.os.Messenger; 39db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport com.android.internal.util.AsyncChannel; 40db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport org.junit.Before; 41db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport org.junit.Test; 42db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport org.junit.runner.RunWith; 43db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport org.mockito.Mock; 44db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichiimport org.mockito.MockitoAnnotations; 45db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 4652d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichiimport java.util.function.Consumer; 4752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 48db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi@RunWith(AndroidJUnit4.class) 49db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi@SmallTest 50db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichipublic class NsdManagerTest { 51db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 528c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi static final int PROTOCOL = NsdManager.PROTOCOL_DNS_SD; 538c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 54db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Mock Context mContext; 55db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Mock INsdManager mService; 56db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi MockServiceHandler mServiceHandler; 57db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 58db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi long mTimeoutMs = 100; // non-final so that tests can adjust the value. 59db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 60db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Before 61db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public void setUp() throws Exception { 62db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi MockitoAnnotations.initMocks(this); 63db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 64db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi mServiceHandler = spy(MockServiceHandler.create(mContext)); 65db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi when(mService.getMessenger()).thenReturn(new Messenger(mServiceHandler)); 66db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 67db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 68db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Test 69db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public void testResolveService() { 70db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager manager = makeManager(); 71db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 72db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdServiceInfo request = new NsdServiceInfo("a_name", "a_type"); 73db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdServiceInfo reply = new NsdServiceInfo("resolved_name", "resolved_type"); 74db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager.ResolveListener listener = mock(NsdManager.ResolveListener.class); 75db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 76db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi manager.resolveService(request, listener); 77db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int key1 = verifyRequest(NsdManager.RESOLVE_SERVICE); 78db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int err = 33; 79db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi sendResponse(NsdManager.RESOLVE_SERVICE_FAILED, err, key1, null); 80db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(listener, timeout(mTimeoutMs).times(1)).onResolveFailed(request, err); 81db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 82db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi manager.resolveService(request, listener); 83db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int key2 = verifyRequest(NsdManager.RESOLVE_SERVICE); 84db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi sendResponse(NsdManager.RESOLVE_SERVICE_SUCCEEDED, 0, key2, reply); 85db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(listener, timeout(mTimeoutMs).times(1)).onServiceResolved(reply); 86db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 87db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 88db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Test 89db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public void testParallelResolveService() { 90db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager manager = makeManager(); 91db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 92db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdServiceInfo request = new NsdServiceInfo("a_name", "a_type"); 93db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdServiceInfo reply = new NsdServiceInfo("resolved_name", "resolved_type"); 94db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 95db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager.ResolveListener listener1 = mock(NsdManager.ResolveListener.class); 96db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager.ResolveListener listener2 = mock(NsdManager.ResolveListener.class); 97db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 98db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi manager.resolveService(request, listener1); 99db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int key1 = verifyRequest(NsdManager.RESOLVE_SERVICE); 100db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 101db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi manager.resolveService(request, listener2); 102db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int key2 = verifyRequest(NsdManager.RESOLVE_SERVICE); 103db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 104db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi sendResponse(NsdManager.RESOLVE_SERVICE_SUCCEEDED, 0, key2, reply); 105db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi sendResponse(NsdManager.RESOLVE_SERVICE_SUCCEEDED, 0, key1, reply); 106db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 107db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(listener1, timeout(mTimeoutMs).times(1)).onServiceResolved(reply); 108db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(listener2, timeout(mTimeoutMs).times(1)).onServiceResolved(reply); 10952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi } 11052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 11152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi @Test 1128c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi public void testRegisterService() { 1138c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi NsdManager manager = makeManager(); 1148c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1158c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi NsdServiceInfo request1 = new NsdServiceInfo("a_name", "a_type"); 1168c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi NsdServiceInfo request2 = new NsdServiceInfo("another_name", "another_type"); 1178c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi request1.setPort(2201); 1188c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi request2.setPort(2202); 1198c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi NsdManager.RegistrationListener listener1 = mock(NsdManager.RegistrationListener.class); 1208c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi NsdManager.RegistrationListener listener2 = mock(NsdManager.RegistrationListener.class); 1218c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1228c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi // Register two services 1238c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi manager.registerService(request1, PROTOCOL, listener1); 1248c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi int key1 = verifyRequest(NsdManager.REGISTER_SERVICE); 1258c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1268c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi manager.registerService(request2, PROTOCOL, listener2); 1278c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi int key2 = verifyRequest(NsdManager.REGISTER_SERVICE); 1288c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1298c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi // First reques fails, second request succeeds 1308c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi sendResponse(NsdManager.REGISTER_SERVICE_SUCCEEDED, 0, key2, request2); 1318c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi verify(listener2, timeout(mTimeoutMs).times(1)).onServiceRegistered(request2); 1328c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1338c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi int err = 1; 1348c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi sendResponse(NsdManager.REGISTER_SERVICE_FAILED, err, key1, request1); 1358c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi verify(listener1, timeout(mTimeoutMs).times(1)).onRegistrationFailed(request1, err); 1368c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1378c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi // Client retries first request, it succeeds 1388c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi manager.registerService(request1, PROTOCOL, listener1); 1398c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi int key3 = verifyRequest(NsdManager.REGISTER_SERVICE); 1408c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1418c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi sendResponse(NsdManager.REGISTER_SERVICE_SUCCEEDED, 0, key3, request1); 1428c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi verify(listener1, timeout(mTimeoutMs).times(1)).onServiceRegistered(request1); 1438c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1448c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi // First request is unregistered, it succeeds 1458c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi manager.unregisterService(listener1); 1468c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi int key3again = verifyRequest(NsdManager.UNREGISTER_SERVICE); 1478c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi assertEquals(key3, key3again); 1488c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1498c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi sendResponse(NsdManager.UNREGISTER_SERVICE_SUCCEEDED, 0, key3again, null); 1508c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi verify(listener1, timeout(mTimeoutMs).times(1)).onServiceUnregistered(request1); 1518c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1528c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi // Second request is unregistered, it fails 1538c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi manager.unregisterService(listener2); 1548c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi int key2again = verifyRequest(NsdManager.UNREGISTER_SERVICE); 1558c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi assertEquals(key2, key2again); 1568c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1578c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi sendResponse(NsdManager.UNREGISTER_SERVICE_FAILED, err, key2again, null); 1588c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi verify(listener2, timeout(mTimeoutMs).times(1)).onUnregistrationFailed(request2, err); 1598c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1608c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi // TODO: do not unregister listener until service is unregistered 1618c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi // Client retries unregistration of second request, it succeeds 1628c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi //manager.unregisterService(listener2); 1638c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi //int key2yetAgain = verifyRequest(NsdManager.UNREGISTER_SERVICE); 1648c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi //assertEquals(key2, key2yetAgain); 1658c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1668c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi //sendResponse(NsdManager.UNREGISTER_SERVICE_SUCCEEDED, 0, key2yetAgain, null); 1678c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi //verify(listener2, timeout(mTimeoutMs).times(1)).onServiceUnregistered(request2); 1688c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi } 1698c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi 1708c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi @Test 17152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi public void testInvalidCalls() { 17252d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdManager manager = new NsdManager(mContext, mService); 17352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 17452d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdManager.RegistrationListener listener1 = mock(NsdManager.RegistrationListener.class); 17552d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdManager.DiscoveryListener listener2 = mock(NsdManager.DiscoveryListener.class); 17652d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdManager.ResolveListener listener3 = mock(NsdManager.ResolveListener.class); 17752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 17852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdServiceInfo invalidService = new NsdServiceInfo(null, null); 17952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdServiceInfo validService = new NsdServiceInfo("a_name", "a_type"); 18052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi validService.setPort(2222); 18152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 18252d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // Service registration 18352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - invalid arguments 18452d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.unregisterService(null); }); 18552d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.registerService(null, -1, null); }); 1868c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi mustFail(() -> { manager.registerService(null, PROTOCOL, listener1); }); 1878c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi mustFail(() -> { manager.registerService(invalidService, PROTOCOL, listener1); }); 18852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.registerService(validService, -1, listener1); }); 1898c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi mustFail(() -> { manager.registerService(validService, PROTOCOL, null); }); 1908c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi manager.registerService(validService, PROTOCOL, listener1); 19152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - listener already registered 1928c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi mustFail(() -> { manager.registerService(validService, PROTOCOL, listener1); }); 19352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi manager.unregisterService(listener1); 19452d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // TODO: make listener immediately reusable 19552d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi //mustFail(() -> { manager.unregisterService(listener1); }); 1968c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi //manager.registerService(validService, PROTOCOL, listener1); 19752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 19852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // Discover service 19952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - invalid arguments 20052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.stopServiceDiscovery(null); }); 20152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.discoverServices(null, -1, null); }); 2028c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi mustFail(() -> { manager.discoverServices(null, PROTOCOL, listener2); }); 20352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.discoverServices("a_service", -1, listener2); }); 2048c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi mustFail(() -> { manager.discoverServices("a_service", PROTOCOL, null); }); 2058c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi manager.discoverServices("a_service", PROTOCOL, listener2); 20652d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - listener already registered 2078c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi mustFail(() -> { manager.discoverServices("another_service", PROTOCOL, listener2); }); 20852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi manager.stopServiceDiscovery(listener2); 20952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // TODO: make listener immediately reusable 21052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi //mustFail(() -> { manager.stopServiceDiscovery(listener2); }); 2118c5eeb0afc5dad35ee8ce11b9e82f7219a1a609dHugo Benichi //manager.discoverServices("another_service", PROTOCOL, listener2); 21252d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 21352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // Resolver service 21452d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - invalid arguments 21552d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.resolveService(null, null); }); 21652d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.resolveService(null, listener3); }); 21752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.resolveService(invalidService, listener3); }); 21852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.resolveService(validService, null); }); 21952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi manager.resolveService(validService, listener3); 22052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - listener already registered:w 22152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.resolveService(validService, listener3); }); 22252d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi } 22352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 22452d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi public void mustFail(Runnable fn) { 22552d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi try { 22652d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi fn.run(); 22752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi fail(); 22852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi } catch (Exception expected) { 22952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi } 23052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi } 231db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 232db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager makeManager() { 233db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager manager = new NsdManager(mContext, mService); 234db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi // Acknowledge first two messages connecting the AsyncChannel. 235db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(mServiceHandler, timeout(mTimeoutMs).times(2)).handleMessage(any()); 236db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi reset(mServiceHandler); 237db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi assertNotNull(mServiceHandler.chan); 238db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi return manager; 239db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 240db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 241db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int verifyRequest(int expectedMessageType) { 242db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(mServiceHandler, timeout(mTimeoutMs)).handleMessage(any()); 243db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi reset(mServiceHandler); 244db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi Message received = mServiceHandler.lastMessage; 245db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi assertEquals(NsdManager.nameOf(expectedMessageType), NsdManager.nameOf(received.what)); 246db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi return received.arg2; 247db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 248db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 249db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi void sendResponse(int replyType, int arg, int key, Object obj) { 250db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi mServiceHandler.chan.sendMessage(replyType, arg, key, obj); 251db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 252db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 253db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi // Implements the server side of AsyncChannel connection protocol 254db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public static class MockServiceHandler extends Handler { 255db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public Context mContext; 256db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public AsyncChannel chan; 257db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public Message lastMessage; 258db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 259db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi MockServiceHandler(Looper looper, Context context) { 260db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi super(looper); 261db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi mContext = context; 262db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 263db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 264db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Override 265db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public void handleMessage(Message msg) { 266db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi lastMessage = obtainMessage(); 267db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi lastMessage.copyFrom(msg); 268db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi if (msg.what == AsyncChannel.CMD_CHANNEL_FULL_CONNECTION) { 269db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi chan = new AsyncChannel(); 270db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi chan.connect(mContext, this, msg.replyTo); 271db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi chan.sendMessage(AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED); 272db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 273db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 274db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 275db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 276db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public static MockServiceHandler create(Context context) { 277db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi HandlerThread t = new HandlerThread("mock-service-handler"); 278db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi t.start(); 279db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi return new MockServiceHandler(t.getLooper(), context); 280db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 281db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 282db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi} 283