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