NsdManagerTest.java revision 52d9e733aedf210b50f1df389cc23fbf28ab97fe
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 52db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Mock Context mContext; 53db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Mock INsdManager mService; 54db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi MockServiceHandler mServiceHandler; 55db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 56db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi long mTimeoutMs = 100; // non-final so that tests can adjust the value. 57db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 58db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Before 59db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public void setUp() throws Exception { 60db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi MockitoAnnotations.initMocks(this); 61db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 62db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi mServiceHandler = spy(MockServiceHandler.create(mContext)); 63db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi when(mService.getMessenger()).thenReturn(new Messenger(mServiceHandler)); 64db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 65db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 66db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Test 67db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public void testResolveService() { 68db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager manager = makeManager(); 69db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 70db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdServiceInfo request = new NsdServiceInfo("a_name", "a_type"); 71db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdServiceInfo reply = new NsdServiceInfo("resolved_name", "resolved_type"); 72db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager.ResolveListener listener = mock(NsdManager.ResolveListener.class); 73db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 74db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi manager.resolveService(request, listener); 75db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int key1 = verifyRequest(NsdManager.RESOLVE_SERVICE); 76db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int err = 33; 77db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi sendResponse(NsdManager.RESOLVE_SERVICE_FAILED, err, key1, null); 78db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(listener, timeout(mTimeoutMs).times(1)).onResolveFailed(request, err); 79db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 80db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi manager.resolveService(request, listener); 81db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int key2 = verifyRequest(NsdManager.RESOLVE_SERVICE); 82db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi sendResponse(NsdManager.RESOLVE_SERVICE_SUCCEEDED, 0, key2, reply); 83db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(listener, timeout(mTimeoutMs).times(1)).onServiceResolved(reply); 84db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 85db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 86db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Test 87db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public void testParallelResolveService() { 88db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager manager = makeManager(); 89db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 90db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdServiceInfo request = new NsdServiceInfo("a_name", "a_type"); 91db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdServiceInfo reply = new NsdServiceInfo("resolved_name", "resolved_type"); 92db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 93db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager.ResolveListener listener1 = mock(NsdManager.ResolveListener.class); 94db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager.ResolveListener listener2 = mock(NsdManager.ResolveListener.class); 95db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 96db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi manager.resolveService(request, listener1); 97db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int key1 = verifyRequest(NsdManager.RESOLVE_SERVICE); 98db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 99db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi manager.resolveService(request, listener2); 100db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int key2 = verifyRequest(NsdManager.RESOLVE_SERVICE); 101db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 102db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi sendResponse(NsdManager.RESOLVE_SERVICE_SUCCEEDED, 0, key2, reply); 103db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi sendResponse(NsdManager.RESOLVE_SERVICE_SUCCEEDED, 0, key1, reply); 104db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 105db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(listener1, timeout(mTimeoutMs).times(1)).onServiceResolved(reply); 106db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(listener2, timeout(mTimeoutMs).times(1)).onServiceResolved(reply); 10752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi } 10852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 10952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi @Test 11052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi public void testInvalidCalls() { 11152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdManager manager = new NsdManager(mContext, mService); 11252d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 11352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdManager.RegistrationListener listener1 = mock(NsdManager.RegistrationListener.class); 11452d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdManager.DiscoveryListener listener2 = mock(NsdManager.DiscoveryListener.class); 11552d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdManager.ResolveListener listener3 = mock(NsdManager.ResolveListener.class); 11652d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 11752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdServiceInfo invalidService = new NsdServiceInfo(null, null); 11852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi NsdServiceInfo validService = new NsdServiceInfo("a_name", "a_type"); 11952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi validService.setPort(2222); 12052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 12152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi int protocol = NsdManager.PROTOCOL_DNS_SD; 12252d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 12352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // Service registration 12452d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - invalid arguments 12552d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.unregisterService(null); }); 12652d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.registerService(null, -1, null); }); 12752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.registerService(null, protocol, listener1); }); 12852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.registerService(invalidService, protocol, listener1); }); 12952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.registerService(validService, -1, listener1); }); 13052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.registerService(validService, protocol, null); }); 13152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi manager.registerService(validService, protocol, listener1); 13252d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - listener already registered 13352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.registerService(validService, protocol, listener1); }); 13452d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi manager.unregisterService(listener1); 13552d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // TODO: make listener immediately reusable 13652d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi //mustFail(() -> { manager.unregisterService(listener1); }); 13752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi //manager.registerService(validService, protocol, listener1); 13852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 13952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // Discover service 14052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - invalid arguments 14152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.stopServiceDiscovery(null); }); 14252d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.discoverServices(null, -1, null); }); 14352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.discoverServices(null, protocol, listener2); }); 14452d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.discoverServices("a_service", -1, listener2); }); 14552d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.discoverServices("a_service", protocol, null); }); 14652d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi manager.discoverServices("a_service", protocol, listener2); 14752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - listener already registered 14852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.discoverServices("another_service", protocol, listener2); }); 14952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi manager.stopServiceDiscovery(listener2); 15052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // TODO: make listener immediately reusable 15152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi //mustFail(() -> { manager.stopServiceDiscovery(listener2); }); 15252d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi //manager.discoverServices("another_service", protocol, listener2); 15352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 15452d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // Resolver service 15552d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - invalid arguments 15652d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.resolveService(null, null); }); 15752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.resolveService(null, listener3); }); 15852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.resolveService(invalidService, listener3); }); 15952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.resolveService(validService, null); }); 16052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi manager.resolveService(validService, listener3); 16152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi // - listener already registered:w 16252d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi mustFail(() -> { manager.resolveService(validService, listener3); }); 16352d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi } 16452d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi 16552d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi public void mustFail(Runnable fn) { 16652d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi try { 16752d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi fn.run(); 16852d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi fail(); 16952d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi } catch (Exception expected) { 17052d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi } 17152d9e733aedf210b50f1df389cc23fbf28ab97feHugo Benichi } 172db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 173db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager makeManager() { 174db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi NsdManager manager = new NsdManager(mContext, mService); 175db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi // Acknowledge first two messages connecting the AsyncChannel. 176db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(mServiceHandler, timeout(mTimeoutMs).times(2)).handleMessage(any()); 177db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi reset(mServiceHandler); 178db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi assertNotNull(mServiceHandler.chan); 179db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi return manager; 180db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 181db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 182db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi int verifyRequest(int expectedMessageType) { 183db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi verify(mServiceHandler, timeout(mTimeoutMs)).handleMessage(any()); 184db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi reset(mServiceHandler); 185db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi Message received = mServiceHandler.lastMessage; 186db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi assertEquals(NsdManager.nameOf(expectedMessageType), NsdManager.nameOf(received.what)); 187db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi return received.arg2; 188db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 189db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 190db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi void sendResponse(int replyType, int arg, int key, Object obj) { 191db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi mServiceHandler.chan.sendMessage(replyType, arg, key, obj); 192db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 193db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 194db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi // Implements the server side of AsyncChannel connection protocol 195db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public static class MockServiceHandler extends Handler { 196db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public Context mContext; 197db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public AsyncChannel chan; 198db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public Message lastMessage; 199db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 200db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi MockServiceHandler(Looper looper, Context context) { 201db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi super(looper); 202db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi mContext = context; 203db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 204db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 205db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi @Override 206db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public void handleMessage(Message msg) { 207db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi lastMessage = obtainMessage(); 208db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi lastMessage.copyFrom(msg); 209db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi if (msg.what == AsyncChannel.CMD_CHANNEL_FULL_CONNECTION) { 210db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi chan = new AsyncChannel(); 211db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi chan.connect(mContext, this, msg.replyTo); 212db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi chan.sendMessage(AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED); 213db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 214db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 215db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 216db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi 217db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi public static MockServiceHandler create(Context context) { 218db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi HandlerThread t = new HandlerThread("mock-service-handler"); 219db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi t.start(); 220db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi return new MockServiceHandler(t.getLooper(), context); 221db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 222db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi } 223db8adb798394af6381974444bfa0c47f4b30f0fbHugo Benichi} 224