WifiVendorHalTest.java revision 5858a3401ecd9368af7363b7bfad8df036856205
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;
18d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.app.test.MockAnswerUtil.AnswerWithArguments;
19d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiApIface;
20d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiChip;
21542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Piusimport android.hardware.wifi.V1_0.IWifiChipEventCallback;
22d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiIface;
23d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiRttController;
241711409f11610d2d646036306ec8de4fb2f69712Wei Wangimport android.hardware.wifi.V1_0.IWifiRttControllerEventCallback;
25d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiStaIface;
267e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Piusimport android.hardware.wifi.V1_0.IWifiStaIfaceEventCallback;
27ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport android.hardware.wifi.V1_0.IfaceType;
28ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.hardware.wifi.V1_0.RttCapabilities;
29ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.hardware.wifi.V1_0.RttConfig;
30ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport android.hardware.wifi.V1_0.StaApfPacketFilterCapabilities;
3156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plassimport android.hardware.wifi.V1_0.StaBackgroundScanCapabilities;
32d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaBackgroundScanParameters;
33699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerIfacePacketStats;
34699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerRadioStats;
35699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerStats;
36d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanData;
37d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanDataFlagMask;
38d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanResult;
39cbe44718452e93ef2b68974230231ff4fac99deeMichael Plassimport android.hardware.wifi.V1_0.WifiDebugHostWakeReasonStats;
405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugPacketFateFrameType;
4153f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferFlags;
4253f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferStatus;
4353f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferVerboseLevel;
445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugRxPacketFate;
455a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugRxPacketFateReport;
465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugTxPacketFate;
475a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugTxPacketFateReport;
48d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.WifiInformationElement;
494f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatus;
504f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatusCode;
51ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport android.net.apf.ApfCapabilities;
52ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.net.wifi.RttManager;
53d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.ScanResult;
54699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.net.wifi.WifiLinkLayerStats;
551dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plassimport android.net.wifi.WifiManager;
56d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.WifiScanner;
57d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.WifiSsid;
58cbe44718452e93ef2b68974230231ff4fac99deeMichael Plassimport android.net.wifi.WifiWakeReasonAndCounts;
59ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport android.os.Looper;
6053f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.RemoteException;
611711409f11610d2d646036306ec8de4fb2f69712Wei Wangimport android.os.test.TestLooper;
62d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.util.Pair;
631dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
6470b995bed9674a30c56b7ae2585d5897900ff695Michael Plassimport com.android.server.connectivity.KeepalivePacketData;
65df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plassimport com.android.server.wifi.util.NativeUtil;
66d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
67d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport static org.junit.Assert.*;
68d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport static org.mockito.Mockito.*;
69d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
70b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Before;
71b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Test;
72d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport org.mockito.ArgumentCaptor;
73b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.Mock;
74b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.MockitoAnnotations;
753401582e1b1defc1877c7c47c6a839611fa211c3Michael Plassimport org.mockito.stubbing.Answer;
76b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
7770b995bed9674a30c56b7ae2585d5897900ff695Michael Plassimport java.net.InetAddress;
78ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport java.util.ArrayList;
795a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport java.util.Arrays;
80ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport java.util.HashSet;
81d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport java.util.List;
825a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport java.util.Random;
83ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport java.util.Set;
84ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
85b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass/**
86b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * Unit tests for {@link com.android.server.wifi.WifiVendorHal}.
87b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass */
88b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plasspublic class WifiVendorHalTest {
89b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
90d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    WifiVendorHal mWifiVendorHal;
914f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusSuccess;
924f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusFailure;
938dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    WifiLog mWifiLog;
944f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
954f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private HalDeviceManager mHalDeviceManager;
964f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
97f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius    private TestLooper mLooper;
984f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
994f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiVendorHal.HalDeviceManagerStatusListener mHalDeviceManagerStatusCallbacks;
1004f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1014f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiApIface mIWifiApIface;
1024f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1034f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiChip mIWifiChip;
1044f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
105ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    private android.hardware.wifi.V1_1.IWifiChip mIWifiChipV11;
106ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Mock
1074f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiStaIface mIWifiStaIface;
1084f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1094f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiRttController mIWifiRttController;
1103401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    private IWifiStaIfaceEventCallback mIWifiStaIfaceEventCallback;
111d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private IWifiChipEventCallback mIWifiChipEventCallback;
112af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    @Mock
113af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    private WifiNative.VendorHalDeathEventHandler mVendorHalDeathHandler;
1143401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
1153401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    /**
116ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Spy used to return the V1_1 IWifiChip mock object to simulate the 1.1 HAL running on the
117ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * device.
118ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
119ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    private class WifiVendorHalSpyV1_1 extends WifiVendorHal {
120ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        WifiVendorHalSpyV1_1(HalDeviceManager halDeviceManager, Looper looper) {
121ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            super(halDeviceManager, looper);
122ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }
123ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
124ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        @Override
125ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        protected android.hardware.wifi.V1_1.IWifiChip getWifiChipForV1_1Mockable() {
126ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            return mIWifiChipV11;
127ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }
128ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
129ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
130ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
1313401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     * Identity function to supply a type to its argument, which is a lambda
1323401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     */
1333401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    static Answer<WifiStatus> answerWifiStatus(Answer<WifiStatus> statusLambda) {
1343401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        return (statusLambda);
1353401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    }
136b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
137b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
138b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     * Sets up for unit test
139b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     */
140b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    @Before
141b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    public void setUp() throws Exception {
142b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass        MockitoAnnotations.initMocks(this);
1438dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = new FakeWifiLog();
144f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius        mLooper = new TestLooper();
1454f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess = new WifiStatus();
1464f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess.code = WifiStatusCode.SUCCESS;
1474f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure = new WifiStatus();
1484f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.code = WifiStatusCode.ERROR_UNKNOWN;
1494f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.description = "I don't even know what a Mock Turtle is.";
1504f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        when(mIWifiStaIface.enableLinkLayerStatsCollection(false)).thenReturn(mWifiStatusSuccess);
1514f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
152d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Setup the HalDeviceManager mock's start/stop behaviour. This can be overridden in
153d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // individual tests, if needed.
154d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
155d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public boolean answer() {
156d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
157d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(true);
158d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
159d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return true;
160d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
161d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
162d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
163d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
164d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public void answer() {
165d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
166d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(false);
167d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
168d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
169d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).stop();
170d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createStaIface(eq(null), eq(null)))
171d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiStaIface);
172d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createApIface(eq(null), eq(null)))
173d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiApIface);
174d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class)))
175d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiChip);
176d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createRttController(any(IWifiIface.class)))
177d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiRttController);
178542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
179542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .thenReturn(mWifiStatusSuccess);
1803401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        mIWifiStaIfaceEventCallback = null;
1817e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        when(mIWifiStaIface.registerEventCallback(any(IWifiStaIfaceEventCallback.class)))
1823401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenAnswer(answerWifiStatus((invocation) -> {
1833401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    Object[] args = invocation.getArguments();
1843401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    mIWifiStaIfaceEventCallback = (IWifiStaIfaceEventCallback) args[0];
1853401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    return (mWifiStatusSuccess);
1863401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                }));
187d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiChipEventCallback = null;
188d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
189d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                .thenAnswer(answerWifiStatus((invocation) -> {
190d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    Object[] args = invocation.getArguments();
191d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    mIWifiChipEventCallback = (IWifiChipEventCallback) args[0];
192d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    return (mWifiStatusSuccess);
193d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                }));
194d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1951711409f11610d2d646036306ec8de4fb2f69712Wei Wang        when(mIWifiRttController.registerEventCallback(any(IWifiRttControllerEventCallback.class)))
1961711409f11610d2d646036306ec8de4fb2f69712Wei Wang                .thenReturn(mWifiStatusSuccess);
1971711409f11610d2d646036306ec8de4fb2f69712Wei Wang
198d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Create the vendor HAL object under test.
199f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius        mWifiVendorHal = new WifiVendorHal(mHalDeviceManager, mLooper.getLooper());
200d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
201d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Initialize the vendor HAL to capture the registered callback.
202af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        mWifiVendorHal.initialize(mVendorHalDeathHandler);
203d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArgumentCaptor<WifiVendorHal.HalDeviceManagerStatusListener> hdmCallbackCaptor =
204d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                ArgumentCaptor.forClass(WifiVendorHal.HalDeviceManagerStatusListener.class);
20528102ffacda0802a1c4aa1b7edbbcc2bf01391a9Roshan Pius        verify(mHalDeviceManager).registerStatusListener(hdmCallbackCaptor.capture(), any());
206d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mHalDeviceManagerStatusCallbacks = hdmCallbackCaptor.getValue();
207d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
208b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    }
209b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
210b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
211d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in STA mode using
212d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
213d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
214d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2157e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalSuccessInStaMode() throws  Exception {
216d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
217d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
218d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
219d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
220d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
221d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
222d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
223d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
224d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
225542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
226542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
227d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
228d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
229d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
230d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
231d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
232d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in AP mode using
233d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
234d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
235d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2367e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalSuccessInApMode() throws Exception {
237d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(false));
238d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
239d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
240d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
241d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
242d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
243d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
244d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
245d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
246d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
247d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
248d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
249d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
250d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
251d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
252d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
253d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
254d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2557e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInStaMode() throws Exception {
256d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // No callbacks are invoked in this case since the start itself failed. So, override
257d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // default AnswerWithArguments that we setup.
258d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
2597e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius            public boolean answer() throws Exception {
260d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return false;
261d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
262d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
263d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
264d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
265d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
266d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
267d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
268d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
269d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
270d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
271d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
272542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface, never())
273542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .registerEventCallback(any(IWifiStaIfaceEventCallback.class));
274d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
275d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
276d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
277d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
278d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
279d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
280d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
2817e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInIfaceCreationInStaMode() throws Exception {
282d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createStaIface(eq(null), eq(null))).thenReturn(null);
283d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
284d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
285d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
286d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
287d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
288d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
289d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
290d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
291d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
292d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
293542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface, never())
294542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .registerEventCallback(any(IWifiStaIfaceEventCallback.class));
295d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
296d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
297d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
298d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
299d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
300d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
301d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3027e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInRttControllerCreationInStaMode() throws Exception {
303d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createRttController(any(IWifiIface.class))).thenReturn(null);
304d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
305d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
306d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
307d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
308d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
309d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
310d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
311542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
312d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
313d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
314d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
315d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
316d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
317d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
318d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
319d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
320d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
321d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3227e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInChipGetInStaMode() throws Exception {
323d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class))).thenReturn(null);
324d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
325d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
326d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
327d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
328d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
329d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
330d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(any(IWifiIface.class));
331d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
332542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
333d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
334d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
335d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
336d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
337d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
338d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
339d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
340d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
341d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3427e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInStaIfaceCallbackRegistration() throws Exception {
3437e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        when(mIWifiStaIface.registerEventCallback(any(IWifiStaIfaceEventCallback.class)))
3447e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius                .thenReturn(mWifiStatusFailure);
3457e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
3467e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
3477e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
3487e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).start();
3497e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
3507e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).stop();
351542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
3527e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
3537e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager, never()).createRttController(eq(mIWifiStaIface));
3547e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
3557e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
3567e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    }
3577e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
3587e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    /**
3597e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     * Tests the failure to start HAL in STA mode using
3607e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
361542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius     */
362542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    @Test
363542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    public void testStartHalFailureInChipCallbackRegistration() throws Exception {
364542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
365542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .thenReturn(mWifiStatusFailure);
366542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
367542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
368542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
369542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).start();
370542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
371542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
372542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).getChip(any(IWifiIface.class));
373542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).stop();
374542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
375542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
376542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
377542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
378542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    }
379542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
380542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    /**
381542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius     * Tests the failure to start HAL in STA mode using
382542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
3837e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     */
3847e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    @Test
3857e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInApMode() throws Exception {
386d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createApIface(eq(null), eq(null))).thenReturn(null);
387d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(false));
388d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
389d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
390d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
391d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
392d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
393d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
394d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
395d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
396d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
397d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
398d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
399d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
400d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in STA mode using
401d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
402d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
403d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
404d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInStaMode() {
405d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
406d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
407d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
408d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
409d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
410d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
411d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
412d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
413d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
414d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
415d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
416d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
417d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
418d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
419d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
420d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
421d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
422d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
423d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in AP mode using
424d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
425d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
426d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
427d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInApMode() {
428d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(false));
429d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
430d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
431d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
432d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
433d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
434d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
435d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
436d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
437d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
438d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
439d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
440d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
441d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
442d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
443d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
4444f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
4454f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
4468dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that enter logs when verbose logging is enabled
4478dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
4488dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
4498dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testEnterLogging() {
4508dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = spy(mWifiLog);
4518dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(true);
4528dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.installPacketFilter(new byte[0]);
4538dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        verify(mWifiVendorHal.mLog).trace(eq("% filter length %"));
4548dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
4558dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
4568dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
4578dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that enter does not log when verbose logging is not enabled
4588dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
4598dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
4608dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testEnterSilenceWhenNotEnabled() {
4618dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = spy(mWifiLog);
4628dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.installPacketFilter(new byte[0]);
4638dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(true);
4648dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(false);
4658dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.installPacketFilter(new byte[0]);
4668dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        verify(mWifiVendorHal.mLog, never()).trace(eq("% filter length %"));
4678dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
4688dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
4698dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
4708dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that boolResult logs a false result
4718dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
4728dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
4738dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testBoolResultFalse() {
4748dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = spy(mWifiLog);
4758dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = mWifiLog;
4768dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mVerboseLog = mWifiLog;
4776ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass        assertFalse(mWifiVendorHal.getBgScanCapabilities(new WifiNative.ScanCapabilities()));
4788dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        verify(mWifiLog).err("% returns %");
4798dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
4808dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
4818dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
4826ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass     * Test that getBgScanCapabilities is hooked up to the HAL correctly
48356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     *
48456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * A call before the vendor HAL is started should return a non-null result with version 0
48556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     *
48656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * A call after the HAL is started should return the mocked values.
48756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     */
48856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    @Test
4896ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass    public void testGetBgScanCapabilities() throws Exception {
49056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        StaBackgroundScanCapabilities capabilities = new StaBackgroundScanCapabilities();
49156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxCacheSize = 12;
49256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxBuckets = 34;
49356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxApCachePerScan = 56;
49456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxReportingThreshold = 78;
49556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
49656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        doAnswer(new AnswerWithArguments() {
49756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            public void answer(IWifiStaIface.getBackgroundScanCapabilitiesCallback cb)
49856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                    throws RemoteException {
49956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
50056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            }
50156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        }).when(mIWifiStaIface).getBackgroundScanCapabilities(any(
50256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                IWifiStaIface.getBackgroundScanCapabilitiesCallback.class));
50356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
50456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        WifiNative.ScanCapabilities result = new WifiNative.ScanCapabilities();
50556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
5066ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass        assertFalse(mWifiVendorHal.getBgScanCapabilities(result));  // should fail - not started
50756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());           // Start the vendor hal
5086ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass        assertTrue(mWifiVendorHal.getBgScanCapabilities(result));   // should succeed
50956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
51056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(12, result.max_scan_cache_size);
51156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(34, result.max_scan_buckets);
51256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(56, result.max_ap_cache_per_scan);
51356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(78, result.max_scan_reporting_threshold);
51456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
51556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
51656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    private void setupValidFrequenciesForBand(ArrayList<Integer> frequencies) throws Exception {
51756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
51856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        doAnswer(new AnswerWithArguments() {
51956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            public void answer(int band, IWifiStaIface.getValidFrequenciesForBandCallback cb)
52056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                    throws RemoteException {
52156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                cb.onValues(mWifiStatusSuccess, frequencies);
52256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            }
52356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        }).when(mIWifiStaIface).getValidFrequenciesForBand(anyInt(), any(
52456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                IWifiStaIface.getValidFrequenciesForBandCallback.class));
52556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
52656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        doAnswer(new AnswerWithArguments() {
52756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            public void answer(int band, IWifiApIface.getValidFrequenciesForBandCallback cb)
52856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                    throws RemoteException {
52956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                cb.onValues(mWifiStatusSuccess, frequencies);
53056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            }
53156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        }).when(mIWifiApIface).getValidFrequenciesForBand(anyInt(), any(
53256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                IWifiApIface.getValidFrequenciesForBandCallback.class));
53356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
53456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
53556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
53656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    private int[] intArrayFromArrayList(ArrayList<Integer> in) {
53756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        int[] ans = new int[in.size()];
53856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        int i = 0;
53956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        for (Integer e : in) ans[i++] = e;
54056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        return ans;
54156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
54256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
54356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    /**
54456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * Test that isGetChannelsForBandSupported works in STA mode
54556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     */
54656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    @Test
54756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    public void testGetChannelsForBandSupportedSta() throws Exception {
54856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        ArrayList<Integer> freq = new ArrayList<>();
54956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        freq.add(2405);
55056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
55156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        setupValidFrequenciesForBand(freq);
55256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
55356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertFalse(mWifiVendorHal.isGetChannelsForBandSupported());
55456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
55556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
55656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
55756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.isGetChannelsForBandSupported());
55856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
55956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
56056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    /**
56156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * Test that isGetChannelsForBandSupported works in AP mode
56256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     */
56356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    @Test
56456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    public void testGetChannelsForBandSupportedAp() throws Exception {
56556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        ArrayList<Integer> freq = new ArrayList<>();
56656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        freq.add(2405);
56756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
56856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        setupValidFrequenciesForBand(freq);
56956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
57056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertFalse(mWifiVendorHal.isGetChannelsForBandSupported());
57156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
57256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
57356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
57456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertTrue(mWifiVendorHal.isGetChannelsForBandSupported());
57556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
57656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
57756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    /**
5781dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Test translation to WifiManager.WIFI_FEATURE_*
5791dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     *
5801dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Just do a spot-check with a few feature bits here; since the code is table-
5811dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * driven we don't have to work hard to exercise all of it.
5821dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     */
5831dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    @Test
584ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    public void testStaIfaceFeatureMaskTranslation() {
5851dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int caps = (
5861dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                IWifiStaIface.StaIfaceCapabilityMask.BACKGROUND_SCAN
5871dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | IWifiStaIface.StaIfaceCapabilityMask.LINK_LAYER_STATS
5881dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass            );
5891dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int expected = (
590691806f65a5f259fd8e6b709c97d0035c418c483Michael Plass                WifiManager.WIFI_FEATURE_SCANNER
5911dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | WifiManager.WIFI_FEATURE_LINK_LAYER_STATS);
5921dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        assertEquals(expected, mWifiVendorHal.wifiFeatureMaskFromStaCapabilities(caps));
5931dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    }
5941dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
5951dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    /**
596ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Test translation to WifiManager.WIFI_FEATURE_*
597ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     *
598ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Just do a spot-check with a few feature bits here; since the code is table-
599ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * driven we don't have to work hard to exercise all of it.
600ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
601ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
602ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    public void testChipFeatureMaskTranslation() {
6035858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        int caps = (
6045858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.SET_TX_POWER_LIMIT
6055858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.D2D_RTT
6065858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.D2AP_RTT
6075858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        );
6085858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        int expected = (
6095858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                WifiManager.WIFI_FEATURE_TX_POWER_LIMIT
6105858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | WifiManager.WIFI_FEATURE_D2D_RTT
6115858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | WifiManager.WIFI_FEATURE_D2AP_RTT
6125858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        );
613ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertEquals(expected, mWifiVendorHal.wifiFeatureMaskFromChipCapabilities(caps));
614ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
615ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
616ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
617ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Test get supported features. Tests whether we coalesce information from different sources
618ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * (IWifiStaIface, IWifiChip and HalDeviceManager) into the bitmask of supported features
619ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * correctly.
620ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
621ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
622ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    public void testGetSupportedFeatures() throws Exception {
623ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
624ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
625ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        int staIfaceHidlCaps = (
626ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                IWifiStaIface.StaIfaceCapabilityMask.BACKGROUND_SCAN
627ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | IWifiStaIface.StaIfaceCapabilityMask.LINK_LAYER_STATS
628ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        );
629ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        int chipHidlCaps =
630ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.SET_TX_POWER_LIMIT;
631ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        Set<Integer>  halDeviceManagerSupportedIfaces = new HashSet<Integer>() {{
632ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                add(IfaceType.STA);
633ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                add(IfaceType.P2P);
634ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            }};
635ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        int expectedFeatureSet = (
636ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                WifiManager.WIFI_FEATURE_SCANNER
637ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_LINK_LAYER_STATS
638ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_TX_POWER_LIMIT
639ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_INFRA
640ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_P2P
641ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        );
642ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
643ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        doAnswer(new AnswerWithArguments() {
644ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            public void answer(IWifiStaIface.getCapabilitiesCallback cb) throws RemoteException {
645ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                cb.onValues(mWifiStatusSuccess, staIfaceHidlCaps);
646ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            }
647ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }).when(mIWifiStaIface).getCapabilities(any(IWifiStaIface.getCapabilitiesCallback.class));
648ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        doAnswer(new AnswerWithArguments() {
649ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            public void answer(IWifiChip.getCapabilitiesCallback cb) throws RemoteException {
650ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                cb.onValues(mWifiStatusSuccess, chipHidlCaps);
651ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            }
652ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }).when(mIWifiChip).getCapabilities(any(IWifiChip.getCapabilitiesCallback.class));
653ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        when(mHalDeviceManager.getSupportedIfaceTypes())
654ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                .thenReturn(halDeviceManagerSupportedIfaces);
655ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
656ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertEquals(expectedFeatureSet, mWifiVendorHal.getSupportedFeatureSet());
657ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
658ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
659ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
6604f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test enablement of link layer stats after startup
661699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
6624f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats before HAL start
6634f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - should not make it to the HAL layer
6644f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in STA mode
6654f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats twice more
6664f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - enable request should make it to the HAL layer
6674f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the requests (i.e., two calls total)
6684f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
6694f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
6704f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsEnableAfterStartup() throws Exception {
6714f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
6724f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
6734f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertNull(mWifiVendorHal.getWifiLinkLayerStats());
6744f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
6754f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
6764f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
6774f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
6784f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiVendorHal.getWifiLinkLayerStats();
6794f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiVendorHal.getWifiLinkLayerStats();
6804f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface).enableLinkLayerStatsCollection(false); // mLinkLayerStatsDebug
6814f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, times(2)).getLinkLayerStats(any());
6824f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
6834f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
6844f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
6854f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test that link layer stats are not enabled and harmless in AP mode
686699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
6874f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in AP mode
6884f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - stats should not be enabled
6894f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats
6904f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the request
6914f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
6924f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
6934f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsNotEnabledAndHarmlessInApMode() throws Exception {
6944f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
6954f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
6964f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
6974f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
6984f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertNull(mWifiVendorHal.getWifiLinkLayerStats());
6994f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
7004f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
7014f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
7024f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).enableLinkLayerStatsCollection(false);
7034f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).getLinkLayerStats(any());
7044f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
7054f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
706699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /**
707699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Test that the link layer stats fields are populated correctly.
708699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
709699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * This is done by filling with random values and then using toString on the
710699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * original and converted values, comparing just the numerics in the result.
711699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * This makes the assumption that the fields are in the same order in both string
712699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * representations, which is not quite true. So apply some fixups before the final
713699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * comparison.
714699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
715699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    @Test
716699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    public void testLinkLayerStatsAssignment() throws Exception {
717699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        Random r = new Random(1775968256);
718699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        StaLinkLayerStats stats = new StaLinkLayerStats();
719699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeBePktStats);
720699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeBkPktStats);
721699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeViPktStats);
722699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeVoPktStats);
7239ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        randomizeRadioStats(r, stats.radios);
7249ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius
725699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        stats.timeStampInMs = 42; // currently dropped in conversion
726699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
727699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        String expected = numbersOnly(stats.toString());
728699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
729699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        WifiLinkLayerStats converted = WifiVendorHal.frameworkFromHalLinkLayerStats(stats);
730699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
731699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        String actual = numbersOnly(converted.toString());
732699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
733699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        // Do the required fixups to the both expected and actual
7349ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        expected = rmValue(expected, stats.radios.get(0).rxTimeInMs);
7359ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        expected = rmValue(expected, stats.radios.get(0).onTimeInMsForScan);
736699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
7379ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        actual = rmValue(actual, stats.radios.get(0).rxTimeInMs);
7389ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        actual = rmValue(actual, stats.radios.get(0).onTimeInMsForScan);
739699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        actual = actual + "42 ";
740699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
741699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        // The remaining fields should agree
742699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        assertEquals(expected, actual);
743699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
744699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
745699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /** Just the digits with delimiting spaces, please */
746699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static String numbersOnly(String s) {
747699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        return s.replaceAll("[^0-9]+", " ");
748699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
749699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
750699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /** Remove the given value from the space-delimited string, or die trying. */
751699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static String rmValue(String s, long value) throws Exception {
752699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        String ans = s.replaceAll(" " + value + " ", " ");
753699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        assertNotEquals(s, ans);
754699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        return ans;
755699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
756699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
757699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /**
758699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Populate packet stats with non-negative random values
759699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
760699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static void randomizePacketStats(Random r, StaLinkLayerIfacePacketStats pstats) {
761699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.rxMpdu = r.nextLong() & 0xFFFFFFFFFFL; // more than 32 bits
762699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.txMpdu = r.nextLong() & 0xFFFFFFFFFFL;
763699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.lostMpdu = r.nextLong() & 0xFFFFFFFFFFL;
764699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.retries = r.nextLong() & 0xFFFFFFFFFFL;
765699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
766699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
767699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass   /**
768699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Populate radio stats with non-negative random values
769699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
7709ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius    private static void randomizeRadioStats(Random r, ArrayList<StaLinkLayerRadioStats> rstats) {
7719ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        StaLinkLayerRadioStats rstat = new StaLinkLayerRadioStats();
7729ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.onTimeInMs = r.nextInt() & 0xFFFFFF;
7739ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.txTimeInMs = r.nextInt() & 0xFFFFFF;
774699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        for (int i = 0; i < 4; i++) {
775699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass            Integer v = r.nextInt() & 0xFFFFFF;
7769ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius            rstat.txTimeInMsPerLevel.add(v);
777699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        }
7789ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.rxTimeInMs = r.nextInt() & 0xFFFFFF;
7799ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.onTimeInMsForScan = r.nextInt() & 0xFFFFFF;
7809ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstats.add(rstat);
781699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
7824f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
7837e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    /**
7847e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Test that getFirmwareVersion() and getDriverVersion() work
7857e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     *
7867e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Calls before the STA is started are expected to return null.
7877e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     */
7887e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    @Test
7897e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    public void testVersionGetters() throws Exception {
7907e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String firmwareVersion = "fuzzy";
7917e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String driverVersion = "dizzy";
7927e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        IWifiChip.ChipDebugInfo chipDebugInfo = new IWifiChip.ChipDebugInfo();
7937e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.firmwareDescription = firmwareVersion;
7947e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.driverDescription = driverVersion;
7957e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
7967e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        doAnswer(new AnswerWithArguments() {
7977e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            public void answer(IWifiChip.requestChipDebugInfoCallback cb) throws RemoteException {
7987e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass                cb.onValues(mWifiStatusSuccess, chipDebugInfo);
7997e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            }
8007e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        }).when(mIWifiChip).requestChipDebugInfo(any(IWifiChip.requestChipDebugInfoCallback.class));
8017e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
8027e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getFirmwareVersion());
8037e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getDriverVersion());
8047e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
8057e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
8067e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
8077e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(firmwareVersion, mWifiVendorHal.getFirmwareVersion());
8087e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(driverVersion, mWifiVendorHal.getDriverVersion());
8097e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    }
810ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
811ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
812ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * For checkRoundTripIntTranslation lambdas
813ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
814ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    interface IntForInt {
815ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        int translate(int value);
816ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
817ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
818ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
819ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Checks that translation from x to y and back again is the identity function
820ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     *
821ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param xFromY reverse translator
822ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param yFromX forward translator
823ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param xLimit non-inclusive upper bound on x (lower bound is zero)
824ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
825ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    private void checkRoundTripIntTranslation(
826ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            IntForInt xFromY, IntForInt yFromX, int xFirst, int xLimit) throws Exception {
827ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        int ex = 0;
828ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        for (int i = xFirst; i < xLimit; i++) {
829ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertEquals(i, xFromY.translate(yFromX.translate(i)));
830ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
831ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        try {
832ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            yFromX.translate(xLimit);
833ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertTrue("expected an exception here", false);
834ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        } catch (IllegalArgumentException e) {
835ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            ex++;
836ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
837ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        try {
838ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            xFromY.translate(yFromX.translate(xLimit - 1) + 1);
839ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertTrue("expected an exception here", false);
840ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        } catch (IllegalArgumentException e) {
841ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            ex++;
842ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
843ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertEquals(2, ex);
844ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
845ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
846ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
847ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
848ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of RTT type
849ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
850ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
851ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testRttTypeTranslation() throws Exception {
852ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
853ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halRttTypeFromFrameworkRttType(y),
854ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkRttTypeFromHalRttType(x),
855ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                1, 3);
856ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
857ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
858ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
859ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of peer type
860ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
861ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
862ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testPeerTranslation() throws Exception {
863ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
864ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halPeerFromFrameworkPeer(y),
865ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkPeerFromHalPeer(x),
866ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                1, 6);
867ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
868ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
869ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
870ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of channel width
871ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
872ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
873ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testChannelWidth() throws Exception {
874ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
875ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halChannelWidthFromFrameworkChannelWidth(y),
876ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkChannelWidthFromHalChannelWidth(x),
877ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 5);
878ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
879ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
880ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
881ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of preamble type mask
882ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
883ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
884ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testPreambleTranslation() throws Exception {
885ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
886ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halPreambleFromFrameworkPreamble(y),
887ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkPreambleFromHalPreamble(x),
888ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 8);
889ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
890ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
891ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
892ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of bandwidth mask
893ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
894ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
895ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testBandwidthTranslations() throws Exception {
896ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
897ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halBwFromFrameworkBw(y),
898ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkBwFromHalBw(x),
899ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 64);
900ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
901ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
902ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
903ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testGetRttStuff() throws Exception {
904ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttManager.RttParams params = new RttManager.RttParams();
905ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) populate
906ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttConfig config = WifiVendorHal.halRttConfigFromFrameworkRttParams(params);
907ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) check
908ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
909ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
910ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
911ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testGetRttCapabilities() throws Exception {
912ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttCapabilities capabilities = new RttCapabilities();
913ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) populate
914ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
915ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        doAnswer(new AnswerWithArguments() {
916ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            public void answer(IWifiRttController.getCapabilitiesCallback cb)
917ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                    throws RemoteException {
918ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
919ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            }
920ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }).when(mIWifiRttController).getCapabilities(any(
921ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                IWifiRttController.getCapabilitiesCallback.class));
922ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
923ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertNull(mWifiVendorHal.getRttCapabilities());
924ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
925ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
926ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
927ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttManager.RttCapabilities actual = mWifiVendorHal.getRttCapabilities();
928ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        //TODO(b/34901744) check
929ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
930ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
931ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
932ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    //TODO(b/34901744) negative RTT test cases as well.
933ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    // e.g. invoke RTT without putting the HAL in the correct mode.
934ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
935ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
936df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     * Test that setScanningMacOui is hooked up to the HAL correctly
937df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     */
938df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    @Test
939df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    public void testSetScanningMacOui() throws Exception {
940df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] oui = NativeUtil.macAddressOuiToByteArray("DA:A1:19");
941df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] zzz = NativeUtil.macAddressOuiToByteArray("00:00:00");
942df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
943df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        when(mIWifiStaIface.setScanningMacOui(any())).thenReturn(mWifiStatusSuccess);
944df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
945df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(oui)); // expect fail - STA not started
946df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
947df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(null));  // expect fail - null
948df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(new byte[]{(byte) 1})); // expect fail - len
949df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.setScanningMacOui(oui));
950df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.setScanningMacOui(zzz));
951df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
952df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(oui));
953df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(zzz));
954df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    }
955df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
95670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
95770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStartSendingOffloadedPacket() throws Exception {
95870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        byte[] srcMac = NativeUtil.macAddressToByteArray("4007b2088c81");
95970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress src = InetAddress.parseNumericAddress("192.168.13.13");
96070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress dst = InetAddress.parseNumericAddress("93.184.216.34");
96170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
96270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int millis = 16000;
96370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
96470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        KeepalivePacketData kap = KeepalivePacketData.nattKeepalivePacket(src, 63000, dst, 4500);
96570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
96670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.startSendingKeepAlivePackets(
96770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                anyInt(), any(), anyShort(), any(), any(), anyInt()
96870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        )).thenReturn(mWifiStatusSuccess);
96970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
97070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
97170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(0 == mWifiVendorHal.startSendingOffloadedPacket(slot, srcMac, kap, millis));
97270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
97370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).startSendingKeepAlivePackets(
97470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                eq(slot), any(), anyShort(), any(), any(), eq(millis));
97570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
97670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
97770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
97870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStopSendingOffloadedPacket() throws Exception {
97970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
98070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
98170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.stopSendingKeepAlivePackets(anyInt())).thenReturn(mWifiStatusSuccess);
98270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
98370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
98470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(0 == mWifiVendorHal.stopSendingOffloadedPacket(slot));
98570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
98670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).stopSendingKeepAlivePackets(eq(slot));
98770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
98870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
989df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    /**
9903401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     * Test the setup, invocation, and removal of a RSSI event handler
9913401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     *
9923401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     */
9933401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    @Test
9943401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    public void testRssiMonitoring() throws Exception {
9953401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        when(mIWifiStaIface.startRssiMonitoring(anyInt(), anyInt(), anyInt()))
9963401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenReturn(mWifiStatusSuccess);
9973401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        when(mIWifiStaIface.stopRssiMonitoring(anyInt()))
9983401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenReturn(mWifiStatusSuccess);
9993401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
10003401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        ArrayList<Byte> breach = new ArrayList<>(10);
10013401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte hi = -21;
10023401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte med = -42;
10033401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte lo = -84;
10043401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        Byte lower = -88;
10053401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        WifiNative.WifiRssiEventHandler handler;
10063401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        handler = ((cur) -> {
10073401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass            breach.add(cur);
10083401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        });
10093401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(hi, lo, handler)); // not started
10103401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.stopRssiMonitoring()); // not started
10113401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
10123401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(hi, lo, handler));
10133401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        int theCmdId = mWifiVendorHal.sRssiMonCmdId;
10143401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        breach.clear();
10153401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        mIWifiStaIfaceEventCallback.onRssiThresholdBreached(theCmdId, new byte[6], lower);
10163401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(breach.get(0), lower);
10173401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.stopRssiMonitoring());
10183401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(hi, lo, handler));
10193401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(med, lo, handler)); // replacing works
10203401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(hi, lo, null)); // null handler fails
10213401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(0, mWifiVendorHal.startRssiMonitoring(hi, lo, handler));
10223401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(lo, hi, handler)); // empty range
10233401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    }
10243401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
10253401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    /**
1026ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * Test that getApfCapabilities is hooked up to the HAL correctly
1027ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
1028ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call before the vendor HAL is started should return a non-null result with version 0
1029ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
1030ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call after the HAL is started should return the mocked values.
1031ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
1032ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
1033ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testApfCapabilities() throws Exception {
1034ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myVersion = 33;
1035ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myMaxSize = 1234;
1036ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1037ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        StaApfPacketFilterCapabilities capabilities = new StaApfPacketFilterCapabilities();
1038ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.version = myVersion;
1039ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.maxLength = myMaxSize;
1040ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1041ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        doAnswer(new AnswerWithArguments() {
1042ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            public void answer(IWifiStaIface.getApfPacketFilterCapabilitiesCallback cb)
1043ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                    throws RemoteException {
1044ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
1045ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            }
1046ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        }).when(mIWifiStaIface).getApfPacketFilterCapabilities(any(
1047ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                IWifiStaIface.getApfPacketFilterCapabilitiesCallback.class));
1048ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1049ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1050ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(0, mWifiVendorHal.getApfCapabilities().apfVersionSupported);
1051ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1052ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1053ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1054ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        ApfCapabilities actual = mWifiVendorHal.getApfCapabilities();
1055ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1056ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myVersion, actual.apfVersionSupported);
1057ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myMaxSize, actual.maximumApfProgramSize);
1058ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(android.system.OsConstants.ARPHRD_ETHER, actual.apfPacketFormat);
1059ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertNotEquals(0, actual.apfPacketFormat);
1060ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
1061ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1062ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
106370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass     * Test that an APF program can be installed.
1064ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
1065ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
1066ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testInstallApf() throws Exception {
1067ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        byte[] filter = new byte[] {19, 53, 10};
1068ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1069ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        ArrayList<Byte> expected = new ArrayList<>(3);
1070ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        for (byte b : filter) expected.add(b);
1071ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1072ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        when(mIWifiStaIface.installApfPacketFilter(anyInt(), any(ArrayList.class)))
1073ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                .thenReturn(mWifiStatusSuccess);
1074ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1075ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1076ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.installPacketFilter(filter));
1077ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1078ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        verify(mIWifiStaIface).installApfPacketFilter(eq(0), eq(expected));
1079ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
1080f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1081f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    /**
1082f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     * Test that the country code is set in AP mode (when it should be).
1083f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     */
1084f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    @Test
1085f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    public void testSetCountryCodeHal() throws Exception {
1086f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        byte[] expected = new byte[]{(byte) 'C', (byte) 'A'};
1087f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1088f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        when(mIWifiApIface.setCountryCode(any()))
1089f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass                .thenReturn(mWifiStatusSuccess);
1090f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1091f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
1092f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1093f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal(null));
1094f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal(""));
1095f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal("A"));
1096f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertTrue(mWifiVendorHal.setCountryCodeHal("CA")); // Only one expected to succeed
1097f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal("ZZZ"));
1098f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1099f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        verify(mIWifiApIface).setCountryCode(eq(expected));
1100f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    }
110153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
110253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
11038dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that RemoteException is caught and logged.
11048dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
11058dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
11068dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testRemoteExceptionIsHandled() throws Exception {
11078dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = spy(mWifiLog);
1108e1d5fa72eb35fb8f936e19d0830548593de6a6ffMichael Plass        mWifiVendorHal.mVerboseLog = mWifiLog;
11098dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        when(mIWifiApIface.setCountryCode(any()))
11108dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass                .thenThrow(new RemoteException("oops"));
11118dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
11128dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal("CA"));
1113e1d5fa72eb35fb8f936e19d0830548593de6a6ffMichael Plass        assertFalse(mWifiVendorHal.isHalStarted());
11148dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        verify(mWifiLog).err(any());
11158dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
11168dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
11178dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
111853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that startLoggingToDebugRingBuffer is plumbed to chip
111953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
112053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * A call before the vendor hal is started should just return false.
112153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * After starting in STA mode, the call should succeed, and pass ther right things down.
112253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
112353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
112453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBuffer() throws Exception {
112553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
112653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
112753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
112853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
112953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
113053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
113153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
113253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
113353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
113453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
113553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
113653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
113753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Same test as testStartLoggingRingBuffer, but in AP mode rather than STA.
113853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
113953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
114053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBufferOnAp() throws Exception {
114153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
114253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
114353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
114453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
114553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
114653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
114753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
114853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
114953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
115053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
115153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
115253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
115353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferStatus gets and translates its stuff correctly
115453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
115553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
115653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testRingBufferStatus() throws Exception {
115753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus one = new WifiDebugRingBufferStatus();
115853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringName = "One";
115953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.flags = WifiDebugRingBufferFlags.HAS_BINARY_ENTRIES;
116053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringId = 5607371;
116153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.sizeInBytes = 54321;
116253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.freeSizeInBytes = 42;
116353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.verboseLevel = WifiDebugRingBufferVerboseLevel.VERBOSE;
116453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        String oneExpect = "name: One flag: 1 ringBufferId: 5607371 ringBufferByteSize: 54321"
116553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                + " verboseLevel: 2 writtenBytes: 0 readBytes: 0 writtenRecords: 0";
116653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
116753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus two = new WifiDebugRingBufferStatus();
116853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringName = "Two";
116953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.flags = WifiDebugRingBufferFlags.HAS_ASCII_ENTRIES
117053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                | WifiDebugRingBufferFlags.HAS_PER_PACKET_ENTRIES;
117153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringId = 4512470;
117253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.sizeInBytes = 300;
117353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.freeSizeInBytes = 42;
117453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.verboseLevel = WifiDebugRingBufferVerboseLevel.DEFAULT;
117553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
117653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        ArrayList<WifiDebugRingBufferStatus> halBufferStatus = new ArrayList<>(2);
117753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(one);
117853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(two);
117953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
118053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiNative.RingBufferStatus[] actual;
118153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
118253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        doAnswer(new AnswerWithArguments() {
118353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            public void answer(IWifiChip.getDebugRingBuffersStatusCallback cb)
118453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                    throws RemoteException {
118553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                cb.onValues(mWifiStatusSuccess, halBufferStatus);
118653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            }
118753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        }).when(mIWifiChip).getDebugRingBuffersStatus(any(
118853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                IWifiChip.getDebugRingBuffersStatusCallback.class));
118953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
119053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
119153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        actual = mWifiVendorHal.getRingBufferStatus();
119253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
119353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(halBufferStatus.size(), actual.length);
119453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(oneExpect, actual[0].toString());
119553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(two.ringId, actual[1].ringBufferId);
119653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
119753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
119853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
119953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
120053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferData calls forceDumpToDebugRingBuffer
120153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
120253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Try once before hal start, and twice after (one success, one failure).
120353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
120453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
120553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testForceRingBufferDump() throws Exception {
120653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Gunk"))).thenReturn(mWifiStatusSuccess);
120753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Glop"))).thenReturn(mWifiStatusFailure);
120853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
120953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Gunk")); // hal not started
121053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
121153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
121253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
121353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.getRingBufferData("Gunk")); // mocked call succeeds
121453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Glop")); // mocked call fails
121553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
121653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Gunk");
121753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Glop");
121853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
121953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
12205a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
12215a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the start of packet fate monitoring.
12225a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
12235a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after (one success, one failure).
12245a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
12255a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
12265a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testStartPktFateMonitoring() throws Exception {
12275a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        when(mIWifiStaIface.startDebugPacketFateMonitoring()).thenReturn(mWifiStatusSuccess);
12285a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12295a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.startPktFateMonitoring());
12305a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never()).startDebugPacketFateMonitoring();
12315a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12325a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
12335a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startPktFateMonitoring());
12345a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface).startDebugPacketFateMonitoring();
12355a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
12365a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12375a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
12385a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of tx packet fates.
12395a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
12405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
12415a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
12425a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
12435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFates() throws Exception {
12445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
12455a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
12465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugTxPacketFateReport fateReport = new WifiDebugTxPacketFateReport();
12475a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugTxPacketFate.DRV_QUEUED;
12485a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
12495a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.ETHERNET_II;
12505a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
12515a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
12525a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12535a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
12545a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugTxPacketFatesCallback cb) {
12555a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
12565a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugTxPacketFateReport>(Arrays.asList(fateReport)));
12575a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
12585a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
12595a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
12605a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12615a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.TxFateReport[] retrievedFates = new WifiNative.TxFateReport[1];
12625a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getTxPktFates(retrievedFates));
12635a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
12645a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
12655a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12665a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
12675a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12685a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getTxPktFates(retrievedFates));
12695a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
12705a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
12715a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.TX_PKT_FATE_DRV_QUEUED, retrievedFates[0].mFate);
12725a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
12735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
12745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, retrievedFates[0].mFrameType);
12755a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
12765a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
12775a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12785a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
12795a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of tx packet fates when the number of fates retrieved exceeds the
12805a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * input array.
12815a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
12825a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
12835a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
12845a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
12855a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFatesExceedsInputArrayLength() throws Exception {
12865a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
12875a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
12885a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugTxPacketFateReport fateReport = new WifiDebugTxPacketFateReport();
12895a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugTxPacketFate.FW_DROP_OTHER;
12905a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
12915a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.MGMT_80211;
12925a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
12935a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
12945a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
12955a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
12965a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugTxPacketFatesCallback cb) {
12975a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
12985a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugTxPacketFateReport>(Arrays.asList(
12995a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                                fateReport, fateReport)));
13005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
13015a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
13025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
13035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.TxFateReport[] retrievedFates = new WifiNative.TxFateReport[1];
13055a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getTxPktFates(retrievedFates));
13065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
13075a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
13085a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13095a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
13105a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13115a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getTxPktFates(retrievedFates));
13125a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
13135a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
13145a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.TX_PKT_FATE_FW_DROP_OTHER, retrievedFates[0].mFate);
13155a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
13165a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
13175a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_80211_MGMT, retrievedFates[0].mFrameType);
13185a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
13195a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
13205a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13215a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
13225a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of rx packet fates.
13235a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
13245a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
13255a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
13265a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
13275a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFates() throws Exception {
13285a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
13295a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
13305a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugRxPacketFateReport fateReport = new WifiDebugRxPacketFateReport();
13315a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugRxPacketFate.SUCCESS;
13325a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
13335a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.ETHERNET_II;
13345a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
13355a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
13365a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13375a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
13385a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugRxPacketFatesCallback cb) {
13395a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
13405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugRxPacketFateReport>(Arrays.asList(fateReport)));
13415a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
13425a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
13435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
13445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13455a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.RxFateReport[] retrievedFates = new WifiNative.RxFateReport[1];
13465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getRxPktFates(retrievedFates));
13475a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
13485a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
13495a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13505a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
13515a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13525a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getRxPktFates(retrievedFates));
13535a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
13545a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
13555a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.RX_PKT_FATE_SUCCESS, retrievedFates[0].mFate);
13565a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
13575a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
13585a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, retrievedFates[0].mFrameType);
13595a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
13605a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
13615a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13625a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
13635a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of rx packet fates when the number of fates retrieved exceeds the
13645a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * input array.
13655a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
13665a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
13675a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
13685a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
13695a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFatesExceedsInputArrayLength() throws Exception {
13705a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
13715a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
13725a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugRxPacketFateReport fateReport = new WifiDebugRxPacketFateReport();
13735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugRxPacketFate.FW_DROP_FILTER;
13745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
13755a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.MGMT_80211;
13765a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
13775a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
13785a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13795a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
13805a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugRxPacketFatesCallback cb) {
13815a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
13825a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugRxPacketFateReport>(Arrays.asList(
13835a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                                fateReport, fateReport)));
13845a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
13855a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
13865a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
13875a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13885a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.RxFateReport[] retrievedFates = new WifiNative.RxFateReport[1];
13895a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getRxPktFates(retrievedFates));
13905a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
13915a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
13925a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13935a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
13945a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
13955a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.getRxPktFates(retrievedFates));
13965a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
13975a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
13985a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.RX_PKT_FATE_FW_DROP_FILTER, retrievedFates[0].mFate);
13995a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
14005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
14015a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_80211_MGMT, retrievedFates[0].mFrameType);
14025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
14035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
14045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14055a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
14065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the failure to retrieve tx packet fates when the input array is empty.
14075a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
14085a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
14095a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFatesEmptyInputArray() throws Exception {
14105a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
14115a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getTxPktFates(new WifiNative.TxFateReport[0]));
14125a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
14135a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14145a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
14155a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14165a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
14175a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the failure to retrieve rx packet fates when the input array is empty.
14185a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
14195a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
14205a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFatesEmptyInputArray() throws Exception {
14215a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
14225a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertFalse(mWifiVendorHal.getRxPktFates(new WifiNative.RxFateReport[0]));
14235a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
14245a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
14255a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
1426135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1427135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    /**
1428135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     * Tests the nd offload enable/disable.
1429135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     */
1430135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    @Test
1431135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    public void testEnableDisableNdOffload() throws Exception {
1432135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        when(mIWifiStaIface.enableNdOffload(anyBoolean())).thenReturn(mWifiStatusSuccess);
1433135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1434135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertFalse(mWifiVendorHal.configureNeighborDiscoveryOffload(true));
1435135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface, never()).enableNdOffload(anyBoolean());
1436135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1437135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1438135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1439135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.configureNeighborDiscoveryOffload(true));
1440135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(true));
1441135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.configureNeighborDiscoveryOffload(false));
1442135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(false));
1443135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    }
1444135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1445135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    /**
1446135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     * Tests the nd offload enable failure.
1447135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     */
1448135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    @Test
1449135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    public void testEnableNdOffloadFailure() throws Exception {
1450135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        when(mIWifiStaIface.enableNdOffload(eq(true))).thenReturn(mWifiStatusFailure);
1451135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1452135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1453135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1454135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertFalse(mWifiVendorHal.configureNeighborDiscoveryOffload(true));
1455135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(true));
1456135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    }
1457cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1458cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    /**
1459cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     * Tests the retrieval of wlan wake reason stats.
1460cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     */
1461cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    @Test
1462cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    public void testGetWlanWakeReasonCount() throws Exception {
1463cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        WifiDebugHostWakeReasonStats stats = new WifiDebugHostWakeReasonStats();
1464cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        Random rand = new Random();
1465cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalCmdEventWakeCnt = rand.nextInt();
1466cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalDriverFwLocalWakeCnt = rand.nextInt();
1467cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalRxPacketWakeCnt = rand.nextInt();
1468cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxPktWakeDetails.rxUnicastCnt = rand.nextInt();
1469cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxPktWakeDetails.rxMulticastCnt = rand.nextInt();
1470cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxIcmpPkWakeDetails.icmpPkt = rand.nextInt();
1471cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxIcmpPkWakeDetails.icmp6Pkt = rand.nextInt();
1472cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt = rand.nextInt();
1473cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt = rand.nextInt();
1474cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1475cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        doAnswer(new AnswerWithArguments() {
1476cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            public void answer(IWifiChip.getDebugHostWakeReasonStatsCallback cb) {
1477cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                cb.onValues(mWifiStatusSuccess, stats);
1478cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            }
1479cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        }).when(mIWifiChip).getDebugHostWakeReasonStats(
1480cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1481cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1482cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNull(mWifiVendorHal.getWlanWakeReasonCount());
1483cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip, never())
1484cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                .getDebugHostWakeReasonStats(
1485cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                        any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1486cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1487cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1488cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1489cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        WifiWakeReasonAndCounts retrievedStats = mWifiVendorHal.getWlanWakeReasonCount();
1490cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip).getDebugHostWakeReasonStats(
1491cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1492cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNotNull(retrievedStats);
1493cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalCmdEventWakeCnt, retrievedStats.totalCmdEventWake);
1494cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalDriverFwLocalWakeCnt, retrievedStats.totalDriverFwLocalWake);
1495cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalRxPacketWakeCnt, retrievedStats.totalRxDataWake);
1496cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxPktWakeDetails.rxUnicastCnt, retrievedStats.rxUnicast);
1497cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxPktWakeDetails.rxMulticastCnt, retrievedStats.rxMulticast);
1498cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxIcmpPkWakeDetails.icmpPkt, retrievedStats.icmp);
1499cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxIcmpPkWakeDetails.icmp6Pkt, retrievedStats.icmp6);
1500cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt,
1501cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                retrievedStats.ipv4RxMulticast);
1502cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt,
1503cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                retrievedStats.ipv6Multicast);
1504cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    }
1505cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1506cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    /**
1507cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     * Tests the failure in retrieval of wlan wake reason stats.
1508cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     */
1509cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    @Test
1510cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    public void testGetWlanWakeReasonCountFailure() throws Exception {
1511cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        doAnswer(new AnswerWithArguments() {
1512cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            public void answer(IWifiChip.getDebugHostWakeReasonStatsCallback cb) {
1513cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                cb.onValues(mWifiStatusFailure, new WifiDebugHostWakeReasonStats());
1514cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            }
1515cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        }).when(mIWifiChip).getDebugHostWakeReasonStats(
1516cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1517cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1518cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        // This should work in both AP & STA mode.
1519cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
1520cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1521cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNull(mWifiVendorHal.getWlanWakeReasonCount());
1522cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip).getDebugHostWakeReasonStats(
1523cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1524cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    }
15252f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
15262f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    /**
15272f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Test that getFwMemoryDump is properly plumbed
15282f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     */
15292f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    @Test
15302f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    public void testGetFwMemoryDump() throws Exception {
15312f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        byte [] sample = NativeUtil.hexStringToByteArray("268c7a3fbfa4661c0bdd6a36");
15322f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        ArrayList<Byte> halBlob = NativeUtil.byteArrayToArrayList(sample);
15332f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
15342f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        doAnswer(new AnswerWithArguments() {
15352f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            public void answer(IWifiChip.requestFirmwareDebugDumpCallback cb)
15362f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                    throws RemoteException {
15372f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                cb.onValues(mWifiStatusSuccess, halBlob);
15382f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            }
15392f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        }).when(mIWifiChip).requestFirmwareDebugDump(any(
15402f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                IWifiChip.requestFirmwareDebugDumpCallback.class));
15412f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
15422f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
15432f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertArrayEquals(sample, mWifiVendorHal.getFwMemoryDump());
15442f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    }
15452f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
15462f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    /**
15472f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Test that getDriverStateDump is properly plumbed
15482f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     *
15492f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Just for variety, use AP mode here.
15502f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     */
15512f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    @Test
15522f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    public void testGetDriverStateDump() throws Exception {
15532f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        byte [] sample = NativeUtil.hexStringToByteArray("e83ff543cf80083e6459d20f");
15542f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        ArrayList<Byte> halBlob = NativeUtil.byteArrayToArrayList(sample);
15552f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
15562f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        doAnswer(new AnswerWithArguments() {
15572f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            public void answer(IWifiChip.requestDriverDebugDumpCallback cb)
15582f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                    throws RemoteException {
15592f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                cb.onValues(mWifiStatusSuccess, halBlob);
15602f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            }
15612f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        }).when(mIWifiChip).requestDriverDebugDump(any(
15622f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                IWifiChip.requestDriverDebugDumpCallback.class));
15632f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
15642f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
15652f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertArrayEquals(sample, mWifiVendorHal.getDriverStateDump());
15662f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    }
1567d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1568d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1569d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan failure is handled correctly.
1570d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1571d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1572d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFailureCallback() throws Exception {
1573d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1574d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1575d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1576d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1577d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1578d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1579d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanFailure(mWifiVendorHal.mScan.cmdId);
1580d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_FAILED);
1581d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1582d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1583d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1584136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test that background scan failure with wrong id is not reported.
1585d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1586d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1587d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFailureCallbackWithInvalidCmdId() throws Exception {
1588d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1589d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1590d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1591d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1592d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1593d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1594d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanFailure(mWifiVendorHal.mScan.cmdId + 1);
1595d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler, never()).onScanStatus(WifiNative.WIFI_SCAN_FAILED);
1596d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1597d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1598d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1599d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan full results are handled correctly.
1600d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1601d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1602d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFullScanResults() throws Exception {
1603d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1604d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1605d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1606d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1607d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1608d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1609d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<StaScanResult, ScanResult> result = createHidlAndFrameworkBgScanResult();
1610d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundFullScanResult(
16116b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius                mWifiVendorHal.mScan.cmdId, 5, result.first);
1612d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1613d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArgumentCaptor<ScanResult> scanResultCaptor = ArgumentCaptor.forClass(ScanResult.class);
16146b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(eventHandler).onFullScanResult(scanResultCaptor.capture(), eq(5));
1615d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1616d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanResultEqual(result.second, scanResultCaptor.getValue());
1617d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1618d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1619d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1620d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan results are handled correctly.
1621d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1622d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1623d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanScanResults() throws Exception {
1624d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1625d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1626d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1627d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1628d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1629d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1630d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<ArrayList<StaScanData>, ArrayList<WifiScanner.ScanData>> data =
1631d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                createHidlAndFrameworkBgScanDatas();
1632d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanResults(
1633d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                mWifiVendorHal.mScan.cmdId, data.first);
1634d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1635d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);
1636d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanDatasEqual(
1637d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                data.second, Arrays.asList(mWifiVendorHal.mScan.latestScanResults));
1638d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1639d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
16401514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
1641136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test that starting a new background scan when one is active will stop the previous one.
1642136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1643136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1644136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanReplacement() throws Exception {
1645136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1646136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1647136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1648136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1649136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1650136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId1 = mWifiVendorHal.mScan.cmdId;
1651136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1652136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotEquals(mWifiVendorHal.mScan.cmdId, cmdId1);
1653136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface, times(2)).startBackgroundScan(anyInt(), any());
1654136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId1);
1655136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1656136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1657136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
1658136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test stopping a background scan.
1659136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1660136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1661136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanStop() throws Exception {
1662136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1663136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1664136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1665136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1666136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1667136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1668136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId = mWifiVendorHal.mScan.cmdId;
1669136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
16706ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass        mWifiVendorHal.stopBgScan();
16716ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass        mWifiVendorHal.stopBgScan(); // second call should not do anything
1672136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId); // Should be called just once
1673136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1674136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1675136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
1676136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test pausing and restarting a background scan.
1677136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1678136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1679136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanPauseAndRestart() throws Exception {
1680136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1681136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1682136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1683136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1684136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1685136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1686136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId = mWifiVendorHal.mScan.cmdId;
1687136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
16886ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass        mWifiVendorHal.pauseBgScan();
16896ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass        mWifiVendorHal.restartBgScan();
1690136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId); // Should be called just once
1691136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface, times(2)).startBackgroundScan(eq(cmdId), any());
1692136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1693136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1694136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
16951514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of log handler set.
16961514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
16971514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
16981514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testSetLogHandler() throws Exception {
16991514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
17001514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17011514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
17021514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
17031514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17041514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.setLoggingEventHandler(eventHandler));
17051514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
17061514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17071514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
17081514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17091514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
17101514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
17111514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        reset(mIWifiChip);
17121514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17131514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Second call should fail.
17141514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.setLoggingEventHandler(eventHandler));
17151514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
17161514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
17171514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17181514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
17191514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of log handler reset.
17201514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
17211514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
17221514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testResetLogHandler() throws Exception {
17231514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
17246b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
17251514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17261514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
17271514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
17286b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
17291514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17301514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
17311514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17321514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Not set, so this should fail.
17331514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
17341514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
17356b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
17361514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17371514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now set and then reset.
17381514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(
17391514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class)));
17401514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
17411514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(false));
17426b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip).stopLoggingToDebugRingBuffer();
17431514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        reset(mIWifiChip);
17441514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17451514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Second reset should fail.
17461514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
17471514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
17486b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
17491514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
17501514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17511514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
17521514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of alert callback.
17531514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
17541514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
17551514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testAlertCallback() throws Exception {
17561514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
17576b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
17581514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17591514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
17601514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertNotNull(mIWifiChipEventCallback);
17611514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17621514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        int errorCode = 5;
17631514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        byte[] errorData = new byte[45];
17641514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        new Random().nextBytes(errorData);
17651514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17661514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Randomly raise the HIDL callback before we register for the log callback.
17675e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        // This should be safely ignored. (Not trigger NPE.)
17681514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugErrorAlert(
17691514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
17705e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
17711514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17721514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
17731514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
17741514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
17751514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
17761514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17771514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now raise the HIDL callback, this should be properly handled.
17781514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugErrorAlert(
17791514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
17805e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
17811514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(eventHandler).onWifiAlert(eq(errorCode), eq(errorData));
17821514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17831514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now stop the logging and invoke the callback. This should be ignored.
17845e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        reset(eventHandler);
17851514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
17861514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugErrorAlert(
17871514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
17885e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
17895e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        verify(eventHandler, never()).onWifiAlert(anyInt(), anyObject());
17901514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
17911514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
17921514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
17931514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of ring buffer callback.
17941514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
17951514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
17961514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testRingBufferDataCallback() throws Exception {
17971514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
17986b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
17991514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18001514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
18011514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertNotNull(mIWifiChipEventCallback);
18021514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18031514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        byte[] errorData = new byte[45];
18041514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        new Random().nextBytes(errorData);
18051514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18061514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Randomly raise the HIDL callback before we register for the log callback.
18075e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        // This should be safely ignored. (Not trigger NPE.)
18081514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
18091514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
18105e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
18111514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18121514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
18131514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
18141514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
18151514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
18161514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18171514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now raise the HIDL callback, this should be properly handled.
18181514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
18191514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
18205e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
18211514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(eventHandler).onRingBufferData(
18221514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                any(WifiNative.RingBufferStatus.class), eq(errorData));
18231514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18241514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now stop the logging and invoke the callback. This should be ignored.
18255e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        reset(eventHandler);
18261514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
18271514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
18281514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
18295e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
18305e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        verify(eventHandler, never()).onRingBufferData(anyObject(), anyObject());
18311514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
18321514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
1833af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    /**
1834af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius     * Test the handling of Vendor HAL death.
1835af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius     */
1836af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    @Test
1837af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    public void testVendorHalDeath() {
1838af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        // Invoke the HAL device manager status callback with ready set to false to indicate the
1839af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        // death of the HAL.
1840af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        when(mHalDeviceManager.isReady()).thenReturn(false);
1841af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        mHalDeviceManagerStatusCallbacks.onStatusChanged();
1842af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius
1843af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        verify(mVendorHalDeathHandler).onDeath();
1844af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    }
1845af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius
1846ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
1847ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Test the new setTxPowerLimit HIDL method invocation. This should return failure if the
1848ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * HAL service is exposing the 1.0 interface.
1849ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
1850ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
1851ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    public void testSetTxPowerLimit() throws RemoteException {
1852ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        int powerLevelInDbm = -45;
1853ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
1854ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
1855ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Should fail because we exposed the 1.0 IWifiChip.
1856ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertFalse(mWifiVendorHal.setTxPowerLimit(powerLevelInDbm));
1857ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        verify(mIWifiChipV11, never()).setTxPowerLimit(eq(powerLevelInDbm));
1858ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
1859ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
1860ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Now expose the 1.1 IWifiChip.
1861ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
1862ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        when(mIWifiChipV11.setTxPowerLimit(anyInt())).thenReturn(mWifiStatusSuccess);
1863ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
1864ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
1865ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertTrue(mWifiVendorHal.setTxPowerLimit(powerLevelInDbm));
1866ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        verify(mIWifiChipV11).setTxPowerLimit(eq(powerLevelInDbm));
1867ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
1868ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
1869ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
1870ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
1871ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Test the new setTxPowerLimit HIDL method invocation. This should return failure if the
1872ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * HAL service is exposing the 1.0 interface.
1873ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
1874ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
1875ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    public void testResetTxPowerLimit() throws RemoteException {
1876ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
1877ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Should fail because we exposed the 1.0 IWifiChip.
1878ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertFalse(mWifiVendorHal.resetTxPowerLimit());
1879ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        verify(mIWifiChipV11, never()).resetTxPowerLimit();
1880ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
1881ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
1882ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Now expose the 1.1 IWifiChip.
1883ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
1884ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        when(mIWifiChipV11.resetTxPowerLimit()).thenReturn(mWifiStatusSuccess);
1885ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
1886ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
1887ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertTrue(mWifiVendorHal.resetTxPowerLimit());
1888ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        verify(mIWifiChipV11).resetTxPowerLimit();
1889ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
1890ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
1891ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
1892d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void startBgScan(WifiNative.ScanEventHandler eventHandler) throws Exception {
1893d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        when(mIWifiStaIface.startBackgroundScan(
1894d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                anyInt(), any(StaBackgroundScanParameters.class))).thenReturn(mWifiStatusSuccess);
1895136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanSettings settings = new WifiNative.ScanSettings();
1896136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        settings.num_buckets = 1;
1897136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings();
1898136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.bucket = 0;
1899136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.period_ms = 16000;
1900136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.report_events = WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN;
1901136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        settings.buckets = new WifiNative.BucketSettings[] {bucketSettings};
19026ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass        assertTrue(mWifiVendorHal.startBgScan(settings, eventHandler));
1903d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1904d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1905d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // Create a pair of HIDL scan result and its corresponding framework scan result for
1906d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // comparison.
1907d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private Pair<StaScanResult, ScanResult> createHidlAndFrameworkBgScanResult() {
1908d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        StaScanResult staScanResult = new StaScanResult();
1909d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Random random = new Random();
1910d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        byte[] ssid = new byte[8];
1911d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(ssid);
1912d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.ssid.addAll(NativeUtil.byteArrayToArrayList(ssid));
1913d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(staScanResult.bssid);
1914d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.frequency = 2432;
1915d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.rssi = -45;
1916d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.timeStampInUs = 5;
1917d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiInformationElement ie1 = new WifiInformationElement();
1918d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        byte[] ie1_data = new byte[56];
1919d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(ie1_data);
1920d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ie1.id = 1;
1921d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ie1.data.addAll(NativeUtil.byteArrayToArrayList(ie1_data));
1922d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.informationElements.add(ie1);
1923d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1924d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        // Now create the corresponding Scan result structure.
1925d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ScanResult scanResult = new ScanResult();
1926d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.SSID = NativeUtil.encodeSsid(staScanResult.ssid);
1927d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.BSSID = NativeUtil.macAddressFromByteArray(staScanResult.bssid);
1928d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.wifiSsid = WifiSsid.createFromByteArray(ssid);
1929d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.frequency = staScanResult.frequency;
1930d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.level = staScanResult.rssi;
1931d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.timestamp = staScanResult.timeStampInUs;
1932d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.bytes = new byte[57];
1933d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.bytes[0] = ie1.id;
1934d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        System.arraycopy(ie1_data, 0, scanResult.bytes, 1, ie1_data.length);
1935d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1936d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        return Pair.create(staScanResult, scanResult);
1937d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1938d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1939d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // Create a pair of HIDL scan datas and its corresponding framework scan datas for
1940d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // comparison.
1941d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private Pair<ArrayList<StaScanData>, ArrayList<WifiScanner.ScanData>>
1942d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            createHidlAndFrameworkBgScanDatas() {
1943d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArrayList<StaScanData> staScanDatas = new ArrayList<>();
1944d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        StaScanData staScanData = new StaScanData();
1945d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1946d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<StaScanResult, ScanResult> result = createHidlAndFrameworkBgScanResult();
1947d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.results.add(result.first);
1948d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.bucketsScanned = 5;
1949d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.flags = StaScanDataFlagMask.INTERRUPTED;
1950d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanDatas.add(staScanData);
1951d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1952d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArrayList<WifiScanner.ScanData> scanDatas = new ArrayList<>();
1953d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ScanResult[] scanResults = new ScanResult[1];
1954d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResults[0] = result.second;
1955d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiScanner.ScanData scanData =
1956d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                new WifiScanner.ScanData(mWifiVendorHal.mScan.cmdId, 1,
1957d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                        staScanData.bucketsScanned, false, scanResults);
1958d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanDatas.add(scanData);
1959d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        return Pair.create(staScanDatas, scanDatas);
1960d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1961d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1962d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanResultEqual(ScanResult expected, ScanResult actual) {
1963d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.SSID, actual.SSID);
1964d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.wifiSsid.getHexString(), actual.wifiSsid.getHexString());
1965d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.BSSID, actual.BSSID);
1966d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.frequency, actual.frequency);
1967d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.level, actual.level);
1968d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.timestamp, actual.timestamp);
1969d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertArrayEquals(expected.bytes, actual.bytes);
1970d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1971d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1972d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanResultsEqual(ScanResult[] expected, ScanResult[] actual) {
1973d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.length, actual.length);
1974d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        for (int i = 0; i < expected.length; i++) {
1975d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            assertScanResultEqual(expected[i], actual[i]);
1976d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        }
1977d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1978d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1979d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanDataEqual(WifiScanner.ScanData expected, WifiScanner.ScanData actual) {
1980d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getId(), actual.getId());
1981d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getFlags(), actual.getFlags());
1982d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getBucketsScanned(), actual.getBucketsScanned());
1983d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanResultsEqual(expected.getResults(), actual.getResults());
1984d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1985d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1986d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanDatasEqual(
1987d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            List<WifiScanner.ScanData> expected, List<WifiScanner.ScanData> actual) {
1988d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.size(), actual.size());
1989d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        for (int i = 0; i < expected.size(); i++) {
1990d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            assertScanDataEqual(expected.get(i), actual.get(i));
1991d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        }
1992d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1993b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass}
1994