WifiVendorHalTest.java revision d4c5eca00c9cae55561210479ed61a977923e0da
1b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass/*
2b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * Copyright (C) 2017 The Android Open Source Project
3b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass *
4b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * Licensed under the Apache License, Version 2.0 (the "License");
5b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * you may not use this file except in compliance with the License.
6b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * You may obtain a copy of the License at
7b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass *
8b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass *      http://www.apache.org/licenses/LICENSE-2.0
9b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass *
10b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * Unless required by applicable law or agreed to in writing, software
11b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * distributed under the License is distributed on an "AS IS" BASIS,
12b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * See the License for the specific language governing permissions and
14b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * limitations under the License.
15b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass */
16b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
17b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plasspackage com.android.server.wifi;
18b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
19d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.app.test.MockAnswerUtil.AnswerWithArguments;
20d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiApIface;
21d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiChip;
22542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Piusimport android.hardware.wifi.V1_0.IWifiChipEventCallback;
23d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiIface;
24d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiRttController;
25d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiStaIface;
267e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Piusimport android.hardware.wifi.V1_0.IWifiStaIfaceEventCallback;
27ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.hardware.wifi.V1_0.RttCapabilities;
28ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.hardware.wifi.V1_0.RttConfig;
29ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport android.hardware.wifi.V1_0.StaApfPacketFilterCapabilities;
3056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plassimport android.hardware.wifi.V1_0.StaBackgroundScanCapabilities;
31d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaBackgroundScanParameters;
32d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanData;
33d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanDataFlagMask;
34d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanResult;
35cbe44718452e93ef2b68974230231ff4fac99deeMichael Plassimport android.hardware.wifi.V1_0.WifiDebugHostWakeReasonStats;
365a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugPacketFateFrameType;
3753f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferFlags;
3853f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferStatus;
3953f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferVerboseLevel;
405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugRxPacketFate;
415a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugRxPacketFateReport;
425a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugTxPacketFate;
435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugTxPacketFateReport;
44d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.WifiInformationElement;
454f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatus;
464f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatusCode;
47ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport android.net.apf.ApfCapabilities;
48ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.net.wifi.RttManager;
49d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.ScanResult;
501dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plassimport android.net.wifi.WifiManager;
51d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.WifiScanner;
52d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.WifiSsid;
53cbe44718452e93ef2b68974230231ff4fac99deeMichael Plassimport android.net.wifi.WifiWakeReasonAndCounts;
5453f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.HandlerThread;
5553f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.Looper;
5653f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.RemoteException;
57d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.util.Pair;
581dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
5970b995bed9674a30c56b7ae2585d5897900ff695Michael Plassimport com.android.server.connectivity.KeepalivePacketData;
60df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plassimport com.android.server.wifi.util.NativeUtil;
61d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
62d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport static org.junit.Assert.*;
63d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport static org.mockito.Mockito.*;
64d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
65b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Before;
66b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Test;
67d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport org.mockito.ArgumentCaptor;
68b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.Mock;
69b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.MockitoAnnotations;
703401582e1b1defc1877c7c47c6a839611fa211c3Michael Plassimport org.mockito.stubbing.Answer;
71b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
7270b995bed9674a30c56b7ae2585d5897900ff695Michael Plassimport java.net.InetAddress;
73ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport java.util.ArrayList;
745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport java.util.Arrays;
75d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport java.util.List;
765a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport java.util.Random;
77ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
78b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass/**
79b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * Unit tests for {@link com.android.server.wifi.WifiVendorHal}.
80b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass */
81b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plasspublic class WifiVendorHalTest {
82b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
83d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    WifiVendorHal mWifiVendorHal;
844f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusSuccess;
854f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusFailure;
864f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
874f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private HalDeviceManager mHalDeviceManager;
884f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
894f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private HandlerThread mWifiStateMachineHandlerThread;
904f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
914f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiVendorHal.HalDeviceManagerStatusListener mHalDeviceManagerStatusCallbacks;
924f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
934f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiApIface mIWifiApIface;
944f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
954f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiChip mIWifiChip;
964f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
974f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiStaIface mIWifiStaIface;
984f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
994f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiRttController mIWifiRttController;
1003401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    private IWifiStaIfaceEventCallback mIWifiStaIfaceEventCallback;
101d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private IWifiChipEventCallback mIWifiChipEventCallback;
1023401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
1033401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    /**
1043401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     * Identity function to supply a type to its argument, which is a lambda
1053401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     */
1063401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    static Answer<WifiStatus> answerWifiStatus(Answer<WifiStatus> statusLambda) {
1073401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        return (statusLambda);
1083401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    }
109b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
110b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
111b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     * Sets up for unit test
112b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     */
113b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    @Before
114b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    public void setUp() throws Exception {
115b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass        MockitoAnnotations.initMocks(this);
1164f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess = new WifiStatus();
1174f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess.code = WifiStatusCode.SUCCESS;
1184f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure = new WifiStatus();
1194f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.code = WifiStatusCode.ERROR_UNKNOWN;
1204f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.description = "I don't even know what a Mock Turtle is.";
1214f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        when(mIWifiStaIface.enableLinkLayerStatsCollection(false)).thenReturn(mWifiStatusSuccess);
1224f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
123b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
124d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Setup the HalDeviceManager mock's start/stop behaviour. This can be overridden in
125d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // individual tests, if needed.
126d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
127d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public boolean answer() {
128d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
129d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(true);
130d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
131d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return true;
132d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
133d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
134d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
135d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
136d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public void answer() {
137d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
138d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(false);
139d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
140d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
141d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).stop();
142d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createStaIface(eq(null), eq(null)))
143d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiStaIface);
144d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createApIface(eq(null), eq(null)))
145d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiApIface);
146d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class)))
147d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiChip);
148d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createRttController(any(IWifiIface.class)))
149d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiRttController);
150542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
151542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .thenReturn(mWifiStatusSuccess);
1523401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        mIWifiStaIfaceEventCallback = null;
1537e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        when(mIWifiStaIface.registerEventCallback(any(IWifiStaIfaceEventCallback.class)))
1543401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenAnswer(answerWifiStatus((invocation) -> {
1553401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    Object[] args = invocation.getArguments();
1563401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    mIWifiStaIfaceEventCallback = (IWifiStaIfaceEventCallback) args[0];
1573401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    return (mWifiStatusSuccess);
1583401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                }));
159d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiChipEventCallback = null;
160d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
161d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                .thenAnswer(answerWifiStatus((invocation) -> {
162d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    Object[] args = invocation.getArguments();
163d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    mIWifiChipEventCallback = (IWifiChipEventCallback) args[0];
164d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    return (mWifiStatusSuccess);
165d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                }));
166d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
167d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Create the vendor HAL object under test.
168d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal = new WifiVendorHal(mHalDeviceManager, mWifiStateMachineHandlerThread);
169d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
170d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Initialize the vendor HAL to capture the registered callback.
171d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.initialize();
172d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArgumentCaptor<WifiVendorHal.HalDeviceManagerStatusListener> hdmCallbackCaptor =
173d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                ArgumentCaptor.forClass(WifiVendorHal.HalDeviceManagerStatusListener.class);
174d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).registerStatusListener(
175d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                hdmCallbackCaptor.capture(), any(Looper.class));
176d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mHalDeviceManagerStatusCallbacks = hdmCallbackCaptor.getValue();
177d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
178b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    }
179b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
180b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
181d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in STA mode using
182d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
183d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
184d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
1857e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalSuccessInStaMode() throws  Exception {
186d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
187d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
188d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
189d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
190d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
191d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
192d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
193d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
194d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
195542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
196542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
197d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
198d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
199d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
200d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
201d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
202d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in AP mode using
203d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
204d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
205d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2067e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalSuccessInApMode() throws Exception {
207d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(false));
208d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
209d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
210d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
211d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
212d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
213d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
214d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
215d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
216d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
217d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
218d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
219d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
220d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
221d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
222d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
223d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
224d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2257e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInStaMode() throws Exception {
226d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // No callbacks are invoked in this case since the start itself failed. So, override
227d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // default AnswerWithArguments that we setup.
228d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
2297e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius            public boolean answer() throws Exception {
230d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return false;
231d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
232d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
233d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
234d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
235d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
236d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
237d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
238d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
239d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
240d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
241d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
242542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface, never())
243542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .registerEventCallback(any(IWifiStaIfaceEventCallback.class));
244d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
245d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
246d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
247d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
248d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
249d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
250d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2517e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInIfaceCreationInStaMode() throws Exception {
252d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createStaIface(eq(null), eq(null))).thenReturn(null);
253d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
254d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
255d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
256d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
257d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
258d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
259d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
260d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
261d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
262d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
263542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface, never())
264542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .registerEventCallback(any(IWifiStaIfaceEventCallback.class));
265d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
266d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
267d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
268d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
269d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
270d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
271d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2727e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInRttControllerCreationInStaMode() throws Exception {
273d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createRttController(any(IWifiIface.class))).thenReturn(null);
274d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
275d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
276d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
277d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
278d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
279d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
280d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
281542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
282d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
283d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
284d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
285d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
286d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
287d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
288d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
289d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
290d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
291d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2927e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInChipGetInStaMode() throws Exception {
293d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class))).thenReturn(null);
294d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
295d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
296d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
297d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
298d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
299d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
300d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(any(IWifiIface.class));
301d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
302542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
303d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
304d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
305d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
306d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
307d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
308d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
309d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
310d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
311d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3127e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInStaIfaceCallbackRegistration() throws Exception {
3137e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        when(mIWifiStaIface.registerEventCallback(any(IWifiStaIfaceEventCallback.class)))
3147e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius                .thenReturn(mWifiStatusFailure);
3157e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
3167e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
3177e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
3187e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).start();
3197e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
3207e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).stop();
321542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
3227e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
3237e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager, never()).createRttController(eq(mIWifiStaIface));
3247e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
3257e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
3267e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    }
3277e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
3287e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    /**
3297e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     * Tests the failure to start HAL in STA mode using
3307e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
331542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius     */
332542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    @Test
333542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    public void testStartHalFailureInChipCallbackRegistration() throws Exception {
334542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
335542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .thenReturn(mWifiStatusFailure);
336542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
337542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
338542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
339542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).start();
340542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
341542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
342542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).getChip(any(IWifiIface.class));
343542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).stop();
344542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
345542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
346542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
347542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
348542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    }
349542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
350542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    /**
351542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius     * Tests the failure to start HAL in STA mode using
352542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
3537e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     */
3547e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    @Test
3557e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInApMode() throws Exception {
356d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createApIface(eq(null), eq(null))).thenReturn(null);
357d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(false));
358d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
359d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
360d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
361d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
362d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
363d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
364d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
365d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
366d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
367d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
368d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
369d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
370d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in STA mode using
371d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
372d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
373d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
374d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInStaMode() {
375d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
376d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
377d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
378d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
379d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
380d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
381d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
382d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
383d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
384d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
385d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
386d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
387d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
388d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
389d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
390d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
391d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
392d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
393d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in AP mode using
394d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
395d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
396d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
397d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInApMode() {
398d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(false));
399d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
400d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
401d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
402d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
403d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
404d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
405d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
406d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
407d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
408d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
409d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
410d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
411d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
412d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
413d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
4144f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
4154f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
41656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * Test that getApfCapabilities is hooked up to the HAL correctly
41756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     *
41856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * A call before the vendor HAL is started should return a non-null result with version 0
41956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     *
42056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * A call after the HAL is started should return the mocked values.
42156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     */
42256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    @Test
42356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    public void testGetScanCapabilities() throws Exception {
42456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        StaBackgroundScanCapabilities capabilities = new StaBackgroundScanCapabilities();
42556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxCacheSize = 12;
42656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxBuckets = 34;
42756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxApCachePerScan = 56;
42856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxReportingThreshold = 78;
42956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
43056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        doAnswer(new AnswerWithArguments() {
43156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            public void answer(IWifiStaIface.getBackgroundScanCapabilitiesCallback cb)
43256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                    throws RemoteException {
43356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
43456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            }
43556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        }).when(mIWifiStaIface).getBackgroundScanCapabilities(any(
43656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                IWifiStaIface.getBackgroundScanCapabilitiesCallback.class));
43756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
43856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        WifiNative.ScanCapabilities result = new WifiNative.ScanCapabilities();
43956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
44056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertFalse(mWifiVendorHal.getScanCapabilities(result));  // should fail - not started
44156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());           // Start the vendor hal
44256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.getScanCapabilities(result));   // should succeed
44356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
44456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(12, result.max_scan_cache_size);
44556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(34, result.max_scan_buckets);
44656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(56, result.max_ap_cache_per_scan);
44756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(78, result.max_scan_reporting_threshold);
44856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
44956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
45056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    private void setupValidFrequenciesForBand(ArrayList<Integer> frequencies) throws Exception {
45156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
45256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        doAnswer(new AnswerWithArguments() {
45356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            public void answer(int band, IWifiStaIface.getValidFrequenciesForBandCallback cb)
45456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                    throws RemoteException {
45556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                cb.onValues(mWifiStatusSuccess, frequencies);
45656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            }
45756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        }).when(mIWifiStaIface).getValidFrequenciesForBand(anyInt(), any(
45856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                IWifiStaIface.getValidFrequenciesForBandCallback.class));
45956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
46056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        doAnswer(new AnswerWithArguments() {
46156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            public void answer(int band, IWifiApIface.getValidFrequenciesForBandCallback cb)
46256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                    throws RemoteException {
46356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                cb.onValues(mWifiStatusSuccess, frequencies);
46456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            }
46556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        }).when(mIWifiApIface).getValidFrequenciesForBand(anyInt(), any(
46656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                IWifiApIface.getValidFrequenciesForBandCallback.class));
46756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
46856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
46956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
47056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    private int[] intArrayFromArrayList(ArrayList<Integer> in) {
47156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        int[] ans = new int[in.size()];
47256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        int i = 0;
47356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        for (Integer e : in) ans[i++] = e;
47456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        return ans;
47556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
47656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
47756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    /**
47856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * Test that isGetChannelsForBandSupported works in STA mode
47956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     */
48056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    @Test
48156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    public void testGetChannelsForBandSupportedSta() throws Exception {
48256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        ArrayList<Integer> freq = new ArrayList<>();
48356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        freq.add(2405);
48456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
48556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        setupValidFrequenciesForBand(freq);
48656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
48756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertFalse(mWifiVendorHal.isGetChannelsForBandSupported());
48856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
48956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
49056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
49156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.isGetChannelsForBandSupported());
49256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
49356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
49456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    /**
49556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * Test that isGetChannelsForBandSupported works in AP mode
49656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     */
49756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    @Test
49856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    public void testGetChannelsForBandSupportedAp() throws Exception {
49956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        ArrayList<Integer> freq = new ArrayList<>();
50056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        freq.add(2405);
50156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
50256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        setupValidFrequenciesForBand(freq);
50356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
50456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertFalse(mWifiVendorHal.isGetChannelsForBandSupported());
50556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
50656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
50756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
50856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.isGetChannelsForBandSupported());
50956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
51056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
51156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    /**
5121dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Test translation to WifiManager.WIFI_FEATURE_*
5131dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     *
5141dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Just do a spot-check with a few feature bits here; since the code is table-
5151dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * driven we don't have to work hard to exercise all of it.
5161dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     */
5171dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    @Test
5181dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    public void testFeatureMaskTranslation() {
5191dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int caps = (
5201dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                IWifiStaIface.StaIfaceCapabilityMask.BACKGROUND_SCAN
5211dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | IWifiStaIface.StaIfaceCapabilityMask.LINK_LAYER_STATS
5221dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass            );
5231dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int expected = (
524691806f65a5f259fd8e6b709c97d0035c418c483Michael Plass                WifiManager.WIFI_FEATURE_SCANNER
5251dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | WifiManager.WIFI_FEATURE_LINK_LAYER_STATS);
5261dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        assertEquals(expected, mWifiVendorHal.wifiFeatureMaskFromStaCapabilities(caps));
5271dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    }
5281dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
5291dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    /**
5304f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test enablement of link layer stats after startup
5314f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * <p>
5324f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats before HAL start
5334f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - should not make it to the HAL layer
5344f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in STA mode
5354f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats twice more
5364f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - enable request should make it to the HAL layer
5374f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the requests (i.e., two calls total)
5384f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
5394f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
5404f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsEnableAfterStartup() throws Exception {
5414f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
5424f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5434f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertNull(mWifiVendorHal.getWifiLinkLayerStats());
5444f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
5454f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
5464f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5474f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
5484f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiVendorHal.getWifiLinkLayerStats();
5494f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiVendorHal.getWifiLinkLayerStats();
5504f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface).enableLinkLayerStatsCollection(false); // mLinkLayerStatsDebug
5514f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, times(2)).getLinkLayerStats(any());
5524f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
5534f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5544f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
5554f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test that link layer stats are not enabled and harmless in AP mode
5564f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * <p>
5574f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in AP mode
5584f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - stats should not be enabled
5594f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats
5604f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the request
5614f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
5624f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
5634f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsNotEnabledAndHarmlessInApMode() throws Exception {
5644f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
5654f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5664f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
5674f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
5684f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertNull(mWifiVendorHal.getWifiLinkLayerStats());
5694f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5704f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
5714f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5724f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).enableLinkLayerStatsCollection(false);
5734f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).getLinkLayerStats(any());
5744f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
5754f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5764f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    // TODO(b/34900534) add test for correct MOVE CORRESPONDING of fields
5774f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5787e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    /**
5797e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Test that getFirmwareVersion() and getDriverVersion() work
5807e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     *
5817e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Calls before the STA is started are expected to return null.
5827e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     */
5837e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    @Test
5847e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    public void testVersionGetters() throws Exception {
5857e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String firmwareVersion = "fuzzy";
5867e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String driverVersion = "dizzy";
5877e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        IWifiChip.ChipDebugInfo chipDebugInfo = new IWifiChip.ChipDebugInfo();
5887e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.firmwareDescription = firmwareVersion;
5897e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.driverDescription = driverVersion;
5907e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
5917e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        doAnswer(new AnswerWithArguments() {
5927e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            public void answer(IWifiChip.requestChipDebugInfoCallback cb) throws RemoteException {
5937e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass                cb.onValues(mWifiStatusSuccess, chipDebugInfo);
5947e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            }
5957e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        }).when(mIWifiChip).requestChipDebugInfo(any(IWifiChip.requestChipDebugInfoCallback.class));
5967e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
5977e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getFirmwareVersion());
5987e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getDriverVersion());
5997e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
6007e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
6017e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
6027e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(firmwareVersion, mWifiVendorHal.getFirmwareVersion());
6037e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(driverVersion, mWifiVendorHal.getDriverVersion());
6047e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    }
605ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
606ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
607ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * For checkRoundTripIntTranslation lambdas
608ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
609ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    interface IntForInt {
610ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        int translate(int value);
611ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
612ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
613ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
614ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Checks that translation from x to y and back again is the identity function
615ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     *
616ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param xFromY reverse translator
617ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param yFromX forward translator
618ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param xLimit non-inclusive upper bound on x (lower bound is zero)
619ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
620ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    private void checkRoundTripIntTranslation(
621ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            IntForInt xFromY, IntForInt yFromX, int xFirst, int xLimit) throws Exception {
622ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        int ex = 0;
623ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        for (int i = xFirst; i < xLimit; i++) {
624ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertEquals(i, xFromY.translate(yFromX.translate(i)));
625ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
626ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        try {
627ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            yFromX.translate(xLimit);
628ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertTrue("expected an exception here", false);
629ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        } catch (IllegalArgumentException e) {
630ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            ex++;
631ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
632ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        try {
633ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            xFromY.translate(yFromX.translate(xLimit - 1) + 1);
634ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertTrue("expected an exception here", false);
635ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        } catch (IllegalArgumentException e) {
636ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            ex++;
637ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
638ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertEquals(2, ex);
639ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
640ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
641ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
642ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
643ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of RTT type
644ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
645ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
646ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testRttTypeTranslation() throws Exception {
647ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
648ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halRttTypeFromFrameworkRttType(y),
649ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkRttTypeFromHalRttType(x),
650ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                1, 3);
651ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
652ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
653ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
654ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of peer type
655ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
656ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
657ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testPeerTranslation() throws Exception {
658ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
659ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halPeerFromFrameworkPeer(y),
660ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkPeerFromHalPeer(x),
661ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                1, 6);
662ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
663ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
664ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
665ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of channel width
666ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
667ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
668ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testChannelWidth() throws Exception {
669ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
670ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halChannelWidthFromFrameworkChannelWidth(y),
671ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkChannelWidthFromHalChannelWidth(x),
672ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 5);
673ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
674ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
675ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
676ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of preamble type mask
677ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
678ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
679ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testPreambleTranslation() throws Exception {
680ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
681ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halPreambleFromFrameworkPreamble(y),
682ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkPreambleFromHalPreamble(x),
683ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 8);
684ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
685ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
686ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
687ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of bandwidth mask
688ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
689ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
690ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testBandwidthTranslations() throws Exception {
691ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
692ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halBwFromFrameworkBw(y),
693ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkBwFromHalBw(x),
694ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 64);
695ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
696ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
697ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
698ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testGetRttStuff() throws Exception {
699ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttManager.RttParams params = new RttManager.RttParams();
700ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) populate
701ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttConfig config = WifiVendorHal.halRttConfigFromFrameworkRttParams(params);
702ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) check
703ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
704ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
705ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
706ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testGetRttCapabilities() throws Exception {
707ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttCapabilities capabilities = new RttCapabilities();
708ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) populate
709ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
710ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        doAnswer(new AnswerWithArguments() {
711ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            public void answer(IWifiRttController.getCapabilitiesCallback cb)
712ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                    throws RemoteException {
713ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
714ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            }
715ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }).when(mIWifiRttController).getCapabilities(any(
716ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                IWifiRttController.getCapabilitiesCallback.class));
717ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
718ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertNull(mWifiVendorHal.getRttCapabilities());
719ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
720ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
721ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
722ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttManager.RttCapabilities actual = mWifiVendorHal.getRttCapabilities();
723ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) check
724ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
725ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
726ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
727ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    //TODO(b/34901744) negative RTT test cases as well.
728ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    // e.g. invoke RTT without putting the HAL in the correct mode.
729ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
730ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
731df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     * Test that setScanningMacOui is hooked up to the HAL correctly
732df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     */
733df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    @Test
734df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    public void testSetScanningMacOui() throws Exception {
735df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] oui = NativeUtil.macAddressOuiToByteArray("DA:A1:19");
736df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] zzz = NativeUtil.macAddressOuiToByteArray("00:00:00");
737df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
738df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        when(mIWifiStaIface.setScanningMacOui(any())).thenReturn(mWifiStatusSuccess);
739df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
740df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(oui)); // expect fail - STA not started
741df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
742df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(null));  // expect fail - null
743df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(new byte[]{(byte) 1})); // expect fail - len
744df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.setScanningMacOui(oui));
745df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.setScanningMacOui(zzz));
746df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
747df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(oui));
748df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(zzz));
749df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    }
750df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
75170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
75270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStartSendingOffloadedPacket() throws Exception {
75370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        byte[] srcMac = NativeUtil.macAddressToByteArray("4007b2088c81");
75470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress src = InetAddress.parseNumericAddress("192.168.13.13");
75570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress dst = InetAddress.parseNumericAddress("93.184.216.34");
75670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
75770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int millis = 16000;
75870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
75970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        KeepalivePacketData kap = KeepalivePacketData.nattKeepalivePacket(src, 63000, dst, 4500);
76070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
76170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.startSendingKeepAlivePackets(
76270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                anyInt(), any(), anyShort(), any(), any(), anyInt()
76370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        )).thenReturn(mWifiStatusSuccess);
76470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
76570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
76670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(0 == mWifiVendorHal.startSendingOffloadedPacket(slot, srcMac, kap, millis));
76770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
76870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).startSendingKeepAlivePackets(
76970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                eq(slot), any(), anyShort(), any(), any(), eq(millis));
77070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
77170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
77270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
77370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStopSendingOffloadedPacket() throws Exception {
77470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
77570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
77670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.stopSendingKeepAlivePackets(anyInt())).thenReturn(mWifiStatusSuccess);
77770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
77870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
77970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(0 == mWifiVendorHal.stopSendingOffloadedPacket(slot));
78070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
78170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).stopSendingKeepAlivePackets(eq(slot));
78270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
78370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
784df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    /**
7853401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     * Test the setup, invocation, and removal of a RSSI event handler
7863401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     *
7873401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     */
7883401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    @Test
7893401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    public void testRssiMonitoring() throws Exception {
7903401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        when(mIWifiStaIface.startRssiMonitoring(anyInt(), anyInt(), anyInt()))
7913401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenReturn(mWifiStatusSuccess);
7923401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        when(mIWifiStaIface.stopRssiMonitoring(anyInt()))
7933401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenReturn(mWifiStatusSuccess);
7943401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
7953401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        ArrayList<Byte> breach = new ArrayList<>(10);
7963401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte hi = -21;
7973401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte med = -42;
7983401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte lo = -84;
7993401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        Byte lower = -88;
8003401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        WifiNative.WifiRssiEventHandler handler;
8013401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        handler = ((cur) -> {
8023401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass            breach.add(cur);
8033401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        });
8043401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(hi, lo, handler)); // not started
8053401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.stopRssiMonitoring()); // not started
8063401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
8073401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(hi, lo, handler));
8083401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        int theCmdId = mWifiVendorHal.sRssiMonCmdId;
8093401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        breach.clear();
8103401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        mIWifiStaIfaceEventCallback.onRssiThresholdBreached(theCmdId, new byte[6], lower);
8113401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(breach.get(0), lower);
8123401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.stopRssiMonitoring());
8133401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(hi, lo, handler));
8143401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(med, lo, handler)); // replacing works
8153401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(hi, lo, null)); // null handler fails
8163401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(hi, lo, handler));
8173401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(lo, hi, handler)); // empty range
8183401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    }
8193401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
8203401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    /**
821ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * Test that getApfCapabilities is hooked up to the HAL correctly
822ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
823ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call before the vendor HAL is started should return a non-null result with version 0
824ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
825ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call after the HAL is started should return the mocked values.
826ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
827ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
828ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testApfCapabilities() throws Exception {
829ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myVersion = 33;
830ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myMaxSize = 1234;
831ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
832ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        StaApfPacketFilterCapabilities capabilities = new StaApfPacketFilterCapabilities();
833ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.version = myVersion;
834ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.maxLength = myMaxSize;
835ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
836ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        doAnswer(new AnswerWithArguments() {
837ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            public void answer(IWifiStaIface.getApfPacketFilterCapabilitiesCallback cb)
838ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                    throws RemoteException {
839ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
840ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            }
841ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        }).when(mIWifiStaIface).getApfPacketFilterCapabilities(any(
842ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                IWifiStaIface.getApfPacketFilterCapabilitiesCallback.class));
843ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
844ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
845ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(0, mWifiVendorHal.getApfCapabilities().apfVersionSupported);
846ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
847ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
848ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
849ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        ApfCapabilities actual = mWifiVendorHal.getApfCapabilities();
850ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
851ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myVersion, actual.apfVersionSupported);
852ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myMaxSize, actual.maximumApfProgramSize);
853ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(android.system.OsConstants.ARPHRD_ETHER, actual.apfPacketFormat);
854ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertNotEquals(0, actual.apfPacketFormat);
855ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
856ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
857ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
85870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass     * Test that an APF program can be installed.
859ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
860ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
861ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testInstallApf() throws Exception {
862ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        byte[] filter = new byte[] {19, 53, 10};
863ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
864ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        ArrayList<Byte> expected = new ArrayList<>(3);
865ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        for (byte b : filter) expected.add(b);
866ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
867ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        when(mIWifiStaIface.installApfPacketFilter(anyInt(), any(ArrayList.class)))
868ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                .thenReturn(mWifiStatusSuccess);
869ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
870ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
871ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.installPacketFilter(filter));
872ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
873ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        verify(mIWifiStaIface).installApfPacketFilter(eq(0), eq(expected));
874ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
875f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
876f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    /**
877f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     * Test that the country code is set in AP mode (when it should be).
878f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     */
879f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    @Test
880f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    public void testSetCountryCodeHal() throws Exception {
881f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        byte[] expected = new byte[]{(byte) 'C', (byte) 'A'};
882f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
883f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        when(mIWifiApIface.setCountryCode(any()))
884f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass                .thenReturn(mWifiStatusSuccess);
885f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
886f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
887f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
888f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal(null));
889f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal(""));
890f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal("A"));
891f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertTrue(mWifiVendorHal.setCountryCodeHal("CA")); // Only one expected to succeed
892f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal("ZZZ"));
893f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
894f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        verify(mIWifiApIface).setCountryCode(eq(expected));
895f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    }
89653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
89753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
89853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that startLoggingToDebugRingBuffer is plumbed to chip
89953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
90053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * A call before the vendor hal is started should just return false.
90153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * After starting in STA mode, the call should succeed, and pass ther right things down.
90253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
90353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
90453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBuffer() throws Exception {
90553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
90653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
90753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
90853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
90953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
91053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
91153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
91253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
91353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
91453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
91553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
91653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
91753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Same test as testStartLoggingRingBuffer, but in AP mode rather than STA.
91853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
91953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
92053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBufferOnAp() throws Exception {
92153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
92253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
92353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
92453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
92553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
92653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
92753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
92853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
92953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
93053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
93153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
93253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
93353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferStatus gets and translates its stuff correctly
93453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
93553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
93653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testRingBufferStatus() throws Exception {
93753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus one = new WifiDebugRingBufferStatus();
93853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringName = "One";
93953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.flags = WifiDebugRingBufferFlags.HAS_BINARY_ENTRIES;
94053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringId = 5607371;
94153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.sizeInBytes = 54321;
94253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.freeSizeInBytes = 42;
94353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.verboseLevel = WifiDebugRingBufferVerboseLevel.VERBOSE;
94453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        String oneExpect = "name: One flag: 1 ringBufferId: 5607371 ringBufferByteSize: 54321"
94553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                + " verboseLevel: 2 writtenBytes: 0 readBytes: 0 writtenRecords: 0";
94653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
94753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus two = new WifiDebugRingBufferStatus();
94853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringName = "Two";
94953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.flags = WifiDebugRingBufferFlags.HAS_ASCII_ENTRIES
95053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                | WifiDebugRingBufferFlags.HAS_PER_PACKET_ENTRIES;
95153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringId = 4512470;
95253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.sizeInBytes = 300;
95353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.freeSizeInBytes = 42;
95453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.verboseLevel = WifiDebugRingBufferVerboseLevel.DEFAULT;
95553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
95653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        ArrayList<WifiDebugRingBufferStatus> halBufferStatus = new ArrayList<>(2);
95753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(one);
95853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(two);
95953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
96053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiNative.RingBufferStatus[] actual;
96153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
96253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        doAnswer(new AnswerWithArguments() {
96353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            public void answer(IWifiChip.getDebugRingBuffersStatusCallback cb)
96453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                    throws RemoteException {
96553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                cb.onValues(mWifiStatusSuccess, halBufferStatus);
96653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            }
96753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        }).when(mIWifiChip).getDebugRingBuffersStatus(any(
96853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                IWifiChip.getDebugRingBuffersStatusCallback.class));
96953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
97053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
97153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        actual = mWifiVendorHal.getRingBufferStatus();
97253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
97353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(halBufferStatus.size(), actual.length);
97453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(oneExpect, actual[0].toString());
97553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(two.ringId, actual[1].ringBufferId);
97653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
97753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
97853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
97953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
98053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferData calls forceDumpToDebugRingBuffer
98153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
98253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Try once before hal start, and twice after (one success, one failure).
98353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
98453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
98553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testForceRingBufferDump() throws Exception {
98653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Gunk"))).thenReturn(mWifiStatusSuccess);
98753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Glop"))).thenReturn(mWifiStatusFailure);
98853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
98953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Gunk")); // hal not started
99053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
99153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
99253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
99353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.getRingBufferData("Gunk")); // mocked call succeeds
99453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Glop")); // mocked call fails
99553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
99653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Gunk");
99753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Glop");
99853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
99953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
10005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
10015a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the start of packet fate monitoring.
10025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
10035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after (one success, one failure).
10045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
10055a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
10065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testStartPktFateMonitoring() throws Exception {
10075a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        when(mIWifiStaIface.startDebugPacketFateMonitoring()).thenReturn(mWifiStatusSuccess);
10085a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10095a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.startPktFateMonitoring());
10105a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never()).startDebugPacketFateMonitoring();
10115a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10125a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
10135a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startPktFateMonitoring());
10145a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface).startDebugPacketFateMonitoring();
10155a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
10165a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10175a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
10185a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of tx packet fates.
10195a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
10205a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
10215a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
10225a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
10235a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFates() throws Exception {
10245a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
10255a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
10265a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugTxPacketFateReport fateReport = new WifiDebugTxPacketFateReport();
10275a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugTxPacketFate.DRV_QUEUED;
10285a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
10295a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.ETHERNET_II;
10305a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
10315a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
10325a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10335a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
10345a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugTxPacketFatesCallback cb) {
10355a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
10365a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugTxPacketFateReport>(Arrays.asList(fateReport)));
10375a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
10385a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
10395a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
10405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10415a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.TxFateReport[] retrievedFates = new WifiNative.TxFateReport[1];
10425a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getTxPktFates(retrievedFates));
10435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
10445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
10455a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
10475a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10485a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getTxPktFates(retrievedFates));
10495a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
10505a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
10515a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.TX_PKT_FATE_DRV_QUEUED, retrievedFates[0].mFate);
10525a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
10535a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
10545a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, retrievedFates[0].mFrameType);
10555a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
10565a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
10575a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10585a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
10595a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of tx packet fates when the number of fates retrieved exceeds the
10605a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * input array.
10615a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
10625a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
10635a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
10645a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
10655a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFatesExceedsInputArrayLength() throws Exception {
10665a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
10675a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
10685a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugTxPacketFateReport fateReport = new WifiDebugTxPacketFateReport();
10695a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugTxPacketFate.FW_DROP_OTHER;
10705a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
10715a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.MGMT_80211;
10725a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
10735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
10745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10755a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
10765a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugTxPacketFatesCallback cb) {
10775a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
10785a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugTxPacketFateReport>(Arrays.asList(
10795a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                                fateReport, fateReport)));
10805a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
10815a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
10825a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
10835a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10845a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.TxFateReport[] retrievedFates = new WifiNative.TxFateReport[1];
10855a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getTxPktFates(retrievedFates));
10865a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
10875a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
10885a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10895a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
10905a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
10915a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getTxPktFates(retrievedFates));
10925a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
10935a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
10945a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.TX_PKT_FATE_FW_DROP_OTHER, retrievedFates[0].mFate);
10955a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
10965a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
10975a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_80211_MGMT, retrievedFates[0].mFrameType);
10985a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
10995a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
11005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11015a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
11025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of rx packet fates.
11035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
11045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
11055a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
11065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
11075a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFates() throws Exception {
11085a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
11095a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
11105a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugRxPacketFateReport fateReport = new WifiDebugRxPacketFateReport();
11115a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugRxPacketFate.SUCCESS;
11125a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
11135a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.ETHERNET_II;
11145a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
11155a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
11165a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11175a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
11185a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugRxPacketFatesCallback cb) {
11195a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
11205a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugRxPacketFateReport>(Arrays.asList(fateReport)));
11215a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
11225a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
11235a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
11245a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11255a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.RxFateReport[] retrievedFates = new WifiNative.RxFateReport[1];
11265a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getRxPktFates(retrievedFates));
11275a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
11285a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
11295a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11305a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
11315a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11325a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getRxPktFates(retrievedFates));
11335a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
11345a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
11355a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.RX_PKT_FATE_SUCCESS, retrievedFates[0].mFate);
11365a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
11375a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
11385a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, retrievedFates[0].mFrameType);
11395a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
11405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
11415a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11425a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
11435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of rx packet fates when the number of fates retrieved exceeds the
11445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * input array.
11455a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
11465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
11475a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
11485a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
11495a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFatesExceedsInputArrayLength() throws Exception {
11505a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
11515a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
11525a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugRxPacketFateReport fateReport = new WifiDebugRxPacketFateReport();
11535a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugRxPacketFate.FW_DROP_FILTER;
11545a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
11555a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.MGMT_80211;
11565a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
11575a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
11585a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11595a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
11605a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugRxPacketFatesCallback cb) {
11615a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
11625a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugRxPacketFateReport>(Arrays.asList(
11635a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                                fateReport, fateReport)));
11645a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
11655a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
11665a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
11675a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11685a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.RxFateReport[] retrievedFates = new WifiNative.RxFateReport[1];
11695a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getRxPktFates(retrievedFates));
11705a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
11715a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
11725a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
11745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11755a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getRxPktFates(retrievedFates));
11765a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
11775a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
11785a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.RX_PKT_FATE_FW_DROP_FILTER, retrievedFates[0].mFate);
11795a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
11805a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
11815a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_80211_MGMT, retrievedFates[0].mFrameType);
11825a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
11835a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
11845a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11855a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
11865a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the failure to retrieve tx packet fates when the input array is empty.
11875a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
11885a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
11895a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFatesEmptyInputArray() throws Exception {
11905a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
11915a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getTxPktFates(new WifiNative.TxFateReport[0]));
11925a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
11935a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
11945a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
11955a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11965a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
11975a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the failure to retrieve rx packet fates when the input array is empty.
11985a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
11995a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
12005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFatesEmptyInputArray() throws Exception {
12015a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
12025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getRxPktFates(new WifiNative.RxFateReport[0]));
12035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
12045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
12055a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
1206135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1207135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    /**
1208135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     * Tests the nd offload enable/disable.
1209135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     */
1210135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    @Test
1211135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    public void testEnableDisableNdOffload() throws Exception {
1212135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        when(mIWifiStaIface.enableNdOffload(anyBoolean())).thenReturn(mWifiStatusSuccess);
1213135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1214135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertFalse(mWifiVendorHal.configureNeighborDiscoveryOffload(true));
1215135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface, never()).enableNdOffload(anyBoolean());
1216135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1217135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1218135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1219135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.configureNeighborDiscoveryOffload(true));
1220135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(true));
1221135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.configureNeighborDiscoveryOffload(false));
1222135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(false));
1223135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    }
1224135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1225135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    /**
1226135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     * Tests the nd offload enable failure.
1227135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     */
1228135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    @Test
1229135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    public void testEnableNdOffloadFailure() throws Exception {
1230135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        when(mIWifiStaIface.enableNdOffload(eq(true))).thenReturn(mWifiStatusFailure);
1231135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1232135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1233135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1234135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertFalse(mWifiVendorHal.configureNeighborDiscoveryOffload(true));
1235135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(true));
1236135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    }
1237cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1238cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    /**
1239cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     * Tests the retrieval of wlan wake reason stats.
1240cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     */
1241cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    @Test
1242cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    public void testGetWlanWakeReasonCount() throws Exception {
1243cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        WifiDebugHostWakeReasonStats stats = new WifiDebugHostWakeReasonStats();
1244cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        Random rand = new Random();
1245cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalCmdEventWakeCnt = rand.nextInt();
1246cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalDriverFwLocalWakeCnt = rand.nextInt();
1247cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalRxPacketWakeCnt = rand.nextInt();
1248cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxPktWakeDetails.rxUnicastCnt = rand.nextInt();
1249cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxPktWakeDetails.rxMulticastCnt = rand.nextInt();
1250cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxIcmpPkWakeDetails.icmpPkt = rand.nextInt();
1251cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxIcmpPkWakeDetails.icmp6Pkt = rand.nextInt();
1252cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt = rand.nextInt();
1253cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt = rand.nextInt();
1254cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1255cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        doAnswer(new AnswerWithArguments() {
1256cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            public void answer(IWifiChip.getDebugHostWakeReasonStatsCallback cb) {
1257cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                cb.onValues(mWifiStatusSuccess, stats);
1258cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            }
1259cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        }).when(mIWifiChip).getDebugHostWakeReasonStats(
1260cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1261cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1262cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNull(mWifiVendorHal.getWlanWakeReasonCount());
1263cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip, never())
1264cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                .getDebugHostWakeReasonStats(
1265cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                        any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1266cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1267cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1268cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1269cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        WifiWakeReasonAndCounts retrievedStats = mWifiVendorHal.getWlanWakeReasonCount();
1270cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip).getDebugHostWakeReasonStats(
1271cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1272cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNotNull(retrievedStats);
1273cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalCmdEventWakeCnt, retrievedStats.totalCmdEventWake);
1274cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalDriverFwLocalWakeCnt, retrievedStats.totalDriverFwLocalWake);
1275cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalRxPacketWakeCnt, retrievedStats.totalRxDataWake);
1276cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxPktWakeDetails.rxUnicastCnt, retrievedStats.rxUnicast);
1277cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxPktWakeDetails.rxMulticastCnt, retrievedStats.rxMulticast);
1278cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxIcmpPkWakeDetails.icmpPkt, retrievedStats.icmp);
1279cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxIcmpPkWakeDetails.icmp6Pkt, retrievedStats.icmp6);
1280cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt,
1281cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                retrievedStats.ipv4RxMulticast);
1282cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt,
1283cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                retrievedStats.ipv6Multicast);
1284cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    }
1285cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1286cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    /**
1287cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     * Tests the failure in retrieval of wlan wake reason stats.
1288cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     */
1289cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    @Test
1290cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    public void testGetWlanWakeReasonCountFailure() throws Exception {
1291cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        doAnswer(new AnswerWithArguments() {
1292cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            public void answer(IWifiChip.getDebugHostWakeReasonStatsCallback cb) {
1293cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                cb.onValues(mWifiStatusFailure, new WifiDebugHostWakeReasonStats());
1294cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            }
1295cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        }).when(mIWifiChip).getDebugHostWakeReasonStats(
1296cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1297cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1298cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        // This should work in both AP & STA mode.
1299cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
1300cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1301cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNull(mWifiVendorHal.getWlanWakeReasonCount());
1302cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip).getDebugHostWakeReasonStats(
1303cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1304cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    }
13052f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
13062f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    /**
13072f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Test that getFwMemoryDump is properly plumbed
13082f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     */
13092f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    @Test
13102f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    public void testGetFwMemoryDump() throws Exception {
13112f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        byte [] sample = NativeUtil.hexStringToByteArray("268c7a3fbfa4661c0bdd6a36");
13122f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        ArrayList<Byte> halBlob = NativeUtil.byteArrayToArrayList(sample);
13132f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
13142f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        doAnswer(new AnswerWithArguments() {
13152f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            public void answer(IWifiChip.requestFirmwareDebugDumpCallback cb)
13162f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                    throws RemoteException {
13172f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                cb.onValues(mWifiStatusSuccess, halBlob);
13182f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            }
13192f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        }).when(mIWifiChip).requestFirmwareDebugDump(any(
13202f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                IWifiChip.requestFirmwareDebugDumpCallback.class));
13212f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
13222f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
13232f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertArrayEquals(sample, mWifiVendorHal.getFwMemoryDump());
13242f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    }
13252f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
13262f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    /**
13272f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Test that getDriverStateDump is properly plumbed
13282f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     *
13292f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Just for variety, use AP mode here.
13302f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     */
13312f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    @Test
13322f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    public void testGetDriverStateDump() throws Exception {
13332f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        byte [] sample = NativeUtil.hexStringToByteArray("e83ff543cf80083e6459d20f");
13342f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        ArrayList<Byte> halBlob = NativeUtil.byteArrayToArrayList(sample);
13352f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
13362f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        doAnswer(new AnswerWithArguments() {
13372f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            public void answer(IWifiChip.requestDriverDebugDumpCallback cb)
13382f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                    throws RemoteException {
13392f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                cb.onValues(mWifiStatusSuccess, halBlob);
13402f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            }
13412f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        }).when(mIWifiChip).requestDriverDebugDump(any(
13422f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                IWifiChip.requestDriverDebugDumpCallback.class));
13432f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
13442f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
13452f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertArrayEquals(sample, mWifiVendorHal.getDriverStateDump());
13462f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    }
1347d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1348d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1349d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan failure is handled correctly.
1350d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1351d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1352d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFailureCallback() throws Exception {
1353d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1354d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1355d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1356d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1357d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1358d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1359d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanFailure(mWifiVendorHal.mScan.cmdId);
1360d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_FAILED);
1361d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1362d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1363d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1364d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan failure is handled correctly.
1365d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1366d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1367d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFailureCallbackWithInvalidCmdId() throws Exception {
1368d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1369d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1370d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1371d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1372d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1373d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1374d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanFailure(mWifiVendorHal.mScan.cmdId + 1);
1375d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler, never()).onScanStatus(WifiNative.WIFI_SCAN_FAILED);
1376d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1377d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1378d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1379d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan full results are handled correctly.
1380d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1381d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1382d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFullScanResults() throws Exception {
1383d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1384d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1385d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1386d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1387d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1388d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1389d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<StaScanResult, ScanResult> result = createHidlAndFrameworkBgScanResult();
1390d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundFullScanResult(
1391d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                mWifiVendorHal.mScan.cmdId, result.first);
1392d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1393d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArgumentCaptor<ScanResult> scanResultCaptor = ArgumentCaptor.forClass(ScanResult.class);
1394d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler).onFullScanResult(scanResultCaptor.capture(), eq(0));
1395d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1396d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanResultEqual(result.second, scanResultCaptor.getValue());
1397d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1398d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1399d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1400d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan results are handled correctly.
1401d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1402d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1403d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanScanResults() throws Exception {
1404d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1405d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1406d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1407d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1408d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1409d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1410d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<ArrayList<StaScanData>, ArrayList<WifiScanner.ScanData>> data =
1411d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                createHidlAndFrameworkBgScanDatas();
1412d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanResults(
1413d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                mWifiVendorHal.mScan.cmdId, data.first);
1414d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1415d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);
1416d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanDatasEqual(
1417d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                data.second, Arrays.asList(mWifiVendorHal.mScan.latestScanResults));
1418d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1419d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1420d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void startBgScan(WifiNative.ScanEventHandler eventHandler) throws Exception {
1421d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        when(mIWifiStaIface.startBackgroundScan(
1422d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                anyInt(), any(StaBackgroundScanParameters.class))).thenReturn(mWifiStatusSuccess);
1423d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startScan(new WifiNative.ScanSettings(), eventHandler));
1424d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1425d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1426d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // Create a pair of HIDL scan result and its corresponding framework scan result for
1427d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // comparison.
1428d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private Pair<StaScanResult, ScanResult> createHidlAndFrameworkBgScanResult() {
1429d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        StaScanResult staScanResult = new StaScanResult();
1430d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Random random = new Random();
1431d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        byte[] ssid = new byte[8];
1432d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(ssid);
1433d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.ssid.addAll(NativeUtil.byteArrayToArrayList(ssid));
1434d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(staScanResult.bssid);
1435d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.frequency = 2432;
1436d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.rssi = -45;
1437d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.timeStampInUs = 5;
1438d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiInformationElement ie1 = new WifiInformationElement();
1439d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        byte[] ie1_data = new byte[56];
1440d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(ie1_data);
1441d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ie1.id = 1;
1442d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ie1.data.addAll(NativeUtil.byteArrayToArrayList(ie1_data));
1443d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.informationElements.add(ie1);
1444d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1445d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        // Now create the corresponding Scan result structure.
1446d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ScanResult scanResult = new ScanResult();
1447d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.SSID = NativeUtil.encodeSsid(staScanResult.ssid);
1448d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.BSSID = NativeUtil.macAddressFromByteArray(staScanResult.bssid);
1449d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.wifiSsid = WifiSsid.createFromByteArray(ssid);
1450d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.frequency = staScanResult.frequency;
1451d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.level = staScanResult.rssi;
1452d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.timestamp = staScanResult.timeStampInUs;
1453d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.bytes = new byte[57];
1454d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.bytes[0] = ie1.id;
1455d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        System.arraycopy(ie1_data, 0, scanResult.bytes, 1, ie1_data.length);
1456d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1457d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        return Pair.create(staScanResult, scanResult);
1458d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1459d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1460d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // Create a pair of HIDL scan datas and its corresponding framework scan datas for
1461d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // comparison.
1462d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private Pair<ArrayList<StaScanData>, ArrayList<WifiScanner.ScanData>>
1463d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            createHidlAndFrameworkBgScanDatas() {
1464d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArrayList<StaScanData> staScanDatas = new ArrayList<>();
1465d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        StaScanData staScanData = new StaScanData();
1466d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1467d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<StaScanResult, ScanResult> result = createHidlAndFrameworkBgScanResult();
1468d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.results.add(result.first);
1469d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.bucketsScanned = 5;
1470d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.flags = StaScanDataFlagMask.INTERRUPTED;
1471d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanDatas.add(staScanData);
1472d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1473d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArrayList<WifiScanner.ScanData> scanDatas = new ArrayList<>();
1474d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ScanResult[] scanResults = new ScanResult[1];
1475d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResults[0] = result.second;
1476d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiScanner.ScanData scanData =
1477d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                new WifiScanner.ScanData(mWifiVendorHal.mScan.cmdId, 1,
1478d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                        staScanData.bucketsScanned, false, scanResults);
1479d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanDatas.add(scanData);
1480d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        return Pair.create(staScanDatas, scanDatas);
1481d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1482d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1483d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanResultEqual(ScanResult expected, ScanResult actual) {
1484d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.SSID, actual.SSID);
1485d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.wifiSsid.getHexString(), actual.wifiSsid.getHexString());
1486d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.BSSID, actual.BSSID);
1487d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.frequency, actual.frequency);
1488d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.level, actual.level);
1489d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.timestamp, actual.timestamp);
1490d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertArrayEquals(expected.bytes, actual.bytes);
1491d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1492d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1493d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanResultsEqual(ScanResult[] expected, ScanResult[] actual) {
1494d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.length, actual.length);
1495d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        for (int i = 0; i < expected.length; i++) {
1496d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            assertScanResultEqual(expected[i], actual[i]);
1497d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        }
1498d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1499d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1500d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanDataEqual(WifiScanner.ScanData expected, WifiScanner.ScanData actual) {
1501d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getId(), actual.getId());
1502d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getFlags(), actual.getFlags());
1503d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getBucketsScanned(), actual.getBucketsScanned());
1504d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanResultsEqual(expected.getResults(), actual.getResults());
1505d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1506d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1507d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanDatasEqual(
1508d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            List<WifiScanner.ScanData> expected, List<WifiScanner.ScanData> actual) {
1509d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.size(), actual.size());
1510d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        for (int i = 0; i < expected.size(); i++) {
1511d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            assertScanDataEqual(expected.get(i), actual.get(i));
1512d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        }
1513d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1514b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass}
1515