WifiVendorHalTest.java revision 70b995bed9674a30c56b7ae2585d5897900ff695
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;
18b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
19d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.app.test.MockAnswerUtil.AnswerWithArguments;
20d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiApIface;
21d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiChip;
22d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiIface;
23d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiRttController;
24d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport android.hardware.wifi.V1_0.IWifiStaIface;
25ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport android.hardware.wifi.V1_0.StaApfPacketFilterCapabilities;
2653f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferFlags;
2753f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferStatus;
2853f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.hardware.wifi.V1_0.WifiDebugRingBufferVerboseLevel;
294f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatus;
304f2049a015722cae0f0169379d499d5d4fc98e30Michael Plassimport android.hardware.wifi.V1_0.WifiStatusCode;
31ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport android.net.apf.ApfCapabilities;
321dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plassimport android.net.wifi.WifiManager;
3353f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.HandlerThread;
3453f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.Looper;
3553f278b6fed422a18d763b07216a21e96d9445f9Michael Plassimport android.os.RemoteException;
361dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
3770b995bed9674a30c56b7ae2585d5897900ff695Michael Plassimport com.android.server.connectivity.KeepalivePacketData;
38df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plassimport com.android.server.wifi.util.NativeUtil;
39d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
40d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport static org.junit.Assert.*;
41d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport static org.mockito.Mockito.*;
42d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
43b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Before;
44b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.junit.Test;
45d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Piusimport org.mockito.ArgumentCaptor;
46b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.Mock;
47b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plassimport org.mockito.MockitoAnnotations;
48b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
4970b995bed9674a30c56b7ae2585d5897900ff695Michael Plassimport java.net.InetAddress;
50ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plassimport java.util.ArrayList;
51ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
52b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass/**
53b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass * Unit tests for {@link com.android.server.wifi.WifiVendorHal}.
54b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass */
55b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plasspublic class WifiVendorHalTest {
56b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
57d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    WifiVendorHal mWifiVendorHal;
584f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusSuccess;
594f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiStatus mWifiStatusFailure;
604f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
614f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private HalDeviceManager mHalDeviceManager;
624f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
634f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private HandlerThread mWifiStateMachineHandlerThread;
644f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
654f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private WifiVendorHal.HalDeviceManagerStatusListener mHalDeviceManagerStatusCallbacks;
664f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
674f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiApIface mIWifiApIface;
684f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
694f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiChip mIWifiChip;
704f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
714f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiStaIface mIWifiStaIface;
724f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Mock
734f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    private IWifiRttController mIWifiRttController;
74b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
75b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
76b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     * Sets up for unit test
77b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass     */
78b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    @Before
79b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    public void setUp() throws Exception {
80b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass        MockitoAnnotations.initMocks(this);
814f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess = new WifiStatus();
824f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusSuccess.code = WifiStatusCode.SUCCESS;
834f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure = new WifiStatus();
844f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.code = WifiStatusCode.ERROR_UNKNOWN;
854f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiStatusFailure.description = "I don't even know what a Mock Turtle is.";
864f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        when(mIWifiStaIface.enableLinkLayerStatsCollection(false)).thenReturn(mWifiStatusSuccess);
874f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
88b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
89d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Setup the HalDeviceManager mock's start/stop behaviour. This can be overridden in
90d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // individual tests, if needed.
91d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
92d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public boolean answer() {
93d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
94d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(true);
95d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
96d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return true;
97d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
98d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
99d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
100d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
101d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public void answer() {
102d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isReady()).thenReturn(true);
103d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                when(mHalDeviceManager.isStarted()).thenReturn(false);
104d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                mHalDeviceManagerStatusCallbacks.onStatusChanged();
105d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
106d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).stop();
107d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createStaIface(eq(null), eq(null)))
108d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiStaIface);
109d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createApIface(eq(null), eq(null)))
110d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiApIface);
111d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class)))
112d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiChip);
113d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createRttController(any(IWifiIface.class)))
114d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                .thenReturn(mIWifiRttController);
115d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
116d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Create the vendor HAL object under test.
117d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal = new WifiVendorHal(mHalDeviceManager, mWifiStateMachineHandlerThread);
118d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
119d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // Initialize the vendor HAL to capture the registered callback.
120d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.initialize();
121d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        ArgumentCaptor<WifiVendorHal.HalDeviceManagerStatusListener> callbackCaptor =
122d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                ArgumentCaptor.forClass(WifiVendorHal.HalDeviceManagerStatusListener.class);
123d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).registerStatusListener(
124d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                callbackCaptor.capture(), any(Looper.class));
125d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mHalDeviceManagerStatusCallbacks = callbackCaptor.getValue();
126b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    }
127b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass
128b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass    /**
129d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in STA mode using
130d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
131d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
132d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
133d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStartHalSuccessInStaMode() {
134d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
135d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
136d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
137d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
138d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
139d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
140d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
141d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
142d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
143d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
144d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
145d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
146d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
147d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
148d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the successful starting of HAL in AP mode using
149d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
150d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
151d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
152d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStartHalSuccessInApMode() {
153d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(false));
154d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
155d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
156d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
157d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
158d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
159d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isReady();
160d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).isStarted();
161d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
162d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
163d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
164d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
165d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
166d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
167d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
168d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
169d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
170d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
171d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStartHalFailureInStaMode() {
172d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // No callbacks are invoked in this case since the start itself failed. So, override
173d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        // default AnswerWithArguments that we setup.
174d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        doAnswer(new AnswerWithArguments() {
175d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            public boolean answer() {
176d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius                return false;
177d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius            }
178d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        }).when(mHalDeviceManager).start();
179d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
180d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
181d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
182d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
183d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
184d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
185d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
186d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
187d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
188d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
189d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
190d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
191d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
192d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
193d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
194d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
195d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStartHalFailureInIfaceCreationInStaMode() {
196d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createStaIface(eq(null), eq(null))).thenReturn(null);
197d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
198d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
199d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
200d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
201d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
202d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
203d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
204d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
205d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
206d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
207d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
208d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
209d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
210d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
211d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
212d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
213d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
214d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStartHalFailureInRttControllerCreationInStaMode() {
215d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createRttController(any(IWifiIface.class))).thenReturn(null);
216d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
217d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
218d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
219d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
220d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
221d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
222d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
223d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
224d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
225d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
226d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
227d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
228d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
229d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
230d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
231d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
232d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
233d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStartHalFailureInChipGetInStaMode() {
234d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.getChip(any(IWifiIface.class))).thenReturn(null);
235d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(true));
236d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
237d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
238d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
239d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
240d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
241d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(any(IWifiIface.class));
242d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
243d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
244d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
245d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
246d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
247d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
248d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the failure to start HAL in STA mode using
249d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#startVendorHal(boolean)}.
250d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
251d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
252d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStartHalFailureInApMode() {
253d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        when(mHalDeviceManager.createApIface(eq(null), eq(null))).thenReturn(null);
254d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.startVendorHal(false));
255d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
256d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
257d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
258d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
259d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
260d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
261d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
262d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
263d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
264d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
265d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
266d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
267d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in STA mode using
268d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
269d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
270d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
271d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInStaMode() {
272d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(true));
273d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
274d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
275d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
276d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
277d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
278d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
279d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
280d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createStaIface(eq(null), eq(null));
281d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
282d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createRttController(eq(mIWifiStaIface));
283d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
284d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
285d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
286d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createApIface(eq(null), eq(null));
287d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
288d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
289d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
290d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * Tests the stopping of HAL in AP mode using
291d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * {@link WifiVendorHal#stopVendorHal()}.
292d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
293d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    @Test
294d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    public void testStopHalInApMode() {
295d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.startVendorHal(false));
296d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertTrue(mWifiVendorHal.isHalStarted());
297d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
298d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        mWifiVendorHal.stopVendorHal();
299d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        assertFalse(mWifiVendorHal.isHalStarted());
300d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
301d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).start();
302d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).stop();
303d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).createApIface(eq(null), eq(null));
304d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager).getChip(eq(mIWifiApIface));
305d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isReady();
306d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, times(2)).isStarted();
307d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
308d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createStaIface(eq(null), eq(null));
309d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius        verify(mHalDeviceManager, never()).createRttController(any(IWifiIface.class));
310d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    }
3114f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
3124f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
3131dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Test translation to WifiManager.WIFI_FEATURE_*
3141dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     *
3151dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * Just do a spot-check with a few feature bits here; since the code is table-
3161dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     * driven we don't have to work hard to exercise all of it.
3171dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass     */
3181dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    @Test
3191dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    public void testFeatureMaskTranslation() {
3201dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int caps = (
3211dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                IWifiStaIface.StaIfaceCapabilityMask.BACKGROUND_SCAN
3221dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | IWifiStaIface.StaIfaceCapabilityMask.LINK_LAYER_STATS
3231dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass            );
3241dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        int expected = (
325691806f65a5f259fd8e6b709c97d0035c418c483Michael Plass                WifiManager.WIFI_FEATURE_SCANNER
3261dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass                | WifiManager.WIFI_FEATURE_LINK_LAYER_STATS);
3271dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass        assertEquals(expected, mWifiVendorHal.wifiFeatureMaskFromStaCapabilities(caps));
3281dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    }
3291dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass
3301dc6d8ecde4cad66dc8cb7b97926f1120e7b0d57Michael Plass    /**
3314f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test enablement of link layer stats after startup
3324f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * <p>
3334f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats before HAL start
3344f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - should not make it to the HAL layer
3354f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in STA mode
3364f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats twice more
3374f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - enable request should make it to the HAL layer
3384f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the requests (i.e., two calls total)
3394f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
3404f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
3414f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsEnableAfterStartup() throws Exception {
3424f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
3434f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
3444f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertNull(mWifiVendorHal.getWifiLinkLayerStats());
3454f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
3464f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
3474f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
3484f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
3494f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiVendorHal.getWifiLinkLayerStats();
3504f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        mWifiVendorHal.getWifiLinkLayerStats();
3514f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface).enableLinkLayerStatsCollection(false); // mLinkLayerStatsDebug
3524f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, times(2)).getLinkLayerStats(any());
3534f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
3544f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
3554f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    /**
3564f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Test that link layer stats are not enabled and harmless in AP mode
3574f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * <p>
3584f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Start the HAL in AP mode
3594f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - stats should not be enabled
3604f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * Request link layer stats
3614f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     * - HAL layer should have been called to make the request
3624f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass     */
3634f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    @Test
3644f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    public void testLinkLayerStatsNotEnabledAndHarmlessInApMode() throws Exception {
3654f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        doNothing().when(mIWifiStaIface).getLinkLayerStats(any());
3664f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
3674f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
3684f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertTrue(mWifiVendorHal.isHalStarted());
3694f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        assertNull(mWifiVendorHal.getWifiLinkLayerStats());
3704f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
3714f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mHalDeviceManager).start();
3724f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
3734f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).enableLinkLayerStatsCollection(false);
3744f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass        verify(mIWifiStaIface, never()).getLinkLayerStats(any());
3754f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    }
3764f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
3774f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass    // TODO(b/34900534) add test for correct MOVE CORRESPONDING of fields
3784f2049a015722cae0f0169379d499d5d4fc98e30Michael Plass
3797e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    /**
3807e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Test that getFirmwareVersion() and getDriverVersion() work
3817e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     *
3827e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     * Calls before the STA is started are expected to return null.
3837e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass     */
3847e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    @Test
3857e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    public void testVersionGetters() throws Exception {
3867e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String firmwareVersion = "fuzzy";
3877e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        String driverVersion = "dizzy";
3887e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        IWifiChip.ChipDebugInfo chipDebugInfo = new IWifiChip.ChipDebugInfo();
3897e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.firmwareDescription = firmwareVersion;
3907e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        chipDebugInfo.driverDescription = driverVersion;
3917e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
3927e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        doAnswer(new AnswerWithArguments() {
3937e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            public void answer(IWifiChip.requestChipDebugInfoCallback cb) throws RemoteException {
3947e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass                cb.onValues(mWifiStatusSuccess, chipDebugInfo);
3957e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass            }
3967e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        }).when(mIWifiChip).requestChipDebugInfo(any(IWifiChip.requestChipDebugInfoCallback.class));
3977e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
3987e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getFirmwareVersion());
3997e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertNull(mWifiVendorHal.getDriverVersion());
4007e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
4017e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
4027e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass
4037e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(firmwareVersion, mWifiVendorHal.getFirmwareVersion());
4047e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass        assertEquals(driverVersion, mWifiVendorHal.getDriverVersion());
4057e7e2e3fd4da1f5ccda2f03dcdb321654e9f6ff8Michael Plass    }
406ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
407ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
408df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     * Test that setScanningMacOui is hooked up to the HAL correctly
409df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass     */
410df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    @Test
411df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    public void testSetScanningMacOui() throws Exception {
412df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] oui = NativeUtil.macAddressOuiToByteArray("DA:A1:19");
413df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        byte[] zzz = NativeUtil.macAddressOuiToByteArray("00:00:00");
414df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
415df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        when(mIWifiStaIface.setScanningMacOui(any())).thenReturn(mWifiStatusSuccess);
416df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
417df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(oui)); // expect fail - STA not started
418df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
419df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(null));  // expect fail - null
420df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertFalse(mWifiVendorHal.setScanningMacOui(new byte[]{(byte) 1})); // expect fail - len
421df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.setScanningMacOui(oui));
422df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        assertTrue(mWifiVendorHal.setScanningMacOui(zzz));
423df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
424df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(oui));
425df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass        verify(mIWifiStaIface).setScanningMacOui(eq(zzz));
426df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    }
427df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass
42870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
42970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStartSendingOffloadedPacket() throws Exception {
43070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        byte[] srcMac = NativeUtil.macAddressToByteArray("4007b2088c81");
43170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress src = InetAddress.parseNumericAddress("192.168.13.13");
43270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        InetAddress dst = InetAddress.parseNumericAddress("93.184.216.34");
43370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
43470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int millis = 16000;
43570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
43670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        KeepalivePacketData kap = KeepalivePacketData.nattKeepalivePacket(src, 63000, dst, 4500);
43770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
43870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.startSendingKeepAlivePackets(
43970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                anyInt(), any(), anyShort(), any(), any(), anyInt()
44070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        )).thenReturn(mWifiStatusSuccess);
44170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
44270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
44370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(0 == mWifiVendorHal.startSendingOffloadedPacket(slot, srcMac, kap, millis));
44470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
44570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).startSendingKeepAlivePackets(
44670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass                eq(slot), any(), anyShort(), any(), any(), eq(millis));
44770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
44870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
44970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    @Test
45070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    public void testStopSendingOffloadedPacket() throws Exception {
45170b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        int slot = 13;
45270b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
45370b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        when(mIWifiStaIface.stopSendingKeepAlivePackets(anyInt())).thenReturn(mWifiStatusSuccess);
45470b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
45570b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
45670b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        assertTrue(0 == mWifiVendorHal.stopSendingOffloadedPacket(slot));
45770b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
45870b995bed9674a30c56b7ae2585d5897900ff695Michael Plass        verify(mIWifiStaIface).stopSendingKeepAlivePackets(eq(slot));
45970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass    }
46070b995bed9674a30c56b7ae2585d5897900ff695Michael Plass
461df8568a5aaed3c82ff7ef1ecafab85abf7a99da7Michael Plass    /**
462ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * Test that getApfCapabilities is hooked up to the HAL correctly
463ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
464ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call before the vendor HAL is started should return a non-null result with version 0
465ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     *
466ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     * A call after the HAL is started should return the mocked values.
467ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
468ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
469ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testApfCapabilities() throws Exception {
470ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myVersion = 33;
471ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        int myMaxSize = 1234;
472ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
473ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        StaApfPacketFilterCapabilities capabilities = new StaApfPacketFilterCapabilities();
474ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.version = myVersion;
475ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        capabilities.maxLength = myMaxSize;
476ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
477ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        doAnswer(new AnswerWithArguments() {
478ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            public void answer(IWifiStaIface.getApfPacketFilterCapabilitiesCallback cb)
479ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                    throws RemoteException {
480ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                cb.onValues(mWifiStatusSuccess, capabilities);
481ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass            }
482ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        }).when(mIWifiStaIface).getApfPacketFilterCapabilities(any(
483ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                IWifiStaIface.getApfPacketFilterCapabilitiesCallback.class));
484ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
485ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
486ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(0, mWifiVendorHal.getApfCapabilities().apfVersionSupported);
487ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
488ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
489ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
490ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        ApfCapabilities actual = mWifiVendorHal.getApfCapabilities();
491ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
492ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myVersion, actual.apfVersionSupported);
493ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(myMaxSize, actual.maximumApfProgramSize);
494ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertEquals(android.system.OsConstants.ARPHRD_ETHER, actual.apfPacketFormat);
495ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertNotEquals(0, actual.apfPacketFormat);
496ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
497ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
498ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    /**
49970b995bed9674a30c56b7ae2585d5897900ff695Michael Plass     * Test that an APF program can be installed.
500ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass     */
501ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    @Test
502ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    public void testInstallApf() throws Exception {
503ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        byte[] filter = new byte[] {19, 53, 10};
504ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
505ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        ArrayList<Byte> expected = new ArrayList<>(3);
506ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        for (byte b : filter) expected.add(b);
507ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
508ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        when(mIWifiStaIface.installApfPacketFilter(anyInt(), any(ArrayList.class)))
509ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass                .thenReturn(mWifiStatusSuccess);
510ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
511ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
512ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        assertTrue(mWifiVendorHal.installPacketFilter(filter));
513ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass
514ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass        verify(mIWifiStaIface).installApfPacketFilter(eq(0), eq(expected));
515ccac1c69ee6559b567e34b9b19e368efaa600174Michael Plass    }
516f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
517f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    /**
518f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     * Test that the country code is set in AP mode (when it should be).
519f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass     */
520f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    @Test
521f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    public void testSetCountryCodeHal() throws Exception {
522f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        byte[] expected = new byte[]{(byte) 'C', (byte) 'A'};
523f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
524f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        when(mIWifiApIface.setCountryCode(any()))
525f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass                .thenReturn(mWifiStatusSuccess);
526f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
527f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
528f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
529f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal(null));
530f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal(""));
531f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal("A"));
532f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertTrue(mWifiVendorHal.setCountryCodeHal("CA")); // Only one expected to succeed
533f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        assertFalse(mWifiVendorHal.setCountryCodeHal("ZZZ"));
534f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass
535f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass        verify(mIWifiApIface).setCountryCode(eq(expected));
536f1423f0bc5fbda5062adb0bd465b999799571f53Michael Plass    }
53753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
53853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
53953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that startLoggingToDebugRingBuffer is plumbed to chip
54053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
54153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * A call before the vendor hal is started should just return false.
54253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * After starting in STA mode, the call should succeed, and pass ther right things down.
54353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
54453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
54553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBuffer() throws Exception {
54653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
54753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
54853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
54953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
55053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
55153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
55253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
55353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
55453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
55553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
55653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
55753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
55853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Same test as testStartLoggingRingBuffer, but in AP mode rather than STA.
55953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
56053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
56153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testStartLoggingRingBufferOnAp() throws Exception {
56253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.startLoggingToDebugRingBuffer(
56353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                any(String.class), anyInt(), anyInt(), anyInt()
56453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        )).thenReturn(mWifiStatusSuccess);
56553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
56653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 0, 0, "One"));
56753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalAp());
56853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startLoggingRingBuffer(1, 0x42, 11, 3000, "One"));
56953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
57053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).startLoggingToDebugRingBuffer("One", 1, 11, 3000);
57153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
57253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
57353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
57453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferStatus gets and translates its stuff correctly
57553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
57653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
57753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testRingBufferStatus() throws Exception {
57853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus one = new WifiDebugRingBufferStatus();
57953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringName = "One";
58053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.flags = WifiDebugRingBufferFlags.HAS_BINARY_ENTRIES;
58153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.ringId = 5607371;
58253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.sizeInBytes = 54321;
58353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.freeSizeInBytes = 42;
58453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        one.verboseLevel = WifiDebugRingBufferVerboseLevel.VERBOSE;
58553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        String oneExpect = "name: One flag: 1 ringBufferId: 5607371 ringBufferByteSize: 54321"
58653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                + " verboseLevel: 2 writtenBytes: 0 readBytes: 0 writtenRecords: 0";
58753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
58853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiDebugRingBufferStatus two = new WifiDebugRingBufferStatus();
58953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringName = "Two";
59053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.flags = WifiDebugRingBufferFlags.HAS_ASCII_ENTRIES
59153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                | WifiDebugRingBufferFlags.HAS_PER_PACKET_ENTRIES;
59253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.ringId = 4512470;
59353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.sizeInBytes = 300;
59453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.freeSizeInBytes = 42;
59553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        two.verboseLevel = WifiDebugRingBufferVerboseLevel.DEFAULT;
59653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
59753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        ArrayList<WifiDebugRingBufferStatus> halBufferStatus = new ArrayList<>(2);
59853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(one);
59953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        halBufferStatus.add(two);
60053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
60153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        WifiNative.RingBufferStatus[] actual;
60253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
60353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        doAnswer(new AnswerWithArguments() {
60453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            public void answer(IWifiChip.getDebugRingBuffersStatusCallback cb)
60553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                    throws RemoteException {
60653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                cb.onValues(mWifiStatusSuccess, halBufferStatus);
60753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass            }
60853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        }).when(mIWifiChip).getDebugRingBuffersStatus(any(
60953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass                IWifiChip.getDebugRingBuffersStatusCallback.class));
61053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
61153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
61253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        actual = mWifiVendorHal.getRingBufferStatus();
61353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
61453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(halBufferStatus.size(), actual.length);
61553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(oneExpect, actual[0].toString());
61653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertEquals(two.ringId, actual[1].ringBufferId);
61753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
61853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
61953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
62053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    /**
62153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Test that getRingBufferData calls forceDumpToDebugRingBuffer
62253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     *
62353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     * Try once before hal start, and twice after (one success, one failure).
62453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass     */
62553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    @Test
62653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    public void testForceRingBufferDump() throws Exception {
62753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Gunk"))).thenReturn(mWifiStatusSuccess);
62853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        when(mIWifiChip.forceDumpToDebugRingBuffer(eq("Glop"))).thenReturn(mWifiStatusFailure);
62953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
63053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Gunk")); // hal not started
63153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
63253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.startVendorHalSta());
63353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
63453f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertTrue(mWifiVendorHal.getRingBufferData("Gunk")); // mocked call succeeds
63553f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        assertFalse(mWifiVendorHal.getRingBufferData("Glop")); // mocked call fails
63653f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
63753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Gunk");
63853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        verify(mIWifiChip).forceDumpToDebugRingBuffer("Glop");
63953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass    }
64053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
641b4659e143a1a0b27e4f4ca82e8428863b8c41324Michael Plass}
642