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