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