Home | History | Annotate | Download | only in wifi
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package com.android.server.wifi;
     18 
     19 import static org.junit.Assert.assertArrayEquals;
     20 import static org.junit.Assert.assertEquals;
     21 import static org.junit.Assert.assertFalse;
     22 import static org.junit.Assert.assertTrue;
     23 import static org.mockito.Mockito.anyBoolean;
     24 import static org.mockito.Mockito.eq;
     25 import static org.mockito.Mockito.mock;
     26 import static org.mockito.Mockito.never;
     27 import static org.mockito.Mockito.verify;
     28 import static org.mockito.Mockito.when;
     29 
     30 import android.net.wifi.IApInterface;
     31 import android.net.wifi.IClientInterface;
     32 import android.net.wifi.WifiConfiguration;
     33 import android.test.suitebuilder.annotation.SmallTest;
     34 
     35 import org.junit.Before;
     36 import org.junit.Test;
     37 import org.mockito.Mock;
     38 import org.mockito.MockitoAnnotations;
     39 
     40 import java.util.HashSet;
     41 import java.util.Set;
     42 import java.util.regex.Pattern;
     43 
     44 /**
     45  * Unit tests for {@link com.android.server.wifi.WifiNative}.
     46  */
     47 @SmallTest
     48 public class WifiNativeTest {
     49     private static final long FATE_REPORT_DRIVER_TIMESTAMP_USEC = 12345;
     50     private static final byte[] FATE_REPORT_FRAME_BYTES = new byte[] {
     51             'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 0, 1, 2, 3, 4, 5, 6, 7};
     52     private static final WifiNative.TxFateReport TX_FATE_REPORT = new WifiNative.TxFateReport(
     53             WifiLoggerHal.TX_PKT_FATE_SENT,
     54             FATE_REPORT_DRIVER_TIMESTAMP_USEC,
     55             WifiLoggerHal.FRAME_TYPE_ETHERNET_II,
     56             FATE_REPORT_FRAME_BYTES
     57     );
     58     private static final WifiNative.RxFateReport RX_FATE_REPORT = new WifiNative.RxFateReport(
     59             WifiLoggerHal.RX_PKT_FATE_FW_DROP_INVALID,
     60             FATE_REPORT_DRIVER_TIMESTAMP_USEC,
     61             WifiLoggerHal.FRAME_TYPE_ETHERNET_II,
     62             FATE_REPORT_FRAME_BYTES
     63     );
     64     private static final FrameTypeMapping[] FRAME_TYPE_MAPPINGS = new FrameTypeMapping[] {
     65             new FrameTypeMapping(WifiLoggerHal.FRAME_TYPE_UNKNOWN, "unknown", "N/A"),
     66             new FrameTypeMapping(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, "data", "Ethernet"),
     67             new FrameTypeMapping(WifiLoggerHal.FRAME_TYPE_80211_MGMT, "802.11 management",
     68                     "802.11 Mgmt"),
     69             new FrameTypeMapping((byte) 42, "42", "N/A")
     70     };
     71     private static final FateMapping[] TX_FATE_MAPPINGS = new FateMapping[] {
     72             new FateMapping(WifiLoggerHal.TX_PKT_FATE_ACKED, "acked"),
     73             new FateMapping(WifiLoggerHal.TX_PKT_FATE_SENT, "sent"),
     74             new FateMapping(WifiLoggerHal.TX_PKT_FATE_FW_QUEUED, "firmware queued"),
     75             new FateMapping(WifiLoggerHal.TX_PKT_FATE_FW_DROP_INVALID,
     76                     "firmware dropped (invalid frame)"),
     77             new FateMapping(
     78                     WifiLoggerHal.TX_PKT_FATE_FW_DROP_NOBUFS,  "firmware dropped (no bufs)"),
     79             new FateMapping(
     80                     WifiLoggerHal.TX_PKT_FATE_FW_DROP_OTHER, "firmware dropped (other)"),
     81             new FateMapping(WifiLoggerHal.TX_PKT_FATE_DRV_QUEUED, "driver queued"),
     82             new FateMapping(WifiLoggerHal.TX_PKT_FATE_DRV_DROP_INVALID,
     83                     "driver dropped (invalid frame)"),
     84             new FateMapping(WifiLoggerHal.TX_PKT_FATE_DRV_DROP_NOBUFS,
     85                     "driver dropped (no bufs)"),
     86             new FateMapping(WifiLoggerHal.TX_PKT_FATE_DRV_DROP_OTHER, "driver dropped (other)"),
     87             new FateMapping((byte) 42, "42")
     88     };
     89     private static final FateMapping[] RX_FATE_MAPPINGS = new FateMapping[] {
     90             new FateMapping(WifiLoggerHal.RX_PKT_FATE_SUCCESS, "success"),
     91             new FateMapping(WifiLoggerHal.RX_PKT_FATE_FW_QUEUED, "firmware queued"),
     92             new FateMapping(
     93                     WifiLoggerHal.RX_PKT_FATE_FW_DROP_FILTER, "firmware dropped (filter)"),
     94             new FateMapping(WifiLoggerHal.RX_PKT_FATE_FW_DROP_INVALID,
     95                     "firmware dropped (invalid frame)"),
     96             new FateMapping(
     97                     WifiLoggerHal.RX_PKT_FATE_FW_DROP_NOBUFS, "firmware dropped (no bufs)"),
     98             new FateMapping(
     99                     WifiLoggerHal.RX_PKT_FATE_FW_DROP_OTHER, "firmware dropped (other)"),
    100             new FateMapping(WifiLoggerHal.RX_PKT_FATE_DRV_QUEUED, "driver queued"),
    101             new FateMapping(
    102                     WifiLoggerHal.RX_PKT_FATE_DRV_DROP_FILTER, "driver dropped (filter)"),
    103             new FateMapping(WifiLoggerHal.RX_PKT_FATE_DRV_DROP_INVALID,
    104                     "driver dropped (invalid frame)"),
    105             new FateMapping(
    106                     WifiLoggerHal.RX_PKT_FATE_DRV_DROP_NOBUFS, "driver dropped (no bufs)"),
    107             new FateMapping(WifiLoggerHal.RX_PKT_FATE_DRV_DROP_OTHER, "driver dropped (other)"),
    108             new FateMapping((byte) 42, "42")
    109     };
    110     private static final WifiNative.SignalPollResult SIGNAL_POLL_RESULT =
    111             new WifiNative.SignalPollResult() {{
    112                 currentRssi = -60;
    113                 txBitrate = 12;
    114                 associationFrequency = 5240;
    115             }};
    116     private static final WifiNative.TxPacketCounters PACKET_COUNTERS_RESULT =
    117             new WifiNative.TxPacketCounters() {{
    118                 txSucceeded = 2000;
    119                 txFailed = 120;
    120             }};
    121 
    122     private static final Set<Integer> SCAN_FREQ_SET =
    123             new HashSet<Integer>() {{
    124                 add(2410);
    125                 add(2450);
    126                 add(5050);
    127                 add(5200);
    128             }};
    129     private static final String TEST_QUOTED_SSID_1 = "\"testSsid1\"";
    130     private static final String TEST_QUOTED_SSID_2 = "\"testSsid2\"";
    131     private static final Set<String> SCAN_HIDDEN_NETWORK_SSID_SET =
    132             new HashSet<String>() {{
    133                 add(TEST_QUOTED_SSID_1);
    134                 add(TEST_QUOTED_SSID_2);
    135             }};
    136 
    137     private static final WifiNative.PnoSettings TEST_PNO_SETTINGS =
    138             new WifiNative.PnoSettings() {{
    139                 isConnected = false;
    140                 periodInMs = 6000;
    141                 networkList = new WifiNative.PnoNetwork[2];
    142                 networkList[0] = new WifiNative.PnoNetwork();
    143                 networkList[1] = new WifiNative.PnoNetwork();
    144                 networkList[0].ssid = TEST_QUOTED_SSID_1;
    145                 networkList[1].ssid = TEST_QUOTED_SSID_2;
    146             }};
    147 
    148     @Mock private WifiVendorHal mWifiVendorHal;
    149     @Mock private WificondControl mWificondControl;
    150     @Mock private SupplicantStaIfaceHal mStaIfaceHal;
    151     private WifiNative mWifiNative;
    152 
    153     @Before
    154     public void setUp() throws Exception {
    155         MockitoAnnotations.initMocks(this);
    156         when(mWifiVendorHal.isVendorHalSupported()).thenReturn(true);
    157         when(mWifiVendorHal.startVendorHal(anyBoolean())).thenReturn(true);
    158         mWifiNative = new WifiNative("test0", mWifiVendorHal, mStaIfaceHal, mWificondControl);
    159     }
    160 
    161     /**
    162      * Verifies that TxFateReport's constructor sets all of the TxFateReport fields.
    163      */
    164     @Test
    165     public void testTxFateReportCtorSetsFields() {
    166         WifiNative.TxFateReport fateReport = new WifiNative.TxFateReport(
    167                 WifiLoggerHal.TX_PKT_FATE_SENT,  // non-zero value
    168                 FATE_REPORT_DRIVER_TIMESTAMP_USEC,
    169                 WifiLoggerHal.FRAME_TYPE_ETHERNET_II,  // non-zero value
    170                 FATE_REPORT_FRAME_BYTES
    171         );
    172         assertEquals(WifiLoggerHal.TX_PKT_FATE_SENT, fateReport.mFate);
    173         assertEquals(FATE_REPORT_DRIVER_TIMESTAMP_USEC, fateReport.mDriverTimestampUSec);
    174         assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, fateReport.mFrameType);
    175         assertArrayEquals(FATE_REPORT_FRAME_BYTES, fateReport.mFrameBytes);
    176     }
    177 
    178     /**
    179      * Verifies that RxFateReport's constructor sets all of the RxFateReport fields.
    180      */
    181     @Test
    182     public void testRxFateReportCtorSetsFields() {
    183         WifiNative.RxFateReport fateReport = new WifiNative.RxFateReport(
    184                 WifiLoggerHal.RX_PKT_FATE_FW_DROP_INVALID,  // non-zero value
    185                 FATE_REPORT_DRIVER_TIMESTAMP_USEC,
    186                 WifiLoggerHal.FRAME_TYPE_ETHERNET_II,  // non-zero value
    187                 FATE_REPORT_FRAME_BYTES
    188         );
    189         assertEquals(WifiLoggerHal.RX_PKT_FATE_FW_DROP_INVALID, fateReport.mFate);
    190         assertEquals(FATE_REPORT_DRIVER_TIMESTAMP_USEC, fateReport.mDriverTimestampUSec);
    191         assertEquals(WifiLoggerHal.FRAME_TYPE_ETHERNET_II, fateReport.mFrameType);
    192         assertArrayEquals(FATE_REPORT_FRAME_BYTES, fateReport.mFrameBytes);
    193     }
    194 
    195     /**
    196      * Verifies the hashCode methods for HiddenNetwork and PnoNetwork classes
    197      */
    198     @Test
    199     public void testHashCode() {
    200         WifiNative.HiddenNetwork hiddenNet1 = new WifiNative.HiddenNetwork();
    201         hiddenNet1.ssid = new String("sametext");
    202 
    203         WifiNative.HiddenNetwork hiddenNet2 = new WifiNative.HiddenNetwork();
    204         hiddenNet2.ssid = new String("sametext");
    205 
    206         assertTrue(hiddenNet1.equals(hiddenNet2));
    207         assertEquals(hiddenNet1.hashCode(), hiddenNet2.hashCode());
    208 
    209         WifiNative.PnoNetwork pnoNet1 = new WifiNative.PnoNetwork();
    210         pnoNet1.ssid = new String("sametext");
    211         pnoNet1.flags = 2;
    212         pnoNet1.auth_bit_field = 4;
    213 
    214         WifiNative.PnoNetwork pnoNet2 = new WifiNative.PnoNetwork();
    215         pnoNet2.ssid = new String("sametext");
    216         pnoNet2.flags = 2;
    217         pnoNet2.auth_bit_field = 4;
    218 
    219         assertTrue(pnoNet1.equals(pnoNet2));
    220         assertEquals(pnoNet1.hashCode(), pnoNet2.hashCode());
    221     }
    222 
    223     // Support classes for test{Tx,Rx}FateReportToString.
    224     private static class FrameTypeMapping {
    225         byte mTypeNumber;
    226         String mExpectedTypeText;
    227         String mExpectedProtocolText;
    228         FrameTypeMapping(byte typeNumber, String expectedTypeText, String expectedProtocolText) {
    229             this.mTypeNumber = typeNumber;
    230             this.mExpectedTypeText = expectedTypeText;
    231             this.mExpectedProtocolText = expectedProtocolText;
    232         }
    233     }
    234     private static class FateMapping {
    235         byte mFateNumber;
    236         String mExpectedText;
    237         FateMapping(byte fateNumber, String expectedText) {
    238             this.mFateNumber = fateNumber;
    239             this.mExpectedText = expectedText;
    240         }
    241     }
    242 
    243     /**
    244      * Verifies that FateReport.getTableHeader() prints the right header.
    245      */
    246     @Test
    247     public void testFateReportTableHeader() {
    248         final String header = WifiNative.FateReport.getTableHeader();
    249         assertEquals(
    250                 "\nTime usec        Walltime      Direction  Fate                              "
    251                 + "Protocol      Type                     Result\n"
    252                 + "---------        --------      ---------  ----                              "
    253                 + "--------      ----                     ------\n", header);
    254     }
    255 
    256     /**
    257      * Verifies that TxFateReport.toTableRowString() includes the information we care about.
    258      */
    259     @Test
    260     public void testTxFateReportToTableRowString() {
    261         WifiNative.TxFateReport fateReport = TX_FATE_REPORT;
    262         assertTrue(
    263                 fateReport.toTableRowString().replaceAll("\\s+", " ").trim().matches(
    264                     FATE_REPORT_DRIVER_TIMESTAMP_USEC + " "  // timestamp
    265                             + "\\d{2}:\\d{2}:\\d{2}\\.\\d{3} "  // walltime
    266                             + "TX "  // direction
    267                             + "sent "  // fate
    268                             + "Ethernet "  // type
    269                             + "N/A "  // protocol
    270                             + "N/A"  // result
    271                 )
    272         );
    273 
    274         for (FrameTypeMapping frameTypeMapping : FRAME_TYPE_MAPPINGS) {
    275             fateReport = new WifiNative.TxFateReport(
    276                     WifiLoggerHal.TX_PKT_FATE_SENT,
    277                     FATE_REPORT_DRIVER_TIMESTAMP_USEC,
    278                     frameTypeMapping.mTypeNumber,
    279                     FATE_REPORT_FRAME_BYTES
    280             );
    281             assertTrue(
    282                     fateReport.toTableRowString().replaceAll("\\s+", " ").trim().matches(
    283                             FATE_REPORT_DRIVER_TIMESTAMP_USEC + " "  // timestamp
    284                                     + "\\d{2}:\\d{2}:\\d{2}\\.\\d{3} "  // walltime
    285                                     + "TX "  // direction
    286                                     + "sent "  // fate
    287                                     + frameTypeMapping.mExpectedProtocolText + " "  // type
    288                                     + "N/A "  // protocol
    289                                     + "N/A"  // result
    290                     )
    291             );
    292         }
    293 
    294         for (FateMapping fateMapping : TX_FATE_MAPPINGS) {
    295             fateReport = new WifiNative.TxFateReport(
    296                     fateMapping.mFateNumber,
    297                     FATE_REPORT_DRIVER_TIMESTAMP_USEC,
    298                     WifiLoggerHal.FRAME_TYPE_80211_MGMT,
    299                     FATE_REPORT_FRAME_BYTES
    300             );
    301             assertTrue(
    302                     fateReport.toTableRowString().replaceAll("\\s+", " ").trim().matches(
    303                             FATE_REPORT_DRIVER_TIMESTAMP_USEC + " "  // timestamp
    304                                     + "\\d{2}:\\d{2}:\\d{2}\\.\\d{3} "  // walltime
    305                                     + "TX "  // direction
    306                                     + Pattern.quote(fateMapping.mExpectedText) + " "  // fate
    307                                     + "802.11 Mgmt "  // type
    308                                     + "N/A "  // protocol
    309                                     + "N/A"  // result
    310                     )
    311             );
    312         }
    313     }
    314 
    315     /**
    316      * Verifies that TxFateReport.toVerboseStringWithPiiAllowed() includes the information we care
    317      * about.
    318      */
    319     @Test
    320     public void testTxFateReportToVerboseStringWithPiiAllowed() {
    321         WifiNative.TxFateReport fateReport = TX_FATE_REPORT;
    322 
    323         String verboseFateString = fateReport.toVerboseStringWithPiiAllowed();
    324         assertTrue(verboseFateString.contains("Frame direction: TX"));
    325         assertTrue(verboseFateString.contains("Frame timestamp: 12345"));
    326         assertTrue(verboseFateString.contains("Frame fate: sent"));
    327         assertTrue(verboseFateString.contains("Frame type: data"));
    328         assertTrue(verboseFateString.contains("Frame protocol: Ethernet"));
    329         assertTrue(verboseFateString.contains("Frame protocol type: N/A"));
    330         assertTrue(verboseFateString.contains("Frame length: 16"));
    331         assertTrue(verboseFateString.contains(
    332                 "61 62 63 64 65 66 67 68 00 01 02 03 04 05 06 07")); // hex dump
    333         // TODO(quiche): uncomment this, once b/27975149 is fixed.
    334         // assertTrue(verboseFateString.contains("abcdefgh........"));  // hex dump
    335 
    336         for (FrameTypeMapping frameTypeMapping : FRAME_TYPE_MAPPINGS) {
    337             fateReport = new WifiNative.TxFateReport(
    338                     WifiLoggerHal.TX_PKT_FATE_SENT,
    339                     FATE_REPORT_DRIVER_TIMESTAMP_USEC,
    340                     frameTypeMapping.mTypeNumber,
    341                     FATE_REPORT_FRAME_BYTES
    342             );
    343             verboseFateString = fateReport.toVerboseStringWithPiiAllowed();
    344             assertTrue(verboseFateString.contains("Frame type: "
    345                     + frameTypeMapping.mExpectedTypeText));
    346         }
    347 
    348         for (FateMapping fateMapping : TX_FATE_MAPPINGS) {
    349             fateReport = new WifiNative.TxFateReport(
    350                     fateMapping.mFateNumber,
    351                     FATE_REPORT_DRIVER_TIMESTAMP_USEC,
    352                     WifiLoggerHal.FRAME_TYPE_80211_MGMT,
    353                     FATE_REPORT_FRAME_BYTES
    354             );
    355             verboseFateString = fateReport.toVerboseStringWithPiiAllowed();
    356             assertTrue(verboseFateString.contains("Frame fate: " + fateMapping.mExpectedText));
    357         }
    358     }
    359 
    360     /**
    361      * Verifies that RxFateReport.toTableRowString() includes the information we care about.
    362      */
    363     @Test
    364     public void testRxFateReportToTableRowString() {
    365         WifiNative.RxFateReport fateReport = RX_FATE_REPORT;
    366         assertTrue(
    367                 fateReport.toTableRowString().replaceAll("\\s+", " ").trim().matches(
    368                         FATE_REPORT_DRIVER_TIMESTAMP_USEC + " "  // timestamp
    369                                 + "\\d{2}:\\d{2}:\\d{2}\\.\\d{3} "  // walltime
    370                                 + "RX "  // direction
    371                                 + Pattern.quote("firmware dropped (invalid frame) ")  // fate
    372                                 + "Ethernet "  // type
    373                                 + "N/A "  // protocol
    374                                 + "N/A"  // result
    375                 )
    376         );
    377 
    378         // FrameTypeMappings omitted, as they're the same as for TX.
    379 
    380         for (FateMapping fateMapping : RX_FATE_MAPPINGS) {
    381             fateReport = new WifiNative.RxFateReport(
    382                     fateMapping.mFateNumber,
    383                     FATE_REPORT_DRIVER_TIMESTAMP_USEC,
    384                     WifiLoggerHal.FRAME_TYPE_80211_MGMT,
    385                     FATE_REPORT_FRAME_BYTES
    386             );
    387             assertTrue(
    388                     fateReport.toTableRowString().replaceAll("\\s+", " ").trim().matches(
    389                             FATE_REPORT_DRIVER_TIMESTAMP_USEC + " "  // timestamp
    390                                     + "\\d{2}:\\d{2}:\\d{2}\\.\\d{3} "  // walltime
    391                                     + "RX "  // direction
    392                                     + Pattern.quote(fateMapping.mExpectedText) + " " // fate
    393                                     + "802.11 Mgmt "  // type
    394                                     + "N/A " // protocol
    395                                     + "N/A"  // result
    396                     )
    397             );
    398         }
    399     }
    400 
    401     /**
    402      * Verifies that RxFateReport.toVerboseStringWithPiiAllowed() includes the information we care
    403      * about.
    404      */
    405     @Test
    406     public void testRxFateReportToVerboseStringWithPiiAllowed() {
    407         WifiNative.RxFateReport fateReport = RX_FATE_REPORT;
    408 
    409         String verboseFateString = fateReport.toVerboseStringWithPiiAllowed();
    410         assertTrue(verboseFateString.contains("Frame direction: RX"));
    411         assertTrue(verboseFateString.contains("Frame timestamp: 12345"));
    412         assertTrue(verboseFateString.contains("Frame fate: firmware dropped (invalid frame)"));
    413         assertTrue(verboseFateString.contains("Frame type: data"));
    414         assertTrue(verboseFateString.contains("Frame protocol: Ethernet"));
    415         assertTrue(verboseFateString.contains("Frame protocol type: N/A"));
    416         assertTrue(verboseFateString.contains("Frame length: 16"));
    417         assertTrue(verboseFateString.contains(
    418                 "61 62 63 64 65 66 67 68 00 01 02 03 04 05 06 07")); // hex dump
    419         // TODO(quiche): uncomment this, once b/27975149 is fixed.
    420         // assertTrue(verboseFateString.contains("abcdefgh........"));  // hex dump
    421 
    422         // FrameTypeMappings omitted, as they're the same as for TX.
    423 
    424         for (FateMapping fateMapping : RX_FATE_MAPPINGS) {
    425             fateReport = new WifiNative.RxFateReport(
    426                     fateMapping.mFateNumber,
    427                     FATE_REPORT_DRIVER_TIMESTAMP_USEC,
    428                     WifiLoggerHal.FRAME_TYPE_80211_MGMT,
    429                     FATE_REPORT_FRAME_BYTES
    430             );
    431             verboseFateString = fateReport.toVerboseStringWithPiiAllowed();
    432             assertTrue(verboseFateString.contains("Frame fate: " + fateMapping.mExpectedText));
    433         }
    434     }
    435 
    436     /**
    437      * Verifies that startPktFateMonitoring returns false when HAL is not started.
    438      */
    439     @Test
    440     public void testStartPktFateMonitoringReturnsFalseWhenHalIsNotStarted() {
    441         assertFalse(mWifiNative.isHalStarted());
    442         assertFalse(mWifiNative.startPktFateMonitoring());
    443     }
    444 
    445     /**
    446      * Verifies that getTxPktFates returns error when HAL is not started.
    447      */
    448     @Test
    449     public void testGetTxPktFatesReturnsErrorWhenHalIsNotStarted() {
    450         WifiNative.TxFateReport[] fateReports = null;
    451         assertFalse(mWifiNative.isHalStarted());
    452         assertFalse(mWifiNative.getTxPktFates(fateReports));
    453     }
    454 
    455     /**
    456      * Verifies that getRxPktFates returns error when HAL is not started.
    457      */
    458     @Test
    459     public void testGetRxPktFatesReturnsErrorWhenHalIsNotStarted() {
    460         WifiNative.RxFateReport[] fateReports = null;
    461         assertFalse(mWifiNative.isHalStarted());
    462         assertFalse(mWifiNative.getRxPktFates(fateReports));
    463     }
    464 
    465     // TODO(quiche): Add tests for the success cases (when HAL has been started). Specifically:
    466     // - testStartPktFateMonitoringCallsHalIfHalIsStarted()
    467     // - testGetTxPktFatesCallsHalIfHalIsStarted()
    468     // - testGetRxPktFatesCallsHalIfHalIsStarted()
    469     //
    470     // Adding these tests is difficult to do at the moment, because we can't mock out the HAL
    471     // itself. Also, we can't mock out the native methods, because those methods are private.
    472     // b/28005116.
    473 
    474     /** Verifies that getDriverStateDumpNative returns null when HAL is not started. */
    475     @Test
    476     public void testGetDriverStateDumpReturnsNullWhenHalIsNotStarted() {
    477         assertEquals(null, mWifiNative.getDriverStateDump());
    478     }
    479 
    480     // TODO(b/28005116): Add test for the success case of getDriverStateDump().
    481 
    482     /**
    483      * Verifies that setupDriverForClientMode() calls underlying WificondControl.
    484      */
    485     @Test
    486     public void testSetupDriverForClientMode() {
    487         IClientInterface clientInterface = mock(IClientInterface.class);
    488         when(mWificondControl.setupDriverForClientMode()).thenReturn(clientInterface);
    489 
    490         IClientInterface returnedClientInterface = mWifiNative.setupForClientMode();
    491         assertEquals(clientInterface, returnedClientInterface);
    492         verify(mWifiVendorHal).startVendorHal(eq(true));
    493         verify(mWificondControl).setupDriverForClientMode();
    494     }
    495 
    496     /**
    497      * Verifies that setupDriverForClientMode() does not call start vendor HAL when it is not
    498      * supported and calls underlying WificondControl setup.
    499      */
    500     @Test
    501     public void testSetupDriverForClientModeWithNoVendorHal() {
    502         when(mWifiVendorHal.isVendorHalSupported()).thenReturn(false);
    503         IClientInterface clientInterface = mock(IClientInterface.class);
    504         when(mWificondControl.setupDriverForClientMode()).thenReturn(clientInterface);
    505 
    506         IClientInterface returnedClientInterface = mWifiNative.setupForClientMode();
    507         assertEquals(clientInterface, returnedClientInterface);
    508         verify(mWifiVendorHal, never()).startVendorHal(anyBoolean());
    509         verify(mWificondControl).setupDriverForClientMode();
    510     }
    511 
    512     /**
    513      * Verifies that setupDriverForClientMode() returns null when underlying WificondControl
    514      * call fails.
    515      */
    516     @Test
    517     public void testSetupDriverForClientModeWificondError() {
    518         when(mWificondControl.setupDriverForClientMode()).thenReturn(null);
    519 
    520         IClientInterface returnedClientInterface = mWifiNative.setupForClientMode();
    521         assertEquals(null, returnedClientInterface);
    522         verify(mWifiVendorHal).startVendorHal(eq(true));
    523         verify(mWificondControl).setupDriverForClientMode();
    524     }
    525 
    526     /**
    527      * Verifies that setupDriverForClientMode() returns null when underlying Hal call fails.
    528      */
    529     @Test
    530     public void testSetupDriverForClientModeHalError() {
    531         when(mWifiVendorHal.startVendorHal(anyBoolean())).thenReturn(false);
    532 
    533         IClientInterface returnedClientInterface = mWifiNative.setupForClientMode();
    534         assertEquals(null, returnedClientInterface);
    535         verify(mWifiVendorHal).startVendorHal(eq(true));
    536         verify(mWificondControl, never()).setupDriverForClientMode();
    537     }
    538 
    539     /**
    540      * Verifies that setupDriverForSoftApMode() calls underlying WificondControl.
    541      */
    542     @Test
    543     public void testSetupDriverForSoftApMode() {
    544         IApInterface apInterface = mock(IApInterface.class);
    545         when(mWificondControl.setupDriverForSoftApMode()).thenReturn(apInterface);
    546 
    547         IApInterface returnedApInterface = mWifiNative.setupForSoftApMode();
    548         assertEquals(apInterface, returnedApInterface);
    549         verify(mWifiVendorHal).startVendorHal(eq(false));
    550         verify(mWificondControl).setupDriverForSoftApMode();
    551     }
    552 
    553     /**
    554      * Verifies that setupDriverForClientMode() does not call start vendor HAL when it is not
    555      * supported and calls underlying WificondControl setup.
    556      */
    557     @Test
    558     public void testSetupDriverForSoftApModeWithNoVendorHal() {
    559         when(mWifiVendorHal.isVendorHalSupported()).thenReturn(false);
    560         IApInterface apInterface = mock(IApInterface.class);
    561         when(mWificondControl.setupDriverForSoftApMode()).thenReturn(apInterface);
    562 
    563         IApInterface returnedApInterface = mWifiNative.setupForSoftApMode();
    564         assertEquals(apInterface, returnedApInterface);
    565         verify(mWifiVendorHal, never()).startVendorHal(anyBoolean());
    566         verify(mWificondControl).setupDriverForSoftApMode();
    567     }
    568 
    569     /**
    570      * Verifies that setupDriverForSoftApMode() returns null when underlying WificondControl
    571      * call fails.
    572      */
    573     @Test
    574     public void testSetupDriverForSoftApModeWificondError() {
    575         when(mWificondControl.setupDriverForSoftApMode()).thenReturn(null);
    576         IApInterface returnedApInterface = mWifiNative.setupForSoftApMode();
    577 
    578         assertEquals(null, returnedApInterface);
    579         verify(mWifiVendorHal).startVendorHal(eq(false));
    580         verify(mWificondControl).setupDriverForSoftApMode();
    581     }
    582 
    583     /**
    584      * Verifies that setupDriverForSoftApMode() returns null when underlying Hal call fails.
    585      */
    586     @Test
    587     public void testSetupDriverForSoftApModeHalError() {
    588         when(mWifiVendorHal.startVendorHal(anyBoolean())).thenReturn(false);
    589 
    590         IApInterface returnedApInterface = mWifiNative.setupForSoftApMode();
    591         assertEquals(null, returnedApInterface);
    592         verify(mWifiVendorHal).startVendorHal(eq(false));
    593         verify(mWificondControl, never()).setupDriverForSoftApMode();
    594     }
    595 
    596     /**
    597      * Verifies that enableSupplicant() calls underlying WificondControl.
    598      */
    599     @Test
    600     public void testEnableSupplicant() {
    601         when(mWificondControl.enableSupplicant()).thenReturn(true);
    602 
    603         mWifiNative.enableSupplicant();
    604         verify(mWificondControl).enableSupplicant();
    605     }
    606 
    607     /**
    608      * Verifies that disableSupplicant() calls underlying WificondControl.
    609      */
    610     @Test
    611     public void testDisableSupplicant() {
    612         when(mWificondControl.disableSupplicant()).thenReturn(true);
    613 
    614         mWifiNative.disableSupplicant();
    615         verify(mWificondControl).disableSupplicant();
    616     }
    617 
    618     /**
    619      * Verifies that tearDownInterfaces() calls underlying WificondControl.
    620      */
    621     @Test
    622     public void testTearDown() {
    623         when(mWificondControl.tearDownInterfaces()).thenReturn(true);
    624 
    625         assertTrue(mWifiNative.tearDown());
    626         verify(mWificondControl).tearDownInterfaces();
    627         verify(mWifiVendorHal).stopVendorHal();
    628     }
    629 
    630     /**
    631      * Verifies that signalPoll() calls underlying WificondControl.
    632      */
    633     @Test
    634     public void testSignalPoll() throws Exception {
    635         when(mWificondControl.signalPoll()).thenReturn(SIGNAL_POLL_RESULT);
    636 
    637         assertEquals(SIGNAL_POLL_RESULT, mWifiNative.signalPoll());
    638         verify(mWificondControl).signalPoll();
    639     }
    640 
    641     /**
    642      * Verifies that getTxPacketCounters() calls underlying WificondControl.
    643      */
    644     @Test
    645     public void testGetTxPacketCounters() throws Exception {
    646         when(mWificondControl.getTxPacketCounters()).thenReturn(PACKET_COUNTERS_RESULT);
    647 
    648         assertEquals(PACKET_COUNTERS_RESULT, mWifiNative.getTxPacketCounters());
    649         verify(mWificondControl).getTxPacketCounters();
    650     }
    651 
    652     /**
    653      * Verifies that scan() calls underlying WificondControl.
    654      */
    655     @Test
    656     public void testScan() throws Exception {
    657         mWifiNative.scan(SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_SET);
    658         verify(mWificondControl).scan(SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_SET);
    659     }
    660 
    661     /**
    662      * Verifies that startPnoscan() calls underlying WificondControl.
    663      */
    664     @Test
    665     public void testStartPnoScan() throws Exception {
    666         mWifiNative.startPnoScan(TEST_PNO_SETTINGS);
    667         verify(mWificondControl).startPnoScan(TEST_PNO_SETTINGS);
    668     }
    669 
    670     /**
    671      * Verifies that stopPnoscan() calls underlying WificondControl.
    672      */
    673     @Test
    674     public void testStopPnoScan() throws Exception {
    675         mWifiNative.stopPnoScan();
    676         verify(mWificondControl).stopPnoScan();
    677     }
    678 
    679     /**
    680      * Verifies that connectToNetwork() calls underlying WificondControl and SupplicantStaIfaceHal.
    681      */
    682     @Test
    683     public void testConnectToNetwork() throws Exception {
    684         WifiConfiguration config = mock(WifiConfiguration.class);
    685         mWifiNative.connectToNetwork(config);
    686         // connectToNetwork() should abort ongoing scan before connection.
    687         verify(mWificondControl).abortScan();
    688         verify(mStaIfaceHal).connectToNetwork(config);
    689     }
    690 
    691     /**
    692      * Verifies that roamToNetwork() calls underlying WificondControl and SupplicantStaIfaceHal.
    693      */
    694     @Test
    695     public void testRoamToNetwork() throws Exception {
    696         WifiConfiguration config = mock(WifiConfiguration.class);
    697         mWifiNative.roamToNetwork(config);
    698         // roamToNetwork() should abort ongoing scan before connection.
    699         verify(mWificondControl).abortScan();
    700         verify(mStaIfaceHal).roamToNetwork(config);
    701     }
    702 
    703 }
    704