WifiVendorHalTest.java revision e1d5fa72eb35fb8f936e19d0830548593de6a6ff
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;
32699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerIfacePacketStats;
33699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerRadioStats;
34699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerStats;
35d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanData;
36d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanDataFlagMask;
37d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanResult;
38cbe44718452e93ef2b68974230231ff4fac99deeMichael Plassimport android.hardware.wifi.V1_0.WifiDebugHostWakeReasonStats;
395a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugPacketFateFrameType;
4053f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferFlags;
4153f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferStatus;
4253f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferVerboseLevel;
435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugRxPacketFate;
445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugRxPacketFateReport;
455a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugTxPacketFate;
465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugTxPacketFateReport;
47d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.WifiInformationElement;
484f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatus;
494f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatusCode;
50ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport android.net.apf.ApfCapabilities;
51ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.net.wifi.RttManager;
52d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.ScanResult;
53699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.net.wifi.WifiLinkLayerStats;
541dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plassimport android.net.wifi.WifiManager;
55d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.WifiScanner;
56d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.WifiSsid;
57cbe44718452e93ef2b68974230231ff4fac99deeMichael Plassimport android.net.wifi.WifiWakeReasonAndCounts;
5853f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.HandlerThread;
5953f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.Looper;
6053f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.RemoteException;
61d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.util.Pair;
621dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
6370b995bed9674a30c56b7ae2585d5897900ff695Michael Plassimport com.android.server.connectivity.KeepalivePacketData;
64df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plassimport com.android.server.wifi.util.NativeUtil;
65d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
66d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport static org.junit.Assert.*;
67d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport static org.mockito.Mockito.*;
68d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
69b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Before;
70b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Test;
71d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport org.mockito.ArgumentCaptor;
72b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.Mock;
73b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.MockitoAnnotations;
743401582e1b1defc1877c7c47c6a839611fa211c3Michael Plassimport org.mockito.stubbing.Answer;
75b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
7670b995bed9674a30c56b7ae2585d5897900ff695Michael Plassimport java.net.InetAddress;
77ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport java.util.ArrayList;
785a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport java.util.Arrays;
79d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport java.util.List;
805a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport java.util.Random;
81ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
82b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass/**
83b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * Unit tests for {@link com.android.server.wifi.WifiVendorHal}.
84b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass */
85b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plasspublic class WifiVendorHalTest {
86b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
87d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    WifiVendorHal mWifiVendorHal;
884f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusSuccess;
894f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusFailure;
908dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    WifiLog mWifiLog;
914f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
924f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private HalDeviceManager mHalDeviceManager;
934f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
944f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private HandlerThread mWifiStateMachineHandlerThread;
954f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
964f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiVendorHal.HalDeviceManagerStatusListener mHalDeviceManagerStatusCallbacks;
974f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
984f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiApIface mIWifiApIface;
994f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1004f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiChip mIWifiChip;
1014f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1024f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiStaIface mIWifiStaIface;
1034f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1044f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiRttController mIWifiRttController;
1053401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    private IWifiStaIfaceEventCallback mIWifiStaIfaceEventCallback;
106d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private IWifiChipEventCallback mIWifiChipEventCallback;
1073401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
1083401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    /**
1093401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     * Identity function to supply a type to its argument, which is a lambda
1103401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     */
1113401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    static Answer<WifiStatus> answerWifiStatus(Answer<WifiStatus> statusLambda) {
1123401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        return (statusLambda);
1133401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    }
114b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
115b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
116b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     * Sets up for unit test
117b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     */
118b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    @Before
119b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    public void setUp() throws Exception {
120b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass        MockitoAnnotations.initMocks(this);
1218dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = new FakeWifiLog();
1224f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess = new WifiStatus();
1234f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess.code = WifiStatusCode.SUCCESS;
1244f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure = new WifiStatus();
1254f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.code = WifiStatusCode.ERROR_UNKNOWN;
1264f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.description = "I don't even know what a Mock Turtle is.";
1274f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        when(mIWifiStaIface.enableLinkLayerStatsCollection(false)).thenReturn(mWifiStatusSuccess);
1284f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
129d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Setup the HalDeviceManager mock's start/stop behaviour. This can be overridden in
130d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // individual tests, if needed.
131d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
132d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public boolean answer() {
133d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
134d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(true);
135d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
136d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return true;
137d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
138d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
139d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
140d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
141d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public void answer() {
142d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
143d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(false);
144d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
145d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
146d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).stop();
147d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createStaIface(eq(null), eq(null)))
148d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiStaIface);
149d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createApIface(eq(null), eq(null)))
150d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiApIface);
151d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class)))
152d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiChip);
153d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createRttController(any(IWifiIface.class)))
154d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiRttController);
155542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
156542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .thenReturn(mWifiStatusSuccess);
1573401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        mIWifiStaIfaceEventCallback = null;
1587e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        when(mIWifiStaIface.registerEventCallback(any(IWifiStaIfaceEventCallback.class)))
1593401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenAnswer(answerWifiStatus((invocation) -> {
1603401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    Object[] args = invocation.getArguments();
1613401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    mIWifiStaIfaceEventCallback = (IWifiStaIfaceEventCallback) args[0];
1623401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    return (mWifiStatusSuccess);
1633401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                }));
164d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiChipEventCallback = null;
165d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
166d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                .thenAnswer(answerWifiStatus((invocation) -> {
167d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    Object[] args = invocation.getArguments();
168d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    mIWifiChipEventCallback = (IWifiChipEventCallback) args[0];
169d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    return (mWifiStatusSuccess);
170d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                }));
171d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
172d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Create the vendor HAL object under test.
173d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal = new WifiVendorHal(mHalDeviceManager, mWifiStateMachineHandlerThread);
174d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
175d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Initialize the vendor HAL to capture the registered callback.
176d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.initialize();
177d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArgumentCaptor<WifiVendorHal.HalDeviceManagerStatusListener> hdmCallbackCaptor =
178d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                ArgumentCaptor.forClass(WifiVendorHal.HalDeviceManagerStatusListener.class);
179d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).registerStatusListener(
180d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                hdmCallbackCaptor.capture(), any(Looper.class));
181d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mHalDeviceManagerStatusCallbacks = hdmCallbackCaptor.getValue();
182d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
183b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    }
184b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
185b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
186d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in STA mode using
187d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
188d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
189d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
1907e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalSuccessInStaMode() throws  Exception {
191d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
192d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
193d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
194d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
195d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
196d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
197d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
198d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
199d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
200542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
201542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
202d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
203d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
204d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
205d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
206d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
207d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in AP mode using
208d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
209d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
210d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2117e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalSuccessInApMode() throws Exception {
212d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(false));
213d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
214d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
215d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
216d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
217d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
218d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
219d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
220d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
221d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
222d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
223d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
224d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
225d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
226d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
227d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
228d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
229d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2307e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInStaMode() throws Exception {
231d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // No callbacks are invoked in this case since the start itself failed. So, override
232d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // default AnswerWithArguments that we setup.
233d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
2347e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius            public boolean answer() throws Exception {
235d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return false;
236d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
237d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
238d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
239d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
240d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
241d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
242d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
243d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
244d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
245d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
246d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
247542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface, never())
248542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .registerEventCallback(any(IWifiStaIfaceEventCallback.class));
249d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
250d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
251d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
252d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
253d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
254d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
255d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2567e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInIfaceCreationInStaMode() throws Exception {
257d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createStaIface(eq(null), eq(null))).thenReturn(null);
258d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
259d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
260d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
261d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
262d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
263d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
264d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
265d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
266d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
267d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
268542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface, never())
269542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .registerEventCallback(any(IWifiStaIfaceEventCallback.class));
270d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
271d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
272d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
273d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
274d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
275d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
276d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2777e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInRttControllerCreationInStaMode() throws Exception {
278d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createRttController(any(IWifiIface.class))).thenReturn(null);
279d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
280d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
281d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
282d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
283d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
284d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
285d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
286542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
287d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
288d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
289d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
290d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
291d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
292d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
293d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
294d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
295d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
296d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2977e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInChipGetInStaMode() throws Exception {
298d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class))).thenReturn(null);
299d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
300d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
301d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
302d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
303d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
304d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
305d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(any(IWifiIface.class));
306d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
307542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
308d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
309d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
310d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
311d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
312d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
313d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
314d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
315d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
316d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3177e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInStaIfaceCallbackRegistration() throws Exception {
3187e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        when(mIWifiStaIface.registerEventCallback(any(IWifiStaIfaceEventCallback.class)))
3197e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius                .thenReturn(mWifiStatusFailure);
3207e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
3217e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
3227e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
3237e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).start();
3247e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
3257e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).stop();
326542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
3277e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
3287e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager, never()).createRttController(eq(mIWifiStaIface));
3297e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
3307e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
3317e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    }
3327e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
3337e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    /**
3347e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     * Tests the failure to start HAL in STA mode using
3357e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
336542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius     */
337542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    @Test
338542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    public void testStartHalFailureInChipCallbackRegistration() throws Exception {
339542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
340542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .thenReturn(mWifiStatusFailure);
341542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
342542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
343542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
344542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).start();
345542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
346542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
347542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).getChip(any(IWifiIface.class));
348542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).stop();
349542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
350542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
351542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
352542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
353542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    }
354542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
355542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    /**
356542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius     * Tests the failure to start HAL in STA mode using
357542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
3587e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     */
3597e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    @Test
3607e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInApMode() throws Exception {
361d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createApIface(eq(null), eq(null))).thenReturn(null);
362d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(false));
363d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
364d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
365d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
366d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
367d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
368d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
369d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
370d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
371d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
372d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
373d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
374d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
375d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in STA mode using
376d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
377d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
378d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
379d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInStaMode() {
380d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
381d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
382d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
383d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
384d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
385d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
386d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
387d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
388d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
389d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
390d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
391d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
392d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
393d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
394d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
395d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
396d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
397d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
398d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in AP mode using
399d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
400d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
401d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
402d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInApMode() {
403d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(false));
404d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
405d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
406d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
407d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
408d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
409d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
410d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
411d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
412d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
413d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
414d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
415d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
416d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
417d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
418d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
4194f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
4204f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
4218dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that enter logs when verbose logging is enabled
4228dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
4238dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
4248dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testEnterLogging() {
4258dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = spy(mWifiLog);
4268dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(true);
4278dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.installPacketFilter(new byte[0]);
4288dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        verify(mWifiVendorHal.mLog).trace(eq("% filter length %"));
4298dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
4308dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
4318dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
4328dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that enter does not log when verbose logging is not enabled
4338dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
4348dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
4358dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testEnterSilenceWhenNotEnabled() {
4368dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = spy(mWifiLog);
4378dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.installPacketFilter(new byte[0]);
4388dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(true);
4398dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(false);
4408dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.installPacketFilter(new byte[0]);
4418dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        verify(mWifiVendorHal.mLog, never()).trace(eq("% filter length %"));
4428dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
4438dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
4448dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
4458dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that boolResult logs a false result
4468dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
4478dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
4488dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testBoolResultFalse() {
4498dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = spy(mWifiLog);
4508dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = mWifiLog;
4518dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mVerboseLog = mWifiLog;
4528dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        assertFalse(mWifiVendorHal.getScanCapabilities(new WifiNative.ScanCapabilities()));
4538dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        verify(mWifiLog).err("% returns %");
4548dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
4558dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
4568dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
45756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * Test that getApfCapabilities is hooked up to the HAL correctly
45856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     *
45956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * A call before the vendor HAL is started should return a non-null result with version 0
46056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     *
46156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * A call after the HAL is started should return the mocked values.
46256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     */
46356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    @Test
46456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    public void testGetScanCapabilities() throws Exception {
46556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        StaBackgroundScanCapabilities capabilities = new StaBackgroundScanCapabilities();
46656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxCacheSize = 12;
46756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxBuckets = 34;
46856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxApCachePerScan = 56;
46956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxReportingThreshold = 78;
47056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
47156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        doAnswer(new AnswerWithArguments() {
47256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            public void answer(IWifiStaIface.getBackgroundScanCapabilitiesCallback cb)
47356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                    throws RemoteException {
47456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
47556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            }
47656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        }).when(mIWifiStaIface).getBackgroundScanCapabilities(any(
47756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                IWifiStaIface.getBackgroundScanCapabilitiesCallback.class));
47856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
47956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        WifiNative.ScanCapabilities result = new WifiNative.ScanCapabilities();
48056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
48156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertFalse(mWifiVendorHal.getScanCapabilities(result));  // should fail - not started
48256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());           // Start the vendor hal
48356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.getScanCapabilities(result));   // should succeed
48456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
48556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(12, result.max_scan_cache_size);
48656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(34, result.max_scan_buckets);
48756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(56, result.max_ap_cache_per_scan);
48856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(78, result.max_scan_reporting_threshold);
48956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
49056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
49156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    private void setupValidFrequenciesForBand(ArrayList<Integer> frequencies) throws Exception {
49256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
49356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        doAnswer(new AnswerWithArguments() {
49456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            public void answer(int band, IWifiStaIface.getValidFrequenciesForBandCallback cb)
49556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                    throws RemoteException {
49656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                cb.onValues(mWifiStatusSuccess, frequencies);
49756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            }
49856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        }).when(mIWifiStaIface).getValidFrequenciesForBand(anyInt(), any(
49956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                IWifiStaIface.getValidFrequenciesForBandCallback.class));
50056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
50156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        doAnswer(new AnswerWithArguments() {
50256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            public void answer(int band, IWifiApIface.getValidFrequenciesForBandCallback cb)
50356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                    throws RemoteException {
50456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                cb.onValues(mWifiStatusSuccess, frequencies);
50556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            }
50656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        }).when(mIWifiApIface).getValidFrequenciesForBand(anyInt(), any(
50756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                IWifiApIface.getValidFrequenciesForBandCallback.class));
50856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
50956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
51056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
51156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    private int[] intArrayFromArrayList(ArrayList<Integer> in) {
51256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        int[] ans = new int[in.size()];
51356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        int i = 0;
51456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        for (Integer e : in) ans[i++] = e;
51556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        return ans;
51656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
51756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
51856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    /**
51956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * Test that isGetChannelsForBandSupported works in STA mode
52056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     */
52156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    @Test
52256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    public void testGetChannelsForBandSupportedSta() throws Exception {
52356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        ArrayList<Integer> freq = new ArrayList<>();
52456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        freq.add(2405);
52556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
52656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        setupValidFrequenciesForBand(freq);
52756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
52856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertFalse(mWifiVendorHal.isGetChannelsForBandSupported());
52956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
53056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
53156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
53256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.isGetChannelsForBandSupported());
53356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
53456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
53556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    /**
53656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * Test that isGetChannelsForBandSupported works in AP mode
53756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     */
53856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    @Test
53956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    public void testGetChannelsForBandSupportedAp() throws Exception {
54056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        ArrayList<Integer> freq = new ArrayList<>();
54156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        freq.add(2405);
54256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
54356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        setupValidFrequenciesForBand(freq);
54456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
54556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertFalse(mWifiVendorHal.isGetChannelsForBandSupported());
54656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
54756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
54856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
54956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.isGetChannelsForBandSupported());
55056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
55156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
55256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    /**
5531dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Test translation to WifiManager.WIFI_FEATURE_*
5541dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     *
5551dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Just do a spot-check with a few feature bits here; since the code is table-
5561dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * driven we don't have to work hard to exercise all of it.
5571dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     */
5581dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    @Test
5591dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    public void testFeatureMaskTranslation() {
5601dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int caps = (
5611dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                IWifiStaIface.StaIfaceCapabilityMask.BACKGROUND_SCAN
5621dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | IWifiStaIface.StaIfaceCapabilityMask.LINK_LAYER_STATS
5631dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass            );
5641dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int expected = (
565691806f65a5f259fd8e6b709c97d0035c418c483Michael Plass                WifiManager.WIFI_FEATURE_SCANNER
5661dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | WifiManager.WIFI_FEATURE_LINK_LAYER_STATS);
5671dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        assertEquals(expected, mWifiVendorHal.wifiFeatureMaskFromStaCapabilities(caps));
5681dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    }
5691dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
5701dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    /**
5714f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test enablement of link layer stats after startup
572699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
5734f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats before HAL start
5744f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - should not make it to the HAL layer
5754f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in STA mode
5764f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats twice more
5774f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - enable request should make it to the HAL layer
5784f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the requests (i.e., two calls total)
5794f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
5804f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
5814f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsEnableAfterStartup() throws Exception {
5824f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
5834f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5844f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertNull(mWifiVendorHal.getWifiLinkLayerStats());
5854f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
5864f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
5874f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5884f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
5894f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiVendorHal.getWifiLinkLayerStats();
5904f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiVendorHal.getWifiLinkLayerStats();
5914f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface).enableLinkLayerStatsCollection(false); // mLinkLayerStatsDebug
5924f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, times(2)).getLinkLayerStats(any());
5934f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
5944f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5954f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
5964f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test that link layer stats are not enabled and harmless in AP mode
597699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
5984f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in AP mode
5994f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - stats should not be enabled
6004f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats
6014f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the request
6024f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
6034f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
6044f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsNotEnabledAndHarmlessInApMode() throws Exception {
6054f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
6064f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
6074f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
6084f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
6094f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertNull(mWifiVendorHal.getWifiLinkLayerStats());
6104f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
6114f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
6124f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
6134f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).enableLinkLayerStatsCollection(false);
6144f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).getLinkLayerStats(any());
6154f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
6164f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
617699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /**
618699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Test that the link layer stats fields are populated correctly.
619699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
620699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * This is done by filling with random values and then using toString on the
621699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * original and converted values, comparing just the numerics in the result.
622699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * This makes the assumption that the fields are in the same order in both string
623699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * representations, which is not quite true. So apply some fixups before the final
624699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * comparison.
625699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
626699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    @Test
627699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    public void testLinkLayerStatsAssignment() throws Exception {
628699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        Random r = new Random(1775968256);
629699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        StaLinkLayerStats stats = new StaLinkLayerStats();
630699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeBePktStats);
631699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeBkPktStats);
632699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeViPktStats);
633699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeVoPktStats);
634699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizeRadioStats(r, stats.radio);
635699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        stats.timeStampInMs = 42; // currently dropped in conversion
636699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
637699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        String expected = numbersOnly(stats.toString());
638699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
639699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        WifiLinkLayerStats converted = WifiVendorHal.frameworkFromHalLinkLayerStats(stats);
640699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
641699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        String actual = numbersOnly(converted.toString());
642699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
643699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        // Do the required fixups to the both expected and actual
644699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        expected = rmValue(expected, stats.radio.rxTimeInMs);
645699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        expected = rmValue(expected, stats.radio.onTimeInMsForScan);
646699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
647699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        actual = rmValue(actual, stats.radio.rxTimeInMs);
648699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        actual = rmValue(actual, stats.radio.onTimeInMsForScan);
649699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        actual = actual + "42 ";
650699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
651699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        // The remaining fields should agree
652699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        assertEquals(expected, actual);
653699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
654699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
655699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /** Just the digits with delimiting spaces, please */
656699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static String numbersOnly(String s) {
657699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        return s.replaceAll("[^0-9]+", " ");
658699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
659699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
660699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /** Remove the given value from the space-delimited string, or die trying. */
661699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static String rmValue(String s, long value) throws Exception {
662699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        String ans = s.replaceAll(" " + value + " ", " ");
663699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        assertNotEquals(s, ans);
664699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        return ans;
665699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
666699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
667699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /**
668699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Populate packet stats with non-negative random values
669699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
670699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static void randomizePacketStats(Random r, StaLinkLayerIfacePacketStats pstats) {
671699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.rxMpdu = r.nextLong() & 0xFFFFFFFFFFL; // more than 32 bits
672699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.txMpdu = r.nextLong() & 0xFFFFFFFFFFL;
673699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.lostMpdu = r.nextLong() & 0xFFFFFFFFFFL;
674699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.retries = r.nextLong() & 0xFFFFFFFFFFL;
675699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
676699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
677699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass   /**
678699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Populate radio stats with non-negative random values
679699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
680699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static void randomizeRadioStats(Random r, StaLinkLayerRadioStats rstats) {
681699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        rstats.onTimeInMs = r.nextInt() & 0xFFFFFF;
682699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        rstats.txTimeInMs = r.nextInt() & 0xFFFFFF;
683699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        for (int i = 0; i < 4; i++) {
684699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass            Integer v = r.nextInt() & 0xFFFFFF;
685699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass            rstats.txTimeInMsPerLevel.add(v);
686699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        }
687699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        rstats.rxTimeInMs = r.nextInt() & 0xFFFFFF;
688699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        rstats.onTimeInMsForScan = r.nextInt() & 0xFFFFFF;
689699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
6904f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
6917e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    /**
6927e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Test that getFirmwareVersion() and getDriverVersion() work
6937e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     *
6947e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Calls before the STA is started are expected to return null.
6957e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     */
6967e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    @Test
6977e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    public void testVersionGetters() throws Exception {
6987e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String firmwareVersion = "fuzzy";
6997e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String driverVersion = "dizzy";
7007e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        IWifiChip.ChipDebugInfo chipDebugInfo = new IWifiChip.ChipDebugInfo();
7017e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.firmwareDescription = firmwareVersion;
7027e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.driverDescription = driverVersion;
7037e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
7047e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        doAnswer(new AnswerWithArguments() {
7057e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            public void answer(IWifiChip.requestChipDebugInfoCallback cb) throws RemoteException {
7067e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass                cb.onValues(mWifiStatusSuccess, chipDebugInfo);
7077e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            }
7087e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        }).when(mIWifiChip).requestChipDebugInfo(any(IWifiChip.requestChipDebugInfoCallback.class));
7097e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
7107e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getFirmwareVersion());
7117e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getDriverVersion());
7127e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
7137e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
7147e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
7157e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(firmwareVersion, mWifiVendorHal.getFirmwareVersion());
7167e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(driverVersion, mWifiVendorHal.getDriverVersion());
7177e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    }
718ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
719ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
720ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * For checkRoundTripIntTranslation lambdas
721ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
722ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    interface IntForInt {
723ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        int translate(int value);
724ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
725ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
726ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
727ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Checks that translation from x to y and back again is the identity function
728ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     *
729ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param xFromY reverse translator
730ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param yFromX forward translator
731ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param xLimit non-inclusive upper bound on x (lower bound is zero)
732ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
733ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    private void checkRoundTripIntTranslation(
734ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            IntForInt xFromY, IntForInt yFromX, int xFirst, int xLimit) throws Exception {
735ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        int ex = 0;
736ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        for (int i = xFirst; i < xLimit; i++) {
737ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertEquals(i, xFromY.translate(yFromX.translate(i)));
738ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
739ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        try {
740ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            yFromX.translate(xLimit);
741ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertTrue("expected an exception here", false);
742ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        } catch (IllegalArgumentException e) {
743ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            ex++;
744ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
745ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        try {
746ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            xFromY.translate(yFromX.translate(xLimit - 1) + 1);
747ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertTrue("expected an exception here", false);
748ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        } catch (IllegalArgumentException e) {
749ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            ex++;
750ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
751ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertEquals(2, ex);
752ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
753ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
754ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
755ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
756ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of RTT type
757ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
758ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
759ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testRttTypeTranslation() throws Exception {
760ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
761ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halRttTypeFromFrameworkRttType(y),
762ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkRttTypeFromHalRttType(x),
763ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                1, 3);
764ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
765ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
766ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
767ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of peer type
768ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
769ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
770ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testPeerTranslation() throws Exception {
771ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
772ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halPeerFromFrameworkPeer(y),
773ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkPeerFromHalPeer(x),
774ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                1, 6);
775ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
776ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
777ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
778ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of channel width
779ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
780ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
781ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testChannelWidth() throws Exception {
782ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
783ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halChannelWidthFromFrameworkChannelWidth(y),
784ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkChannelWidthFromHalChannelWidth(x),
785ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 5);
786ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
787ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
788ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
789ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of preamble type mask
790ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
791ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
792ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testPreambleTranslation() throws Exception {
793ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
794ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halPreambleFromFrameworkPreamble(y),
795ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkPreambleFromHalPreamble(x),
796ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 8);
797ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
798ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
799ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
800ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of bandwidth mask
801ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
802ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
803ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testBandwidthTranslations() throws Exception {
804ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
805ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halBwFromFrameworkBw(y),
806ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkBwFromHalBw(x),
807ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 64);
808ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
809ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
810ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
811ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testGetRttStuff() throws Exception {
812ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttManager.RttParams params = new RttManager.RttParams();
813ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) populate
814ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttConfig config = WifiVendorHal.halRttConfigFromFrameworkRttParams(params);
815ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) check
816ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
817ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
818ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
819ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testGetRttCapabilities() throws Exception {
820ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttCapabilities capabilities = new RttCapabilities();
821ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) populate
822ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
823ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        doAnswer(new AnswerWithArguments() {
824ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            public void answer(IWifiRttController.getCapabilitiesCallback cb)
825ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                    throws RemoteException {
826ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
827ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            }
828ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }).when(mIWifiRttController).getCapabilities(any(
829ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                IWifiRttController.getCapabilitiesCallback.class));
830ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
831ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertNull(mWifiVendorHal.getRttCapabilities());
832ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
833ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
834ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
835ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttManager.RttCapabilities actual = mWifiVendorHal.getRttCapabilities();
836ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) check
837ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
838ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
839ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
840ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    //TODO(b/34901744) negative RTT test cases as well.
841ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    // e.g. invoke RTT without putting the HAL in the correct mode.
842ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
843ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
844df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     * Test that setScanningMacOui is hooked up to the HAL correctly
845df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     */
846df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    @Test
847df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    public void testSetScanningMacOui() throws Exception {
848df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] oui = NativeUtil.macAddressOuiToByteArray("DA:A1:19");
849df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] zzz = NativeUtil.macAddressOuiToByteArray("00:00:00");
850df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
851df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        when(mIWifiStaIface.setScanningMacOui(any())).thenReturn(mWifiStatusSuccess);
852df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
853df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(oui)); // expect fail - STA not started
854df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
855df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(null));  // expect fail - null
856df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(new byte[]{(byte) 1})); // expect fail - len
857df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.setScanningMacOui(oui));
858df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.setScanningMacOui(zzz));
859df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
860df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(oui));
861df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(zzz));
862df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    }
863df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
86470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
86570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStartSendingOffloadedPacket() throws Exception {
86670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        byte[] srcMac = NativeUtil.macAddressToByteArray("4007b2088c81");
86770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress src = InetAddress.parseNumericAddress("192.168.13.13");
86870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress dst = InetAddress.parseNumericAddress("93.184.216.34");
86970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
87070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int millis = 16000;
87170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
87270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        KeepalivePacketData kap = KeepalivePacketData.nattKeepalivePacket(src, 63000, dst, 4500);
87370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
87470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.startSendingKeepAlivePackets(
87570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                anyInt(), any(), anyShort(), any(), any(), anyInt()
87670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        )).thenReturn(mWifiStatusSuccess);
87770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
87870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
87970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(0 == mWifiVendorHal.startSendingOffloadedPacket(slot, srcMac, kap, millis));
88070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
88170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).startSendingKeepAlivePackets(
88270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                eq(slot), any(), anyShort(), any(), any(), eq(millis));
88370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
88470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
88570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
88670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStopSendingOffloadedPacket() throws Exception {
88770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
88870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
88970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.stopSendingKeepAlivePackets(anyInt())).thenReturn(mWifiStatusSuccess);
89070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
89170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
89270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(0 == mWifiVendorHal.stopSendingOffloadedPacket(slot));
89370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
89470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).stopSendingKeepAlivePackets(eq(slot));
89570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
89670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
897df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    /**
8983401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     * Test the setup, invocation, and removal of a RSSI event handler
8993401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     *
9003401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     */
9013401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    @Test
9023401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    public void testRssiMonitoring() throws Exception {
9033401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        when(mIWifiStaIface.startRssiMonitoring(anyInt(), anyInt(), anyInt()))
9043401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenReturn(mWifiStatusSuccess);
9053401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        when(mIWifiStaIface.stopRssiMonitoring(anyInt()))
9063401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenReturn(mWifiStatusSuccess);
9073401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
9083401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        ArrayList<Byte> breach = new ArrayList<>(10);
9093401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte hi = -21;
9103401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte med = -42;
9113401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte lo = -84;
9123401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        Byte lower = -88;
9133401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        WifiNative.WifiRssiEventHandler handler;
9143401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        handler = ((cur) -> {
9153401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass            breach.add(cur);
9163401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        });
9173401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(hi, lo, handler)); // not started
9183401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.stopRssiMonitoring()); // not started
9193401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
9203401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(hi, lo, handler));
9213401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        int theCmdId = mWifiVendorHal.sRssiMonCmdId;
9223401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        breach.clear();
9233401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        mIWifiStaIfaceEventCallback.onRssiThresholdBreached(theCmdId, new byte[6], lower);
9243401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(breach.get(0), lower);
9253401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.stopRssiMonitoring());
9263401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(hi, lo, handler));
9273401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(med, lo, handler)); // replacing works
9283401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(hi, lo, null)); // null handler fails
9293401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(hi, lo, handler));
9303401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(lo, hi, handler)); // empty range
9313401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    }
9323401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
9333401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    /**
934ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * Test that getApfCapabilities is hooked up to the HAL correctly
935ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
936ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call before the vendor HAL is started should return a non-null result with version 0
937ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
938ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call after the HAL is started should return the mocked values.
939ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
940ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
941ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testApfCapabilities() throws Exception {
942ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myVersion = 33;
943ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myMaxSize = 1234;
944ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
945ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        StaApfPacketFilterCapabilities capabilities = new StaApfPacketFilterCapabilities();
946ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.version = myVersion;
947ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.maxLength = myMaxSize;
948ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
949ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        doAnswer(new AnswerWithArguments() {
950ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            public void answer(IWifiStaIface.getApfPacketFilterCapabilitiesCallback cb)
951ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                    throws RemoteException {
952ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
953ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            }
954ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        }).when(mIWifiStaIface).getApfPacketFilterCapabilities(any(
955ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                IWifiStaIface.getApfPacketFilterCapabilitiesCallback.class));
956ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
957ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
958ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(0, mWifiVendorHal.getApfCapabilities().apfVersionSupported);
959ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
960ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
961ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
962ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        ApfCapabilities actual = mWifiVendorHal.getApfCapabilities();
963ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
964ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myVersion, actual.apfVersionSupported);
965ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myMaxSize, actual.maximumApfProgramSize);
966ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(android.system.OsConstants.ARPHRD_ETHER, actual.apfPacketFormat);
967ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertNotEquals(0, actual.apfPacketFormat);
968ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
969ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
970ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
97170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass     * Test that an APF program can be installed.
972ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
973ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
974ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testInstallApf() throws Exception {
975ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        byte[] filter = new byte[] {19, 53, 10};
976ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
977ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        ArrayList<Byte> expected = new ArrayList<>(3);
978ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        for (byte b : filter) expected.add(b);
979ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
980ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        when(mIWifiStaIface.installApfPacketFilter(anyInt(), any(ArrayList.class)))
981ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                .thenReturn(mWifiStatusSuccess);
982ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
983ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
984ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.installPacketFilter(filter));
985ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
986ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        verify(mIWifiStaIface).installApfPacketFilter(eq(0), eq(expected));
987ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
988f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
989f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    /**
990f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     * Test that the country code is set in AP mode (when it should be).
991f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     */
992f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    @Test
993f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    public void testSetCountryCodeHal() throws Exception {
994f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        byte[] expected = new byte[]{(byte) 'C', (byte) 'A'};
995f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
996f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        when(mIWifiApIface.setCountryCode(any()))
997f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass                .thenReturn(mWifiStatusSuccess);
998f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
999f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
1000f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1001f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal(null));
1002f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal(""));
1003f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal("A"));
1004f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertTrue(mWifiVendorHal.setCountryCodeHal("CA")); // Only one expected to succeed
1005f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal("ZZZ"));
1006f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1007f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        verify(mIWifiApIface).setCountryCode(eq(expected));
1008f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    }
100953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
101053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
10118dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that RemoteException is caught and logged.
10128dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
10138dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
10148dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testRemoteExceptionIsHandled() throws Exception {
10158dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = spy(mWifiLog);
1016e1d5fa72eb35fb8f936e19d0830548593de6a6ffMichael Plass        mWifiVendorHal.mVerboseLog = mWifiLog;
10178dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        when(mIWifiApIface.setCountryCode(any()))
10188dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass                .thenThrow(new RemoteException("oops"));
10198dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
10208dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal("CA"));
1021e1d5fa72eb35fb8f936e19d0830548593de6a6ffMichael Plass        assertFalse(mWifiVendorHal.isHalStarted());
10228dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        verify(mWifiLog).err(any());
10238dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
10248dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
10258dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
102653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that startLoggingToDebugRingBuffer is plumbed to chip
102753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
102853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * A call before the vendor hal is started should just return false.
102953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * After starting in STA mode, the call should succeed, and pass ther right things down.
103053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
103153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
103253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBuffer() throws Exception {
103353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
103453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
103553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
103653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
103753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
103853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
103953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
104053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
104153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
104253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
104353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
104453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
104553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Same test as testStartLoggingRingBuffer, but in AP mode rather than STA.
104653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
104753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
104853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBufferOnAp() throws Exception {
104953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
105053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
105153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
105253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
105353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
105453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
105553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
105653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
105753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
105853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
105953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
106053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
106153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferStatus gets and translates its stuff correctly
106253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
106353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
106453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testRingBufferStatus() throws Exception {
106553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus one = new WifiDebugRingBufferStatus();
106653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringName = "One";
106753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.flags = WifiDebugRingBufferFlags.HAS_BINARY_ENTRIES;
106853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringId = 5607371;
106953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.sizeInBytes = 54321;
107053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.freeSizeInBytes = 42;
107153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.verboseLevel = WifiDebugRingBufferVerboseLevel.VERBOSE;
107253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        String oneExpect = "name: One flag: 1 ringBufferId: 5607371 ringBufferByteSize: 54321"
107353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                + " verboseLevel: 2 writtenBytes: 0 readBytes: 0 writtenRecords: 0";
107453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
107553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus two = new WifiDebugRingBufferStatus();
107653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringName = "Two";
107753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.flags = WifiDebugRingBufferFlags.HAS_ASCII_ENTRIES
107853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                | WifiDebugRingBufferFlags.HAS_PER_PACKET_ENTRIES;
107953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringId = 4512470;
108053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.sizeInBytes = 300;
108153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.freeSizeInBytes = 42;
108253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.verboseLevel = WifiDebugRingBufferVerboseLevel.DEFAULT;
108353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
108453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        ArrayList<WifiDebugRingBufferStatus> halBufferStatus = new ArrayList<>(2);
108553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(one);
108653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(two);
108753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
108853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiNative.RingBufferStatus[] actual;
108953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
109053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        doAnswer(new AnswerWithArguments() {
109153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            public void answer(IWifiChip.getDebugRingBuffersStatusCallback cb)
109253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                    throws RemoteException {
109353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                cb.onValues(mWifiStatusSuccess, halBufferStatus);
109453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            }
109553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        }).when(mIWifiChip).getDebugRingBuffersStatus(any(
109653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                IWifiChip.getDebugRingBuffersStatusCallback.class));
109753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
109853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
109953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        actual = mWifiVendorHal.getRingBufferStatus();
110053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
110153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(halBufferStatus.size(), actual.length);
110253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(oneExpect, actual[0].toString());
110353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(two.ringId, actual[1].ringBufferId);
110453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
110553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
110653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
110753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
110853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferData calls forceDumpToDebugRingBuffer
110953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
111053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Try once before hal start, and twice after (one success, one failure).
111153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
111253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
111353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testForceRingBufferDump() throws Exception {
111453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Gunk"))).thenReturn(mWifiStatusSuccess);
111553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Glop"))).thenReturn(mWifiStatusFailure);
111653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
111753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Gunk")); // hal not started
111853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
111953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
112053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
112153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.getRingBufferData("Gunk")); // mocked call succeeds
112253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Glop")); // mocked call fails
112353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
112453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Gunk");
112553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Glop");
112653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
112753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
11285a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
11295a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the start of packet fate monitoring.
11305a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
11315a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after (one success, one failure).
11325a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
11335a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
11345a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testStartPktFateMonitoring() throws Exception {
11355a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        when(mIWifiStaIface.startDebugPacketFateMonitoring()).thenReturn(mWifiStatusSuccess);
11365a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11375a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.startPktFateMonitoring());
11385a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never()).startDebugPacketFateMonitoring();
11395a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
11415a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startPktFateMonitoring());
11425a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface).startDebugPacketFateMonitoring();
11435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
11445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11455a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
11465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of tx packet fates.
11475a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
11485a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
11495a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
11505a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
11515a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFates() throws Exception {
11525a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
11535a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
11545a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugTxPacketFateReport fateReport = new WifiDebugTxPacketFateReport();
11555a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugTxPacketFate.DRV_QUEUED;
11565a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
11575a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.ETHERNET_II;
11585a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
11595a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
11605a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11615a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
11625a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugTxPacketFatesCallback cb) {
11635a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
11645a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugTxPacketFateReport>(Arrays.asList(fateReport)));
11655a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
11665a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
11675a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
11685a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11695a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.TxFateReport[] retrievedFates = new WifiNative.TxFateReport[1];
11705a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getTxPktFates(retrievedFates));
11715a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
11725a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
11735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
11755a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11765a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getTxPktFates(retrievedFates));
11775a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
11785a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
11795a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.TX_PKT_FATE_DRV_QUEUED, retrievedFates[0].mFate);
11805a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
11815a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
11825a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, retrievedFates[0].mFrameType);
11835a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
11845a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
11855a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
11865a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
11875a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of tx packet fates when the number of fates retrieved exceeds the
11885a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * input array.
11895a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
11905a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
11915a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
11925a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
11935a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFatesExceedsInputArrayLength() throws Exception {
11945a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
11955a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
11965a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugTxPacketFateReport fateReport = new WifiDebugTxPacketFateReport();
11975a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugTxPacketFate.FW_DROP_OTHER;
11985a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
11995a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.MGMT_80211;
12005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
12015a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
12025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
12045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugTxPacketFatesCallback cb) {
12055a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
12065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugTxPacketFateReport>(Arrays.asList(
12075a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                                fateReport, fateReport)));
12085a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
12095a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
12105a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
12115a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12125a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.TxFateReport[] retrievedFates = new WifiNative.TxFateReport[1];
12135a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getTxPktFates(retrievedFates));
12145a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
12155a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
12165a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12175a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
12185a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12195a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getTxPktFates(retrievedFates));
12205a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
12215a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
12225a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.TX_PKT_FATE_FW_DROP_OTHER, retrievedFates[0].mFate);
12235a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
12245a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
12255a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_80211_MGMT, retrievedFates[0].mFrameType);
12265a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
12275a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
12285a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12295a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
12305a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of rx packet fates.
12315a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
12325a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
12335a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
12345a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
12355a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFates() throws Exception {
12365a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
12375a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
12385a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugRxPacketFateReport fateReport = new WifiDebugRxPacketFateReport();
12395a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugRxPacketFate.SUCCESS;
12405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
12415a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.ETHERNET_II;
12425a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
12435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
12445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12455a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
12465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugRxPacketFatesCallback cb) {
12475a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
12485a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugRxPacketFateReport>(Arrays.asList(fateReport)));
12495a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
12505a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
12515a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
12525a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12535a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.RxFateReport[] retrievedFates = new WifiNative.RxFateReport[1];
12545a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getRxPktFates(retrievedFates));
12555a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
12565a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
12575a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12585a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
12595a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12605a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getRxPktFates(retrievedFates));
12615a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
12625a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
12635a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.RX_PKT_FATE_SUCCESS, retrievedFates[0].mFate);
12645a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
12655a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
12665a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, retrievedFates[0].mFrameType);
12675a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
12685a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
12695a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12705a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
12715a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of rx packet fates when the number of fates retrieved exceeds the
12725a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * input array.
12735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
12745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
12755a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
12765a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
12775a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFatesExceedsInputArrayLength() throws Exception {
12785a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
12795a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
12805a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugRxPacketFateReport fateReport = new WifiDebugRxPacketFateReport();
12815a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugRxPacketFate.FW_DROP_FILTER;
12825a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
12835a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.MGMT_80211;
12845a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
12855a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
12865a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12875a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
12885a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugRxPacketFatesCallback cb) {
12895a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
12905a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugRxPacketFateReport>(Arrays.asList(
12915a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                                fateReport, fateReport)));
12925a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
12935a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
12945a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
12955a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12965a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.RxFateReport[] retrievedFates = new WifiNative.RxFateReport[1];
12975a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getRxPktFates(retrievedFates));
12985a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
12995a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
13005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13015a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
13025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getRxPktFates(retrievedFates));
13045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
13055a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
13065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.RX_PKT_FATE_FW_DROP_FILTER, retrievedFates[0].mFate);
13075a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
13085a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
13095a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_80211_MGMT, retrievedFates[0].mFrameType);
13105a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
13115a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
13125a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13135a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
13145a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the failure to retrieve tx packet fates when the input array is empty.
13155a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
13165a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
13175a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFatesEmptyInputArray() throws Exception {
13185a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
13195a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getTxPktFates(new WifiNative.TxFateReport[0]));
13205a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
13215a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
13225a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
13235a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13245a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
13255a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the failure to retrieve rx packet fates when the input array is empty.
13265a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
13275a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
13285a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFatesEmptyInputArray() throws Exception {
13295a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
13305a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getRxPktFates(new WifiNative.RxFateReport[0]));
13315a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
13325a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
13335a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
1334135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1335135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    /**
1336135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     * Tests the nd offload enable/disable.
1337135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     */
1338135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    @Test
1339135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    public void testEnableDisableNdOffload() throws Exception {
1340135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        when(mIWifiStaIface.enableNdOffload(anyBoolean())).thenReturn(mWifiStatusSuccess);
1341135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1342135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertFalse(mWifiVendorHal.configureNeighborDiscoveryOffload(true));
1343135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface, never()).enableNdOffload(anyBoolean());
1344135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1345135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1346135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1347135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.configureNeighborDiscoveryOffload(true));
1348135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(true));
1349135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.configureNeighborDiscoveryOffload(false));
1350135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(false));
1351135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    }
1352135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1353135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    /**
1354135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     * Tests the nd offload enable failure.
1355135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     */
1356135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    @Test
1357135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    public void testEnableNdOffloadFailure() throws Exception {
1358135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        when(mIWifiStaIface.enableNdOffload(eq(true))).thenReturn(mWifiStatusFailure);
1359135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1360135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1361135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1362135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertFalse(mWifiVendorHal.configureNeighborDiscoveryOffload(true));
1363135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(true));
1364135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    }
1365cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1366cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    /**
1367cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     * Tests the retrieval of wlan wake reason stats.
1368cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     */
1369cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    @Test
1370cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    public void testGetWlanWakeReasonCount() throws Exception {
1371cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        WifiDebugHostWakeReasonStats stats = new WifiDebugHostWakeReasonStats();
1372cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        Random rand = new Random();
1373cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalCmdEventWakeCnt = rand.nextInt();
1374cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalDriverFwLocalWakeCnt = rand.nextInt();
1375cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalRxPacketWakeCnt = rand.nextInt();
1376cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxPktWakeDetails.rxUnicastCnt = rand.nextInt();
1377cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxPktWakeDetails.rxMulticastCnt = rand.nextInt();
1378cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxIcmpPkWakeDetails.icmpPkt = rand.nextInt();
1379cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxIcmpPkWakeDetails.icmp6Pkt = rand.nextInt();
1380cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt = rand.nextInt();
1381cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt = rand.nextInt();
1382cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1383cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        doAnswer(new AnswerWithArguments() {
1384cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            public void answer(IWifiChip.getDebugHostWakeReasonStatsCallback cb) {
1385cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                cb.onValues(mWifiStatusSuccess, stats);
1386cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            }
1387cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        }).when(mIWifiChip).getDebugHostWakeReasonStats(
1388cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1389cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1390cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNull(mWifiVendorHal.getWlanWakeReasonCount());
1391cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip, never())
1392cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                .getDebugHostWakeReasonStats(
1393cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                        any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1394cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1395cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1396cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1397cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        WifiWakeReasonAndCounts retrievedStats = mWifiVendorHal.getWlanWakeReasonCount();
1398cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip).getDebugHostWakeReasonStats(
1399cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1400cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNotNull(retrievedStats);
1401cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalCmdEventWakeCnt, retrievedStats.totalCmdEventWake);
1402cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalDriverFwLocalWakeCnt, retrievedStats.totalDriverFwLocalWake);
1403cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalRxPacketWakeCnt, retrievedStats.totalRxDataWake);
1404cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxPktWakeDetails.rxUnicastCnt, retrievedStats.rxUnicast);
1405cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxPktWakeDetails.rxMulticastCnt, retrievedStats.rxMulticast);
1406cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxIcmpPkWakeDetails.icmpPkt, retrievedStats.icmp);
1407cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxIcmpPkWakeDetails.icmp6Pkt, retrievedStats.icmp6);
1408cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt,
1409cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                retrievedStats.ipv4RxMulticast);
1410cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt,
1411cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                retrievedStats.ipv6Multicast);
1412cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    }
1413cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1414cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    /**
1415cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     * Tests the failure in retrieval of wlan wake reason stats.
1416cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     */
1417cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    @Test
1418cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    public void testGetWlanWakeReasonCountFailure() throws Exception {
1419cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        doAnswer(new AnswerWithArguments() {
1420cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            public void answer(IWifiChip.getDebugHostWakeReasonStatsCallback cb) {
1421cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                cb.onValues(mWifiStatusFailure, new WifiDebugHostWakeReasonStats());
1422cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            }
1423cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        }).when(mIWifiChip).getDebugHostWakeReasonStats(
1424cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1425cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1426cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        // This should work in both AP & STA mode.
1427cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
1428cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1429cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNull(mWifiVendorHal.getWlanWakeReasonCount());
1430cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip).getDebugHostWakeReasonStats(
1431cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1432cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    }
14332f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
14342f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    /**
14352f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Test that getFwMemoryDump is properly plumbed
14362f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     */
14372f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    @Test
14382f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    public void testGetFwMemoryDump() throws Exception {
14392f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        byte [] sample = NativeUtil.hexStringToByteArray("268c7a3fbfa4661c0bdd6a36");
14402f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        ArrayList<Byte> halBlob = NativeUtil.byteArrayToArrayList(sample);
14412f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
14422f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        doAnswer(new AnswerWithArguments() {
14432f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            public void answer(IWifiChip.requestFirmwareDebugDumpCallback cb)
14442f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                    throws RemoteException {
14452f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                cb.onValues(mWifiStatusSuccess, halBlob);
14462f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            }
14472f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        }).when(mIWifiChip).requestFirmwareDebugDump(any(
14482f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                IWifiChip.requestFirmwareDebugDumpCallback.class));
14492f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
14502f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
14512f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertArrayEquals(sample, mWifiVendorHal.getFwMemoryDump());
14522f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    }
14532f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
14542f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    /**
14552f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Test that getDriverStateDump is properly plumbed
14562f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     *
14572f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Just for variety, use AP mode here.
14582f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     */
14592f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    @Test
14602f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    public void testGetDriverStateDump() throws Exception {
14612f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        byte [] sample = NativeUtil.hexStringToByteArray("e83ff543cf80083e6459d20f");
14622f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        ArrayList<Byte> halBlob = NativeUtil.byteArrayToArrayList(sample);
14632f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
14642f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        doAnswer(new AnswerWithArguments() {
14652f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            public void answer(IWifiChip.requestDriverDebugDumpCallback cb)
14662f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                    throws RemoteException {
14672f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                cb.onValues(mWifiStatusSuccess, halBlob);
14682f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            }
14692f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        }).when(mIWifiChip).requestDriverDebugDump(any(
14702f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                IWifiChip.requestDriverDebugDumpCallback.class));
14712f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
14722f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
14732f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertArrayEquals(sample, mWifiVendorHal.getDriverStateDump());
14742f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    }
1475d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1476d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1477d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan failure is handled correctly.
1478d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1479d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1480d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFailureCallback() throws Exception {
1481d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1482d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1483d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1484d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1485d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1486d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1487d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanFailure(mWifiVendorHal.mScan.cmdId);
1488d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_FAILED);
1489d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1490d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1491d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1492136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test that background scan failure with wrong id is not reported.
1493d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1494d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1495d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFailureCallbackWithInvalidCmdId() throws Exception {
1496d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1497d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1498d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1499d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1500d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1501d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1502d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanFailure(mWifiVendorHal.mScan.cmdId + 1);
1503d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler, never()).onScanStatus(WifiNative.WIFI_SCAN_FAILED);
1504d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1505d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1506d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1507d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan full results are handled correctly.
1508d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1509d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1510d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFullScanResults() throws Exception {
1511d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1512d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1513d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1514d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1515d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1516d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1517d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<StaScanResult, ScanResult> result = createHidlAndFrameworkBgScanResult();
1518d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundFullScanResult(
15196b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius                mWifiVendorHal.mScan.cmdId, 5, result.first);
1520d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1521d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArgumentCaptor<ScanResult> scanResultCaptor = ArgumentCaptor.forClass(ScanResult.class);
15226b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(eventHandler).onFullScanResult(scanResultCaptor.capture(), eq(5));
1523d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1524d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanResultEqual(result.second, scanResultCaptor.getValue());
1525d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1526d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1527d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1528d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan results are handled correctly.
1529d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1530d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1531d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanScanResults() throws Exception {
1532d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1533d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1534d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1535d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1536d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1537d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1538d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<ArrayList<StaScanData>, ArrayList<WifiScanner.ScanData>> data =
1539d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                createHidlAndFrameworkBgScanDatas();
1540d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanResults(
1541d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                mWifiVendorHal.mScan.cmdId, data.first);
1542d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1543d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);
1544d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanDatasEqual(
1545d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                data.second, Arrays.asList(mWifiVendorHal.mScan.latestScanResults));
1546d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1547d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
15481514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
1549136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test that starting a new background scan when one is active will stop the previous one.
1550136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1551136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1552136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanReplacement() throws Exception {
1553136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1554136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1555136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1556136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1557136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1558136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId1 = mWifiVendorHal.mScan.cmdId;
1559136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1560136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotEquals(mWifiVendorHal.mScan.cmdId, cmdId1);
1561136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface, times(2)).startBackgroundScan(anyInt(), any());
1562136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId1);
1563136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1564136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1565136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
1566136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test stopping a background scan.
1567136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1568136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1569136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanStop() throws Exception {
1570136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1571136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1572136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1573136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1574136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1575136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1576136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId = mWifiVendorHal.mScan.cmdId;
1577136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1578136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        mWifiVendorHal.stopScan();
1579136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        mWifiVendorHal.stopScan(); // second call should not do anything
1580136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId); // Should be called just once
1581136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1582136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1583136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
1584136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test pausing and restarting a background scan.
1585136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1586136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1587136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanPauseAndRestart() throws Exception {
1588136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1589136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1590136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1591136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1592136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1593136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1594136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId = mWifiVendorHal.mScan.cmdId;
1595136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1596136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        mWifiVendorHal.pauseScan();
1597136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        mWifiVendorHal.restartScan();
1598136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId); // Should be called just once
1599136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface, times(2)).startBackgroundScan(eq(cmdId), any());
1600136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1601136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1602136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
16031514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of log handler set.
16041514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
16051514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
16061514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testSetLogHandler() throws Exception {
16071514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
16081514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16091514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
16101514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
16111514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16121514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.setLoggingEventHandler(eventHandler));
16131514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
16141514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16151514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
16161514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16171514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
16181514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
16191514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        reset(mIWifiChip);
16201514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16211514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Second call should fail.
16221514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.setLoggingEventHandler(eventHandler));
16231514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
16241514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
16251514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16261514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
16271514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of log handler reset.
16281514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
16291514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
16301514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testResetLogHandler() throws Exception {
16311514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
16326b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
16331514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16341514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
16351514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
16366b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
16371514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16381514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
16391514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16401514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Not set, so this should fail.
16411514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
16421514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
16436b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
16441514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16451514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now set and then reset.
16461514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(
16471514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class)));
16481514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
16491514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(false));
16506b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip).stopLoggingToDebugRingBuffer();
16511514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        reset(mIWifiChip);
16521514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16531514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Second reset should fail.
16541514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
16551514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
16566b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
16571514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
16581514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16591514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
16601514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of alert callback.
16611514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
16621514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
16631514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testAlertCallback() throws Exception {
16641514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
16656b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
16661514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16671514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
16681514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertNotNull(mIWifiChipEventCallback);
16691514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16701514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        int errorCode = 5;
16711514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        byte[] errorData = new byte[45];
16721514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        new Random().nextBytes(errorData);
16731514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16741514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Randomly raise the HIDL callback before we register for the log callback.
16751514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // This should be ignored.
16761514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugErrorAlert(
16771514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
16781514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16791514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
16801514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
16811514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
16821514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
16831514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16841514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now raise the HIDL callback, this should be properly handled.
16851514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugErrorAlert(
16861514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
16871514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(eventHandler).onWifiAlert(eq(errorCode), eq(errorData));
16881514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16891514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now stop the logging and invoke the callback. This should be ignored.
16901514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
16911514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugErrorAlert(
16921514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
16931514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
16941514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
16951514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
16961514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of ring buffer callback.
16971514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
16981514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
16991514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testRingBufferDataCallback() throws Exception {
17001514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
17016b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
17021514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17031514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
17041514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertNotNull(mIWifiChipEventCallback);
17051514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17061514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        byte[] errorData = new byte[45];
17071514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        new Random().nextBytes(errorData);
17081514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17091514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Randomly raise the HIDL callback before we register for the log callback.
17101514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // This should be ignored.
17111514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
17121514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
17131514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17141514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
17151514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
17161514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
17171514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
17181514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17191514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now raise the HIDL callback, this should be properly handled.
17201514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
17211514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
17221514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(eventHandler).onRingBufferData(
17231514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                any(WifiNative.RingBufferStatus.class), eq(errorData));
17241514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17251514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now stop the logging and invoke the callback. This should be ignored.
17261514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
17271514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
17281514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
17291514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
17301514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
1731d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void startBgScan(WifiNative.ScanEventHandler eventHandler) throws Exception {
1732d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        when(mIWifiStaIface.startBackgroundScan(
1733d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                anyInt(), any(StaBackgroundScanParameters.class))).thenReturn(mWifiStatusSuccess);
1734136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanSettings settings = new WifiNative.ScanSettings();
1735136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        settings.num_buckets = 1;
1736136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings();
1737136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.bucket = 0;
1738136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.period_ms = 16000;
1739136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.report_events = WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN;
1740136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        settings.buckets = new WifiNative.BucketSettings[] {bucketSettings};
1741136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startScan(settings, eventHandler));
1742d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1743d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1744d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // Create a pair of HIDL scan result and its corresponding framework scan result for
1745d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // comparison.
1746d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private Pair<StaScanResult, ScanResult> createHidlAndFrameworkBgScanResult() {
1747d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        StaScanResult staScanResult = new StaScanResult();
1748d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Random random = new Random();
1749d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        byte[] ssid = new byte[8];
1750d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(ssid);
1751d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.ssid.addAll(NativeUtil.byteArrayToArrayList(ssid));
1752d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(staScanResult.bssid);
1753d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.frequency = 2432;
1754d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.rssi = -45;
1755d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.timeStampInUs = 5;
1756d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiInformationElement ie1 = new WifiInformationElement();
1757d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        byte[] ie1_data = new byte[56];
1758d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(ie1_data);
1759d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ie1.id = 1;
1760d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ie1.data.addAll(NativeUtil.byteArrayToArrayList(ie1_data));
1761d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.informationElements.add(ie1);
1762d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1763d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        // Now create the corresponding Scan result structure.
1764d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ScanResult scanResult = new ScanResult();
1765d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.SSID = NativeUtil.encodeSsid(staScanResult.ssid);
1766d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.BSSID = NativeUtil.macAddressFromByteArray(staScanResult.bssid);
1767d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.wifiSsid = WifiSsid.createFromByteArray(ssid);
1768d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.frequency = staScanResult.frequency;
1769d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.level = staScanResult.rssi;
1770d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.timestamp = staScanResult.timeStampInUs;
1771d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.bytes = new byte[57];
1772d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.bytes[0] = ie1.id;
1773d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        System.arraycopy(ie1_data, 0, scanResult.bytes, 1, ie1_data.length);
1774d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1775d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        return Pair.create(staScanResult, scanResult);
1776d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1777d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1778d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // Create a pair of HIDL scan datas and its corresponding framework scan datas for
1779d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // comparison.
1780d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private Pair<ArrayList<StaScanData>, ArrayList<WifiScanner.ScanData>>
1781d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            createHidlAndFrameworkBgScanDatas() {
1782d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArrayList<StaScanData> staScanDatas = new ArrayList<>();
1783d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        StaScanData staScanData = new StaScanData();
1784d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1785d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<StaScanResult, ScanResult> result = createHidlAndFrameworkBgScanResult();
1786d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.results.add(result.first);
1787d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.bucketsScanned = 5;
1788d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.flags = StaScanDataFlagMask.INTERRUPTED;
1789d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanDatas.add(staScanData);
1790d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1791d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArrayList<WifiScanner.ScanData> scanDatas = new ArrayList<>();
1792d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ScanResult[] scanResults = new ScanResult[1];
1793d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResults[0] = result.second;
1794d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiScanner.ScanData scanData =
1795d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                new WifiScanner.ScanData(mWifiVendorHal.mScan.cmdId, 1,
1796d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                        staScanData.bucketsScanned, false, scanResults);
1797d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanDatas.add(scanData);
1798d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        return Pair.create(staScanDatas, scanDatas);
1799d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1800d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1801d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanResultEqual(ScanResult expected, ScanResult actual) {
1802d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.SSID, actual.SSID);
1803d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.wifiSsid.getHexString(), actual.wifiSsid.getHexString());
1804d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.BSSID, actual.BSSID);
1805d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.frequency, actual.frequency);
1806d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.level, actual.level);
1807d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.timestamp, actual.timestamp);
1808d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertArrayEquals(expected.bytes, actual.bytes);
1809d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1810d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1811d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanResultsEqual(ScanResult[] expected, ScanResult[] actual) {
1812d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.length, actual.length);
1813d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        for (int i = 0; i < expected.length; i++) {
1814d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            assertScanResultEqual(expected[i], actual[i]);
1815d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        }
1816d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1817d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1818d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanDataEqual(WifiScanner.ScanData expected, WifiScanner.ScanData actual) {
1819d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getId(), actual.getId());
1820d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getFlags(), actual.getFlags());
1821d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getBucketsScanned(), actual.getBucketsScanned());
1822d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanResultsEqual(expected.getResults(), actual.getResults());
1823d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1824d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1825d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanDatasEqual(
1826d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            List<WifiScanner.ScanData> expected, List<WifiScanner.ScanData> actual) {
1827d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.size(), actual.size());
1828d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        for (int i = 0; i < expected.size(); i++) {
1829d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            assertScanDataEqual(expected.get(i), actual.get(i));
1830d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        }
1831d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1832b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass}
1833