WifiVendorHalTest.java revision e25d3edec10f7b9cd60c291808f760a490b7d31d
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;
410d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport static org.mockito.Mockito.when;
420d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohen
43d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.app.test.MockAnswerUtil.AnswerWithArguments;
44d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiApIface;
45d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiChip;
46542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Piusimport android.hardware.wifi.V1_0.IWifiChipEventCallback;
47d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiIface;
48d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiRttController;
491711409f11610d2d646036306ec8de4fb2f69712Wei Wangimport android.hardware.wifi.V1_0.IWifiRttControllerEventCallback;
50d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiStaIface;
517e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Piusimport android.hardware.wifi.V1_0.IWifiStaIfaceEventCallback;
52ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport android.hardware.wifi.V1_0.IfaceType;
530320a9aa86429e98ff282a9e2297e19337667ad9Michael Plassimport android.hardware.wifi.V1_0.RttBw;
54ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.hardware.wifi.V1_0.RttCapabilities;
55ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.hardware.wifi.V1_0.RttConfig;
560320a9aa86429e98ff282a9e2297e19337667ad9Michael Plassimport android.hardware.wifi.V1_0.RttPreamble;
57ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport android.hardware.wifi.V1_0.StaApfPacketFilterCapabilities;
5856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plassimport android.hardware.wifi.V1_0.StaBackgroundScanCapabilities;
59d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaBackgroundScanParameters;
60699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerIfacePacketStats;
61699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerRadioStats;
62699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plassimport android.hardware.wifi.V1_0.StaLinkLayerStats;
63d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanData;
64d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanDataFlagMask;
65d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.StaScanResult;
66cbe44718452e93ef2b68974230231ff4fac99deeMichael Plassimport android.hardware.wifi.V1_0.WifiDebugHostWakeReasonStats;
675a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugPacketFateFrameType;
6853f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferFlags;
6953f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferStatus;
7053f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferVerboseLevel;
715a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugRxPacketFate;
725a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugRxPacketFateReport;
735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugTxPacketFate;
745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport android.hardware.wifi.V1_0.WifiDebugTxPacketFateReport;
75d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.hardware.wifi.V1_0.WifiInformationElement;
764f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatus;
774f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatusCode;
78505663e1f5ecfd9ec588f5d9073915a5f0a9ecc1Nathan Haroldimport android.net.KeepalivePacketData;
791c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kimimport android.net.MacAddress;
80ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport android.net.apf.ApfCapabilities;
81ea644ad9920420dbcf420602355f9f91a7266b14Michael Plassimport android.net.wifi.RttManager;
82d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.ScanResult;
831dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plassimport android.net.wifi.WifiManager;
84d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.WifiScanner;
85d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.net.wifi.WifiSsid;
86cbe44718452e93ef2b68974230231ff4fac99deeMichael Plassimport android.net.wifi.WifiWakeReasonAndCounts;
870d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohenimport android.os.Handler;
88ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport android.os.Looper;
8953f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.RemoteException;
901711409f11610d2d646036306ec8de4fb2f69712Wei Wangimport android.os.test.TestLooper;
91ed0b7cfa5bb7be5731e42c2aaac7c9fdaa68baa4Nathan Haroldimport android.system.OsConstants;
92d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport android.util.Pair;
931dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
94be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Piusimport com.android.server.wifi.HalDeviceManager.InterfaceDestroyedListener;
95df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plassimport com.android.server.wifi.util.NativeUtil;
96d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
97b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Before;
98b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Test;
99d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport org.mockito.ArgumentCaptor;
100b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.Mock;
101b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.MockitoAnnotations;
1023401582e1b1defc1877c7c47c6a839611fa211c3Michael Plassimport org.mockito.stubbing.Answer;
103b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
10470b995bed9674a30c56b7ae2585d5897900ff695Michael Plassimport java.net.InetAddress;
105ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport java.util.ArrayList;
1065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport java.util.Arrays;
107ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport java.util.HashSet;
108d4c5eca00c9cae55561210479ed61a977923e0daRoshan Piusimport java.util.List;
1095a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plassimport java.util.Random;
110ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Piusimport java.util.Set;
111ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
112b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass/**
113b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * Unit tests for {@link com.android.server.wifi.WifiVendorHal}.
114b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass */
115b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plasspublic class WifiVendorHalTest {
116b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
117d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius    private static final String TEST_IFACE_NAME = "wlan0";
1181c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    private static final MacAddress TEST_MAC_ADDRESS = MacAddress.fromString("ee:33:a2:94:10:92");
1191c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
120d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    WifiVendorHal mWifiVendorHal;
1214f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusSuccess;
1224f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusFailure;
1238dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    WifiLog mWifiLog;
1244f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1254f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private HalDeviceManager mHalDeviceManager;
1264f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
127f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius    private TestLooper mLooper;
1284f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1294f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiVendorHal.HalDeviceManagerStatusListener mHalDeviceManagerStatusCallbacks;
1304f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1314f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiApIface mIWifiApIface;
1324f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1334f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiChip mIWifiChip;
1344f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
135ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    private android.hardware.wifi.V1_1.IWifiChip mIWifiChipV11;
136ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Mock
137cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    private android.hardware.wifi.V1_2.IWifiChip mIWifiChipV12;
138cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    @Mock
1394f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiStaIface mIWifiStaIface;
1404f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
1411c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    private android.hardware.wifi.V1_2.IWifiStaIface mIWifiStaIfaceV12;
1421c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    @Mock
1434f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiRttController mIWifiRttController;
1443401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    private IWifiStaIfaceEventCallback mIWifiStaIfaceEventCallback;
145d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private IWifiChipEventCallback mIWifiChipEventCallback;
146cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    private android.hardware.wifi.V1_2.IWifiChipEventCallback mIWifiChipEventCallbackV12;
147af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    @Mock
148af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    private WifiNative.VendorHalDeathEventHandler mVendorHalDeathHandler;
1493401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
1503401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    /**
151ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Spy used to return the V1_1 IWifiChip mock object to simulate the 1.1 HAL running on the
152ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * device.
153ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
154ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    private class WifiVendorHalSpyV1_1 extends WifiVendorHal {
155ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        WifiVendorHalSpyV1_1(HalDeviceManager halDeviceManager, Looper looper) {
156ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            super(halDeviceManager, looper);
157ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }
158ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
159ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        @Override
160ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        protected android.hardware.wifi.V1_1.IWifiChip getWifiChipForV1_1Mockable() {
161ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            return mIWifiChipV11;
162ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }
163cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
164cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        @Override
165cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        protected android.hardware.wifi.V1_2.IWifiChip getWifiChipForV1_2Mockable() {
166cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius            return null;
167cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        }
1681c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
1691c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        @Override
1701c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        protected android.hardware.wifi.V1_2.IWifiStaIface getWifiStaIfaceForV1_2Mockable(
1711c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim                String ifaceName) {
1721c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim            return null;
1731c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        }
174cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    }
175cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
176cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    /**
1771c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * Spy used to return the V1_2 IWifiChip and IWifiStaIface mock objects to simulate
1781c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * the 1.2 HAL running on the device.
179cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius     */
180cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    private class WifiVendorHalSpyV1_2 extends WifiVendorHal {
181cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        WifiVendorHalSpyV1_2(HalDeviceManager halDeviceManager, Looper looper) {
182cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius            super(halDeviceManager, looper);
183cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        }
184cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
185cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        @Override
186cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        protected android.hardware.wifi.V1_1.IWifiChip getWifiChipForV1_1Mockable() {
187cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius            return null;
188cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        }
189cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
190cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        @Override
191cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        protected android.hardware.wifi.V1_2.IWifiChip getWifiChipForV1_2Mockable() {
192cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius            return mIWifiChipV12;
193cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        }
1941c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
1951c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        @Override
1961c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        protected android.hardware.wifi.V1_2.IWifiStaIface getWifiStaIfaceForV1_2Mockable(
1971c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim                String ifaceName) {
1981c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim            return mIWifiStaIfaceV12;
1991c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        }
200ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
201ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
202ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
2033401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     * Identity function to supply a type to its argument, which is a lambda
2043401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     */
2053401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    static Answer<WifiStatus> answerWifiStatus(Answer<WifiStatus> statusLambda) {
2063401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        return (statusLambda);
2073401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    }
208b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
209b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
210b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     * Sets up for unit test
211b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     */
212b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    @Before
213b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    public void setUp() throws Exception {
214b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass        MockitoAnnotations.initMocks(this);
2158dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = new FakeWifiLog();
216f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius        mLooper = new TestLooper();
2174f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess = new WifiStatus();
2184f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess.code = WifiStatusCode.SUCCESS;
2194f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure = new WifiStatus();
2204f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.code = WifiStatusCode.ERROR_UNKNOWN;
2214f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.description = "I don't even know what a Mock Turtle is.";
2224f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        when(mIWifiStaIface.enableLinkLayerStatsCollection(false)).thenReturn(mWifiStatusSuccess);
2234f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
224d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Setup the HalDeviceManager mock's start/stop behaviour. This can be overridden in
225d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // individual tests, if needed.
226d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
227d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public boolean answer() {
228d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
229d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(true);
230d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
231d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return true;
232d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
233d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
234d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
235d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
236d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public void answer() {
237d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
238d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(false);
239d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
240d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
241d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).stop();
2427dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        when(mHalDeviceManager.createStaIface(anyBoolean(), any(), eq(null)))
243d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiStaIface);
244be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        when(mHalDeviceManager.createApIface(any(), eq(null)))
245d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiApIface);
2463153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        when(mHalDeviceManager.removeIface(any())).thenReturn(true);
247d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class)))
248d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiChip);
2496ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        when(mHalDeviceManager.createRttController()).thenReturn(mIWifiRttController);
250542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
251542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .thenReturn(mWifiStatusSuccess);
2523401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        mIWifiStaIfaceEventCallback = null;
2537e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        when(mIWifiStaIface.registerEventCallback(any(IWifiStaIfaceEventCallback.class)))
2543401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenAnswer(answerWifiStatus((invocation) -> {
2553401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    Object[] args = invocation.getArguments();
2563401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    mIWifiStaIfaceEventCallback = (IWifiStaIfaceEventCallback) args[0];
2573401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                    return (mWifiStatusSuccess);
2583401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                }));
259d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
260d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                .thenAnswer(answerWifiStatus((invocation) -> {
261d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    Object[] args = invocation.getArguments();
262d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    mIWifiChipEventCallback = (IWifiChipEventCallback) args[0];
263d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                    return (mWifiStatusSuccess);
264d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                }));
265cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        when(mIWifiChipV12.registerEventCallback_1_2(
266cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                any(android.hardware.wifi.V1_2.IWifiChipEventCallback.class)))
267cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                .thenAnswer(answerWifiStatus((invocation) -> {
268cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                    Object[] args = invocation.getArguments();
269cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                    mIWifiChipEventCallbackV12 =
270cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                            (android.hardware.wifi.V1_2.IWifiChipEventCallback) args[0];
271cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                    return (mWifiStatusSuccess);
272cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                }));
273d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2741711409f11610d2d646036306ec8de4fb2f69712Wei Wang        when(mIWifiRttController.registerEventCallback(any(IWifiRttControllerEventCallback.class)))
2751711409f11610d2d646036306ec8de4fb2f69712Wei Wang                .thenReturn(mWifiStatusSuccess);
2761711409f11610d2d646036306ec8de4fb2f69712Wei Wang
2773153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        doAnswer(new AnswerWithArguments() {
2783153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            public void answer(IWifiIface.getNameCallback cb)
2793153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                    throws RemoteException {
280d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                cb.onValues(mWifiStatusSuccess, TEST_IFACE_NAME);
2813153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            }
2823153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        }).when(mIWifiStaIface).getName(any(IWifiIface.getNameCallback.class));
2833153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        doAnswer(new AnswerWithArguments() {
2843153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            public void answer(IWifiIface.getNameCallback cb)
2853153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                    throws RemoteException {
286d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                cb.onValues(mWifiStatusSuccess, TEST_IFACE_NAME);
2873153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            }
2883153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        }).when(mIWifiApIface).getName(any(IWifiIface.getNameCallback.class));
2893153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
290d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Create the vendor HAL object under test.
291f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius        mWifiVendorHal = new WifiVendorHal(mHalDeviceManager, mLooper.getLooper());
292d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
293d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Initialize the vendor HAL to capture the registered callback.
294af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        mWifiVendorHal.initialize(mVendorHalDeathHandler);
295d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArgumentCaptor<WifiVendorHal.HalDeviceManagerStatusListener> hdmCallbackCaptor =
296d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                ArgumentCaptor.forClass(WifiVendorHal.HalDeviceManagerStatusListener.class);
2970d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohen        verify(mHalDeviceManager).registerStatusListener(hdmCallbackCaptor.capture(),
2980d5a9d5c9f0914ad145926beb96fb72b39089e02Etan Cohen                any(Handler.class));
299d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mHalDeviceManagerStatusCallbacks = hdmCallbackCaptor.getValue();
300d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
301b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    }
302b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
303b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
304d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in STA mode using
3053153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
306d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
307d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3087e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalSuccessInStaMode() throws  Exception {
3093153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
310d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
311d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
312d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
3137dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
314d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
3156ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager).createRttController();
316d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
317d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
318542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
319542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
320d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
321be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
322d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
323d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
324d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
325d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in AP mode using
3263153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalAp()}.
327d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
328d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3297e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalSuccessInApMode() throws Exception {
3303153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalAp());
331d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
332d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
333d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
334be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(any(), eq(null));
335d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
336d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
337d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
338d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
3397dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
3406ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
341d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
342d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
343d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
344d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
3453153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
346d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
347d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3487e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInStaMode() throws Exception {
349d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // No callbacks are invoked in this case since the start itself failed. So, override
350d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // default AnswerWithArguments that we setup.
351d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
3527e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius            public boolean answer() throws Exception {
353d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return false;
354d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
355d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
3563153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
357d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
358d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
359d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
360d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
3617dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
362be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
363d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
3646ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
365542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface, never())
366542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .registerEventCallback(any(IWifiStaIfaceEventCallback.class));
367d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
368d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
369d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
370d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
3713153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
372d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
373d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3747e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInIfaceCreationInStaMode() throws Exception {
3757dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        when(mHalDeviceManager.createStaIface(anyBoolean(), any(), eq(null))).thenReturn(null);
3763153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
377d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
378d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
379d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
3807dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
381d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
382d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
383be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
384d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
3856ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
386542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface, never())
387542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .registerEventCallback(any(IWifiStaIfaceEventCallback.class));
388d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
389d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
390d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
391d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
3923153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
393d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
394d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
3957e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInRttControllerCreationInStaMode() throws Exception {
3966ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        when(mHalDeviceManager.createRttController()).thenReturn(null);
3973153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
398d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
399d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
400d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
4017dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
4026ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager).createRttController();
403d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
404542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
405d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
406be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
407d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
408d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
409d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
410d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
411d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
4123153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
413d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
414d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
4157e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInChipGetInStaMode() throws Exception {
416d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class))).thenReturn(null);
4173153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
418d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
419d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
420d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
4217dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
4226ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager).createRttController();
423d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(any(IWifiIface.class));
424d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
425542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
426d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
427be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
428d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
429d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
430d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
431d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
4323153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
433d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
434d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
4357e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInStaIfaceCallbackRegistration() throws Exception {
4367e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        when(mIWifiStaIface.registerEventCallback(any(IWifiStaIfaceEventCallback.class)))
4377e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius                .thenReturn(mWifiStatusFailure);
4383153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
4397e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
4407e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
4417e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).start();
4427dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
4437e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager).stop();
444542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
4457e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
4466ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
4477e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
448be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
4497e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    }
4507e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius
4517e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    /**
4527e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     * Tests the failure to start HAL in STA mode using
4533153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalSta()}.
454542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius     */
455542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    @Test
456542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    public void testStartHalFailureInChipCallbackRegistration() throws Exception {
457542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
458542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius                .thenReturn(mWifiStatusFailure);
4593153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalSta());
460542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
461542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
462542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).start();
4637dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
4646ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager).createRttController();
465542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).getChip(any(IWifiIface.class));
466542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mHalDeviceManager).stop();
467542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
468542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
469542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
470be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
471542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    }
472542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius
473542b204c2120a9c91324ccc86c6695012ac02ab7Roshan Pius    /**
4743153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * Tests the failure to start HAL in AP mode using
4753153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * {@link WifiVendorHal#startVendorHalAp()}.
4767e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius     */
4777e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    @Test
4787e4b5bdfa88703a09f611e3ef8973ab7e286375dRoshan Pius    public void testStartHalFailureInApMode() throws Exception {
479be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        when(mHalDeviceManager.createApIface(any(), eq(null))).thenReturn(null);
4803153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertFalse(mWifiVendorHal.startVendorHalAp());
481d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
482d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
483d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
484be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(any(), eq(null));
485d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
486d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
4877dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
488d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
4896ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
490d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
491d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
492d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
493d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in STA mode using
494d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
495d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
496d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
497d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInStaMode() {
4983153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
499d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
500d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
501d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
502d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
503d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
504d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
505d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
5067dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
507d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
5086ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager).createRttController();
509d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
510d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
511d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
512be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
513d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
514d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
515d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
516d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in AP mode using
517d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
518d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
519d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
520d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInApMode() {
5213153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalAp());
522d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
523d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
524d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
525d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
526d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
527d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
528d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
529be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(any(), eq(null));
530d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
531d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
532d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
533d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
5347dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
5356ac9ca60cb5d75f51b633bd0171da2ecf6274b2aEtan Cohen        verify(mHalDeviceManager, never()).createRttController();
536d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
5374f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
5384f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
539be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius     * Tests the handling of interface destroyed callback from HalDeviceManager.
540be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius     */
541be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    @Test
542be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    public void testStaInterfaceDestroyedHandling() throws  Exception {
543be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        ArgumentCaptor<InterfaceDestroyedListener> internalListenerCaptor =
544be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius                ArgumentCaptor.forClass(InterfaceDestroyedListener.class);
545be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        InterfaceDestroyedListener externalLister = mock(InterfaceDestroyedListener.class);
546be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
547be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
5487dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        assertNotNull(mWifiVendorHal.createStaIface(false, externalLister));
549be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
550be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
551be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).start();
5527dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), internalListenerCaptor.capture(),
5537dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen                eq(null));
554be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
555be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createRttController();
556be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).isReady();
557be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).isStarted();
558be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
559be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
560be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
561be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // Now trigger the interface destroyed callback from HalDeviceManager and ensure the
562be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // external listener is invoked and iface removed from internal database.
563be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        internalListenerCaptor.getValue().onDestroyed(TEST_IFACE_NAME);
564be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(externalLister).onDestroyed(TEST_IFACE_NAME);
565be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
566be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // This should fail now, since the interface was already destroyed.
567be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertFalse(mWifiVendorHal.removeStaIface(TEST_IFACE_NAME));
568be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).removeIface(any());
569be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    }
570be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
571be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    /**
572be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius     * Tests the handling of interface destroyed callback from HalDeviceManager.
573be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius     */
574be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    @Test
575be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    public void testApInterfaceDestroyedHandling() throws  Exception {
576be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        ArgumentCaptor<InterfaceDestroyedListener> internalListenerCaptor =
577be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius                ArgumentCaptor.forClass(InterfaceDestroyedListener.class);
578be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        InterfaceDestroyedListener externalLister = mock(InterfaceDestroyedListener.class);
579be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
580be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
581be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertNotNull(mWifiVendorHal.createApIface(externalLister));
582be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
583be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
584be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).start();
585be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(internalListenerCaptor.capture(), eq(null));
586be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
587be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).isReady();
588be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).isStarted();
589be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mIWifiChip).registerEventCallback(any(IWifiChipEventCallback.class));
590be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
591be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // Now trigger the interface destroyed callback from HalDeviceManager and ensure the
592be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // external listener is invoked and iface removed from internal database.
593be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        internalListenerCaptor.getValue().onDestroyed(TEST_IFACE_NAME);
594be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(externalLister).onDestroyed(TEST_IFACE_NAME);
595be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
596be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        // This should fail now, since the interface was already destroyed.
597be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        assertFalse(mWifiVendorHal.removeApIface(TEST_IFACE_NAME));
598be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager, never()).removeIface(any());
599be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    }
600be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius
601be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius    /**
6028dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that enter logs when verbose logging is enabled
6038dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
6048dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
6058dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testEnterLogging() {
6068dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = spy(mWifiLog);
6078dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(true);
608d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.installPacketFilter(TEST_IFACE_NAME, new byte[0]);
609654e16971c2e558d59eafd9c4fab1cdbe4775657mukesh agrawal        verify(mWifiVendorHal.mLog).trace(eq("filter length %"), eq(1));
6108dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
6118dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
6128dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
6138dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that enter does not log when verbose logging is not enabled
6148dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
6158dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
6168dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testEnterSilenceWhenNotEnabled() {
6178dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = spy(mWifiLog);
618d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.installPacketFilter(TEST_IFACE_NAME, new byte[0]);
6198dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(true);
6208dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.enableVerboseLogging(false);
621d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.installPacketFilter(TEST_IFACE_NAME, new byte[0]);
622654e16971c2e558d59eafd9c4fab1cdbe4775657mukesh agrawal        verify(mWifiVendorHal.mLog, never()).trace(eq("filter length %"), anyInt());
6238dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
6248dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
6258dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
6268dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that boolResult logs a false result
6278dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
6288dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
6298dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testBoolResultFalse() {
6308dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = spy(mWifiLog);
6318dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mLog = mWifiLog;
6328dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiVendorHal.mVerboseLog = mWifiLog;
633d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getBgScanCapabilities(
634d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                TEST_IFACE_NAME, new WifiNative.ScanCapabilities()));
6358dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        verify(mWifiLog).err("% returns %");
6368dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
6378dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
6388dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
6396ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass     * Test that getBgScanCapabilities is hooked up to the HAL correctly
64056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     *
64156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * A call before the vendor HAL is started should return a non-null result with version 0
64256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     *
64356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     * A call after the HAL is started should return the mocked values.
64456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass     */
64556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    @Test
6466ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass    public void testGetBgScanCapabilities() throws Exception {
64756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        StaBackgroundScanCapabilities capabilities = new StaBackgroundScanCapabilities();
64856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxCacheSize = 12;
64956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxBuckets = 34;
65056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxApCachePerScan = 56;
65156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        capabilities.maxReportingThreshold = 78;
65256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
65356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        doAnswer(new AnswerWithArguments() {
65456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            public void answer(IWifiStaIface.getBackgroundScanCapabilitiesCallback cb)
65556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                    throws RemoteException {
65656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
65756d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass            }
65856d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        }).when(mIWifiStaIface).getBackgroundScanCapabilities(any(
65956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass                IWifiStaIface.getBackgroundScanCapabilitiesCallback.class));
66056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
66156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        WifiNative.ScanCapabilities result = new WifiNative.ScanCapabilities();
66256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
663d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // should fail - not started
664d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getBgScanCapabilities(TEST_IFACE_NAME, result));
665d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // Start the vendor hal
666d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
667d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // should succeed
668d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.getBgScanCapabilities(TEST_IFACE_NAME, result));
66956d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
67056d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(12, result.max_scan_cache_size);
67156d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(34, result.max_scan_buckets);
67256d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(56, result.max_ap_cache_per_scan);
67356d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass        assertEquals(78, result.max_scan_reporting_threshold);
67456d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    }
67556d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass
67656d2cece0c3cc908a875fd1d3291a1ba8882bbafMichael Plass    /**
6771dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Test translation to WifiManager.WIFI_FEATURE_*
6781dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     *
6791dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Just do a spot-check with a few feature bits here; since the code is table-
6801dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * driven we don't have to work hard to exercise all of it.
6811dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     */
6821dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    @Test
683ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    public void testStaIfaceFeatureMaskTranslation() {
6841dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int caps = (
6851dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                IWifiStaIface.StaIfaceCapabilityMask.BACKGROUND_SCAN
6861dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | IWifiStaIface.StaIfaceCapabilityMask.LINK_LAYER_STATS
6871dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass            );
6881dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int expected = (
689691806f65a5f259fd8e6b709c97d0035c418c483Michael Plass                WifiManager.WIFI_FEATURE_SCANNER
6901dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | WifiManager.WIFI_FEATURE_LINK_LAYER_STATS);
6911dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        assertEquals(expected, mWifiVendorHal.wifiFeatureMaskFromStaCapabilities(caps));
6921dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    }
6931dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
6941dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    /**
695ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Test translation to WifiManager.WIFI_FEATURE_*
696ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     *
697ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Just do a spot-check with a few feature bits here; since the code is table-
698ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * driven we don't have to work hard to exercise all of it.
699ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
700ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
701ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    public void testChipFeatureMaskTranslation() {
7025858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        int caps = (
7035858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.SET_TX_POWER_LIMIT
7045858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.D2D_RTT
7055858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.D2AP_RTT
7065858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        );
7075858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        int expected = (
7085858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                WifiManager.WIFI_FEATURE_TX_POWER_LIMIT
7095858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | WifiManager.WIFI_FEATURE_D2D_RTT
7105858a3401ecd9368af7363b7bfad8df036856205Roshan Pius                        | WifiManager.WIFI_FEATURE_D2AP_RTT
7115858a3401ecd9368af7363b7bfad8df036856205Roshan Pius        );
712ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        assertEquals(expected, mWifiVendorHal.wifiFeatureMaskFromChipCapabilities(caps));
713ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
714ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
715ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
716ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Test get supported features. Tests whether we coalesce information from different sources
717ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * (IWifiStaIface, IWifiChip and HalDeviceManager) into the bitmask of supported features
718ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * correctly.
719ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
720ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
721ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    public void testGetSupportedFeatures() throws Exception {
7223153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
723ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
724ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        int staIfaceHidlCaps = (
725ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                IWifiStaIface.StaIfaceCapabilityMask.BACKGROUND_SCAN
726ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | IWifiStaIface.StaIfaceCapabilityMask.LINK_LAYER_STATS
727ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        );
728ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        int chipHidlCaps =
729ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                android.hardware.wifi.V1_1.IWifiChip.ChipCapabilityMask.SET_TX_POWER_LIMIT;
730ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        Set<Integer>  halDeviceManagerSupportedIfaces = new HashSet<Integer>() {{
731ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                add(IfaceType.STA);
732ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                add(IfaceType.P2P);
733ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            }};
734ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        int expectedFeatureSet = (
735ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                WifiManager.WIFI_FEATURE_SCANNER
736ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_LINK_LAYER_STATS
737ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_TX_POWER_LIMIT
738ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_INFRA
739ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                        | WifiManager.WIFI_FEATURE_P2P
740ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        );
741ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
742ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        doAnswer(new AnswerWithArguments() {
743ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            public void answer(IWifiStaIface.getCapabilitiesCallback cb) throws RemoteException {
744ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                cb.onValues(mWifiStatusSuccess, staIfaceHidlCaps);
745ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            }
746ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }).when(mIWifiStaIface).getCapabilities(any(IWifiStaIface.getCapabilitiesCallback.class));
747ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        doAnswer(new AnswerWithArguments() {
748ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            public void answer(IWifiChip.getCapabilitiesCallback cb) throws RemoteException {
749ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                cb.onValues(mWifiStatusSuccess, chipHidlCaps);
750ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius            }
751ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        }).when(mIWifiChip).getCapabilities(any(IWifiChip.getCapabilitiesCallback.class));
752ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        when(mHalDeviceManager.getSupportedIfaceTypes())
753ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius                .thenReturn(halDeviceManagerSupportedIfaces);
754ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
755d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(expectedFeatureSet, mWifiVendorHal.getSupportedFeatureSet(TEST_IFACE_NAME));
756ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
757ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
758ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
7594f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test enablement of link layer stats after startup
760699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
7614f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats before HAL start
7624f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - should not make it to the HAL layer
7634f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in STA mode
7644f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats twice more
7654f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - enable request should make it to the HAL layer
7664f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the requests (i.e., two calls total)
7674f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
7684f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
7694f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsEnableAfterStartup() throws Exception {
7704f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
7714f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
772d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertNull(mWifiVendorHal.getWifiLinkLayerStats(TEST_IFACE_NAME));
7734f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
7744f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
7754f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
7764f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
777d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.getWifiLinkLayerStats(TEST_IFACE_NAME);
778d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.getWifiLinkLayerStats(TEST_IFACE_NAME);
7794f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface).enableLinkLayerStatsCollection(false); // mLinkLayerStatsDebug
7804f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, times(2)).getLinkLayerStats(any());
7814f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
7824f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
7834f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
7844f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test that link layer stats are not enabled and harmless in AP mode
785699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
7864f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in AP mode
7874f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - stats should not be enabled
7884f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats
7894f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the request
7904f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
7914f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
7924f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsNotEnabledAndHarmlessInApMode() throws Exception {
7934f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
7944f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
7954f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
7964f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
797d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertNull(mWifiVendorHal.getWifiLinkLayerStats(TEST_IFACE_NAME));
7984f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
7994f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
8004f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
8014f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).enableLinkLayerStatsCollection(false);
8024f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).getLinkLayerStats(any());
8034f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
8044f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
805699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /**
806699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Test that the link layer stats fields are populated correctly.
807699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     *
808699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * This is done by filling with random values and then using toString on the
809699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * original and converted values, comparing just the numerics in the result.
810699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * This makes the assumption that the fields are in the same order in both string
811699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * representations, which is not quite true. So apply some fixups before the final
812699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * comparison.
813699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
814699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    @Test
815699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    public void testLinkLayerStatsAssignment() throws Exception {
816699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        Random r = new Random(1775968256);
817699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        StaLinkLayerStats stats = new StaLinkLayerStats();
818699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeBePktStats);
819699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeBkPktStats);
820699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeViPktStats);
821699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        randomizePacketStats(r, stats.iface.wmeVoPktStats);
8229ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        randomizeRadioStats(r, stats.radios);
8239ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius
824442a0afdad6b7eb32a9098d927ecd65aa64df6eaMichael Plass        stats.timeStampInMs = r.nextLong() & 0xFFFFFFFFFFL;
825699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
826442a0afdad6b7eb32a9098d927ecd65aa64df6eaMichael Plass        String expected = numbersOnly(stats.toString() + " ");
827699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
828699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        WifiLinkLayerStats converted = WifiVendorHal.frameworkFromHalLinkLayerStats(stats);
829699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
830442a0afdad6b7eb32a9098d927ecd65aa64df6eaMichael Plass        String actual = numbersOnly(converted.toString() + " ");
831699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
832699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        // Do the required fixups to the both expected and actual
8339ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        expected = rmValue(expected, stats.radios.get(0).rxTimeInMs);
8349ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        expected = rmValue(expected, stats.radios.get(0).onTimeInMsForScan);
835699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
8369ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        actual = rmValue(actual, stats.radios.get(0).rxTimeInMs);
8379ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        actual = rmValue(actual, stats.radios.get(0).onTimeInMsForScan);
838699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
839699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        // The remaining fields should agree
840699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        assertEquals(expected, actual);
841699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
842699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
843699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /** Just the digits with delimiting spaces, please */
844699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static String numbersOnly(String s) {
845699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        return s.replaceAll("[^0-9]+", " ");
846699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
847699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
848699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /** Remove the given value from the space-delimited string, or die trying. */
849699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static String rmValue(String s, long value) throws Exception {
850699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        String ans = s.replaceAll(" " + value + " ", " ");
851699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        assertNotEquals(s, ans);
852699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        return ans;
853699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
854699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
855699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    /**
856699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Populate packet stats with non-negative random values
857699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
858699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    private static void randomizePacketStats(Random r, StaLinkLayerIfacePacketStats pstats) {
859699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.rxMpdu = r.nextLong() & 0xFFFFFFFFFFL; // more than 32 bits
860699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.txMpdu = r.nextLong() & 0xFFFFFFFFFFL;
861699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.lostMpdu = r.nextLong() & 0xFFFFFFFFFFL;
862699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        pstats.retries = r.nextLong() & 0xFFFFFFFFFFL;
863699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
864699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass
865699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass   /**
866699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     * Populate radio stats with non-negative random values
867699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass     */
8689ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius    private static void randomizeRadioStats(Random r, ArrayList<StaLinkLayerRadioStats> rstats) {
8699ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        StaLinkLayerRadioStats rstat = new StaLinkLayerRadioStats();
8709ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.onTimeInMs = r.nextInt() & 0xFFFFFF;
8719ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.txTimeInMs = r.nextInt() & 0xFFFFFF;
872699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        for (int i = 0; i < 4; i++) {
873699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass            Integer v = r.nextInt() & 0xFFFFFF;
8749ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius            rstat.txTimeInMsPerLevel.add(v);
875699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass        }
8769ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.rxTimeInMs = r.nextInt() & 0xFFFFFF;
8779ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstat.onTimeInMsForScan = r.nextInt() & 0xFFFFFF;
8789ca3944e48689ee1d72eed1ed27bc19ecea2c039Roshan Pius        rstats.add(rstat);
879699cb92ca94c3fbd883472937ab3b071cafadf77Michael Plass    }
8804f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
8817e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    /**
8827e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Test that getFirmwareVersion() and getDriverVersion() work
8837e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     *
8847e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Calls before the STA is started are expected to return null.
8857e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     */
8867e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    @Test
8877e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    public void testVersionGetters() throws Exception {
8887e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String firmwareVersion = "fuzzy";
8897e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String driverVersion = "dizzy";
8907e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        IWifiChip.ChipDebugInfo chipDebugInfo = new IWifiChip.ChipDebugInfo();
8917e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.firmwareDescription = firmwareVersion;
8927e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.driverDescription = driverVersion;
8937e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
8947e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        doAnswer(new AnswerWithArguments() {
8957e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            public void answer(IWifiChip.requestChipDebugInfoCallback cb) throws RemoteException {
8967e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass                cb.onValues(mWifiStatusSuccess, chipDebugInfo);
8977e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            }
8987e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        }).when(mIWifiChip).requestChipDebugInfo(any(IWifiChip.requestChipDebugInfoCallback.class));
8997e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
9007e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getFirmwareVersion());
9017e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getDriverVersion());
9027e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
9037e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
9047e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
9057e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(firmwareVersion, mWifiVendorHal.getFirmwareVersion());
9067e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(driverVersion, mWifiVendorHal.getDriverVersion());
9077e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    }
908ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
909ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
910ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * For checkRoundTripIntTranslation lambdas
911ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
912ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    interface IntForInt {
913ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        int translate(int value);
914ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
915ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
916ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
917ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Checks that translation from x to y and back again is the identity function
918ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     *
919ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param xFromY reverse translator
920ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param yFromX forward translator
921ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * @param xLimit non-inclusive upper bound on x (lower bound is zero)
922ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
923ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    private void checkRoundTripIntTranslation(
924ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            IntForInt xFromY, IntForInt yFromX, int xFirst, int xLimit) throws Exception {
925ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        int ex = 0;
926ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        for (int i = xFirst; i < xLimit; i++) {
927ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertEquals(i, xFromY.translate(yFromX.translate(i)));
928ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
929ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        try {
930ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            yFromX.translate(xLimit);
931ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertTrue("expected an exception here", false);
932ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        } catch (IllegalArgumentException e) {
933ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            ex++;
934ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
935ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        try {
936ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            xFromY.translate(yFromX.translate(xLimit - 1) + 1);
937ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            assertTrue("expected an exception here", false);
938ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        } catch (IllegalArgumentException e) {
939ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            ex++;
940ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }
941ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertEquals(2, ex);
942ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
943ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
944ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
945ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
946ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of RTT type
947ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
948ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
949ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testRttTypeTranslation() throws Exception {
950ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
951ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halRttTypeFromFrameworkRttType(y),
952ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkRttTypeFromHalRttType(x),
953ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                1, 3);
954ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
955ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
956ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
957ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of peer type
958ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
959ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
960ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testPeerTranslation() throws Exception {
961ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
962ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halPeerFromFrameworkPeer(y),
963ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkPeerFromHalPeer(x),
964ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                1, 6);
965ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
966ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
967ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
968ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of channel width
969ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
970ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
971ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testChannelWidth() throws Exception {
972ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
973ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halChannelWidthFromFrameworkChannelWidth(y),
974ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkChannelWidthFromHalChannelWidth(x),
975ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 5);
976ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
977ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
978ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
979ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of preamble type mask
980ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
981ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
982ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testPreambleTranslation() throws Exception {
983ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
984ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halPreambleFromFrameworkPreamble(y),
985ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkPreambleFromHalPreamble(x),
986ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 8);
987ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
988ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
989ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
990ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     * Test translations of bandwidth mask
991ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass     */
992ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
993ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testBandwidthTranslations() throws Exception {
994ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        checkRoundTripIntTranslation(
995ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (y) -> WifiVendorHal.halBwFromFrameworkBw(y),
996ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                (x) -> WifiVendorHal.frameworkBwFromHalBw(x),
997ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                0, 64);
998ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
999ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
10000320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    /**
10010320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     * Test translation of framwork RttParams to hal RttConfig
10020320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     */
1003ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
1004ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testGetRttStuff() throws Exception {
1005ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttManager.RttParams params = new RttManager.RttParams();
10060320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.bssid = "03:01:04:01:05:09";
10070320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.frequency = 2420;
10080320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.channelWidth = ScanResult.CHANNEL_WIDTH_40MHZ;
10090320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.centerFreq0 = 2440;
10100320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.centerFreq1 = 1;
10110320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.num_samples = 2;
10120320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.num_retries = 3;
10130320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.numberBurst = 4;
10140320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.interval = 5;
10150320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.numSamplesPerBurst = 8;
10160320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.numRetriesPerMeasurementFrame = 6;
10170320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.numRetriesPerFTMR = 7;
10180320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.LCIRequest = false;
10190320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.LCRRequest = false;
10200320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        params.burstTimeout = 15;
10210320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        String frameish = params.toString();
10220320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertFalse(frameish.contains("=0,")); // make sure all fields are initialized
1023ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttConfig config = WifiVendorHal.halRttConfigFromFrameworkRttParams(params);
10240320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        String halish = config.toString();
10250320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        StringBuffer expect = new StringBuffer(200);
10260320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append("{.addr = [3, 1, 4, 1, 5, 9], .type = ONE_SIDED, .peer = AP, ");
10270320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".channel = {.width = WIDTH_40, .centerFreq = 2420, ");
10280320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".centerFreq0 = 2440, .centerFreq1 = 1}, ");
10290320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".burstPeriod = 5, .numBurst = 4, .numFramesPerBurst = 8, ");
10300320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".numRetriesPerRttFrame = 6, .numRetriesPerFtmr = 7, ");
10310320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".mustRequestLci = false, .mustRequestLcr = false, .burstDuration = 15, ");
10320320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        expect.append(".preamble = HT, .bw = BW_20MHZ}");
10330320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertEquals(expect.toString(), halish);
1034ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
1035ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
10360320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    /**
10370320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     * Test that RTT capabilities are plumbed through
10380320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     */
1039ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    @Test
1040ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    public void testGetRttCapabilities() throws Exception {
1041ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttCapabilities capabilities = new RttCapabilities();
10420320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        capabilities.lcrSupported = true;
10430320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        capabilities.preambleSupport = RttPreamble.LEGACY | RttPreamble.VHT;
10440320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        capabilities.bwSupport = RttBw.BW_5MHZ | RttBw.BW_20MHZ;
10450320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        capabilities.mcVersion = 43;
1046ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        doAnswer(new AnswerWithArguments() {
1047ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            public void answer(IWifiRttController.getCapabilitiesCallback cb)
1048ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                    throws RemoteException {
1049ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
1050ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass            }
1051ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        }).when(mIWifiRttController).getCapabilities(any(
1052ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass                IWifiRttController.getCapabilitiesCallback.class));
1053ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
1054ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertNull(mWifiVendorHal.getRttCapabilities());
1055ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
1056ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1057ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
1058ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass        RttManager.RttCapabilities actual = mWifiVendorHal.getRttCapabilities();
10590320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertTrue(actual.lcrSupported);
10600320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertEquals(RttManager.PREAMBLE_LEGACY | RttManager.PREAMBLE_VHT,
10610320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass                actual.preambleSupported);
10620320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertEquals(RttManager.RTT_BW_5_SUPPORT | RttManager.RTT_BW_20_SUPPORT,
10630320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass                actual.bwSupported);
10640320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertEquals(43, (int) capabilities.mcVersion);
1065ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    }
1066ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
10670320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    /**
10680320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     * Negative test of disableRttResponder
10690320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass     */
10700320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    @Test
10710320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    public void testDisableOfUnstartedRtt() throws Exception {
10720320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass        assertFalse(mWifiVendorHal.disableRttResponder());
10730320a9aa86429e98ff282a9e2297e19337667ad9Michael Plass    }
1074ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass
1075ea644ad9920420dbcf420602355f9f91a7266b14Michael Plass    /**
1076df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     * Test that setScanningMacOui is hooked up to the HAL correctly
1077df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     */
1078df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    @Test
1079df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    public void testSetScanningMacOui() throws Exception {
1080df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] oui = NativeUtil.macAddressOuiToByteArray("DA:A1:19");
1081df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] zzz = NativeUtil.macAddressOuiToByteArray("00:00:00");
1082df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
1083df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        when(mIWifiStaIface.setScanningMacOui(any())).thenReturn(mWifiStatusSuccess);
1084df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
1085d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // expect fail - STA not started
1086d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setScanningMacOui(TEST_IFACE_NAME, oui));
1087df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1088d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // expect fail - null
1089d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setScanningMacOui(TEST_IFACE_NAME, null));
1090d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // expect fail - len
1091d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setScanningMacOui(TEST_IFACE_NAME, new byte[]{(byte) 1}));
1092d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.setScanningMacOui(TEST_IFACE_NAME, oui));
1093d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.setScanningMacOui(TEST_IFACE_NAME, zzz));
1094df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
1095df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(oui));
1096df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(zzz));
1097df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    }
1098df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
109970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
110070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStartSendingOffloadedPacket() throws Exception {
110170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        byte[] srcMac = NativeUtil.macAddressToByteArray("4007b2088c81");
1102ed0b7cfa5bb7be5731e42c2aaac7c9fdaa68baa4Nathan Harold        byte[] dstMac = NativeUtil.macAddressToByteArray("4007b8675309");
110370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress src = InetAddress.parseNumericAddress("192.168.13.13");
110470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress dst = InetAddress.parseNumericAddress("93.184.216.34");
110570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
110670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int millis = 16000;
110770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
110870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        KeepalivePacketData kap = KeepalivePacketData.nattKeepalivePacket(src, 63000, dst, 4500);
110970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
111070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.startSendingKeepAlivePackets(
111170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                anyInt(), any(), anyShort(), any(), any(), anyInt()
111270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        )).thenReturn(mWifiStatusSuccess);
111370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
111470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1115d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(0 == mWifiVendorHal.startSendingOffloadedPacket(
1116ed0b7cfa5bb7be5731e42c2aaac7c9fdaa68baa4Nathan Harold                TEST_IFACE_NAME, slot, srcMac, dstMac, kap.getPacket(),
1117ed0b7cfa5bb7be5731e42c2aaac7c9fdaa68baa4Nathan Harold                OsConstants.ETH_P_IPV6, millis));
111870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
111970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).startSendingKeepAlivePackets(
112070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                eq(slot), any(), anyShort(), any(), any(), eq(millis));
112170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
112270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
112370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
112470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStopSendingOffloadedPacket() throws Exception {
112570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
112670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
112770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.stopSendingKeepAlivePackets(anyInt())).thenReturn(mWifiStatusSuccess);
112870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
112970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1130d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(0 == mWifiVendorHal.stopSendingOffloadedPacket(
1131d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                TEST_IFACE_NAME, slot));
113270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
113370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).stopSendingKeepAlivePackets(eq(slot));
113470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
113570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
1136df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    /**
11373401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     * Test the setup, invocation, and removal of a RSSI event handler
11383401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     *
11393401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass     */
11403401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    @Test
11413401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    public void testRssiMonitoring() throws Exception {
11423401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        when(mIWifiStaIface.startRssiMonitoring(anyInt(), anyInt(), anyInt()))
11433401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenReturn(mWifiStatusSuccess);
11443401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        when(mIWifiStaIface.stopRssiMonitoring(anyInt()))
11453401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass                .thenReturn(mWifiStatusSuccess);
11463401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
11473401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        ArrayList<Byte> breach = new ArrayList<>(10);
11483401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte hi = -21;
11493401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte med = -42;
11503401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        byte lo = -84;
11513401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        Byte lower = -88;
11523401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        WifiNative.WifiRssiEventHandler handler;
11533401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        handler = ((cur) -> {
11543401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass            breach.add(cur);
11553401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        });
1156d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // not started
1157d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, hi, lo, handler));
1158d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // not started
1159d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(-1, mWifiVendorHal.stopRssiMonitoring(TEST_IFACE_NAME));
11603401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1161d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, hi, lo, handler));
11623401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        int theCmdId = mWifiVendorHal.sRssiMonCmdId;
11633401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        breach.clear();
11643401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        mIWifiStaIfaceEventCallback.onRssiThresholdBreached(theCmdId, new byte[6], lower);
11653401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass        assertEquals(breach.get(0), lower);
1166d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.stopRssiMonitoring(TEST_IFACE_NAME));
1167d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, hi, lo, handler));
1168d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // replacing works
1169d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, med, lo, handler));
1170d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // null handler fails
1171d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(
1172d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                TEST_IFACE_NAME, hi, lo, null));
1173d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, hi, lo, handler));
1174d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // empty range
1175d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(-1, mWifiVendorHal.startRssiMonitoring(TEST_IFACE_NAME, lo, hi, handler));
11763401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    }
11773401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass
11783401582e1b1defc1877c7c47c6a839611fa211c3Michael Plass    /**
1179ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * Test that getApfCapabilities is hooked up to the HAL correctly
1180ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
1181ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call before the vendor HAL is started should return a non-null result with version 0
1182ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
1183ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call after the HAL is started should return the mocked values.
1184ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
1185ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
1186ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testApfCapabilities() throws Exception {
1187ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myVersion = 33;
1188ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myMaxSize = 1234;
1189ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1190ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        StaApfPacketFilterCapabilities capabilities = new StaApfPacketFilterCapabilities();
1191ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.version = myVersion;
1192ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.maxLength = myMaxSize;
1193ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1194ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        doAnswer(new AnswerWithArguments() {
1195ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            public void answer(IWifiStaIface.getApfPacketFilterCapabilitiesCallback cb)
1196ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                    throws RemoteException {
1197ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
1198ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            }
1199ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        }).when(mIWifiStaIface).getApfPacketFilterCapabilities(any(
1200ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                IWifiStaIface.getApfPacketFilterCapabilitiesCallback.class));
1201ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1202ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1203d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(0, mWifiVendorHal.getApfCapabilities(TEST_IFACE_NAME)
1204d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                .apfVersionSupported);
1205ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1206ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1207ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1208d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        ApfCapabilities actual = mWifiVendorHal.getApfCapabilities(TEST_IFACE_NAME);
1209ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1210ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myVersion, actual.apfVersionSupported);
1211ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myMaxSize, actual.maximumApfProgramSize);
1212ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(android.system.OsConstants.ARPHRD_ETHER, actual.apfPacketFormat);
1213ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertNotEquals(0, actual.apfPacketFormat);
1214ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
1215ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1216ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
121770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass     * Test that an APF program can be installed.
1218ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
1219ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
1220ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testInstallApf() throws Exception {
1221ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        byte[] filter = new byte[] {19, 53, 10};
1222ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1223ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        ArrayList<Byte> expected = new ArrayList<>(3);
1224ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        for (byte b : filter) expected.add(b);
1225ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1226ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        when(mIWifiStaIface.installApfPacketFilter(anyInt(), any(ArrayList.class)))
1227ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                .thenReturn(mWifiStatusSuccess);
1228ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1229ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1230d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.installPacketFilter(TEST_IFACE_NAME, filter));
1231ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
1232ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        verify(mIWifiStaIface).installApfPacketFilter(eq(0), eq(expected));
1233ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
1234f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1235f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    /**
1236e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti     * Test that an APF program and data buffer can be read back.
1237e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti     */
1238e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti    @Test
1239e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti    public void testReadApf() throws Exception {
1240e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        // Expose the 1.2 IWifiStaIface.
1241e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
1242e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti
1243e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        byte[] program = new byte[] {65, 66, 67};
1244e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        ArrayList<Byte> expected = new ArrayList<>(3);
1245e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        for (byte b : program) expected.add(b);
1246e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti
1247e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        doAnswer(new AnswerWithArguments() {
1248e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti            public void answer(
1249e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti                    android.hardware.wifi.V1_2.IWifiStaIface.readApfPacketFilterDataCallback cb)
1250e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti                    throws RemoteException {
1251e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti                cb.onValues(mWifiStatusSuccess, expected);
1252e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti            }
1253e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        }).when(mIWifiStaIfaceV12).readApfPacketFilterData(any(
1254e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti                android.hardware.wifi.V1_2.IWifiStaIface.readApfPacketFilterDataCallback.class));
1255e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti
1256e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        assertTrue(mWifiVendorHal.startVendorHalSta());
1257e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti        assertArrayEquals(program, mWifiVendorHal.readPacketFilter(TEST_IFACE_NAME));
1258e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti    }
1259e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti
1260e25d3edec10f7b9cd60c291808f760a490b7d31dBernie Innocenti    /**
1261f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     * Test that the country code is set in AP mode (when it should be).
1262f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     */
1263f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    @Test
1264f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    public void testSetCountryCodeHal() throws Exception {
1265f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        byte[] expected = new byte[]{(byte) 'C', (byte) 'A'};
1266f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1267f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        when(mIWifiApIface.setCountryCode(any()))
1268f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass                .thenReturn(mWifiStatusSuccess);
1269f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1270f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
1271f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1272d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, null));
1273d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, ""));
1274d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, "A"));
1275d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        // Only one expected to succeed
1276d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, "CA"));
1277d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, "ZZZ"));
1278f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
1279f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        verify(mIWifiApIface).setCountryCode(eq(expected));
1280f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    }
128153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
128253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
12838dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     * Test that RemoteException is caught and logged.
12848dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass     */
12858dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    @Test
12868dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    public void testRemoteExceptionIsHandled() throws Exception {
12878dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        mWifiLog = spy(mWifiLog);
1288e1d5fa72eb35fb8f936e19d0830548593de6a6ffMichael Plass        mWifiVendorHal.mVerboseLog = mWifiLog;
12898dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        when(mIWifiApIface.setCountryCode(any()))
12908dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass                .thenThrow(new RemoteException("oops"));
12918dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
1292d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.setCountryCodeHal(TEST_IFACE_NAME, "CA"));
1293e1d5fa72eb35fb8f936e19d0830548593de6a6ffMichael Plass        assertFalse(mWifiVendorHal.isHalStarted());
129444f4850de75c4de3389d7ecf48d82142e0590476mukesh agrawal        verify(mWifiLog).err("% RemoteException in HIDL call %");
12958dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    }
12968dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass
12978dfa1a2e88781c773cb1ce79a1d4b72cc45c5c04Michael Plass    /**
129853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that startLoggingToDebugRingBuffer is plumbed to chip
129953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
130053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * A call before the vendor hal is started should just return false.
130153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * After starting in STA mode, the call should succeed, and pass ther right things down.
130253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
130353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
130453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBuffer() throws Exception {
130553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
130653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
130753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
130853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
130953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
131053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
131153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
131253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
131353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
131453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
131553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
131653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
131753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Same test as testStartLoggingRingBuffer, but in AP mode rather than STA.
131853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
131953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
132053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBufferOnAp() throws Exception {
132153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
132253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
132353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
132453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
132553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
132653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
132753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
132853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
132953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
133053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
133153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
133253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
133353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferStatus gets and translates its stuff correctly
133453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
133553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
133653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testRingBufferStatus() throws Exception {
133753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus one = new WifiDebugRingBufferStatus();
133853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringName = "One";
133953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.flags = WifiDebugRingBufferFlags.HAS_BINARY_ENTRIES;
134053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringId = 5607371;
134153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.sizeInBytes = 54321;
134253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.freeSizeInBytes = 42;
134353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.verboseLevel = WifiDebugRingBufferVerboseLevel.VERBOSE;
134453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        String oneExpect = "name: One flag: 1 ringBufferId: 5607371 ringBufferByteSize: 54321"
134553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                + " verboseLevel: 2 writtenBytes: 0 readBytes: 0 writtenRecords: 0";
134653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
134753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus two = new WifiDebugRingBufferStatus();
134853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringName = "Two";
134953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.flags = WifiDebugRingBufferFlags.HAS_ASCII_ENTRIES
135053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                | WifiDebugRingBufferFlags.HAS_PER_PACKET_ENTRIES;
135153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringId = 4512470;
135253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.sizeInBytes = 300;
135353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.freeSizeInBytes = 42;
135453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.verboseLevel = WifiDebugRingBufferVerboseLevel.DEFAULT;
135553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
135653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        ArrayList<WifiDebugRingBufferStatus> halBufferStatus = new ArrayList<>(2);
135753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(one);
135853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(two);
135953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
136053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiNative.RingBufferStatus[] actual;
136153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
136253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        doAnswer(new AnswerWithArguments() {
136353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            public void answer(IWifiChip.getDebugRingBuffersStatusCallback cb)
136453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                    throws RemoteException {
136553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                cb.onValues(mWifiStatusSuccess, halBufferStatus);
136653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            }
136753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        }).when(mIWifiChip).getDebugRingBuffersStatus(any(
136853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                IWifiChip.getDebugRingBuffersStatusCallback.class));
136953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
137053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
137153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        actual = mWifiVendorHal.getRingBufferStatus();
137253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
137353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(halBufferStatus.size(), actual.length);
137453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(oneExpect, actual[0].toString());
137553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(two.ringId, actual[1].ringBufferId);
137653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
137753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
137853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
137953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferData calls forceDumpToDebugRingBuffer
138053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
138153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Try once before hal start, and twice after (one success, one failure).
138253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
138353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
138453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testForceRingBufferDump() throws Exception {
138553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Gunk"))).thenReturn(mWifiStatusSuccess);
138653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Glop"))).thenReturn(mWifiStatusFailure);
138753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
138853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Gunk")); // hal not started
138953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
139053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
139153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
139253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.getRingBufferData("Gunk")); // mocked call succeeds
139353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Glop")); // mocked call fails
139453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
139553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Gunk");
139653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Glop");
139753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
139853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
13995a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
14005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the start of packet fate monitoring.
14015a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
14025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after (one success, one failure).
14035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
14045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
14055a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testStartPktFateMonitoring() throws Exception {
14065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        when(mIWifiStaIface.startDebugPacketFateMonitoring()).thenReturn(mWifiStatusSuccess);
14075a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
1408d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.startPktFateMonitoring(TEST_IFACE_NAME));
14095a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never()).startDebugPacketFateMonitoring();
14105a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14115a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1412d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.startPktFateMonitoring(TEST_IFACE_NAME));
14135a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface).startDebugPacketFateMonitoring();
14145a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
14155a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14165a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
14175a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of tx packet fates.
14185a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
14195a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
14205a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
14215a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
14225a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFates() throws Exception {
14235a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
14245a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
14255a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugTxPacketFateReport fateReport = new WifiDebugTxPacketFateReport();
14265a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugTxPacketFate.DRV_QUEUED;
14275a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
14285a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.ETHERNET_II;
14295a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
14305a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
14315a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14325a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
14335a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugTxPacketFatesCallback cb) {
14345a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
14355a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugTxPacketFateReport>(Arrays.asList(fateReport)));
14365a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
14375a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
14385a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14395a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.TxFateReport[] retrievedFates = new WifiNative.TxFateReport[1];
1441d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getTxPktFates(TEST_IFACE_NAME, retrievedFates));
14425a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
14435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14455a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
14465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
1447d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.getTxPktFates(TEST_IFACE_NAME, retrievedFates));
14485a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
14495a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14505a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.TX_PKT_FATE_DRV_QUEUED, retrievedFates[0].mFate);
14515a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
14525a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
14535a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, retrievedFates[0].mFrameType);
14545a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
14555a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
14565a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14575a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
14585a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of tx packet fates when the number of fates retrieved exceeds the
14595a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * input array.
14605a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
14615a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
14625a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
14635a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
14645a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFatesExceedsInputArrayLength() throws Exception {
14655a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
14665a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
14675a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugTxPacketFateReport fateReport = new WifiDebugTxPacketFateReport();
14685a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugTxPacketFate.FW_DROP_OTHER;
14695a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
14705a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.MGMT_80211;
14715a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
14725a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
14735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14745a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
14755a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugTxPacketFatesCallback cb) {
14765a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
14775a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugTxPacketFateReport>(Arrays.asList(
14785a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                                fateReport, fateReport)));
14795a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
14805a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
14815a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14825a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14835a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.TxFateReport[] retrievedFates = new WifiNative.TxFateReport[1];
1484d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getTxPktFates(TEST_IFACE_NAME, retrievedFates));
14855a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
14865a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14875a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
14885a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
14895a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
1490d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.getTxPktFates(TEST_IFACE_NAME, retrievedFates));
14915a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
14925a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
14935a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.TX_PKT_FATE_FW_DROP_OTHER, retrievedFates[0].mFate);
14945a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
14955a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
14965a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_80211_MGMT, retrievedFates[0].mFrameType);
14975a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
14985a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
14995a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
15015a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of rx packet fates.
15025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
15035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
15045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
15055a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
15065a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFates() throws Exception {
15075a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
15085a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
15095a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugRxPacketFateReport fateReport = new WifiDebugRxPacketFateReport();
15105a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugRxPacketFate.SUCCESS;
15115a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
15125a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.ETHERNET_II;
15135a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
15145a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
15155a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15165a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
15175a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugRxPacketFatesCallback cb) {
15185a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
15195a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugRxPacketFateReport>(Arrays.asList(fateReport)));
15205a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
15215a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
15225a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15235a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15245a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.RxFateReport[] retrievedFates = new WifiNative.RxFateReport[1];
1525d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getRxPktFates(TEST_IFACE_NAME, retrievedFates));
15265a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
15275a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15285a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15295a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
15305a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
1531d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.getRxPktFates(TEST_IFACE_NAME, retrievedFates));
15325a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
15335a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15345a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.RX_PKT_FATE_SUCCESS, retrievedFates[0].mFate);
15355a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
15365a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
15375a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, retrievedFates[0].mFrameType);
15385a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
15395a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
15405a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15415a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
15425a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the retrieval of rx packet fates when the number of fates retrieved exceeds the
15435a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * input array.
15445a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     *
15455a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Try once before hal start, and once after.
15465a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
15475a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
15485a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFatesExceedsInputArrayLength() throws Exception {
15495a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        byte[] frameContentBytes = new byte[30];
15505a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        new Random().nextBytes(frameContentBytes);
15515a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiDebugRxPacketFateReport fateReport = new WifiDebugRxPacketFateReport();
15525a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.fate = WifiDebugRxPacketFate.FW_DROP_FILTER;
15535a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.driverTimestampUsec = new Random().nextLong();
15545a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameType = WifiDebugPacketFateFrameType.MGMT_80211;
15555a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        fateReport.frameInfo.frameContent.addAll(
15565a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                NativeUtil.byteArrayToArrayList(frameContentBytes));
15575a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15585a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        doAnswer(new AnswerWithArguments() {
15595a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            public void answer(IWifiStaIface.getDebugRxPacketFatesCallback cb) {
15605a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                cb.onValues(mWifiStatusSuccess,
15615a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                        new ArrayList<WifiDebugRxPacketFateReport>(Arrays.asList(
15625a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                                fateReport, fateReport)));
15635a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass            }
15645a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        }).when(mIWifiStaIface)
15655a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15665a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15675a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        WifiNative.RxFateReport[] retrievedFates = new WifiNative.RxFateReport[1];
1568d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getRxPktFates(TEST_IFACE_NAME, retrievedFates));
15695a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
15705a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15715a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15725a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
15735a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
1574d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.getRxPktFates(TEST_IFACE_NAME, retrievedFates));
15755a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface)
15765a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
15775a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.RX_PKT_FATE_FW_DROP_FILTER, retrievedFates[0].mFate);
15785a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(fateReport.frameInfo.driverTimestampUsec,
15795a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                retrievedFates[0].mDriverTimestampUSec);
15805a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertEquals(WifiLoggerHal.FRAME_TYPE_80211_MGMT, retrievedFates[0].mFrameType);
15815a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertArrayEquals(frameContentBytes, retrievedFates[0].mFrameBytes);
15825a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
15835a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15845a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
15855a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the failure to retrieve tx packet fates when the input array is empty.
15865a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
15875a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
15885a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetTxPktFatesEmptyInputArray() throws Exception {
15895a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1590d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getTxPktFates(TEST_IFACE_NAME, new WifiNative.TxFateReport[0]));
15915a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
15925a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugTxPacketFates(any(IWifiStaIface.getDebugTxPacketFatesCallback.class));
15935a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
15945a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass
15955a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    /**
15965a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     * Tests the failure to retrieve rx packet fates when the input array is empty.
15975a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass     */
15985a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    @Test
15995a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    public void testGetRxPktFatesEmptyInputArray() throws Exception {
16005a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1601d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.getRxPktFates(TEST_IFACE_NAME, new WifiNative.RxFateReport[0]));
16025a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass        verify(mIWifiStaIface, never())
16035a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass                .getDebugRxPacketFates(any(IWifiStaIface.getDebugRxPacketFatesCallback.class));
16045a801ea1dd4da217cb2ea03ecfcfc02985e4f1dfMichael Plass    }
1605135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1606135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    /**
1607135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     * Tests the nd offload enable/disable.
1608135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     */
1609135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    @Test
1610135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    public void testEnableDisableNdOffload() throws Exception {
1611135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        when(mIWifiStaIface.enableNdOffload(anyBoolean())).thenReturn(mWifiStatusSuccess);
1612135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1613d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.configureNeighborDiscoveryOffload(TEST_IFACE_NAME, true));
1614135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface, never()).enableNdOffload(anyBoolean());
1615135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1616135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1617135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1618d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.configureNeighborDiscoveryOffload(TEST_IFACE_NAME, true));
1619135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(true));
1620d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.configureNeighborDiscoveryOffload(TEST_IFACE_NAME, false));
1621135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(false));
1622135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    }
1623135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1624135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    /**
1625135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     * Tests the nd offload enable failure.
1626135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass     */
1627135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    @Test
1628135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    public void testEnableNdOffloadFailure() throws Exception {
1629135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        when(mIWifiStaIface.enableNdOffload(eq(true))).thenReturn(mWifiStatusFailure);
1630135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1631135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1632135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass
1633d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertFalse(mWifiVendorHal.configureNeighborDiscoveryOffload(TEST_IFACE_NAME, true));
1634135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass        verify(mIWifiStaIface).enableNdOffload(eq(true));
1635135be5a123dd70bb4663396a28dda9d6c26956fcMichael Plass    }
1636cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1637cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    /**
1638cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     * Tests the retrieval of wlan wake reason stats.
1639cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     */
1640cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    @Test
1641cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    public void testGetWlanWakeReasonCount() throws Exception {
1642cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        WifiDebugHostWakeReasonStats stats = new WifiDebugHostWakeReasonStats();
1643cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        Random rand = new Random();
1644cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalCmdEventWakeCnt = rand.nextInt();
1645cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalDriverFwLocalWakeCnt = rand.nextInt();
1646cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.totalRxPacketWakeCnt = rand.nextInt();
1647cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxPktWakeDetails.rxUnicastCnt = rand.nextInt();
1648cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxPktWakeDetails.rxMulticastCnt = rand.nextInt();
1649cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxIcmpPkWakeDetails.icmpPkt = rand.nextInt();
1650cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxIcmpPkWakeDetails.icmp6Pkt = rand.nextInt();
1651cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt = rand.nextInt();
1652cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        stats.rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt = rand.nextInt();
1653cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1654cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        doAnswer(new AnswerWithArguments() {
1655cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            public void answer(IWifiChip.getDebugHostWakeReasonStatsCallback cb) {
1656cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                cb.onValues(mWifiStatusSuccess, stats);
1657cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            }
1658cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        }).when(mIWifiChip).getDebugHostWakeReasonStats(
1659cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1660cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1661cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNull(mWifiVendorHal.getWlanWakeReasonCount());
1662cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip, never())
1663cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                .getDebugHostWakeReasonStats(
1664cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                        any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1665cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1666cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1667cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1668cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        WifiWakeReasonAndCounts retrievedStats = mWifiVendorHal.getWlanWakeReasonCount();
1669cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip).getDebugHostWakeReasonStats(
1670cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1671cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNotNull(retrievedStats);
1672cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalCmdEventWakeCnt, retrievedStats.totalCmdEventWake);
1673cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalDriverFwLocalWakeCnt, retrievedStats.totalDriverFwLocalWake);
1674cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.totalRxPacketWakeCnt, retrievedStats.totalRxDataWake);
1675cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxPktWakeDetails.rxUnicastCnt, retrievedStats.rxUnicast);
1676cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxPktWakeDetails.rxMulticastCnt, retrievedStats.rxMulticast);
1677cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxIcmpPkWakeDetails.icmpPkt, retrievedStats.icmp);
1678cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxIcmpPkWakeDetails.icmp6Pkt, retrievedStats.icmp6);
1679cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt,
1680cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                retrievedStats.ipv4RxMulticast);
1681cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertEquals(stats.rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt,
1682cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                retrievedStats.ipv6Multicast);
1683cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    }
1684cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1685cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    /**
1686cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     * Tests the failure in retrieval of wlan wake reason stats.
1687cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass     */
1688cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    @Test
1689cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    public void testGetWlanWakeReasonCountFailure() throws Exception {
1690cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        doAnswer(new AnswerWithArguments() {
1691cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            public void answer(IWifiChip.getDebugHostWakeReasonStatsCallback cb) {
1692cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                cb.onValues(mWifiStatusFailure, new WifiDebugHostWakeReasonStats());
1693cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass            }
1694cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        }).when(mIWifiChip).getDebugHostWakeReasonStats(
1695cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1696cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1697cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        // This should work in both AP & STA mode.
1698cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
1699cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass
1700cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        assertNull(mWifiVendorHal.getWlanWakeReasonCount());
1701cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass        verify(mIWifiChip).getDebugHostWakeReasonStats(
1702cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass                any(IWifiChip.getDebugHostWakeReasonStatsCallback.class));
1703cbe44718452e93ef2b68974230231ff4fac99deeMichael Plass    }
17042f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17052f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    /**
17062f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Test that getFwMemoryDump is properly plumbed
17072f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     */
17082f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    @Test
17092f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    public void testGetFwMemoryDump() throws Exception {
17102f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        byte [] sample = NativeUtil.hexStringToByteArray("268c7a3fbfa4661c0bdd6a36");
17112f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        ArrayList<Byte> halBlob = NativeUtil.byteArrayToArrayList(sample);
17122f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17132f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        doAnswer(new AnswerWithArguments() {
17142f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            public void answer(IWifiChip.requestFirmwareDebugDumpCallback cb)
17152f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                    throws RemoteException {
17162f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                cb.onValues(mWifiStatusSuccess, halBlob);
17172f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            }
17182f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        }).when(mIWifiChip).requestFirmwareDebugDump(any(
17192f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                IWifiChip.requestFirmwareDebugDumpCallback.class));
17202f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17212f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
17222f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertArrayEquals(sample, mWifiVendorHal.getFwMemoryDump());
17232f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    }
17242f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17252f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    /**
17262f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Test that getDriverStateDump is properly plumbed
17272f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     *
17282f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     * Just for variety, use AP mode here.
17292f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass     */
17302f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    @Test
17312f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    public void testGetDriverStateDump() throws Exception {
17322f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        byte [] sample = NativeUtil.hexStringToByteArray("e83ff543cf80083e6459d20f");
17332f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        ArrayList<Byte> halBlob = NativeUtil.byteArrayToArrayList(sample);
17342f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17352f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        doAnswer(new AnswerWithArguments() {
17362f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            public void answer(IWifiChip.requestDriverDebugDumpCallback cb)
17372f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                    throws RemoteException {
17382f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                cb.onValues(mWifiStatusSuccess, halBlob);
17392f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass            }
17402f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        }).when(mIWifiChip).requestDriverDebugDump(any(
17412f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass                IWifiChip.requestDriverDebugDumpCallback.class));
17422f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass
17432f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
17442f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass        assertArrayEquals(sample, mWifiVendorHal.getDriverStateDump());
17452f0db656f678c8cf1ab6643739c6d0059721e6e2Michael Plass    }
1746d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1747d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1748d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan failure is handled correctly.
1749d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1750d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1751d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFailureCallback() throws Exception {
1752d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1753d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1754d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1755d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1756d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1757d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1758d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanFailure(mWifiVendorHal.mScan.cmdId);
1759d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_FAILED);
1760d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1761d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1762d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1763136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test that background scan failure with wrong id is not reported.
1764d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1765d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1766d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFailureCallbackWithInvalidCmdId() throws Exception {
1767d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1768d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1769d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1770d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1771d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1772d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1773d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanFailure(mWifiVendorHal.mScan.cmdId + 1);
1774d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler, never()).onScanStatus(WifiNative.WIFI_SCAN_FAILED);
1775d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1776d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1777d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1778d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan full results are handled correctly.
1779d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1780d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1781d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanFullScanResults() throws Exception {
1782d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1783d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1784d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1785d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1786d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1787d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1788d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<StaScanResult, ScanResult> result = createHidlAndFrameworkBgScanResult();
1789d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundFullScanResult(
17906b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius                mWifiVendorHal.mScan.cmdId, 5, result.first);
1791d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1792d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArgumentCaptor<ScanResult> scanResultCaptor = ArgumentCaptor.forClass(ScanResult.class);
17936b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(eventHandler).onFullScanResult(scanResultCaptor.capture(), eq(5));
1794d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1795d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanResultEqual(result.second, scanResultCaptor.getValue());
1796d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1797d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1798d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    /**
1799d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     * Test that background scan results are handled correctly.
1800d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius     */
1801d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    @Test
1802d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    public void testBgScanScanResults() throws Exception {
1803d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
1804d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertNotNull(mIWifiStaIfaceEventCallback);
1805d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1806d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1807d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        startBgScan(eventHandler);
1808d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1809d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<ArrayList<StaScanData>, ArrayList<WifiScanner.ScanData>> data =
1810d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                createHidlAndFrameworkBgScanDatas();
1811d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        mIWifiStaIfaceEventCallback.onBackgroundScanResults(
1812d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                mWifiVendorHal.mScan.cmdId, data.first);
1813d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
1814d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);
1815d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanDatasEqual(
1816d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                data.second, Arrays.asList(mWifiVendorHal.mScan.latestScanResults));
1817d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
1818d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
18191514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
1820136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test that starting a new background scan when one is active will stop the previous one.
1821136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1822136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1823136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanReplacement() throws Exception {
1824136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1825136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1826136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1827136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1828136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1829136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId1 = mWifiVendorHal.mScan.cmdId;
1830136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1831136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotEquals(mWifiVendorHal.mScan.cmdId, cmdId1);
1832136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface, times(2)).startBackgroundScan(anyInt(), any());
1833136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId1);
1834136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1835136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1836136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
1837136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test stopping a background scan.
1838136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1839136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1840136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanStop() throws Exception {
1841136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1842136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1843136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1844136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1845136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1846136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1847136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId = mWifiVendorHal.mScan.cmdId;
1848136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1849d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.stopBgScan(TEST_IFACE_NAME);
1850d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.stopBgScan(TEST_IFACE_NAME); // second call should not do anything
1851136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId); // Should be called just once
1852136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1853136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1854136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
1855136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     * Test pausing and restarting a background scan.
1856136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass     */
1857136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    @Test
1858136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    public void testBgScanPauseAndRestart() throws Exception {
1859136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        when(mIWifiStaIface.stopBackgroundScan(anyInt())).thenReturn(mWifiStatusSuccess);
1860136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
1861136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        assertNotNull(mIWifiStaIfaceEventCallback);
1862136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class);
1863136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        startBgScan(eventHandler);
1864136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1865136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        int cmdId = mWifiVendorHal.mScan.cmdId;
1866136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1867d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.pauseBgScan(TEST_IFACE_NAME);
1868d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.restartBgScan(TEST_IFACE_NAME);
1869136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface).stopBackgroundScan(cmdId); // Should be called just once
1870136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        verify(mIWifiStaIface, times(2)).startBackgroundScan(eq(cmdId), any());
1871136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    }
1872136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass
1873136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass    /**
18741514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of log handler set.
18751514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
18761514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
18771514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testSetLogHandler() throws Exception {
18781514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
18791514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18801514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
18811514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
18821514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18831514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.setLoggingEventHandler(eventHandler));
18841514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
18851514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18861514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
18871514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18881514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
18891514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
18901514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        reset(mIWifiChip);
18911514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18921514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Second call should fail.
18931514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.setLoggingEventHandler(eventHandler));
18941514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
18951514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
18961514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
18971514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
18981514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of log handler reset.
18991514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
19001514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
19011514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testResetLogHandler() throws Exception {
19021514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
19036b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
19041514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19051514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
19061514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
19076b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
19081514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19091514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
19101514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19111514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Not set, so this should fail.
19121514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
19131514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
19146b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
19151514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19161514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now set and then reset.
19171514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(
19181514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class)));
19191514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
19201514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(false));
19216b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip).stopLoggingToDebugRingBuffer();
19221514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        reset(mIWifiChip);
19231514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19241514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Second reset should fail.
19251514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertFalse(mWifiVendorHal.resetLogHandler());
19261514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip, never()).enableDebugErrorAlerts(anyBoolean());
19276b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        verify(mIWifiChip, never()).stopLoggingToDebugRingBuffer();
19281514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
19291514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19301514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
19311514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of alert callback.
19321514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
19331514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
19341514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testAlertCallback() throws Exception {
19351514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
19361514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertNotNull(mIWifiChipEventCallback);
19371514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
1938cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        testAlertCallbackUsingProvidedCallback(mIWifiChipEventCallback);
19391514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
19401514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19411514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    /**
19421514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     * Test the handling of ring buffer callback.
19431514ed2b37ca20f14990c9a605a576632300649bRoshan Pius     */
19441514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    @Test
19451514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    public void testRingBufferDataCallback() throws Exception {
19461514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
19476b1dfdb05b07e485cf510d3cc393cb0ca7b9d9efRoshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
19481514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19491514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
19501514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertNotNull(mIWifiChipEventCallback);
19511514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19521514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        byte[] errorData = new byte[45];
19531514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        new Random().nextBytes(errorData);
19541514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19551514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Randomly raise the HIDL callback before we register for the log callback.
19565e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        // This should be safely ignored. (Not trigger NPE.)
19571514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
19581514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
19595e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
19601514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19611514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
19621514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
19631514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
19641514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
19651514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19661514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now raise the HIDL callback, this should be properly handled.
19671514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
19681514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
19695e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
19701514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        verify(eventHandler).onRingBufferData(
19711514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                any(WifiNative.RingBufferStatus.class), eq(errorData));
19721514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
19731514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        // Now stop the logging and invoke the callback. This should be ignored.
19745e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        reset(eventHandler);
19751514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
19761514ed2b37ca20f14990c9a605a576632300649bRoshan Pius        mIWifiChipEventCallback.onDebugRingBufferDataAvailable(
19771514ed2b37ca20f14990c9a605a576632300649bRoshan Pius                new WifiDebugRingBufferStatus(), NativeUtil.byteArrayToArrayList(errorData));
19785e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        mLooper.dispatchAll();
19795e6aea460e272ef7c70029abe9f0e5a695ad119emukesh agrawal        verify(eventHandler, never()).onRingBufferData(anyObject(), anyObject());
19801514ed2b37ca20f14990c9a605a576632300649bRoshan Pius    }
19811514ed2b37ca20f14990c9a605a576632300649bRoshan Pius
1982af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    /**
1983af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius     * Test the handling of Vendor HAL death.
1984af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius     */
1985af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    @Test
1986af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    public void testVendorHalDeath() {
1987af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        // Invoke the HAL device manager status callback with ready set to false to indicate the
1988af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        // death of the HAL.
1989af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        when(mHalDeviceManager.isReady()).thenReturn(false);
1990af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        mHalDeviceManagerStatusCallbacks.onStatusChanged();
1991af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius
1992af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        verify(mVendorHalDeathHandler).onDeath();
1993af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    }
1994af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius
1995ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
1996b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     * Test the new selectTxPowerScenario HIDL method invocation. This should return failure if the
1997ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * HAL service is exposing the 1.0 interface.
1998ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
1999ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
2000b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    public void testSelectTxPowerScenario() throws RemoteException {
20013153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2002ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Should fail because we exposed the 1.0 IWifiChip.
2003b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        assertFalse(
2004b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius                mWifiVendorHal.selectTxPowerScenario(WifiNative.TX_POWER_SCENARIO_VOICE_CALL));
2005b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).selectTxPowerScenario(anyInt());
2006ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
2007ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
2008ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Now expose the 1.1 IWifiChip.
2009ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
2010b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        when(mIWifiChipV11.selectTxPowerScenario(anyInt())).thenReturn(mWifiStatusSuccess);
2011ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
20123153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2013b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        assertTrue(
2014b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius                mWifiVendorHal.selectTxPowerScenario(WifiNative.TX_POWER_SCENARIO_VOICE_CALL));
2015b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11).selectTxPowerScenario(
2016b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius                eq(android.hardware.wifi.V1_1.IWifiChip.TxPowerScenario.VOICE_CALL));
2017b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).resetTxPowerScenario();
2018ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
2019ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
2020ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
2021ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
2022b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     * Test the new resetTxPowerScenario HIDL method invocation. This should return failure if the
2023ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * HAL service is exposing the 1.0 interface.
2024ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
2025ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    @Test
2026b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    public void testResetTxPowerScenario() throws RemoteException {
20273153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2028ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Should fail because we exposed the 1.0 IWifiChip.
2029b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        assertFalse(mWifiVendorHal.selectTxPowerScenario(WifiNative.TX_POWER_SCENARIO_NORMAL));
2030b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).resetTxPowerScenario();
2031ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
2032ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
2033ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        // Now expose the 1.1 IWifiChip.
2034ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
2035b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        when(mIWifiChipV11.resetTxPowerScenario()).thenReturn(mWifiStatusSuccess);
2036b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius
20373153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2038b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        assertTrue(mWifiVendorHal.selectTxPowerScenario(WifiNative.TX_POWER_SCENARIO_NORMAL));
2039b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11).resetTxPowerScenario();
2040b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).selectTxPowerScenario(anyInt());
2041b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        mWifiVendorHal.stopVendorHal();
2042b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    }
2043b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius
2044b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    /**
2045b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     * Test the new selectTxPowerScenario HIDL method invocation with a bad scenario index.
2046b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     */
2047b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    @Test
2048b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    public void testInvalidSelectTxPowerScenario() throws RemoteException {
2049b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        // Expose the 1.1 IWifiChip.
2050b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
2051b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        when(mIWifiChipV11.selectTxPowerScenario(anyInt())).thenReturn(mWifiStatusSuccess);
2052ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
20533153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2054b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        assertFalse(mWifiVendorHal.selectTxPowerScenario(-6));
2055b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).selectTxPowerScenario(anyInt());
2056b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        verify(mIWifiChipV11, never()).resetTxPowerScenario();
2057ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius        mWifiVendorHal.stopVendorHal();
2058ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
2059ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
20603153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    /**
20613153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * Test the STA Iface creation failure due to iface name retrieval failure.
20623153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     */
20633153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    @Test
20643153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    public void testCreateStaIfaceFailureInIfaceName() throws RemoteException {
20653153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        doAnswer(new AnswerWithArguments() {
20663153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            public void answer(IWifiIface.getNameCallback cb)
20673153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                    throws RemoteException {
20683153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                cb.onValues(mWifiStatusFailure, "wlan0");
20693153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            }
20703153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        }).when(mIWifiStaIface).getName(any(IWifiIface.getNameCallback.class));
20713153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
20723153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
20737dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        assertNull(mWifiVendorHal.createStaIface(true, null));
20747dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(true), any(), eq(null));
20753153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    }
20763153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
20773153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    /**
20783153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * Test the STA Iface creation failure due to iface name retrieval failure.
20793153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     */
20803153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    @Test
2081d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius    public void testCreateApIfaceFailureInIfaceName() throws RemoteException {
20823153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        doAnswer(new AnswerWithArguments() {
20833153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            public void answer(IWifiIface.getNameCallback cb)
20843153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                    throws RemoteException {
20853153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius                cb.onValues(mWifiStatusFailure, "wlan0");
20863153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            }
20873153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        }).when(mIWifiApIface).getName(any(IWifiIface.getNameCallback.class));
20883153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
20893153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
20903153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertNull(mWifiVendorHal.createApIface(null));
2091be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(any(), eq(null));
20923153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    }
20933153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
20943153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    /**
20953153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * Test the creation and removal of STA Iface.
20963153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     */
20973153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    @Test
20983153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    public void testCreateRemoveStaIface() throws RemoteException {
20993153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
21007dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        String ifaceName = mWifiVendorHal.createStaIface(false, null);
21017dadc4d68ea820779ec513073347890b842a6f9cEtan Cohen        verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
2102d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(TEST_IFACE_NAME, ifaceName);
21033153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.removeStaIface(ifaceName));
21043153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        verify(mHalDeviceManager).removeIface(eq(mIWifiStaIface));
21053153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    }
21063153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
21073153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    /**
21083153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     * Test the creation and removal of Ap Iface.
21093153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius     */
21103153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    @Test
21113153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    public void testCreateRemoveApIface() throws RemoteException {
21123153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal());
21133153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        String ifaceName = mWifiVendorHal.createApIface(null);
2114be7435e9929c73d041a4c1c9aeba3a3421bcd859Roshan Pius        verify(mHalDeviceManager).createApIface(any(), eq(null));
2115d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertEquals(TEST_IFACE_NAME, ifaceName);
21163153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        assertTrue(mWifiVendorHal.removeApIface(ifaceName));
21173153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        verify(mHalDeviceManager).removeIface(eq(mIWifiApIface));
21183153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius    }
21193153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius
2120cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    /**
2121cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius     * Test the callback handling for the 1.2 HAL.
2122cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius     */
2123cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    @Test
2124cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    public void testAlertCallbackUsing_1_2_EventCallback() throws Exception {
2125cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        // Expose the 1.2 IWifiChip.
2126cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
2127cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2128cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        assertTrue(mWifiVendorHal.startVendorHalSta());
2129cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        assertNotNull(mIWifiChipEventCallbackV12);
2130cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2131cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        testAlertCallbackUsingProvidedCallback(mIWifiChipEventCallbackV12);
2132cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    }
2133cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
21341c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    /**
21351c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * Verifies setMacAddress() success.
21361c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     */
21371c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    @Test
21381c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    public void testSetMacAddressSuccess() throws Exception {
21391c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        // Expose the 1.2 IWifiStaIface.
21401c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
21411c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        byte[] macByteArray = TEST_MAC_ADDRESS.toByteArray();
21421c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        when(mIWifiStaIfaceV12.setMacAddress(macByteArray)).thenReturn(mWifiStatusSuccess);
21431c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21441c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        assertTrue(mWifiVendorHal.setMacAddress(TEST_IFACE_NAME, TEST_MAC_ADDRESS));
21451c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        verify(mIWifiStaIfaceV12).setMacAddress(macByteArray);
21461c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    }
21471c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21481c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    /**
21491c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * Verifies setMacAddress() can handle failure status.
21501c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     */
21511c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    @Test
21521c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    public void testSetMacAddressFailDueToStatusFailure() throws Exception {
21531c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        // Expose the 1.2 IWifiStaIface.
21541c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
21551c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        byte[] macByteArray = TEST_MAC_ADDRESS.toByteArray();
21561c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        when(mIWifiStaIfaceV12.setMacAddress(macByteArray)).thenReturn(mWifiStatusFailure);
21571c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21581c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        assertFalse(mWifiVendorHal.setMacAddress(TEST_IFACE_NAME, TEST_MAC_ADDRESS));
21591c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        verify(mIWifiStaIfaceV12).setMacAddress(macByteArray);
21601c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    }
21611c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21621c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    /**
21631c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * Verifies setMacAddress() can handle RemoteException.
21641c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     */
21651c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    @Test
21661c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    public void testSetMacAddressFailDueToRemoteException() throws Exception {
21671c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        // Expose the 1.2 IWifiStaIface.
21681c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
21691c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        byte[] macByteArray = TEST_MAC_ADDRESS.toByteArray();
21701c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        doThrow(new RemoteException()).when(mIWifiStaIfaceV12).setMacAddress(macByteArray);
21711c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21721c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        assertFalse(mWifiVendorHal.setMacAddress(TEST_IFACE_NAME, TEST_MAC_ADDRESS));
21731c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        verify(mIWifiStaIfaceV12).setMacAddress(macByteArray);
21741c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    }
21751c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
21761c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    /**
21771c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     * Verifies setMacAddress() does not crash with older HALs.
21781c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim     */
21791c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    @Test
21801c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    public void testSetMacAddressDoesNotCrashOnOlderHal() throws Exception {
21811c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        byte[] macByteArray = TEST_MAC_ADDRESS.toByteArray();
21821c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim        assertFalse(mWifiVendorHal.setMacAddress(TEST_IFACE_NAME, TEST_MAC_ADDRESS));
21831c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim    }
21841c7f0d2c83318cdd1c127a083362e91765c0d941Jong Wook Kim
2185cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    private void testAlertCallbackUsingProvidedCallback(IWifiChipEventCallback chipCallback)
2186cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius            throws Exception {
2187cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess);
2188cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        when(mIWifiChip.stopLoggingToDebugRingBuffer()).thenReturn(mWifiStatusSuccess);
2189cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2190cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        int errorCode = 5;
2191cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        byte[] errorData = new byte[45];
2192cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        new Random().nextBytes(errorData);
2193cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2194cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        // Randomly raise the HIDL callback before we register for the log callback.
2195cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        // This should be safely ignored. (Not trigger NPE.)
2196cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        chipCallback.onDebugErrorAlert(
2197cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
2198cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        mLooper.dispatchAll();
2199cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2200cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        WifiNative.WifiLoggerEventHandler eventHandler =
2201cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                mock(WifiNative.WifiLoggerEventHandler.class);
2202cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        assertTrue(mWifiVendorHal.setLoggingEventHandler(eventHandler));
2203cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        verify(mIWifiChip).enableDebugErrorAlerts(eq(true));
2204cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2205cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        // Now raise the HIDL callback, this should be properly handled.
2206cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        chipCallback.onDebugErrorAlert(
2207cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
2208cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        mLooper.dispatchAll();
2209cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        verify(eventHandler).onWifiAlert(eq(errorCode), eq(errorData));
2210cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2211cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        // Now stop the logging and invoke the callback. This should be ignored.
2212cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        reset(eventHandler);
2213cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        assertTrue(mWifiVendorHal.resetLogHandler());
2214cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        chipCallback.onDebugErrorAlert(
2215cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius                errorCode, NativeUtil.byteArrayToArrayList(errorData));
2216cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        mLooper.dispatchAll();
2217cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius        verify(eventHandler, never()).onWifiAlert(anyInt(), anyObject());
2218cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius    }
2219cc9c910dd0d35ad75003e4777b15562ebd7ada35Roshan Pius
2220d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void startBgScan(WifiNative.ScanEventHandler eventHandler) throws Exception {
2221d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        when(mIWifiStaIface.startBackgroundScan(
2222d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                anyInt(), any(StaBackgroundScanParameters.class))).thenReturn(mWifiStatusSuccess);
2223136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.ScanSettings settings = new WifiNative.ScanSettings();
2224136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        settings.num_buckets = 1;
2225136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings();
2226136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.bucket = 0;
2227136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.period_ms = 16000;
2228136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        bucketSettings.report_events = WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN;
2229136c7ba4dc189068fb63457a60f642ca499ed63cMichael Plass        settings.buckets = new WifiNative.BucketSettings[] {bucketSettings};
2230d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        assertTrue(mWifiVendorHal.startBgScan(TEST_IFACE_NAME, settings, eventHandler));
2231d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2232d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2233d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // Create a pair of HIDL scan result and its corresponding framework scan result for
2234d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // comparison.
2235d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private Pair<StaScanResult, ScanResult> createHidlAndFrameworkBgScanResult() {
2236d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        StaScanResult staScanResult = new StaScanResult();
2237d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Random random = new Random();
2238d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        byte[] ssid = new byte[8];
2239d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(ssid);
2240d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.ssid.addAll(NativeUtil.byteArrayToArrayList(ssid));
2241d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(staScanResult.bssid);
2242d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.frequency = 2432;
2243d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.rssi = -45;
2244d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.timeStampInUs = 5;
2245d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiInformationElement ie1 = new WifiInformationElement();
2246d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        byte[] ie1_data = new byte[56];
2247d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        random.nextBytes(ie1_data);
2248d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ie1.id = 1;
2249d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ie1.data.addAll(NativeUtil.byteArrayToArrayList(ie1_data));
2250d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanResult.informationElements.add(ie1);
2251d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2252d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        // Now create the corresponding Scan result structure.
2253d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ScanResult scanResult = new ScanResult();
2254d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.SSID = NativeUtil.encodeSsid(staScanResult.ssid);
2255d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.BSSID = NativeUtil.macAddressFromByteArray(staScanResult.bssid);
2256d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.wifiSsid = WifiSsid.createFromByteArray(ssid);
2257d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.frequency = staScanResult.frequency;
2258d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.level = staScanResult.rssi;
2259d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResult.timestamp = staScanResult.timeStampInUs;
2260d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2261d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        return Pair.create(staScanResult, scanResult);
2262d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2263d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2264d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // Create a pair of HIDL scan datas and its corresponding framework scan datas for
2265d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    // comparison.
2266d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private Pair<ArrayList<StaScanData>, ArrayList<WifiScanner.ScanData>>
2267d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            createHidlAndFrameworkBgScanDatas() {
2268d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArrayList<StaScanData> staScanDatas = new ArrayList<>();
2269d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        StaScanData staScanData = new StaScanData();
2270d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2271d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        Pair<StaScanResult, ScanResult> result = createHidlAndFrameworkBgScanResult();
2272d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.results.add(result.first);
2273d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.bucketsScanned = 5;
2274d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanData.flags = StaScanDataFlagMask.INTERRUPTED;
2275d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        staScanDatas.add(staScanData);
2276d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2277d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ArrayList<WifiScanner.ScanData> scanDatas = new ArrayList<>();
2278d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        ScanResult[] scanResults = new ScanResult[1];
2279d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanResults[0] = result.second;
2280d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        WifiScanner.ScanData scanData =
2281d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                new WifiScanner.ScanData(mWifiVendorHal.mScan.cmdId, 1,
2282d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius                        staScanData.bucketsScanned, false, scanResults);
2283d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        scanDatas.add(scanData);
2284d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        return Pair.create(staScanDatas, scanDatas);
2285d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2286d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2287d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanResultEqual(ScanResult expected, ScanResult actual) {
2288d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.SSID, actual.SSID);
2289d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.wifiSsid.getHexString(), actual.wifiSsid.getHexString());
2290d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.BSSID, actual.BSSID);
2291d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.frequency, actual.frequency);
2292d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.level, actual.level);
2293d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.timestamp, actual.timestamp);
2294d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2295d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2296d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanResultsEqual(ScanResult[] expected, ScanResult[] actual) {
2297d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.length, actual.length);
2298d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        for (int i = 0; i < expected.length; i++) {
2299d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            assertScanResultEqual(expected[i], actual[i]);
2300d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        }
2301d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2302d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2303d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanDataEqual(WifiScanner.ScanData expected, WifiScanner.ScanData actual) {
2304d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getId(), actual.getId());
2305d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getFlags(), actual.getFlags());
2306d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.getBucketsScanned(), actual.getBucketsScanned());
2307d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertScanResultsEqual(expected.getResults(), actual.getResults());
2308d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2309d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius
2310d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    private void assertScanDatasEqual(
2311d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            List<WifiScanner.ScanData> expected, List<WifiScanner.ScanData> actual) {
2312d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        assertEquals(expected.size(), actual.size());
2313d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        for (int i = 0; i < expected.size(); i++) {
2314d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius            assertScanDataEqual(expected.get(i), actual.get(i));
2315d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius        }
2316d4c5eca00c9cae55561210479ed61a977923e0daRoshan Pius    }
2317b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass}
2318