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; 33435236f48f94a8373fa71251a3223e642f446e77Ningyuan Wangimport android.net.wifi.IWificond; 3468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.net.wifi.RttManager; 35202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wangimport android.net.wifi.RttManager.ParcelableRttParams; 3668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.net.wifi.RttManager.ResponderConfig; 3768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.net.wifi.WifiManager; 3868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.os.Handler; 3968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.os.Message; 40f4267b6840dbc7f430638c35c5448187b6e83846Christopher Wileyimport android.os.test.TestLooper; 4168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.test.suitebuilder.annotation.SmallTest; 4268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 43f4267b6840dbc7f430638c35c5448187b6e83846Christopher Wileyimport com.android.internal.util.test.BidirectionalAsyncChannel; 44f4267b6840dbc7f430638c35c5448187b6e83846Christopher Wiley 4568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.junit.After; 4668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.junit.Before; 4768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.junit.Test; 4868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.mockito.ArgumentCaptor; 4968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.mockito.Mock; 5068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport org.mockito.MockitoAnnotations; 5168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 5268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang/** 5368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * Unit test for {@link com.android.server.wifi.RttService} 5468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang */ 5568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang@SmallTest 5668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangpublic class RttServiceTest { 5768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 5868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Some constants for running Rtt tests. 5968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private static final String MAC = "12:34:56:78:9A:BC"; 6068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private static final int CLIENT_KEY1 = 1; 6168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private static final int CLIENT_KEY2 = 2; 6268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 6368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Mock 6468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Context mContext; 6568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Mock 6668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang WifiNative mWifiNative; 67f4267b6840dbc7f430638c35c5448187b6e83846Christopher Wiley TestLooper mLooper; 68435236f48f94a8373fa71251a3223e642f446e77Ningyuan Wang @Mock 69435236f48f94a8373fa71251a3223e642f446e77Ningyuan Wang WifiInjector mWifiInjector; 70435236f48f94a8373fa71251a3223e642f446e77Ningyuan Wang @Mock 71435236f48f94a8373fa71251a3223e642f446e77Ningyuan Wang IWificond mWificond; 7268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 7368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang RttService.RttServiceImpl mRttServiceImpl; 7468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang ArgumentCaptor<BroadcastReceiver> mBroadcastReceiverCaptor = ArgumentCaptor 7568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang .forClass(BroadcastReceiver.class); 7668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 7768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Before 7868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void setUp() throws Exception { 7968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang MockitoAnnotations.initMocks(this); 80f4267b6840dbc7f430638c35c5448187b6e83846Christopher Wiley mLooper = new TestLooper(); 81435236f48f94a8373fa71251a3223e642f446e77Ningyuan Wang when(mWifiInjector.makeWificond()).thenReturn(mWificond); 82b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius when(mWifiInjector.getWifiNative()).thenReturn(mWifiNative); 83b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mRttServiceImpl = new RttService.RttServiceImpl(mContext, mLooper.getLooper(), 84b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mWifiInjector); 8568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mRttServiceImpl.startService(); 8668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 8768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 8868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @After 8968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void cleanup() { 9068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang validateMockitoUsage(); 9168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 9268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 9368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private void startWifi() { 9468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verify(mContext).registerReceiver(mBroadcastReceiverCaptor.capture(), 9568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang any(IntentFilter.class)); 9668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang TestUtil.sendWifiScanAvailable(mBroadcastReceiverCaptor.getValue(), 9768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mContext, WifiManager.WIFI_STATE_ENABLED); 9868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 9968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 10068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Create and connect a bi-directional async channel. 10168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private BidirectionalAsyncChannel connectChannel(Handler handler) { 10268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = new BidirectionalAsyncChannel(); 10368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.connect(mLooper.getLooper(), mRttServiceImpl.getMessenger(), 10468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang handler); 10568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mLooper.dispatchAll(); 10668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.assertConnected(); 10768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang return channel; 10868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 10968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 110202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang private void sendRangingRequestFailed(BidirectionalAsyncChannel channel, Handler handler, 111202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang int clientKey, ParcelableRttParams params) { 112202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang Message message = sendRangingRequest(channel, handler, clientKey, params); 113202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang assertEquals("ranging request did not fail", 114202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang RttManager.CMD_OP_FAILED, message.what); 115202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang verifyNoMoreInteractions(mWifiNative); 116202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang } 117202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang 118202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang // Send rtt ranging request message and verify failure. 119202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang private Message sendRangingRequest(BidirectionalAsyncChannel channel, Handler handler, 120202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang int clientKey, ParcelableRttParams params) { 121202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang Message message = new Message(); 122202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang message.what = RttManager.CMD_OP_START_RANGING; 123202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang message.arg2 = clientKey; 124202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang message.obj = params; 125202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang channel.sendMessage(message); 126202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang mLooper.dispatchAll(); 127202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 128202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang verify(handler, atLeastOnce()).handleMessage(messageCaptor.capture()); 129202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang return messageCaptor.getValue(); 130202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang } 131202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang 13268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Send enable responder message and verify success. 13368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private void sendEnableResponderSucceed(BidirectionalAsyncChannel channel, 13468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler, int clientKey) { 13568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Message message = sendEnableResponder(channel, handler, clientKey, 13668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang createResponderConfig()); 13787a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang verify(mWifiNative).enableRttResponder(anyInt()); 13868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang assertEquals("reponse status is not success", 13968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang RttManager.CMD_OP_ENALBE_RESPONDER_SUCCEEDED, message.what); 14068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang String actualMac = ((ResponderConfig) message.obj).macAddress; 14168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang assertEquals("mac address mismatch", MAC, actualMac); 14268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 14368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 144202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang // Send enable responder message and verify failure. 14568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private void sendEnableResponderFailed(BidirectionalAsyncChannel channel, 14687a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang Handler handler, int clientKey, int reason) { 14768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Message message = sendEnableResponder(channel, handler, clientKey, null); 14868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang assertEquals("reponse status is not failure", 14968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang RttManager.CMD_OP_ENALBE_RESPONDER_FAILED, message.what); 15087a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang assertEquals("failure reason is not " + reason, 15187a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang reason, message.arg1); 15268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 15368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 15468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private Message sendEnableResponder(BidirectionalAsyncChannel channel, Handler handler, 15568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang int clientKey, ResponderConfig config) { 15668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang when(mWifiNative.enableRttResponder(anyInt())).thenReturn(config); 15768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang when(mWifiNative.getMacAddress()).thenReturn(MAC); 15868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Message message = new Message(); 15968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang message.what = RttManager.CMD_OP_ENABLE_RESPONDER; 16068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang message.arg2 = clientKey; 16168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.sendMessage(message); 16268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mLooper.dispatchAll(); 16368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); 16468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verify(handler, atLeastOnce()).handleMessage(messageCaptor.capture()); 16568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang return messageCaptor.getValue(); 16668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 16768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 16868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private void sendDisableResponder(BidirectionalAsyncChannel channel, int key, boolean success) { 16968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang when(mWifiNative.disableRttResponder()).thenReturn(success); 17068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Message message = new Message(); 17168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang message.what = RttManager.CMD_OP_DISABLE_RESPONDER; 17268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang message.arg2 = key; 17368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang channel.sendMessage(message); 17468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang mLooper.dispatchAll(); 17568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 17668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 17768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang private ResponderConfig createResponderConfig() { 17868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang ResponderConfig config = new ResponderConfig(); 17968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang config.macAddress = MAC; 18068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang return config; 18168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 18268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 18368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 18468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testEnableResponderSuccess() throws Exception { 18568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 18668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 18768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 18868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Successfully enabled responder. 18968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY1); 19068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 19168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 19268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 19368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testEnableResponderSecondTime() 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 // Calling enabling responder with the same key should succeed. 19968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY1); 20068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 20168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 20268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 20368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testEnableResponderMultiClient() throws Exception { 20468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 20568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 20668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 20768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY1); 20868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY2); 20968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Native method should be called only once when multiple clients enabled responder. 21068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verify(mWifiNative, times(1)).enableRttResponder(anyInt()); 21168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 21268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 21368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 21468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testDisableResponderSuccess() throws Exception { 21568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 21668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 21768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 21868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY1); 21968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Disable after successfully enabling. 22068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendDisableResponder(channel, CLIENT_KEY1, false); 22168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verify(mWifiNative).disableRttResponder(); 22268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 22368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 22487a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang /** 22587a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang * Enable responder failed because of internal error. 22687a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang */ 22768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 22868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testEnableResponderFailure() throws Exception { 22968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 23068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 23168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang when(mWifiNative.enableRttResponder(anyInt())).thenReturn(null); 23268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 23368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Disable failed. 23487a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang sendEnableResponderFailed(channel, handler, CLIENT_KEY1, RttManager.REASON_UNSPECIFIED); 23568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 23668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 23768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 23868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testDisableResponderNotStarted() throws Exception { 23968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 24068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 24168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 24268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Disable without enabling should fail. 24368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendDisableResponder(channel, CLIENT_KEY1, false); 24468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Native disable method shouldn't be called. 24568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verifyNoMoreInteractions(mWifiNative); 24668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 24768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang 24868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Test 24968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang public void testDisableResponderMultiClient() throws Exception { 25068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang startWifi(); 25168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang Handler handler = mock(Handler.class); 25268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 25368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY1); 25468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendEnableResponderSucceed(channel, handler, CLIENT_KEY2); 25568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang // Two clients enabled, one client disabled. 25668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang sendDisableResponder(channel, CLIENT_KEY1, true); 25768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verify(mWifiNative, times(1)).getMacAddress(); 25868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang verifyNoMoreInteractions(mWifiNative); 25968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang } 260202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang 261202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang /** 26287a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang * Enable responder failed because wifi is not enabled. 26387a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang */ 26487a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang @Test 26587a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang public void testEnableResponderFailedWifiDisabled() throws Exception { 26687a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang Handler handler = mock(Handler.class); 26787a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 26887a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang // Wifi is disabled as startWifi() is not invoked. 26987a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang sendEnableResponderFailed(channel, handler, CLIENT_KEY1, RttManager.REASON_NOT_AVAILABLE); 27087a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang verifyNoMoreInteractions(mWifiNative); 27187a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang } 27287a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang 27387a0e55e7d75e305e0fb50a0748d2002cd44c984Wei Wang /** 274202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang * Test RTT ranging with empty RttParams. 275202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang */ 276202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang @Test 277202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang public void testInitiatorEmptyParams() throws Exception { 278202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang startWifi(); 279202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang Handler handler = mock(Handler.class); 280202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang BidirectionalAsyncChannel channel = connectChannel(handler); 281202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang sendRangingRequestFailed(channel, handler, CLIENT_KEY1, new ParcelableRttParams(null)); 282202fdf96e1e0191be37a916d97116df35fe3cbfcWei Wang } 28368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang} 284