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;
180d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohen
190d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.junit.Assert.assertArrayEquals;
200d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.junit.Assert.assertEquals;
210d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.junit.Assert.assertFalse;
220d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.junit.Assert.assertNotEquals;
230d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.junit.Assert.assertNotNull;
240d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.junit.Assert.assertNull;
250d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.junit.Assert.assertTrue;
260d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.any;
270d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.anyBoolean;
280d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.anyInt;
290d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.anyObject;
300d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.anyShort;
310d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.doAnswer;
320d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.doNothing;
331c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kimimport static org.mockito.Mockito.doThrow;
340d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.eq;
350d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.mock;
360d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.never;
370d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.reset;
380d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.spy;
390d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.times;
400d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.verify;
41f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Piusimport static org.mockito.Mockito.verifyNoMoreInteractions;
420d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.when;
430d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohen
44d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.app.test.MockAnswerUtil.AnswerWithArguments;
45d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiApIface;
46d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiChip;
47542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Piusimport android.hardware.wifi.V1_0.IWifiChipEventCallback;
48d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiIface;
49d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiRttController;
501711409f11610d2d646036306ec8de4fb2f69712Wei Wangimport android.hardware.wifi.V1_0.IWifiRttControllerEventCallback;
51d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiStaIface;
527e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Piusimport android.hardware.wifi.V1_0.IWifiStaIfaceEventCallback;
53ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport android.hardware.wifi.V1_0.IfaceType;
540320a9aa86429e98ff282a9e2297e19337667ad9Michael Plassimport android.hardware.wifi.V1_0.RttBw;
55ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.hardware.wifi.V1_0.RttCapabilities;
56ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.hardware.wifi.V1_0.RttConfig;
570320a9aa86429e98ff282a9e2297e19337667ad9Michael Plassimport android.hardware.wifi.V1_0.RttPreamble;
58ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport android.hardware.wifi.V1_0.StaApfPacketFilterCapabilities;
5956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plassimport android.hardware.wifi.V1_0.StaBackgroundScanCapabilities;
60d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaBackgroundScanParameters;
61699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerIfacePacketStats;
62699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerRadioStats;
63699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerStats;
64d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanData;
65d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanDataFlagMask;
66d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanResult;
67cbe44718452e93ef2b68974230231ff4fac99deeMichael Plassimport android.hardware.wifi.V1_0.WifiDebugHostWakeReasonStats;
685a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugPacketFateFrameType;
6953f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferFlags;
7053f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferStatus;
7153f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferVerboseLevel;
725a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugRxPacketFate;
735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugRxPacketFateReport;
745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugTxPacketFate;
755a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugTxPacketFateReport;
76d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.WifiInformationElement;
774f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatus;
784f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatusCode;
79f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Piusimport android.hardware.wifi.V1_2.IWifiChipEventCallback.IfaceInfo;
80f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Piusimport android.hardware.wifi.V1_2.IWifiChipEventCallback.RadioModeInfo;
81505663e1f5ecfd9ec588f5d9073915a5f0a9ecc1Nathan Haroldimport android.net.KeepalivePacketData;
821c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kimimport android.net.MacAddress;
83ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport android.net.apf.ApfCapabilities;
84ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.net.wifi.RttManager;
85d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.ScanResult;
861dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plassimport android.net.wifi.WifiManager;
87d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.WifiScanner;
88d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.WifiSsid;
89cbe44718452e93ef2b68974230231ff4fac99deeMichael Plassimport android.net.wifi.WifiWakeReasonAndCounts;
90ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport android.os.Looper;
9153f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.RemoteException;
921711409f11610d2d646036306ec8de4fb2f69712Wei Wangimport android.os.test.TestLooper;
93ed0b7cfa5bb7be5731e42c2aaac7c9fdaa68baa4Nathan Haroldimport android.system.OsConstants;
94d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.util.Pair;
951dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
96be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Piusimport com.android.server.wifi.HalDeviceManager.InterfaceDestroyedListener;
97df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plassimport com.android.server.wifi.util.NativeUtil;
98d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
99b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Before;
100b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Test;
101d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport org.mockito.ArgumentCaptor;
102b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.Mock;
103b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.MockitoAnnotations;
1043401582e1b1defc1877c7c47c6a839611fa211c3Michael Plassimport org.mockito.stubbing.Answer;
105b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
10670b995bed9674a30c56b7ae2585d5897900ff695Michael Plassimport java.net.InetAddress;
107ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport java.util.ArrayList;
1085a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport java.util.Arrays;
109ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport java.util.HashSet;
110d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport java.util.List;
1115a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport java.util.Random;
112ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport java.util.Set;
113ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
114b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass/**
115b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * Unit tests for {@link com.android.server.wifi.WifiVendorHal}.
116b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass */
117b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plasspublic class WifiVendorHalTest {
118b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
119d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius    private static final String TEST_IFACE_NAME = "wlan0";
120f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    private static final String TEST_IFACE_NAME_1 = "wlan1";
1211c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    private static final MacAddress TEST_MAC_ADDRESS = MacAddress.fromString("ee:33:a2:94:10:92");
1221c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
123d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    WifiVendorHal mWifiVendorHal;
1244f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusSuccess;
1254f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusFailure;
1268dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    WifiLog mWifiLog;
1274f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1284f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private HalDeviceManager mHalDeviceManager;
1294f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
130f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius    private TestLooper mLooper;
1314f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1324f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiVendorHal.HalDeviceManagerStatusListener mHalDeviceManagerStatusCallbacks;
1334f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1344f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiApIface mIWifiApIface;
1354f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1364f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiChip mIWifiChip;
1374f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
138ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    private android.hardware.wifi.V1_1.IWifiChip mIWifiChipV11;
139ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Mock
140cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    private android.hardware.wifi.V1_2.IWifiChip mIWifiChipV12;
141cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    @Mock
1424f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiStaIface mIWifiStaIface;
1434f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1441c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    private android.hardware.wifi.V1_2.IWifiStaIface mIWifiStaIfaceV12;
1451c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    @Mock
1464f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiRttController mIWifiRttController;
1473401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    private IWifiStaIfaceEventCallback mIWifiStaIfaceEventCallback;
148d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private IWifiChipEventCallback mIWifiChipEventCallback;
149cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    private android.hardware.wifi.V1_2.IWifiChipEventCallback mIWifiChipEventCallbackV12;
150af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    @Mock
151af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    private WifiNative.VendorHalDeathEventHandler mVendorHalDeathHandler;
152f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    @Mock
153f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    private WifiNative.VendorHalRadioModeChangeEventHandler mVendorHalRadioModeChangeHandler;
1543401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
1553401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    /**
156ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Spy used to return the V1_1 IWifiChip mock object to simulate the 1.1 HAL running on the
157ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * device.
158ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
159ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    private class WifiVendorHalSpyV1_1 extends WifiVendorHal {
160ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        WifiVendorHalSpyV1_1(HalDeviceManager halDeviceManager, Looper looper) {
161ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            super(halDeviceManager, looper);
162ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }
163ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
164ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        @Override
165ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        protected android.hardware.wifi.V1_1.IWifiChip getWifiChipForV1_1Mockable() {
166ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            return mIWifiChipV11;
167ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }
168cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
169cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        @Override
170cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        protected android.hardware.wifi.V1_2.IWifiChip getWifiChipForV1_2Mockable() {
171cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius            return null;
172cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        }
1731c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
1741c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        @Override
1751c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        protected android.hardware.wifi.V1_2.IWifiStaIface getWifiStaIfaceForV1_2Mockable(
1761c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim                String ifaceName) {
1771c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim            return null;
1781c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        }
179cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    }
180cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
181cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    /**
1821c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * Spy used to return the V1_2 IWifiChip and IWifiStaIface mock objects to simulate
1831c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * the 1.2 HAL running on the device.
184cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius     */
185cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    private class WifiVendorHalSpyV1_2 extends WifiVendorHal {
186cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        WifiVendorHalSpyV1_2(HalDeviceManager halDeviceManager, Looper looper) {
187cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius            super(halDeviceManager, looper);
188cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        }
189cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
190cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        @Override
191cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        protected android.hardware.wifi.V1_1.IWifiChip getWifiChipForV1_1Mockable() {
192cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius            return null;
193cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        }
194cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
195cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        @Override
196cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        protected android.hardware.wifi.V1_2.IWifiChip getWifiChipForV1_2Mockable() {
197cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius            return mIWifiChipV12;
198cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        }
1991c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
2001c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        @Override
2011c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        protected android.hardware.wifi.V1_2.IWifiStaIface getWifiStaIfaceForV1_2Mockable(
2021c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim                String ifaceName) {
2031c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim            return mIWifiStaIfaceV12;
2041c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        }
205ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
206ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
207ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
2083401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     * Identity function to supply a type to its argument, which is a lambda
2093401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     */
2103401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    static Answer<WifiStatus> answerWifiStatus(Answer<WifiStatus> statusLambda) {
2113401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        return (statusLambda);
2123401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    }
213b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
214b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
215b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     * Sets up for unit test
216b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     */
217b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    @Before
218b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    public void setUp() throws Exception {
219b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass        MockitoAnnotations.initMocks(this);
2208dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = new FakeWifiLog();
221f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius        mLooper = new TestLooper();
2224f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess = new WifiStatus();
2234f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess.code = WifiStatusCode.SUCCESS;
2244f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure = new WifiStatus();
2254f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.code = WifiStatusCode.ERROR_UNKNOWN;
2264f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.description = "I don't even know what a Mock Turtle is.";
2274f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        when(mIWifiStaIface.enableLinkLayerStatsCollection(false)).thenReturn(mWifiStatusSuccess);
2284f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
229d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Setup the HalDeviceManager mock's start/stop behaviour. This can be overridden in
230d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // individual tests, if needed.
231d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
232d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public boolean answer() {
233d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
234d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(true);
235d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
236d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return true;
237d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
238d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
239d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
240d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
241d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public void answer() {
242d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
243d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(false);
244d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
245d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
246d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).stop();
2477dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        when(mHalDeviceManager.createStaIface(anyBoolean(), any(), eq(null)))
248d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiStaIface);
249be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        when(mHalDeviceManager.createApIface(any(), eq(null)))
250d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiApIface);
2513153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        when(mHalDeviceManager.removeIface(any())).thenReturn(true);
252d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class)))
253d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiChip);
2546ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        when(mHalDeviceManager.createRttController()).thenReturn(mIWifiRttController);
255542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
256542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .thenReturn(mWifiStatusSuccess);
2573401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        mIWifiStaIfaceEventCallback = null;
2587e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        when(mIWifiStaIface.registerEventCallback(any(IWifiStaIfaceEventCallback.class)))
2593401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenAnswer(answerWifiStatus((invocation) -> {
2603401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    Object[] args = invocation.getArguments();
2613401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    mIWifiStaIfaceEventCallback = (IWifiStaIfaceEventCallback) args[0];
2623401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    return (mWifiStatusSuccess);
2633401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                }));
264d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
265d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                .thenAnswer(answerWifiStatus((invocation) -> {
266d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    Object[] args = invocation.getArguments();
267d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    mIWifiChipEventCallback = (IWifiChipEventCallback) args[0];
268d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    return (mWifiStatusSuccess);
269d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                }));
270cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        when(mIWifiChipV12.registerEventCallback_1_2(
271cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                any(android.hardware.wifi.V1_2.IWifiChipEventCallback.class)))
272cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                .thenAnswer(answerWifiStatus((invocation) -> {
273cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                    Object[] args = invocation.getArguments();
274cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                    mIWifiChipEventCallbackV12 =
275cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                            (android.hardware.wifi.V1_2.IWifiChipEventCallback) args[0];
276cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                    return (mWifiStatusSuccess);
277cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                }));
278d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2791711409f11610d2d646036306ec8de4fb2f69712Wei Wang        when(mIWifiRttController.registerEventCallback(any(IWifiRttControllerEventCallback.class)))
2801711409f11610d2d646036306ec8de4fb2f69712Wei Wang                .thenReturn(mWifiStatusSuccess);
2811711409f11610d2d646036306ec8de4fb2f69712Wei Wang
2823153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        doAnswer(new AnswerWithArguments() {
2833153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            public void answer(IWifiIface.getNameCallback cb)
2843153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                    throws RemoteException {
285d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                cb.onValues(mWifiStatusSuccess, TEST_IFACE_NAME);
2863153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            }
2873153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        }).when(mIWifiStaIface).getName(any(IWifiIface.getNameCallback.class));
2883153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        doAnswer(new AnswerWithArguments() {
2893153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            public void answer(IWifiIface.getNameCallback cb)
2903153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                    throws RemoteException {
291d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                cb.onValues(mWifiStatusSuccess, TEST_IFACE_NAME);
2923153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            }
2933153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        }).when(mIWifiApIface).getName(any(IWifiIface.getNameCallback.class));
2943153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
295d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Create the vendor HAL object under test.
296f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius        mWifiVendorHal = new WifiVendorHal(mHalDeviceManager, mLooper.getLooper());
297d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
298d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Initialize the vendor HAL to capture the registered callback.
299af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        mWifiVendorHal.initialize(mVendorHalDeathHandler);
300d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArgumentCaptor<WifiVendorHal.HalDeviceManagerStatusListener> hdmCallbackCaptor =
301d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                ArgumentCaptor.forClass(WifiVendorHal.HalDeviceManagerStatusListener.class);
302ddaa720025e435d3c21aa200c00c8da64c95e289Roshan Pius        verify(mHalDeviceManager).registerStatusListener(hdmCallbackCaptor.capture(), eq(null));
303d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mHalDeviceManagerStatusCallbacks = hdmCallbackCaptor.getValue();
304d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
305b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    }
306b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
307b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
308d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in STA mode using
3093153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
310d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
311d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3127e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalSuccessInStaMode() throws  Exception {
3133153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
314d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
315d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
316d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
3177dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
318d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
3196ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager).createRttController();
320d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
321d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
322542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
323542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
324d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
325be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
326d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
327d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
328d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
329d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in AP mode using
3303153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalAp()}.
331d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
332d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3337e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalSuccessInApMode() throws Exception {
3343153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalAp());
335d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
336d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
337d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
338be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(any(), eq(null));
339d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
340d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
341d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
342d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
3437dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
3446ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
345d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
346d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
347d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
348d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
3493153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
350d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
351d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3527e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInStaMode() throws Exception {
353d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // No callbacks are invoked in this case since the start itself failed. So, override
354d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // default AnswerWithArguments that we setup.
355d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
3567e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius            public boolean answer() throws Exception {
357d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return false;
358d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
359d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
3603153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
361d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
362d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
363d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
364d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
3657dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
366be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
367d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
3686ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
369542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface, never())
370542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .registerEventCallback(any(IWifiStaIfaceEventCallback.class));
371d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
372d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
373d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
374d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
3753153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
376d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
377d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3787e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInIfaceCreationInStaMode() throws Exception {
3797dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        when(mHalDeviceManager.createStaIface(anyBoolean(), any(), eq(null))).thenReturn(null);
3803153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
381d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
382d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
383d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
3847dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
385d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
386d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
387be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
388d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
3896ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
390542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface, never())
391542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .registerEventCallback(any(IWifiStaIfaceEventCallback.class));
392d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
393d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
394d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
395d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
3963153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
397d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
398d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3997e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInRttControllerCreationInStaMode() throws Exception {
4006ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        when(mHalDeviceManager.createRttController()).thenReturn(null);
4013153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
402d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
403d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
404d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
4057dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
4066ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager).createRttController();
407d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
408542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
409d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
410be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
411d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
412d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
413d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
414d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
415d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
4163153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
417d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
418d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
4197e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInChipGetInStaMode() throws Exception {
420d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class))).thenReturn(null);
4213153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
422d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
423d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
424d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
4257dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
4266ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager).createRttController();
427d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(any(IWifiIface.class));
428d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
429542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
430d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
431be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
432d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
433d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
434d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
435d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
4363153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
437d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
438d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
4397e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInStaIfaceCallbackRegistration() throws Exception {
4407e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        when(mIWifiStaIface.registerEventCallback(any(IWifiStaIfaceEventCallback.class)))
4417e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius                .thenReturn(mWifiStatusFailure);
4423153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
4437e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
4447e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
4457e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).start();
4467dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
4477e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).stop();
448542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
4497e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
4506ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
4517e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
452be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
4537e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    }
4547e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
4557e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    /**
4567e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     * Tests the failure to start HAL in STA mode using
4573153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
458542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius     */
459542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    @Test
460542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    public void testStartHalFailureInChipCallbackRegistration() throws Exception {
461542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
462542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .thenReturn(mWifiStatusFailure);
4633153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
464542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
465542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
466542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).start();
4677dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
4686ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager).createRttController();
469542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).getChip(any(IWifiIface.class));
470542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).stop();
471542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
472542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
473542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
474be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
475542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    }
476542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
477542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    /**
4783153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * Tests the failure to start HAL in AP mode using
4793153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalAp()}.
4807e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     */
4817e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    @Test
4827e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInApMode() throws Exception {
483be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        when(mHalDeviceManager.createApIface(any(), eq(null))).thenReturn(null);
4843153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalAp());
485d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
486d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
487d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
488be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(any(), eq(null));
489d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
490d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
4917dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
492d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
4936ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
494d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
495d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
496d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
497d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in STA mode using
498d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
499d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
500d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
501d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInStaMode() {
5023153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
503d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
504d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
505d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
506d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
507d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
508d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
509d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
5107dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
511d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
5126ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager).createRttController();
513d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
514d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
515d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
516be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
517d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
518d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
519d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
520d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in AP mode using
521d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
522d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
523d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
524d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInApMode() {
5253153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalAp());
526d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
527d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
528d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
529d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
530d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
531d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
532d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
533be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(any(), eq(null));
534d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
535d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
536d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
537d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
5387dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
5396ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
540d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
5414f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5424f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
543be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius     * Tests the handling of interface destroyed callback from HalDeviceManager.
544be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius     */
545be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    @Test
546be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    public void testStaInterfaceDestroyedHandling() throws  Exception {
547be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        ArgumentCaptor<InterfaceDestroyedListener> internalListenerCaptor =
548be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius                ArgumentCaptor.forClass(InterfaceDestroyedListener.class);
549be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        InterfaceDestroyedListener externalLister = mock(InterfaceDestroyedListener.class);
550be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
551be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
5527dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        assertNotNull(mWifiVendorHal.createStaIface(false, externalLister));
553be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
554be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
555be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).start();
5567dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), internalListenerCaptor.capture(),
5577dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen                eq(null));
558be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
559be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createRttController();
560be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).isReady();
561be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).isStarted();
562be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
563be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
564be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
565be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // Now trigger the interface destroyed callback from HalDeviceManager and ensure the
566be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // external listener is invoked and iface removed from internal database.
567be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        internalListenerCaptor.getValue().onDestroyed(TEST_IFACE_NAME);
568be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(externalLister).onDestroyed(TEST_IFACE_NAME);
569be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
570be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // This should fail now, since the interface was already destroyed.
571be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertFalse(mWifiVendorHal.removeStaIface(TEST_IFACE_NAME));
572be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).removeIface(any());
573be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    }
574be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
575be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    /**
576be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius     * Tests the handling of interface destroyed callback from HalDeviceManager.
577be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius     */
578be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    @Test
579be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    public void testApInterfaceDestroyedHandling() throws  Exception {
580be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        ArgumentCaptor<InterfaceDestroyedListener> internalListenerCaptor =
581be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius                ArgumentCaptor.forClass(InterfaceDestroyedListener.class);
582be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        InterfaceDestroyedListener externalLister = mock(InterfaceDestroyedListener.class);
583be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
584be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
585be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertNotNull(mWifiVendorHal.createApIface(externalLister));
586be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
587be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
588be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).start();
589be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(internalListenerCaptor.capture(), eq(null));
590be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
591be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).isReady();
592be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).isStarted();
593be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
594be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
595be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // Now trigger the interface destroyed callback from HalDeviceManager and ensure the
596be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // external listener is invoked and iface removed from internal database.
597be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        internalListenerCaptor.getValue().onDestroyed(TEST_IFACE_NAME);
598be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(externalLister).onDestroyed(TEST_IFACE_NAME);
599be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
600be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // This should fail now, since the interface was already destroyed.
601be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertFalse(mWifiVendorHal.removeApIface(TEST_IFACE_NAME));
602be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).removeIface(any());
603be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    }
604be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
605be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    /**
6068dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that enter logs when verbose logging is enabled
6078dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
6088dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
6098dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testEnterLogging() {
6108dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = spy(mWifiLog);
6118dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(true);
612d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.installPacketFilter(TEST_IFACE_NAME, new byte[0]);
613654e16971c2e558d59eafd9c4fab1cdbe4775657mukesh agrawal        verify(mWifiVendorHal.mLog).trace(eq("filter length %"), eq(1));
6148dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
6158dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
6168dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
6178dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that enter does not log when verbose logging is not enabled
6188dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
6198dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
6208dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testEnterSilenceWhenNotEnabled() {
6218dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = spy(mWifiLog);
622d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.installPacketFilter(TEST_IFACE_NAME, new byte[0]);
6238dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(true);
6248dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(false);
625d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.installPacketFilter(TEST_IFACE_NAME, new byte[0]);
626654e16971c2e558d59eafd9c4fab1cdbe4775657mukesh agrawal        verify(mWifiVendorHal.mLog, never()).trace(eq("filter length %"), anyInt());
6278dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
6288dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
6298dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
6308dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that boolResult logs a false result
6318dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
6328dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
6338dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testBoolResultFalse() {
6348dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = spy(mWifiLog);
6358dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = mWifiLog;
6368dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mVerboseLog = mWifiLog;
637d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getBgScanCapabilities(
638d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                TEST_IFACE_NAME, new WifiNative.ScanCapabilities()));
6398dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        verify(mWifiLog).err("% returns %");
6408dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
6418dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
6428dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
6436ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass     * Test that getBgScanCapabilities is hooked up to the HAL correctly
64456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     *
64556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * A call before the vendor HAL is started should return a non-null result with version 0
64656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     *
64756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * A call after the HAL is started should return the mocked values.
64856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     */
64956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    @Test
6506ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass    public void testGetBgScanCapabilities() throws Exception {
65156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        StaBackgroundScanCapabilities capabilities = new StaBackgroundScanCapabilities();
65256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxCacheSize = 12;
65356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxBuckets = 34;
65456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxApCachePerScan = 56;
65556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxReportingThreshold = 78;
65656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
65756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        doAnswer(new AnswerWithArguments() {
65856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            public void answer(IWifiStaIface.getBackgroundScanCapabilitiesCallback cb)
65956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                    throws RemoteException {
66056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
66156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            }
66256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        }).when(mIWifiStaIface).getBackgroundScanCapabilities(any(
66356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                IWifiStaIface.getBackgroundScanCapabilitiesCallback.class));
66456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
66556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        WifiNative.ScanCapabilities result = new WifiNative.ScanCapabilities();
66656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
667d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // should fail - not started
668d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getBgScanCapabilities(TEST_IFACE_NAME, result));
669d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // Start the vendor hal
670d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
671d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // should succeed
672d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.getBgScanCapabilities(TEST_IFACE_NAME, result));
67356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
67456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(12, result.max_scan_cache_size);
67556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(34, result.max_scan_buckets);
67656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(56, result.max_ap_cache_per_scan);
67756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(78, result.max_scan_reporting_threshold);
67856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
67956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
68056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    /**
6811dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Test translation to WifiManager.WIFI_FEATURE_*
6821dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     *
6831dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Just do a spot-check with a few feature bits here; since the code is table-
6841dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * driven we don't have to work hard to exercise all of it.
6851dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     */
6861dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    @Test
687ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    public void testStaIfaceFeatureMaskTranslation() {
6881dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int caps = (
6891dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                IWifiStaIface.StaIfaceCapabilityMask.BACKGROUND_SCAN
6901dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | IWifiStaIface.StaIfaceCapabilityMask.LINK_LAYER_STATS
6911dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass            );
6921dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int expected = (
693691806f65a5f259fd8e6b709c97d0035c418c483Michael Plass                WifiManager.WIFI_FEATURE_SCANNER
6941dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | WifiManager.WIFI_FEATURE_LINK_LAYER_STATS);
6951dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        assertEquals(expected, mWifiVendorHal.wifiFeatureMaskFromStaCapabilities(caps));
6961dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    }
6971dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
6981dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    /**
699ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Test translation to WifiManager.WIFI_FEATURE_*
700ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     *
701ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Just do a spot-check with a few feature bits here; since the code is table-
702ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * driven we don't have to work hard to exercise all of it.
703ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
704ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
705ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    public void testChipFeatureMaskTranslation() {
7065858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        int caps = (
7075858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.SET_TX_POWER_LIMIT
7085858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.D2D_RTT
7095858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.D2AP_RTT
7105858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        );
7115858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        int expected = (
7125858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                WifiManager.WIFI_FEATURE_TX_POWER_LIMIT
7135858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | WifiManager.WIFI_FEATURE_D2D_RTT
7145858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | WifiManager.WIFI_FEATURE_D2AP_RTT
7155858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        );
716ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertEquals(expected, mWifiVendorHal.wifiFeatureMaskFromChipCapabilities(caps));
717ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
718ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
719ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
720ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Test get supported features. Tests whether we coalesce information from different sources
721ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * (IWifiStaIface, IWifiChip and HalDeviceManager) into the bitmask of supported features
722ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * correctly.
723ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
724ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
725ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    public void testGetSupportedFeatures() throws Exception {
7263153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
727ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
728ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        int staIfaceHidlCaps = (
729ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                IWifiStaIface.StaIfaceCapabilityMask.BACKGROUND_SCAN
730ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | IWifiStaIface.StaIfaceCapabilityMask.LINK_LAYER_STATS
731ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        );
732ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        int chipHidlCaps =
733ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.SET_TX_POWER_LIMIT;
734ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        Set<Integer>  halDeviceManagerSupportedIfaces = new HashSet<Integer>() {{
735ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                add(IfaceType.STA);
736ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                add(IfaceType.P2P);
737ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            }};
738ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        int expectedFeatureSet = (
739ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                WifiManager.WIFI_FEATURE_SCANNER
740ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_LINK_LAYER_STATS
741ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_TX_POWER_LIMIT
742ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_INFRA
743ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_P2P
744ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        );
745ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
746ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        doAnswer(new AnswerWithArguments() {
747ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            public void answer(IWifiStaIface.getCapabilitiesCallback cb) throws RemoteException {
748ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                cb.onValues(mWifiStatusSuccess, staIfaceHidlCaps);
749ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            }
750ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }).when(mIWifiStaIface).getCapabilities(any(IWifiStaIface.getCapabilitiesCallback.class));
751ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        doAnswer(new AnswerWithArguments() {
752ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            public void answer(IWifiChip.getCapabilitiesCallback cb) throws RemoteException {
753ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                cb.onValues(mWifiStatusSuccess, chipHidlCaps);
754ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            }
755ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }).when(mIWifiChip).getCapabilities(any(IWifiChip.getCapabilitiesCallback.class));
756ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        when(mHalDeviceManager.getSupportedIfaceTypes())
757ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                .thenReturn(halDeviceManagerSupportedIfaces);
758ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
759d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(expectedFeatureSet, mWifiVendorHal.getSupportedFeatureSet(TEST_IFACE_NAME));
760ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
761ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
762ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
7634f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test enablement of link layer stats after startup
764699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
7654f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats before HAL start
7664f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - should not make it to the HAL layer
7674f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in STA mode
7684f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats twice more
7694f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - enable request should make it to the HAL layer
7704f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the requests (i.e., two calls total)
7714f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
7724f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
7734f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsEnableAfterStartup() throws Exception {
7744f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
7754f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
776d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertNull(mWifiVendorHal.getWifiLinkLayerStats(TEST_IFACE_NAME));
7774f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
7784f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
7794f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
7804f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
781d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.getWifiLinkLayerStats(TEST_IFACE_NAME);
782d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.getWifiLinkLayerStats(TEST_IFACE_NAME);
7834f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface).enableLinkLayerStatsCollection(false); // mLinkLayerStatsDebug
7844f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, times(2)).getLinkLayerStats(any());
7854f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
7864f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
7874f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
7884f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test that link layer stats are not enabled and harmless in AP mode
789699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
7904f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in AP mode
7914f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - stats should not be enabled
7924f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats
7934f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the request
7944f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
7954f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
7964f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsNotEnabledAndHarmlessInApMode() throws Exception {
7974f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
7984f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
7994f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
8004f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
801d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertNull(mWifiVendorHal.getWifiLinkLayerStats(TEST_IFACE_NAME));
8024f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
8034f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
8044f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
8054f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).enableLinkLayerStatsCollection(false);
8064f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).getLinkLayerStats(any());
8074f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
8084f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
809699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /**
810699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Test that the link layer stats fields are populated correctly.
811699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
812699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * This is done by filling with random values and then using toString on the
813699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * original and converted values, comparing just the numerics in the result.
814699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * This makes the assumption that the fields are in the same order in both string
815699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * representations, which is not quite true. So apply some fixups before the final
816699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * comparison.
817699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
818699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    @Test
819699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    public void testLinkLayerStatsAssignment() throws Exception {
820699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        Random r = new Random(1775968256);
821699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        StaLinkLayerStats stats = new StaLinkLayerStats();
822699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeBePktStats);
823699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeBkPktStats);
824699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeViPktStats);
825699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeVoPktStats);
8269ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        randomizeRadioStats(r, stats.radios);
8279ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius
828442a0afdad6b7eb32a9098d927ecd65aa64df6eaMichael Plass        stats.timeStampInMs = r.nextLong() & 0xFFFFFFFFFFL;
829699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
830442a0afdad6b7eb32a9098d927ecd65aa64df6eaMichael Plass        String expected = numbersOnly(stats.toString() + " ");
831699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
832699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        WifiLinkLayerStats converted = WifiVendorHal.frameworkFromHalLinkLayerStats(stats);
833699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
834442a0afdad6b7eb32a9098d927ecd65aa64df6eaMichael Plass        String actual = numbersOnly(converted.toString() + " ");
835699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
836699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        // Do the required fixups to the both expected and actual
8379ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        expected = rmValue(expected, stats.radios.get(0).rxTimeInMs);
8389ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        expected = rmValue(expected, stats.radios.get(0).onTimeInMsForScan);
839699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
8409ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        actual = rmValue(actual, stats.radios.get(0).rxTimeInMs);
8419ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        actual = rmValue(actual, stats.radios.get(0).onTimeInMsForScan);
842699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
843699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        // The remaining fields should agree
844699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        assertEquals(expected, actual);
845699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
846699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
847699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /** Just the digits with delimiting spaces, please */
848699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static String numbersOnly(String s) {
849699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        return s.replaceAll("[^0-9]+", " ");
850699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
851699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
852699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /** Remove the given value from the space-delimited string, or die trying. */
853699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static String rmValue(String s, long value) throws Exception {
854699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        String ans = s.replaceAll(" " + value + " ", " ");
855699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        assertNotEquals(s, ans);
856699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        return ans;
857699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
858699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
859699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /**
860699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Populate packet stats with non-negative random values
861699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
862699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static void randomizePacketStats(Random r, StaLinkLayerIfacePacketStats pstats) {
863699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.rxMpdu = r.nextLong() & 0xFFFFFFFFFFL; // more than 32 bits
864699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.txMpdu = r.nextLong() & 0xFFFFFFFFFFL;
865699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.lostMpdu = r.nextLong() & 0xFFFFFFFFFFL;
866699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.retries = r.nextLong() & 0xFFFFFFFFFFL;
867699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
868699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
869699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass   /**
870699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Populate radio stats with non-negative random values
871699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
8729ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius    private static void randomizeRadioStats(Random r, ArrayList<StaLinkLayerRadioStats> rstats) {
8739ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        StaLinkLayerRadioStats rstat = new StaLinkLayerRadioStats();
8749ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.onTimeInMs = r.nextInt() & 0xFFFFFF;
8759ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.txTimeInMs = r.nextInt() & 0xFFFFFF;
876699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        for (int i = 0; i < 4; i++) {
877699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass            Integer v = r.nextInt() & 0xFFFFFF;
8789ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius            rstat.txTimeInMsPerLevel.add(v);
879699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        }
8809ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.rxTimeInMs = r.nextInt() & 0xFFFFFF;
8819ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.onTimeInMsForScan = r.nextInt() & 0xFFFFFF;
8829ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstats.add(rstat);
883699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
8844f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
8857e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    /**
8867e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Test that getFirmwareVersion() and getDriverVersion() work
8877e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     *
8887e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Calls before the STA is started are expected to return null.
8897e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     */
8907e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    @Test
8917e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    public void testVersionGetters() throws Exception {
8927e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String firmwareVersion = "fuzzy";
8937e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String driverVersion = "dizzy";
8947e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        IWifiChip.ChipDebugInfo chipDebugInfo = new IWifiChip.ChipDebugInfo();
8957e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.firmwareDescription = firmwareVersion;
8967e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.driverDescription = driverVersion;
8977e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
8987e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        doAnswer(new AnswerWithArguments() {
8997e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            public void answer(IWifiChip.requestChipDebugInfoCallback cb) throws RemoteException {
9007e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass                cb.onValues(mWifiStatusSuccess, chipDebugInfo);
9017e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            }
9027e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        }).when(mIWifiChip).requestChipDebugInfo(any(IWifiChip.requestChipDebugInfoCallback.class));
9037e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
9047e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getFirmwareVersion());
9057e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getDriverVersion());
9067e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
9077e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
9087e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
9097e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(firmwareVersion, mWifiVendorHal.getFirmwareVersion());
9107e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(driverVersion, mWifiVendorHal.getDriverVersion());
9117e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    }
912ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
913ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
914ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * For checkRoundTripIntTranslation lambdas
915ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
916ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    interface IntForInt {
917ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        int translate(int value);
918ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
919ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
920ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
921ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Checks that translation from x to y and back again is the identity function
922ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     *
923ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param xFromY reverse translator
924ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param yFromX forward translator
925ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param xLimit non-inclusive upper bound on x (lower bound is zero)
926ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
927ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    private void checkRoundTripIntTranslation(
928ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            IntForInt xFromY, IntForInt yFromX, int xFirst, int xLimit) throws Exception {
929ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        int ex = 0;
930ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        for (int i = xFirst; i < xLimit; i++) {
931ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertEquals(i, xFromY.translate(yFromX.translate(i)));
932ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
933ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        try {
934ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            yFromX.translate(xLimit);
935ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertTrue("expected an exception here", false);
936ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        } catch (IllegalArgumentException e) {
937ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            ex++;
938ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
939ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        try {
940ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            xFromY.translate(yFromX.translate(xLimit - 1) + 1);
941ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertTrue("expected an exception here", false);
942ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        } catch (IllegalArgumentException e) {
943ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            ex++;
944ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
945ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertEquals(2, ex);
946ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
947ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
948ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
949ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
950ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of RTT type
951ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
952ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
953ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testRttTypeTranslation() throws Exception {
954ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
955ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halRttTypeFromFrameworkRttType(y),
956ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkRttTypeFromHalRttType(x),
957ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                1, 3);
958ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
959ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
960ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
961ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of peer type
962ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
963ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
964ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testPeerTranslation() throws Exception {
965ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
966ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halPeerFromFrameworkPeer(y),
967ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkPeerFromHalPeer(x),
968ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                1, 6);
969ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
970ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
971ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
972ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of channel width
973ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
974ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
975ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testChannelWidth() throws Exception {
976ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
977ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halChannelWidthFromFrameworkChannelWidth(y),
978ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkChannelWidthFromHalChannelWidth(x),
979ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 5);
980ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
981ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
982ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
983ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of preamble type mask
984ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
985ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
986ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testPreambleTranslation() throws Exception {
987ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
988ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halPreambleFromFrameworkPreamble(y),
989ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkPreambleFromHalPreamble(x),
990ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 8);
991ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
992ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
993ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
994ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of bandwidth mask
995ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
996ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
997ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testBandwidthTranslations() throws Exception {
998ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
999ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halBwFromFrameworkBw(y),
1000ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkBwFromHalBw(x),
1001ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 64);
1002ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
1003ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
10040320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    /**
10050320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     * Test translation of framwork RttParams to hal RttConfig
10060320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     */
1007ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
1008ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testGetRttStuff() throws Exception {
1009ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttManager.RttParams params = new RttManager.RttParams();
10100320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.bssid = "03:01:04:01:05:09";
10110320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.frequency = 2420;
10120320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.channelWidth = ScanResult.CHANNEL_WIDTH_40MHZ;
10130320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.centerFreq0 = 2440;
10140320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.centerFreq1 = 1;
10150320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.num_samples = 2;
10160320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.num_retries = 3;
10170320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.numberBurst = 4;
10180320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.interval = 5;
10190320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.numSamplesPerBurst = 8;
10200320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.numRetriesPerMeasurementFrame = 6;
10210320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.numRetriesPerFTMR = 7;
10220320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.LCIRequest = false;
10230320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.LCRRequest = false;
10240320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.burstTimeout = 15;
10250320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        String frameish = params.toString();
10260320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertFalse(frameish.contains("=0,")); // make sure all fields are initialized
1027ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttConfig config = WifiVendorHal.halRttConfigFromFrameworkRttParams(params);
10280320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        String halish = config.toString();
10290320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        StringBuffer expect = new StringBuffer(200);
10300320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append("{.addr = [3, 1, 4, 1, 5, 9], .type = ONE_SIDED, .peer = AP, ");
10310320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".channel = {.width = WIDTH_40, .centerFreq = 2420, ");
10320320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".centerFreq0 = 2440, .centerFreq1 = 1}, ");
10330320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".burstPeriod = 5, .numBurst = 4, .numFramesPerBurst = 8, ");
10340320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".numRetriesPerRttFrame = 6, .numRetriesPerFtmr = 7, ");
10350320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".mustRequestLci = false, .mustRequestLcr = false, .burstDuration = 15, ");
10360320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".preamble = HT, .bw = BW_20MHZ}");
10370320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertEquals(expect.toString(), halish);
1038ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
1039ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
10400320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    /**
10410320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     * Test that RTT capabilities are plumbed through
10420320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     */
1043ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
1044ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testGetRttCapabilities() throws Exception {
1045ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttCapabilities capabilities = new RttCapabilities();
10460320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        capabilities.lcrSupported = true;
10470320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        capabilities.preambleSupport = RttPreamble.LEGACY | RttPreamble.VHT;
10480320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        capabilities.bwSupport = RttBw.BW_5MHZ | RttBw.BW_20MHZ;
10490320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        capabilities.mcVersion = 43;
1050ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        doAnswer(new AnswerWithArguments() {
1051ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            public void answer(IWifiRttController.getCapabilitiesCallback cb)
1052ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                    throws RemoteException {
1053ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
1054ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            }
1055ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }).when(mIWifiRttController).getCapabilities(any(
1056ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                IWifiRttController.getCapabilitiesCallback.class));
1057ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
1058ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertNull(mWifiVendorHal.getRttCapabilities());
1059ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
1060ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1061ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
1062ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttManager.RttCapabilities actual = mWifiVendorHal.getRttCapabilities();
10630320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertTrue(actual.lcrSupported);
10640320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertEquals(RttManager.PREAMBLE_LEGACY | RttManager.PREAMBLE_VHT,
10650320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass                actual.preambleSupported);
10660320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertEquals(RttManager.RTT_BW_5_SUPPORT | RttManager.RTT_BW_20_SUPPORT,
10670320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass                actual.bwSupported);
10680320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertEquals(43, (int) capabilities.mcVersion);
1069ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
1070ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
10710320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    /**
10720320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     * Negative test of disableRttResponder
10730320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     */
10740320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    @Test
10750320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    public void testDisableOfUnstartedRtt() throws Exception {
10760320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertFalse(mWifiVendorHal.disableRttResponder());
10770320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    }
1078ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
1079ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
1080df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     * Test that setScanningMacOui is hooked up to the HAL correctly
1081df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     */
1082df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    @Test
1083df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    public void testSetScanningMacOui() throws Exception {
1084df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] oui = NativeUtil.macAddressOuiToByteArray("DA:A1:19");
1085df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] zzz = NativeUtil.macAddressOuiToByteArray("00:00:00");
1086df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
1087df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        when(mIWifiStaIface.setScanningMacOui(any())).thenReturn(mWifiStatusSuccess);
1088df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
1089d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // expect fail - STA not started
1090d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setScanningMacOui(TEST_IFACE_NAME, oui));
1091df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1092d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // expect fail - null
1093d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setScanningMacOui(TEST_IFACE_NAME, null));
1094d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // expect fail - len
1095d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setScanningMacOui(TEST_IFACE_NAME, new byte[]{(byte) 1}));
1096d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.setScanningMacOui(TEST_IFACE_NAME, oui));
1097d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.setScanningMacOui(TEST_IFACE_NAME, zzz));
1098df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
1099df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(oui));
1100df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(zzz));
1101df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    }
1102df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
110370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
110470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStartSendingOffloadedPacket() throws Exception {
110570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        byte[] srcMac = NativeUtil.macAddressToByteArray("4007b2088c81");
1106ed0b7cfa5bb7be5731e42c2aaac7c9fdaa68baa4Nathan Harold        byte[] dstMac = NativeUtil.macAddressToByteArray("4007b8675309");
110770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress src = InetAddress.parseNumericAddress("192.168.13.13");
110870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress dst = InetAddress.parseNumericAddress("93.184.216.34");
110970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
111070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int millis = 16000;
111170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
111270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        KeepalivePacketData kap = KeepalivePacketData.nattKeepalivePacket(src, 63000, dst, 4500);
111370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
111470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.startSendingKeepAlivePackets(
111570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                anyInt(), any(), anyShort(), any(), any(), anyInt()
111670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        )).thenReturn(mWifiStatusSuccess);
111770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
111870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1119d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(0 == mWifiVendorHal.startSendingOffloadedPacket(
1120ed0b7cfa5bb7be5731e42c2aaac7c9fdaa68baa4Nathan Harold                TEST_IFACE_NAME, slot, srcMac, dstMac, kap.getPacket(),
1121ed0b7cfa5bb7be5731e42c2aaac7c9fdaa68baa4Nathan Harold                OsConstants.ETH_P_IPV6, millis));
112270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
112370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).startSendingKeepAlivePackets(
112470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                eq(slot), any(), anyShort(), any(), any(), eq(millis));
112570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
112670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
112770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
112870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStopSendingOffloadedPacket() throws Exception {
112970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
113070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
113170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.stopSendingKeepAlivePackets(anyInt())).thenReturn(mWifiStatusSuccess);
113270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
113370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1134d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(0 == mWifiVendorHal.stopSendingOffloadedPacket(
1135d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                TEST_IFACE_NAME, slot));
113670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
113770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).stopSendingKeepAlivePackets(eq(slot));
113870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
113970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
1140df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    /**
11413401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     * Test the setup, invocation, and removal of a RSSI event handler
11423401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     *
11433401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     */
11443401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    @Test
11453401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    public void testRssiMonitoring() throws Exception {
11463401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        when(mIWifiStaIface.startRssiMonitoring(anyInt(), anyInt(), anyInt()))
11473401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenReturn(mWifiStatusSuccess);
11483401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        when(mIWifiStaIface.stopRssiMonitoring(anyInt()))
11493401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenReturn(mWifiStatusSuccess);
11503401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
11513401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        ArrayList<Byte> breach = new ArrayList<>(10);
11523401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte hi = -21;
11533401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte med = -42;
11543401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte lo = -84;
11553401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        Byte lower = -88;
11563401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        WifiNative.WifiRssiEventHandler handler;
11573401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        handler = ((cur) -> {
11583401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass            breach.add(cur);
11593401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        });
1160d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // not started
1161d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, hi, lo, handler));
1162d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // not started
1163d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(-1, mWifiVendorHal.stopRssiMonitoring(TEST_IFACE_NAME));
11643401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1165d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, hi, lo, handler));
11663401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        int theCmdId = mWifiVendorHal.sRssiMonCmdId;
11673401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        breach.clear();
11683401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        mIWifiStaIfaceEventCallback.onRssiThresholdBreached(theCmdId, new byte[6], lower);
11693401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(breach.get(0), lower);
1170d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.stopRssiMonitoring(TEST_IFACE_NAME));
1171d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, hi, lo, handler));
1172d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // replacing works
1173d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, med, lo, handler));
1174d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // null handler fails
1175d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(
1176d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                TEST_IFACE_NAME, hi, lo, null));
1177d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, hi, lo, handler));
1178d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // empty range
1179d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, lo, hi, handler));
11803401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    }
11813401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
11823401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    /**
1183ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * Test that getApfCapabilities is hooked up to the HAL correctly
1184ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
1185ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call before the vendor HAL is started should return a non-null result with version 0
1186ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
1187ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call after the HAL is started should return the mocked values.
1188ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
1189ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
1190ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testApfCapabilities() throws Exception {
1191ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myVersion = 33;
1192ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myMaxSize = 1234;
1193ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1194ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        StaApfPacketFilterCapabilities capabilities = new StaApfPacketFilterCapabilities();
1195ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.version = myVersion;
1196ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.maxLength = myMaxSize;
1197ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1198ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        doAnswer(new AnswerWithArguments() {
1199ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            public void answer(IWifiStaIface.getApfPacketFilterCapabilitiesCallback cb)
1200ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                    throws RemoteException {
1201ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
1202ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            }
1203ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        }).when(mIWifiStaIface).getApfPacketFilterCapabilities(any(
1204ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                IWifiStaIface.getApfPacketFilterCapabilitiesCallback.class));
1205ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1206ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1207d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.getApfCapabilities(TEST_IFACE_NAME)
1208d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                .apfVersionSupported);
1209ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1210ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1211ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1212d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        ApfCapabilities actual = mWifiVendorHal.getApfCapabilities(TEST_IFACE_NAME);
1213ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1214ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myVersion, actual.apfVersionSupported);
1215ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myMaxSize, actual.maximumApfProgramSize);
1216ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(android.system.OsConstants.ARPHRD_ETHER, actual.apfPacketFormat);
1217ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertNotEquals(0, actual.apfPacketFormat);
1218ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
1219ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1220ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
122170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass     * Test that an APF program can be installed.
1222ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
1223ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
1224ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testInstallApf() throws Exception {
1225ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        byte[] filter = new byte[] {19, 53, 10};
1226ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1227ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        ArrayList<Byte> expected = new ArrayList<>(3);
1228ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        for (byte b : filter) expected.add(b);
1229ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1230ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        when(mIWifiStaIface.installApfPacketFilter(anyInt(), any(ArrayList.class)))
1231ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                .thenReturn(mWifiStatusSuccess);
1232ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1233ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1234d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.installPacketFilter(TEST_IFACE_NAME, filter));
1235ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1236ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        verify(mIWifiStaIface).installApfPacketFilter(eq(0), eq(expected));
1237ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
1238f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1239f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    /**
1240e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti     * Test that an APF program and data buffer can be read back.
1241e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti     */
1242e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti    @Test
1243e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti    public void testReadApf() throws Exception {
1244e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        // Expose the 1.2 IWifiStaIface.
1245e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
1246e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti
1247e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        byte[] program = new byte[] {65, 66, 67};
1248e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        ArrayList<Byte> expected = new ArrayList<>(3);
1249e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        for (byte b : program) expected.add(b);
1250e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti
1251e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        doAnswer(new AnswerWithArguments() {
1252e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti            public void answer(
1253e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti                    android.hardware.wifi.V1_2.IWifiStaIface.readApfPacketFilterDataCallback cb)
1254e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti                    throws RemoteException {
1255e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti                cb.onValues(mWifiStatusSuccess, expected);
1256e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti            }
1257e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        }).when(mIWifiStaIfaceV12).readApfPacketFilterData(any(
1258e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti                android.hardware.wifi.V1_2.IWifiStaIface.readApfPacketFilterDataCallback.class));
1259e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti
1260e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        assertTrue(mWifiVendorHal.startVendorHalSta());
1261e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        assertArrayEquals(program, mWifiVendorHal.readPacketFilter(TEST_IFACE_NAME));
1262e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti    }
1263e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti
1264e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti    /**
1265f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     * Test that the country code is set in AP mode (when it should be).
1266f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     */
1267f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    @Test
1268f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    public void testSetCountryCodeHal() throws Exception {
1269f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        byte[] expected = new byte[]{(byte) 'C', (byte) 'A'};
1270f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1271f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        when(mIWifiApIface.setCountryCode(any()))
1272f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass                .thenReturn(mWifiStatusSuccess);
1273f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1274f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
1275f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1276d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, null));
1277d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, ""));
1278d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, "A"));
1279d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // Only one expected to succeed
1280d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, "CA"));
1281d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, "ZZZ"));
1282f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1283f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        verify(mIWifiApIface).setCountryCode(eq(expected));
1284f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    }
128553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
128653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
12878dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that RemoteException is caught and logged.
12888dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
12898dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
12908dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testRemoteExceptionIsHandled() throws Exception {
12918dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = spy(mWifiLog);
1292e1d5fa72eb35fb8f936e19d0830548593de6a6ffMichael Plass        mWifiVendorHal.mVerboseLog = mWifiLog;
12938dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        when(mIWifiApIface.setCountryCode(any()))
12948dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass                .thenThrow(new RemoteException("oops"));
12958dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
1296d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, "CA"));
1297e1d5fa72eb35fb8f936e19d0830548593de6a6ffMichael Plass        assertFalse(mWifiVendorHal.isHalStarted());
129844f4850de75c4de3389d7ecf48d82142e0590476mukesh agrawal        verify(mWifiLog).err("% RemoteException in HIDL call %");
12998dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
13008dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
13018dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
130253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that startLoggingToDebugRingBuffer is plumbed to chip
130353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
130453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * A call before the vendor hal is started should just return false.
130553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * After starting in STA mode, the call should succeed, and pass ther right things down.
130653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
130753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
130853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBuffer() throws Exception {
130953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
131053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
131153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
131253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
131353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
131453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
131553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
131653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
131753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
131853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
131953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
132053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
132153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Same test as testStartLoggingRingBuffer, but in AP mode rather than STA.
132253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
132353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
132453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBufferOnAp() throws Exception {
132553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
132653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
132753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
132853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
132953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
133053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
133153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
133253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
133353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
133453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
133553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
133653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
133753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferStatus gets and translates its stuff correctly
133853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
133953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
134053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testRingBufferStatus() throws Exception {
134153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus one = new WifiDebugRingBufferStatus();
134253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringName = "One";
134353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.flags = WifiDebugRingBufferFlags.HAS_BINARY_ENTRIES;
134453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringId = 5607371;
134553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.sizeInBytes = 54321;
134653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.freeSizeInBytes = 42;
134753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.verboseLevel = WifiDebugRingBufferVerboseLevel.VERBOSE;
134853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        String oneExpect = "name: One flag: 1 ringBufferId: 5607371 ringBufferByteSize: 54321"
134953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                + " verboseLevel: 2 writtenBytes: 0 readBytes: 0 writtenRecords: 0";
135053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
135153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus two = new WifiDebugRingBufferStatus();
135253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringName = "Two";
135353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.flags = WifiDebugRingBufferFlags.HAS_ASCII_ENTRIES
135453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                | WifiDebugRingBufferFlags.HAS_PER_PACKET_ENTRIES;
135553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringId = 4512470;
135653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.sizeInBytes = 300;
135753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.freeSizeInBytes = 42;
135853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.verboseLevel = WifiDebugRingBufferVerboseLevel.DEFAULT;
135953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
136053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        ArrayList<WifiDebugRingBufferStatus> halBufferStatus = new ArrayList<>(2);
136153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(one);
136253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(two);
136353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
136453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiNative.RingBufferStatus[] actual;
136553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
136653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        doAnswer(new AnswerWithArguments() {
136753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            public void answer(IWifiChip.getDebugRingBuffersStatusCallback cb)
136853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                    throws RemoteException {
136953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                cb.onValues(mWifiStatusSuccess, halBufferStatus);
137053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            }
137153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        }).when(mIWifiChip).getDebugRingBuffersStatus(any(
137253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                IWifiChip.getDebugRingBuffersStatusCallback.class));
137353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
137453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
137553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        actual = mWifiVendorHal.getRingBufferStatus();
137653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
137753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(halBufferStatus.size(), actual.length);
137853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(oneExpect, actual[0].toString());
137953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(two.ringId, actual[1].ringBufferId);
138053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
138153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
138253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
138353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferData calls forceDumpToDebugRingBuffer
138453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
138553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Try once before hal start, and twice after (one success, one failure).
138653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
138753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
138853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testForceRingBufferDump() throws Exception {
138953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Gunk"))).thenReturn(mWifiStatusSuccess);
139053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Glop"))).thenReturn(mWifiStatusFailure);
139153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
139253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Gunk")); // hal not started
139353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
139453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
139553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
139653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.getRingBufferData("Gunk")); // mocked call succeeds
139753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Glop")); // mocked call fails
139853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
139953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Gunk");
140053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Glop");
140153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
140253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
14035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
14045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the start of packet fate monitoring.
14055a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
14065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after (one success, one failure).
14075a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
14085a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
14095a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testStartPktFateMonitoring() throws Exception {
14105a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        when(mIWifiStaIface.startDebugPacketFateMonitoring()).thenReturn(mWifiStatusSuccess);
14115a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
1412d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.startPktFateMonitoring(TEST_IFACE_NAME));
14135a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never()).startDebugPacketFateMonitoring();
14145a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14155a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1416d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.startPktFateMonitoring(TEST_IFACE_NAME));
14175a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface).startDebugPacketFateMonitoring();
14185a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
14195a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14205a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
14215a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of tx packet fates.
14225a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
14235a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
14245a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
14255a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
14265a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFates() throws Exception {
14275a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
14285a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
14295a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugTxPacketFateReport fateReport = new WifiDebugTxPacketFateReport();
14305a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugTxPacketFate.DRV_QUEUED;
14315a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
14325a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.ETHERNET_II;
14335a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
14345a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
14355a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14365a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
14375a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugTxPacketFatesCallback cb) {
14385a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
14395a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugTxPacketFateReport>(Arrays.asList(fateReport)));
14405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
14415a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
14425a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.TxFateReport[] retrievedFates = new WifiNative.TxFateReport[1];
1445d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getTxPktFates(TEST_IFACE_NAME, retrievedFates));
14465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
14475a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14485a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14495a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
14505a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
1451d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.getTxPktFates(TEST_IFACE_NAME, retrievedFates));
14525a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
14535a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14545a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.TX_PKT_FATE_DRV_QUEUED, retrievedFates[0].mFate);
14555a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
14565a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
14575a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, retrievedFates[0].mFrameType);
14585a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
14595a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
14605a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14615a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
14625a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of tx packet fates when the number of fates retrieved exceeds the
14635a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * input array.
14645a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
14655a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
14665a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
14675a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
14685a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFatesExceedsInputArrayLength() throws Exception {
14695a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
14705a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
14715a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugTxPacketFateReport fateReport = new WifiDebugTxPacketFateReport();
14725a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugTxPacketFate.FW_DROP_OTHER;
14735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
14745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.MGMT_80211;
14755a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
14765a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
14775a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14785a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
14795a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugTxPacketFatesCallback cb) {
14805a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
14815a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugTxPacketFateReport>(Arrays.asList(
14825a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                                fateReport, fateReport)));
14835a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
14845a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
14855a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14865a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14875a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.TxFateReport[] retrievedFates = new WifiNative.TxFateReport[1];
1488d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getTxPktFates(TEST_IFACE_NAME, retrievedFates));
14895a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
14905a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14915a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14925a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
14935a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
1494d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.getTxPktFates(TEST_IFACE_NAME, retrievedFates));
14955a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
14965a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14975a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.TX_PKT_FATE_FW_DROP_OTHER, retrievedFates[0].mFate);
14985a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
14995a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
15005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_80211_MGMT, retrievedFates[0].mFrameType);
15015a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
15025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
15035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
15055a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of rx packet fates.
15065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
15075a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
15085a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
15095a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
15105a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFates() throws Exception {
15115a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
15125a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
15135a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugRxPacketFateReport fateReport = new WifiDebugRxPacketFateReport();
15145a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugRxPacketFate.SUCCESS;
15155a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
15165a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.ETHERNET_II;
15175a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
15185a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
15195a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15205a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
15215a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugRxPacketFatesCallback cb) {
15225a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
15235a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugRxPacketFateReport>(Arrays.asList(fateReport)));
15245a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
15255a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
15265a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15275a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15285a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.RxFateReport[] retrievedFates = new WifiNative.RxFateReport[1];
1529d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getRxPktFates(TEST_IFACE_NAME, retrievedFates));
15305a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
15315a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15325a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15335a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
15345a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
1535d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.getRxPktFates(TEST_IFACE_NAME, retrievedFates));
15365a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
15375a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15385a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.RX_PKT_FATE_SUCCESS, retrievedFates[0].mFate);
15395a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
15405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
15415a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, retrievedFates[0].mFrameType);
15425a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
15435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
15445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15455a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
15465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of rx packet fates when the number of fates retrieved exceeds the
15475a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * input array.
15485a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
15495a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
15505a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
15515a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
15525a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFatesExceedsInputArrayLength() throws Exception {
15535a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
15545a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
15555a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugRxPacketFateReport fateReport = new WifiDebugRxPacketFateReport();
15565a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugRxPacketFate.FW_DROP_FILTER;
15575a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
15585a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.MGMT_80211;
15595a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
15605a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
15615a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15625a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
15635a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugRxPacketFatesCallback cb) {
15645a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
15655a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugRxPacketFateReport>(Arrays.asList(
15665a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                                fateReport, fateReport)));
15675a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
15685a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
15695a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15705a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15715a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.RxFateReport[] retrievedFates = new WifiNative.RxFateReport[1];
1572d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getRxPktFates(TEST_IFACE_NAME, retrievedFates));
15735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
15745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15755a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15765a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
15775a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
1578d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.getRxPktFates(TEST_IFACE_NAME, retrievedFates));
15795a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
15805a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15815a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.RX_PKT_FATE_FW_DROP_FILTER, retrievedFates[0].mFate);
15825a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
15835a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
15845a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_80211_MGMT, retrievedFates[0].mFrameType);
15855a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
15865a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
15875a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15885a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
15895a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the failure to retrieve tx packet fates when the input array is empty.
15905a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
15915a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
15925a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFatesEmptyInputArray() throws Exception {
15935a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1594d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getTxPktFates(TEST_IFACE_NAME, new WifiNative.TxFateReport[0]));
15955a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
15965a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
15975a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
15985a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15995a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
16005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the failure to retrieve rx packet fates when the input array is empty.
16015a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
16025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
16035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFatesEmptyInputArray() throws Exception {
16045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1605d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getRxPktFates(TEST_IFACE_NAME, new WifiNative.RxFateReport[0]));
16065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
16075a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
16085a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
1609135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1610135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    /**
1611135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     * Tests the nd offload enable/disable.
1612135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     */
1613135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    @Test
1614135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    public void testEnableDisableNdOffload() throws Exception {
1615135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        when(mIWifiStaIface.enableNdOffload(anyBoolean())).thenReturn(mWifiStatusSuccess);
1616135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1617d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.configureNeighborDiscoveryOffload(TEST_IFACE_NAME, true));
1618135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface, never()).enableNdOffload(anyBoolean());
1619135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1620135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1621135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1622d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.configureNeighborDiscoveryOffload(TEST_IFACE_NAME, true));
1623135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(true));
1624d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.configureNeighborDiscoveryOffload(TEST_IFACE_NAME, false));
1625135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(false));
1626135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    }
1627135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1628135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    /**
1629135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     * Tests the nd offload enable failure.
1630135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     */
1631135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    @Test
1632135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    public void testEnableNdOffloadFailure() throws Exception {
1633135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        when(mIWifiStaIface.enableNdOffload(eq(true))).thenReturn(mWifiStatusFailure);
1634135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1635135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1636135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1637d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.configureNeighborDiscoveryOffload(TEST_IFACE_NAME, true));
1638135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(true));
1639135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    }
1640cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1641cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    /**
1642cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     * Tests the retrieval of wlan wake reason stats.
1643cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     */
1644cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    @Test
1645cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    public void testGetWlanWakeReasonCount() throws Exception {
1646cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        WifiDebugHostWakeReasonStats stats = new WifiDebugHostWakeReasonStats();
1647cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        Random rand = new Random();
1648cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalCmdEventWakeCnt = rand.nextInt();
1649cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalDriverFwLocalWakeCnt = rand.nextInt();
1650cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalRxPacketWakeCnt = rand.nextInt();
1651cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxPktWakeDetails.rxUnicastCnt = rand.nextInt();
1652cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxPktWakeDetails.rxMulticastCnt = rand.nextInt();
1653cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxIcmpPkWakeDetails.icmpPkt = rand.nextInt();
1654cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxIcmpPkWakeDetails.icmp6Pkt = rand.nextInt();
1655cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt = rand.nextInt();
1656cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt = rand.nextInt();
1657cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1658cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        doAnswer(new AnswerWithArguments() {
1659cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            public void answer(IWifiChip.getDebugHostWakeReasonStatsCallback cb) {
1660cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                cb.onValues(mWifiStatusSuccess, stats);
1661cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            }
1662cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        }).when(mIWifiChip).getDebugHostWakeReasonStats(
1663cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1664cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1665cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNull(mWifiVendorHal.getWlanWakeReasonCount());
1666cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip, never())
1667cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                .getDebugHostWakeReasonStats(
1668cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                        any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1669cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1670cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1671cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1672cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        WifiWakeReasonAndCounts retrievedStats = mWifiVendorHal.getWlanWakeReasonCount();
1673cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip).getDebugHostWakeReasonStats(
1674cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1675cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNotNull(retrievedStats);
1676cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalCmdEventWakeCnt, retrievedStats.totalCmdEventWake);
1677cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalDriverFwLocalWakeCnt, retrievedStats.totalDriverFwLocalWake);
1678cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalRxPacketWakeCnt, retrievedStats.totalRxDataWake);
1679cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxPktWakeDetails.rxUnicastCnt, retrievedStats.rxUnicast);
1680cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxPktWakeDetails.rxMulticastCnt, retrievedStats.rxMulticast);
1681cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxIcmpPkWakeDetails.icmpPkt, retrievedStats.icmp);
1682cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxIcmpPkWakeDetails.icmp6Pkt, retrievedStats.icmp6);
1683cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt,
1684cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                retrievedStats.ipv4RxMulticast);
1685cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt,
1686cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                retrievedStats.ipv6Multicast);
1687cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    }
1688cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1689cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    /**
1690cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     * Tests the failure in retrieval of wlan wake reason stats.
1691cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     */
1692cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    @Test
1693cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    public void testGetWlanWakeReasonCountFailure() throws Exception {
1694cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        doAnswer(new AnswerWithArguments() {
1695cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            public void answer(IWifiChip.getDebugHostWakeReasonStatsCallback cb) {
1696cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                cb.onValues(mWifiStatusFailure, new WifiDebugHostWakeReasonStats());
1697cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            }
1698cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        }).when(mIWifiChip).getDebugHostWakeReasonStats(
1699cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1700cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1701cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        // This should work in both AP & STA mode.
1702cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
1703cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1704cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNull(mWifiVendorHal.getWlanWakeReasonCount());
1705cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip).getDebugHostWakeReasonStats(
1706cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1707cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    }
17082f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17092f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    /**
17102f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Test that getFwMemoryDump is properly plumbed
17112f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     */
17122f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    @Test
17132f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    public void testGetFwMemoryDump() throws Exception {
17142f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        byte [] sample = NativeUtil.hexStringToByteArray("268c7a3fbfa4661c0bdd6a36");
17152f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        ArrayList<Byte> halBlob = NativeUtil.byteArrayToArrayList(sample);
17162f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17172f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        doAnswer(new AnswerWithArguments() {
17182f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            public void answer(IWifiChip.requestFirmwareDebugDumpCallback cb)
17192f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                    throws RemoteException {
17202f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                cb.onValues(mWifiStatusSuccess, halBlob);
17212f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            }
17222f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        }).when(mIWifiChip).requestFirmwareDebugDump(any(
17232f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                IWifiChip.requestFirmwareDebugDumpCallback.class));
17242f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17252f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
17262f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertArrayEquals(sample, mWifiVendorHal.getFwMemoryDump());
17272f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    }
17282f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17292f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    /**
17302f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Test that getDriverStateDump is properly plumbed
17312f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     *
17322f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Just for variety, use AP mode here.
17332f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     */
17342f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    @Test
17352f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    public void testGetDriverStateDump() throws Exception {
17362f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        byte [] sample = NativeUtil.hexStringToByteArray("e83ff543cf80083e6459d20f");
17372f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        ArrayList<Byte> halBlob = NativeUtil.byteArrayToArrayList(sample);
17382f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17392f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        doAnswer(new AnswerWithArguments() {
17402f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            public void answer(IWifiChip.requestDriverDebugDumpCallback cb)
17412f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                    throws RemoteException {
17422f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                cb.onValues(mWifiStatusSuccess, halBlob);
17432f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            }
17442f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        }).when(mIWifiChip).requestDriverDebugDump(any(
17452f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                IWifiChip.requestDriverDebugDumpCallback.class));
17462f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17472f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
17482f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertArrayEquals(sample, mWifiVendorHal.getDriverStateDump());
17492f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    }
1750d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1751d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1752d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan failure is handled correctly.
1753d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1754d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1755d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFailureCallback() throws Exception {
1756d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1757d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1758d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1759d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1760d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1761d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1762d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanFailure(mWifiVendorHal.mScan.cmdId);
1763d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_FAILED);
1764d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1765d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1766d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1767136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test that background scan failure with wrong id is not reported.
1768d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1769d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1770d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFailureCallbackWithInvalidCmdId() throws Exception {
1771d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1772d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1773d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1774d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1775d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1776d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1777d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanFailure(mWifiVendorHal.mScan.cmdId + 1);
1778d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler, never()).onScanStatus(WifiNative.WIFI_SCAN_FAILED);
1779d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1780d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1781d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1782d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan full results are handled correctly.
1783d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1784d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1785d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFullScanResults() throws Exception {
1786d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1787d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1788d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1789d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1790d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1791d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1792d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<StaScanResult, ScanResult> result = createHidlAndFrameworkBgScanResult();
1793d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundFullScanResult(
17946b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius                mWifiVendorHal.mScan.cmdId, 5, result.first);
1795d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1796d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArgumentCaptor<ScanResult> scanResultCaptor = ArgumentCaptor.forClass(ScanResult.class);
17976b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(eventHandler).onFullScanResult(scanResultCaptor.capture(), eq(5));
1798d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1799d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanResultEqual(result.second, scanResultCaptor.getValue());
1800d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1801d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1802d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1803d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan results are handled correctly.
1804d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1805d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1806d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanScanResults() throws Exception {
1807d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1808d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1809d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1810d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1811d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1812d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1813d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<ArrayList<StaScanData>, ArrayList<WifiScanner.ScanData>> data =
1814d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                createHidlAndFrameworkBgScanDatas();
1815d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanResults(
1816d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                mWifiVendorHal.mScan.cmdId, data.first);
1817d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1818d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);
1819d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanDatasEqual(
1820d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                data.second, Arrays.asList(mWifiVendorHal.mScan.latestScanResults));
1821d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1822d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
18231514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
1824136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test that starting a new background scan when one is active will stop the previous one.
1825136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1826136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1827136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanReplacement() throws Exception {
1828136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1829136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1830136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1831136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1832136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1833136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId1 = mWifiVendorHal.mScan.cmdId;
1834136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1835136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotEquals(mWifiVendorHal.mScan.cmdId, cmdId1);
1836136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface, times(2)).startBackgroundScan(anyInt(), any());
1837136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId1);
1838136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1839136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1840136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
1841136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test stopping a background scan.
1842136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1843136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1844136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanStop() throws Exception {
1845136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1846136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1847136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1848136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1849136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1850136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1851136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId = mWifiVendorHal.mScan.cmdId;
1852136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1853d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.stopBgScan(TEST_IFACE_NAME);
1854d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.stopBgScan(TEST_IFACE_NAME); // second call should not do anything
1855136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId); // Should be called just once
1856136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1857136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1858136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
1859136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test pausing and restarting a background scan.
1860136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1861136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1862136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanPauseAndRestart() throws Exception {
1863136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1864136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1865136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1866136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1867136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1868136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1869136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId = mWifiVendorHal.mScan.cmdId;
1870136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1871d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.pauseBgScan(TEST_IFACE_NAME);
1872d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.restartBgScan(TEST_IFACE_NAME);
1873136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId); // Should be called just once
1874136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface, times(2)).startBackgroundScan(eq(cmdId), any());
1875136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1876136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1877136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
18781514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of log handler set.
18791514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
18801514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
18811514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testSetLogHandler() throws Exception {
18821514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
18831514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18841514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
18851514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
18861514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18871514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.setLoggingEventHandler(eventHandler));
18881514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
18891514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18901514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
18911514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18921514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
18931514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
18941514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        reset(mIWifiChip);
18951514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18961514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Second call should fail.
18971514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.setLoggingEventHandler(eventHandler));
18981514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
18991514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
19001514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19011514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
19021514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of log handler reset.
19031514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
19041514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
19051514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testResetLogHandler() throws Exception {
19061514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
19076b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
19081514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19091514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
19101514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
19116b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
19121514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19131514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
19141514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19151514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Not set, so this should fail.
19161514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
19171514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
19186b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
19191514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19201514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now set and then reset.
19211514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(
19221514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class)));
19231514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
19241514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(false));
19256b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip).stopLoggingToDebugRingBuffer();
19261514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        reset(mIWifiChip);
19271514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19281514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Second reset should fail.
19291514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
19301514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
19316b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
19321514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
19331514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19341514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
19351514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of alert callback.
19361514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
19371514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
19381514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testAlertCallback() throws Exception {
19391514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
19401514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertNotNull(mIWifiChipEventCallback);
19411514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
1942cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        testAlertCallbackUsingProvidedCallback(mIWifiChipEventCallback);
19431514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
19441514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19451514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
19461514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of ring buffer callback.
19471514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
19481514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
19491514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testRingBufferDataCallback() throws Exception {
19501514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
19516b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
19521514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19531514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
19541514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertNotNull(mIWifiChipEventCallback);
19551514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19561514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        byte[] errorData = new byte[45];
19571514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        new Random().nextBytes(errorData);
19581514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19591514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Randomly raise the HIDL callback before we register for the log callback.
19605e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        // This should be safely ignored. (Not trigger NPE.)
19611514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
19621514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
19635e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
19641514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19651514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
19661514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
19671514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
19681514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
19691514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19701514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now raise the HIDL callback, this should be properly handled.
19711514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
19721514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
19735e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
19741514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(eventHandler).onRingBufferData(
19751514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                any(WifiNative.RingBufferStatus.class), eq(errorData));
19761514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19771514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now stop the logging and invoke the callback. This should be ignored.
19785e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        reset(eventHandler);
19791514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
19801514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
19811514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
19825e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
19835e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        verify(eventHandler, never()).onRingBufferData(anyObject(), anyObject());
19841514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
19851514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
1986af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    /**
1987af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius     * Test the handling of Vendor HAL death.
1988af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius     */
1989af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    @Test
1990af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    public void testVendorHalDeath() {
1991af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        // Invoke the HAL device manager status callback with ready set to false to indicate the
1992af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        // death of the HAL.
1993af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        when(mHalDeviceManager.isReady()).thenReturn(false);
1994af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        mHalDeviceManagerStatusCallbacks.onStatusChanged();
1995af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius
1996af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        verify(mVendorHalDeathHandler).onDeath();
1997af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    }
1998af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius
1999ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
2000b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     * Test the new selectTxPowerScenario HIDL method invocation. This should return failure if the
2001ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * HAL service is exposing the 1.0 interface.
2002ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
2003ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
2004b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    public void testSelectTxPowerScenario() throws RemoteException {
20053153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2006ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Should fail because we exposed the 1.0 IWifiChip.
2007b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        assertFalse(
2008b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius                mWifiVendorHal.selectTxPowerScenario(WifiNative.TX_POWER_SCENARIO_VOICE_CALL));
2009b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).selectTxPowerScenario(anyInt());
2010ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
2011ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
2012ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Now expose the 1.1 IWifiChip.
2013ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
2014b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        when(mIWifiChipV11.selectTxPowerScenario(anyInt())).thenReturn(mWifiStatusSuccess);
2015ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
20163153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2017b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        assertTrue(
2018b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius                mWifiVendorHal.selectTxPowerScenario(WifiNative.TX_POWER_SCENARIO_VOICE_CALL));
2019b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11).selectTxPowerScenario(
2020b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius                eq(android.hardware.wifi.V1_1.IWifiChip.TxPowerScenario.VOICE_CALL));
2021b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).resetTxPowerScenario();
2022ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
2023ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
2024ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
2025ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
2026b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     * Test the new resetTxPowerScenario HIDL method invocation. This should return failure if the
2027ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * HAL service is exposing the 1.0 interface.
2028ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
2029ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
2030b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    public void testResetTxPowerScenario() throws RemoteException {
20313153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2032ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Should fail because we exposed the 1.0 IWifiChip.
2033b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        assertFalse(mWifiVendorHal.selectTxPowerScenario(WifiNative.TX_POWER_SCENARIO_NORMAL));
2034b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).resetTxPowerScenario();
2035ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
2036ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
2037ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Now expose the 1.1 IWifiChip.
2038ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
2039b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        when(mIWifiChipV11.resetTxPowerScenario()).thenReturn(mWifiStatusSuccess);
2040b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius
20413153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2042b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        assertTrue(mWifiVendorHal.selectTxPowerScenario(WifiNative.TX_POWER_SCENARIO_NORMAL));
2043b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11).resetTxPowerScenario();
2044b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).selectTxPowerScenario(anyInt());
2045b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        mWifiVendorHal.stopVendorHal();
2046b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    }
2047b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius
2048b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    /**
2049b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     * Test the new selectTxPowerScenario HIDL method invocation with a bad scenario index.
2050b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     */
2051b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    @Test
2052b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    public void testInvalidSelectTxPowerScenario() throws RemoteException {
2053b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        // Expose the 1.1 IWifiChip.
2054b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
2055b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        when(mIWifiChipV11.selectTxPowerScenario(anyInt())).thenReturn(mWifiStatusSuccess);
2056ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
20573153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2058b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        assertFalse(mWifiVendorHal.selectTxPowerScenario(-6));
2059b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).selectTxPowerScenario(anyInt());
2060b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).resetTxPowerScenario();
2061ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
2062ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
2063ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
20643153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    /**
20653153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * Test the STA Iface creation failure due to iface name retrieval failure.
20663153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     */
20673153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    @Test
20683153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    public void testCreateStaIfaceFailureInIfaceName() throws RemoteException {
20693153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        doAnswer(new AnswerWithArguments() {
20703153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            public void answer(IWifiIface.getNameCallback cb)
20713153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                    throws RemoteException {
20723153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                cb.onValues(mWifiStatusFailure, "wlan0");
20733153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            }
20743153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        }).when(mIWifiStaIface).getName(any(IWifiIface.getNameCallback.class));
20753153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
20763153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
20777dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        assertNull(mWifiVendorHal.createStaIface(true, null));
20787dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(true), any(), eq(null));
20793153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    }
20803153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
20813153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    /**
20823153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * Test the STA Iface creation failure due to iface name retrieval failure.
20833153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     */
20843153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    @Test
2085d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius    public void testCreateApIfaceFailureInIfaceName() throws RemoteException {
20863153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        doAnswer(new AnswerWithArguments() {
20873153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            public void answer(IWifiIface.getNameCallback cb)
20883153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                    throws RemoteException {
20893153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                cb.onValues(mWifiStatusFailure, "wlan0");
20903153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            }
20913153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        }).when(mIWifiApIface).getName(any(IWifiIface.getNameCallback.class));
20923153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
20933153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
20943153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertNull(mWifiVendorHal.createApIface(null));
2095be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(any(), eq(null));
20963153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    }
20973153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
20983153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    /**
20993153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * Test the creation and removal of STA Iface.
21003153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     */
21013153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    @Test
21023153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    public void testCreateRemoveStaIface() throws RemoteException {
21033153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
21047dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        String ifaceName = mWifiVendorHal.createStaIface(false, null);
21057dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
2106d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(TEST_IFACE_NAME, ifaceName);
21073153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.removeStaIface(ifaceName));
21083153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        verify(mHalDeviceManager).removeIface(eq(mIWifiStaIface));
21093153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    }
21103153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
21113153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    /**
21123153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * Test the creation and removal of Ap Iface.
21133153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     */
21143153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    @Test
21153153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    public void testCreateRemoveApIface() throws RemoteException {
21163153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
21173153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        String ifaceName = mWifiVendorHal.createApIface(null);
2118be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(any(), eq(null));
2119d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(TEST_IFACE_NAME, ifaceName);
21203153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.removeApIface(ifaceName));
21213153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        verify(mHalDeviceManager).removeIface(eq(mIWifiApIface));
21223153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    }
21233153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
2124cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    /**
2125cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius     * Test the callback handling for the 1.2 HAL.
2126cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius     */
2127cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    @Test
2128cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    public void testAlertCallbackUsing_1_2_EventCallback() throws Exception {
2129cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        // Expose the 1.2 IWifiChip.
2130cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
2131cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2132cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2133cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        assertNotNull(mIWifiChipEventCallbackV12);
2134cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2135cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        testAlertCallbackUsingProvidedCallback(mIWifiChipEventCallbackV12);
2136cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    }
2137cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
21381c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    /**
21391c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * Verifies setMacAddress() success.
21401c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     */
21411c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    @Test
21421c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    public void testSetMacAddressSuccess() throws Exception {
21431c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        // Expose the 1.2 IWifiStaIface.
21441c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
21451c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        byte[] macByteArray = TEST_MAC_ADDRESS.toByteArray();
21461c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        when(mIWifiStaIfaceV12.setMacAddress(macByteArray)).thenReturn(mWifiStatusSuccess);
21471c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21481c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        assertTrue(mWifiVendorHal.setMacAddress(TEST_IFACE_NAME, TEST_MAC_ADDRESS));
21491c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        verify(mIWifiStaIfaceV12).setMacAddress(macByteArray);
21501c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    }
21511c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21521c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    /**
21531c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * Verifies setMacAddress() can handle failure status.
21541c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     */
21551c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    @Test
21561c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    public void testSetMacAddressFailDueToStatusFailure() throws Exception {
21571c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        // Expose the 1.2 IWifiStaIface.
21581c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
21591c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        byte[] macByteArray = TEST_MAC_ADDRESS.toByteArray();
21601c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        when(mIWifiStaIfaceV12.setMacAddress(macByteArray)).thenReturn(mWifiStatusFailure);
21611c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21621c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        assertFalse(mWifiVendorHal.setMacAddress(TEST_IFACE_NAME, TEST_MAC_ADDRESS));
21631c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        verify(mIWifiStaIfaceV12).setMacAddress(macByteArray);
21641c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    }
21651c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21661c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    /**
21671c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * Verifies setMacAddress() can handle RemoteException.
21681c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     */
21691c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    @Test
21701c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    public void testSetMacAddressFailDueToRemoteException() throws Exception {
21711c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        // Expose the 1.2 IWifiStaIface.
21721c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
21731c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        byte[] macByteArray = TEST_MAC_ADDRESS.toByteArray();
21741c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        doThrow(new RemoteException()).when(mIWifiStaIfaceV12).setMacAddress(macByteArray);
21751c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21761c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        assertFalse(mWifiVendorHal.setMacAddress(TEST_IFACE_NAME, TEST_MAC_ADDRESS));
21771c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        verify(mIWifiStaIfaceV12).setMacAddress(macByteArray);
21781c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    }
21791c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21801c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    /**
21811c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * Verifies setMacAddress() does not crash with older HALs.
21821c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     */
21831c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    @Test
21841c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    public void testSetMacAddressDoesNotCrashOnOlderHal() throws Exception {
21851c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        byte[] macByteArray = TEST_MAC_ADDRESS.toByteArray();
21861c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        assertFalse(mWifiVendorHal.setMacAddress(TEST_IFACE_NAME, TEST_MAC_ADDRESS));
21871c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    }
21881c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
2189f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    /**
2190f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius     * Verifies radio mode change callback to indicate DBS mode.
2191f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius     */
2192f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    @Test
2193f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    public void testRadioModeChangeCallbackToDbsMode() throws Exception {
2194f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        startHalInStaModeAndRegisterRadioModeChangeCallback();
2195f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2196f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        RadioModeInfo radioModeInfo0 = new RadioModeInfo();
2197f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo0.bandInfo = WifiScanner.WIFI_BAND_5_GHZ;
2198f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        RadioModeInfo radioModeInfo1 = new RadioModeInfo();
2199f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo1.bandInfo = WifiScanner.WIFI_BAND_24_GHZ;
2200f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2201f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        IfaceInfo ifaceInfo0 = new IfaceInfo();
2202f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo0.name = TEST_IFACE_NAME;
2203f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo0.channel = 34;
2204f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        IfaceInfo ifaceInfo1 = new IfaceInfo();
2205f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo1.name = TEST_IFACE_NAME_1;
2206f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo1.channel = 1;
2207f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2208f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo0.ifaceInfos.add(ifaceInfo0);
2209f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo1.ifaceInfos.add(ifaceInfo1);
2210f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2211f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ArrayList<RadioModeInfo> radioModeInfos = new ArrayList<>();
2212f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfos.add(radioModeInfo0);
2213f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfos.add(radioModeInfo1);
2214f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2215f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        mIWifiChipEventCallbackV12.onRadioModeChange(radioModeInfos);
2216f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        verify(mVendorHalRadioModeChangeHandler).onDbs();
2217f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2218f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        verifyNoMoreInteractions(mVendorHalRadioModeChangeHandler);
2219f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    }
2220f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2221f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    /**
2222f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius     * Verifies radio mode change callback to indicate SBS mode.
2223f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius     */
2224f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    @Test
2225f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    public void testRadioModeChangeCallbackToSbsMode() throws Exception {
2226f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        startHalInStaModeAndRegisterRadioModeChangeCallback();
2227f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2228f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        RadioModeInfo radioModeInfo0 = new RadioModeInfo();
2229f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo0.bandInfo = WifiScanner.WIFI_BAND_5_GHZ;
2230f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        RadioModeInfo radioModeInfo1 = new RadioModeInfo();
2231f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo1.bandInfo = WifiScanner.WIFI_BAND_5_GHZ;
2232f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2233f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        IfaceInfo ifaceInfo0 = new IfaceInfo();
2234f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo0.name = TEST_IFACE_NAME;
2235f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo0.channel = 34;
2236f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        IfaceInfo ifaceInfo1 = new IfaceInfo();
2237f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo1.name = TEST_IFACE_NAME_1;
2238f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo1.channel = 36;
2239f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2240f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo0.ifaceInfos.add(ifaceInfo0);
2241f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo1.ifaceInfos.add(ifaceInfo1);
2242f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2243f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ArrayList<RadioModeInfo> radioModeInfos = new ArrayList<>();
2244f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfos.add(radioModeInfo0);
2245f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfos.add(radioModeInfo1);
2246f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2247f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        mIWifiChipEventCallbackV12.onRadioModeChange(radioModeInfos);
2248f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        verify(mVendorHalRadioModeChangeHandler).onSbs(WifiScanner.WIFI_BAND_5_GHZ);
2249f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2250f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        verifyNoMoreInteractions(mVendorHalRadioModeChangeHandler);
2251f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    }
2252f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2253f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    /**
2254f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius     * Verifies radio mode change callback to indicate SCC mode.
2255f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius     */
2256f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    @Test
2257f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    public void testRadioModeChangeCallbackToSccMode() throws Exception {
2258f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        startHalInStaModeAndRegisterRadioModeChangeCallback();
2259f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2260f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        RadioModeInfo radioModeInfo0 = new RadioModeInfo();
2261f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo0.bandInfo = WifiScanner.WIFI_BAND_5_GHZ;
2262f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2263f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        IfaceInfo ifaceInfo0 = new IfaceInfo();
2264f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo0.name = TEST_IFACE_NAME;
2265f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo0.channel = 34;
2266f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        IfaceInfo ifaceInfo1 = new IfaceInfo();
2267f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo1.name = TEST_IFACE_NAME_1;
2268f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo1.channel = 34;
2269f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2270f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo0.ifaceInfos.add(ifaceInfo0);
2271f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo0.ifaceInfos.add(ifaceInfo1);
2272f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2273f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ArrayList<RadioModeInfo> radioModeInfos = new ArrayList<>();
2274f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfos.add(radioModeInfo0);
2275f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2276f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        mIWifiChipEventCallbackV12.onRadioModeChange(radioModeInfos);
2277f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        verify(mVendorHalRadioModeChangeHandler).onScc(WifiScanner.WIFI_BAND_5_GHZ);
2278f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2279f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        verifyNoMoreInteractions(mVendorHalRadioModeChangeHandler);
2280f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    }
2281f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2282f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    /**
2283f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius     * Verifies radio mode change callback to indicate MCC mode.
2284f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius     */
2285f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    @Test
2286f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    public void testRadioModeChangeCallbackToMccMode() throws Exception {
2287f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        startHalInStaModeAndRegisterRadioModeChangeCallback();
2288f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2289f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        RadioModeInfo radioModeInfo0 = new RadioModeInfo();
229049ad9d4f0c52b44dcfce54bc594df902dda3df0cRoshan Pius        radioModeInfo0.bandInfo = WifiScanner.WIFI_BAND_BOTH;
2291f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2292f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        IfaceInfo ifaceInfo0 = new IfaceInfo();
2293f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo0.name = TEST_IFACE_NAME;
229449ad9d4f0c52b44dcfce54bc594df902dda3df0cRoshan Pius        ifaceInfo0.channel = 1;
2295f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        IfaceInfo ifaceInfo1 = new IfaceInfo();
2296f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo1.name = TEST_IFACE_NAME_1;
2297f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo1.channel = 36;
2298f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2299f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo0.ifaceInfos.add(ifaceInfo0);
2300f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo0.ifaceInfos.add(ifaceInfo1);
2301f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2302f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ArrayList<RadioModeInfo> radioModeInfos = new ArrayList<>();
2303f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfos.add(radioModeInfo0);
2304f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2305f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        mIWifiChipEventCallbackV12.onRadioModeChange(radioModeInfos);
230649ad9d4f0c52b44dcfce54bc594df902dda3df0cRoshan Pius        verify(mVendorHalRadioModeChangeHandler).onMcc(WifiScanner.WIFI_BAND_BOTH);
2307f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2308f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        verifyNoMoreInteractions(mVendorHalRadioModeChangeHandler);
2309f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    }
2310f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2311f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    /**
2312f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius     * Verifies radio mode change callback error cases.
2313f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius     */
2314f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    @Test
2315f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    public void testRadioModeChangeCallbackErrorSimultaneousWithSameIfaceOnBothRadios()
2316f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius            throws Exception {
2317f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        startHalInStaModeAndRegisterRadioModeChangeCallback();
2318f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2319f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        RadioModeInfo radioModeInfo0 = new RadioModeInfo();
2320f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo0.bandInfo = WifiScanner.WIFI_BAND_24_GHZ;
2321f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        RadioModeInfo radioModeInfo1 = new RadioModeInfo();
2322f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo1.bandInfo = WifiScanner.WIFI_BAND_5_GHZ;
2323f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2324f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        IfaceInfo ifaceInfo0 = new IfaceInfo();
2325f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo0.name = TEST_IFACE_NAME;
2326f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ifaceInfo0.channel = 34;
2327f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2328f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo0.ifaceInfos.add(ifaceInfo0);
2329f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfo1.ifaceInfos.add(ifaceInfo0);
2330f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2331f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        ArrayList<RadioModeInfo> radioModeInfos = new ArrayList<>();
2332f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfos.add(radioModeInfo0);
2333f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        radioModeInfos.add(radioModeInfo1);
2334f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2335f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        mIWifiChipEventCallbackV12.onRadioModeChange(radioModeInfos);
2336f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        // Ignored....
2337f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2338f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        verifyNoMoreInteractions(mVendorHalRadioModeChangeHandler);
2339f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    }
2340f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2341f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    private void startHalInStaModeAndRegisterRadioModeChangeCallback() {
2342f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        // Expose the 1.2 IWifiChip.
2343f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
2344f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        mWifiVendorHal.registerRadioModeChangeHandler(mVendorHalRadioModeChangeHandler);
2345f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2346f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius        assertNotNull(mIWifiChipEventCallbackV12);
2347f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius    }
2348f5749a73fe63a3e01db62a9752be365fb40ec633Roshan Pius
2349cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    private void testAlertCallbackUsingProvidedCallback(IWifiChipEventCallback chipCallback)
2350cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius            throws Exception {
2351cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
2352cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
2353cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2354cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        int errorCode = 5;
2355cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        byte[] errorData = new byte[45];
2356cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        new Random().nextBytes(errorData);
2357cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2358cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        // Randomly raise the HIDL callback before we register for the log callback.
2359cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        // This should be safely ignored. (Not trigger NPE.)
2360cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        chipCallback.onDebugErrorAlert(
2361cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
2362cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        mLooper.dispatchAll();
2363cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2364cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
2365cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
2366cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
2367cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
2368cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2369cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        // Now raise the HIDL callback, this should be properly handled.
2370cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        chipCallback.onDebugErrorAlert(
2371cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
2372cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        mLooper.dispatchAll();
2373cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        verify(eventHandler).onWifiAlert(eq(errorCode), eq(errorData));
2374cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2375cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        // Now stop the logging and invoke the callback. This should be ignored.
2376cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        reset(eventHandler);
2377cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
2378cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        chipCallback.onDebugErrorAlert(
2379cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
2380cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        mLooper.dispatchAll();
2381cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        verify(eventHandler, never()).onWifiAlert(anyInt(), anyObject());
2382cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    }
2383cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2384d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void startBgScan(WifiNative.ScanEventHandler eventHandler) throws Exception {
2385d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        when(mIWifiStaIface.startBackgroundScan(
2386d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                anyInt(), any(StaBackgroundScanParameters.class))).thenReturn(mWifiStatusSuccess);
2387136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanSettings settings = new WifiNative.ScanSettings();
2388136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        settings.num_buckets = 1;
2389136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings();
2390136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.bucket = 0;
2391136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.period_ms = 16000;
2392136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.report_events = WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN;
2393136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        settings.buckets = new WifiNative.BucketSettings[] {bucketSettings};
2394d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.startBgScan(TEST_IFACE_NAME, settings, eventHandler));
2395d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2396d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2397d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // Create a pair of HIDL scan result and its corresponding framework scan result for
2398d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // comparison.
2399d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private Pair<StaScanResult, ScanResult> createHidlAndFrameworkBgScanResult() {
2400d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        StaScanResult staScanResult = new StaScanResult();
2401d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Random random = new Random();
2402d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        byte[] ssid = new byte[8];
2403d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(ssid);
2404d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.ssid.addAll(NativeUtil.byteArrayToArrayList(ssid));
2405d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(staScanResult.bssid);
2406d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.frequency = 2432;
2407d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.rssi = -45;
2408d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.timeStampInUs = 5;
2409d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiInformationElement ie1 = new WifiInformationElement();
2410d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        byte[] ie1_data = new byte[56];
2411d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(ie1_data);
2412d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ie1.id = 1;
2413d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ie1.data.addAll(NativeUtil.byteArrayToArrayList(ie1_data));
2414d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.informationElements.add(ie1);
2415d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2416d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        // Now create the corresponding Scan result structure.
2417d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ScanResult scanResult = new ScanResult();
2418d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.SSID = NativeUtil.encodeSsid(staScanResult.ssid);
2419d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.BSSID = NativeUtil.macAddressFromByteArray(staScanResult.bssid);
2420d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.wifiSsid = WifiSsid.createFromByteArray(ssid);
2421d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.frequency = staScanResult.frequency;
2422d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.level = staScanResult.rssi;
2423d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.timestamp = staScanResult.timeStampInUs;
2424d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2425d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        return Pair.create(staScanResult, scanResult);
2426d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2427d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2428d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // Create a pair of HIDL scan datas and its corresponding framework scan datas for
2429d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // comparison.
2430d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private Pair<ArrayList<StaScanData>, ArrayList<WifiScanner.ScanData>>
2431d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            createHidlAndFrameworkBgScanDatas() {
2432d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArrayList<StaScanData> staScanDatas = new ArrayList<>();
2433d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        StaScanData staScanData = new StaScanData();
2434d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2435d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<StaScanResult, ScanResult> result = createHidlAndFrameworkBgScanResult();
2436d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.results.add(result.first);
2437d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.bucketsScanned = 5;
2438d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.flags = StaScanDataFlagMask.INTERRUPTED;
2439d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanDatas.add(staScanData);
2440d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2441d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArrayList<WifiScanner.ScanData> scanDatas = new ArrayList<>();
2442d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ScanResult[] scanResults = new ScanResult[1];
2443d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResults[0] = result.second;
2444d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiScanner.ScanData scanData =
2445d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                new WifiScanner.ScanData(mWifiVendorHal.mScan.cmdId, 1,
2446d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                        staScanData.bucketsScanned, false, scanResults);
2447d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanDatas.add(scanData);
2448d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        return Pair.create(staScanDatas, scanDatas);
2449d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2450d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2451d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanResultEqual(ScanResult expected, ScanResult actual) {
2452d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.SSID, actual.SSID);
2453d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.wifiSsid.getHexString(), actual.wifiSsid.getHexString());
2454d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.BSSID, actual.BSSID);
2455d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.frequency, actual.frequency);
2456d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.level, actual.level);
2457d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.timestamp, actual.timestamp);
2458d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2459d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2460d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanResultsEqual(ScanResult[] expected, ScanResult[] actual) {
2461d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.length, actual.length);
2462d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        for (int i = 0; i < expected.length; i++) {
2463d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            assertScanResultEqual(expected[i], actual[i]);
2464d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        }
2465d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2466d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2467d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanDataEqual(WifiScanner.ScanData expected, WifiScanner.ScanData actual) {
2468d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getId(), actual.getId());
2469d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getFlags(), actual.getFlags());
2470d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getBucketsScanned(), actual.getBucketsScanned());
2471d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanResultsEqual(expected.getResults(), actual.getResults());
2472d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2473d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2474d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanDatasEqual(
2475d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            List<WifiScanner.ScanData> expected, List<WifiScanner.ScanData> actual) {
2476d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.size(), actual.size());
2477d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        for (int i = 0; i < expected.size(); i++) {
2478d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            assertScanDataEqual(expected.get(i), actual.get(i));
2479d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        }
2480d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2481b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass}
2482