168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang/* 268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * Copyright (C) 2016 The Android Open Source Project 368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * 468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * Licensed under the Apache License, Version 2.0 (the "License"); 568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * you may not use this file except in compliance with the License. 668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * You may obtain a copy of the License at 768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * 868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * http://www.apache.org/licenses/LICENSE-2.0 968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * 1068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * Unless required by applicable law or agreed to in writing, software 1168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * distributed under the License is distributed on an "AS IS" BASIS, 1268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * See the License for the specific language governing permissions and 1468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * limitations under the License. 1568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang */ 1668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 1768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangpackage com.android.server.wifi; 1868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 1968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport static org.junit.Assert.assertEquals; 2068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport static org.mockito.Matchers.any; 2168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport static org.mockito.Matchers.anyInt; 2268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport static org.mockito.Mockito.atLeastOnce; 2368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport static org.mockito.Mockito.mock; 2468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport static org.mockito.Mockito.times; 2568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport static org.mockito.Mockito.validateMockitoUsage; 2668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport static org.mockito.Mockito.verify; 2768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport static org.mockito.Mockito.verifyNoMoreInteractions; 2868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport static org.mockito.Mockito.when; 2968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 3068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.content.BroadcastReceiver; 3168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.content.Context; 3268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.content.IntentFilter; 3368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.net.wifi.RttManager; 34202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wangimport android.net.wifi.RttManager.ParcelableRttParams; 3568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.net.wifi.RttManager.ResponderConfig; 3668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.net.wifi.WifiManager; 3768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.os.Handler; 3868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.os.Message; 3968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.test.suitebuilder.annotation.SmallTest; 4068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 4168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.junit.After; 4268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.junit.Before; 4368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.junit.Test; 4468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.mockito.ArgumentCaptor; 4568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.mockito.Mock; 4668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.mockito.MockitoAnnotations; 4768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 4868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang/** 4968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * Unit test for {@link com.android.server.wifi.RttService} 5068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang */ 5168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang@SmallTest 5268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangpublic class RttServiceTest { 5368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 5468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Some constants for running Rtt tests. 5568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private static final String MAC = "12:34:56:78:9A:BC"; 5668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private static final int CLIENT_KEY1 = 1; 5768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private static final int CLIENT_KEY2 = 2; 5868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 5968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Mock 6068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Context mContext; 6168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Mock 6268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang WifiNative mWifiNative; 6368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang MockLooper mLooper; 6468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 6568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang RttService.RttServiceImpl mRttServiceImpl; 6668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang ArgumentCaptor<BroadcastReceiver> mBroadcastReceiverCaptor = ArgumentCaptor 6768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang .forClass(BroadcastReceiver.class); 6868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 6968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Before 7068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void setUp() throws Exception { 7168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang MockitoAnnotations.initMocks(this); 7268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang TestUtil.installWlanWifiNative(mWifiNative); 7368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mLooper = new MockLooper(); 7468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mRttServiceImpl = new RttService.RttServiceImpl(mContext, mLooper.getLooper()); 7568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mRttServiceImpl.startService(); 7668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 7768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 7868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @After 7968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void cleanup() { 8068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang validateMockitoUsage(); 8168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 8268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 8368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private void startWifi() { 8468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verify(mContext).registerReceiver(mBroadcastReceiverCaptor.capture(), 8568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang any(IntentFilter.class)); 8668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang TestUtil.sendWifiScanAvailable(mBroadcastReceiverCaptor.getValue(), 8768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mContext, WifiManager.WIFI_STATE_ENABLED); 8868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 8968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 9068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Create and connect a bi-directional async channel. 9168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private BidirectionalAsyncChannel connectChannel(Handler handler) { 9268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = new BidirectionalAsyncChannel(); 9368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.connect(mLooper.getLooper(), mRttServiceImpl.getMessenger(), 9468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang handler); 9568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mLooper.dispatchAll(); 9668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.assertConnected(); 9768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang return channel; 9868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 9968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 100202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang private void sendRangingRequestFailed(BidirectionalAsyncChannel channel, Handler handler, 101202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang int clientKey, ParcelableRttParams params) { 102202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang Message message = sendRangingRequest(channel, handler, clientKey, params); 103202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang assertEquals("ranging request did not fail", 104202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang RttManager.CMD_OP_FAILED, message.what); 105202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang verifyNoMoreInteractions(mWifiNative); 106202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang } 107202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang 108202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang // Send rtt ranging request message and verify failure. 109202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang private Message sendRangingRequest(BidirectionalAsyncChannel channel, Handler handler, 110202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang int clientKey, ParcelableRttParams params) { 111202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang Message message = new Message(); 112202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang message.what = RttManager.CMD_OP_START_RANGING; 113202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang message.arg2 = clientKey; 114202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang message.obj = params; 115202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang channel.sendMessage(message); 116202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang mLooper.dispatchAll(); 117202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 118202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang verify(handler, atLeastOnce()).handleMessage(messageCaptor.capture()); 119202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang return messageCaptor.getValue(); 120202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang } 121202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang 12268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Send enable responder message and verify success. 12368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private void sendEnableResponderSucceed(BidirectionalAsyncChannel channel, 12468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler, int clientKey) { 12568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Message message = sendEnableResponder(channel, handler, clientKey, 12668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang createResponderConfig()); 12787a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang verify(mWifiNative).enableRttResponder(anyInt()); 12868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang assertEquals("reponse status is not success", 12968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang RttManager.CMD_OP_ENALBE_RESPONDER_SUCCEEDED, message.what); 13068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang String actualMac = ((ResponderConfig) message.obj).macAddress; 13168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang assertEquals("mac address mismatch", MAC, actualMac); 13268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 13368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 134202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang // Send enable responder message and verify failure. 13568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private void sendEnableResponderFailed(BidirectionalAsyncChannel channel, 13687a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang Handler handler, int clientKey, int reason) { 13768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Message message = sendEnableResponder(channel, handler, clientKey, null); 13868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang assertEquals("reponse status is not failure", 13968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang RttManager.CMD_OP_ENALBE_RESPONDER_FAILED, message.what); 14087a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang assertEquals("failure reason is not " + reason, 14187a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang reason, message.arg1); 14268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 14368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 14468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private Message sendEnableResponder(BidirectionalAsyncChannel channel, Handler handler, 14568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang int clientKey, ResponderConfig config) { 14668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang when(mWifiNative.enableRttResponder(anyInt())).thenReturn(config); 14768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang when(mWifiNative.getMacAddress()).thenReturn(MAC); 14868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Message message = new Message(); 14968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang message.what = RttManager.CMD_OP_ENABLE_RESPONDER; 15068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang message.arg2 = clientKey; 15168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.sendMessage(message); 15268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mLooper.dispatchAll(); 15368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 15468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verify(handler, atLeastOnce()).handleMessage(messageCaptor.capture()); 15568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang return messageCaptor.getValue(); 15668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 15768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 15868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private void sendDisableResponder(BidirectionalAsyncChannel channel, int key, boolean success) { 15968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang when(mWifiNative.disableRttResponder()).thenReturn(success); 16068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Message message = new Message(); 16168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang message.what = RttManager.CMD_OP_DISABLE_RESPONDER; 16268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang message.arg2 = key; 16368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.sendMessage(message); 16468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mLooper.dispatchAll(); 16568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 16668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 16768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private ResponderConfig createResponderConfig() { 16868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang ResponderConfig config = new ResponderConfig(); 16968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang config.macAddress = MAC; 17068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang return config; 17168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 17268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 17368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 17468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testEnableResponderSuccess() throws Exception { 17568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 17668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 17768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 17868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Successfully enabled responder. 17968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY1); 18068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 18168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 18268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 18368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testEnableResponderSecondTime() throws Exception { 18468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 18568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 18668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 18768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY1); 18868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Calling enabling responder with the same key should succeed. 18968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY1); 19068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 19168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 19268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 19368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testEnableResponderMultiClient() throws Exception { 19468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 19568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 19668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 19768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY1); 19868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY2); 19968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Native method should be called only once when multiple clients enabled responder. 20068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verify(mWifiNative, times(1)).enableRttResponder(anyInt()); 20168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 20268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 20368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 20468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testDisableResponderSuccess() throws Exception { 20568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 20668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 20768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 20868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY1); 20968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Disable after successfully enabling. 21068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendDisableResponder(channel, CLIENT_KEY1, false); 21168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verify(mWifiNative).disableRttResponder(); 21268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 21368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 21487a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang /** 21587a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang * Enable responder failed because of internal error. 21687a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang */ 21768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 21868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testEnableResponderFailure() throws Exception { 21968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 22068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 22168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang when(mWifiNative.enableRttResponder(anyInt())).thenReturn(null); 22268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 22368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Disable failed. 22487a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang sendEnableResponderFailed(channel, handler, CLIENT_KEY1, RttManager.REASON_UNSPECIFIED); 22568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 22668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 22768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 22868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testDisableResponderNotStarted() throws Exception { 22968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 23068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 23168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 23268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Disable without enabling should fail. 23368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendDisableResponder(channel, CLIENT_KEY1, false); 23468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Native disable method shouldn't be called. 23568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verifyNoMoreInteractions(mWifiNative); 23668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 23768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 23868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 23968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testDisableResponderMultiClient() throws Exception { 24068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 24168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 24268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 24368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY1); 24468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY2); 24568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Two clients enabled, one client disabled. 24668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendDisableResponder(channel, CLIENT_KEY1, true); 24768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verify(mWifiNative, times(1)).getMacAddress(); 24868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verifyNoMoreInteractions(mWifiNative); 24968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 250202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang 251202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang /** 25287a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang * Enable responder failed because wifi is not enabled. 25387a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang */ 25487a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang @Test 25587a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang public void testEnableResponderFailedWifiDisabled() throws Exception { 25687a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang Handler handler = mock(Handler.class); 25787a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 25887a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang // Wifi is disabled as startWifi() is not invoked. 25987a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang sendEnableResponderFailed(channel, handler, CLIENT_KEY1, RttManager.REASON_NOT_AVAILABLE); 26087a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang verifyNoMoreInteractions(mWifiNative); 26187a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang } 26287a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang 26387a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang /** 264202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang * Test RTT ranging with empty RttParams. 265202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang */ 266202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang @Test 267202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang public void testInitiatorEmptyParams() throws Exception { 268202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang startWifi(); 269202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang Handler handler = mock(Handler.class); 270202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 271202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang sendRangingRequestFailed(channel, handler, CLIENT_KEY1, new ParcelableRttParams(null)); 272202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang } 27368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang} 274