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