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