WiFiMetrics: Count hidden & passpoint networks

1. Extended the WiFiMetrics proto to include counts for hidden and
passpoint networks, counting these for all saved networks, connections
and scan results.
2. Extended the counting of Open, Personal and Enterprise network to
include scans.
3. Extended ConnectionEvent logging to detect and flag passpoint network
connections.
4. Implemented the checks that detect if a scan Result is a hidden network.
While I was here: Cleaned up a couple old WifiMetrics <TODO>s, which we will not be doing.
BUG=28634987

Change-Id: I2e22bf8d79ccbda84ead700272ff0f1b0f13d2e7
Test: Extended unit tests, executed manually
diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java
index 9b856ba..c9c7813 100644
--- a/service/java/com/android/server/wifi/WifiConnectivityManager.java
+++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java
@@ -225,6 +225,7 @@
                 mStateMachine.isSupplicantTransientState(), scanDetails);
         mWifiLastResortWatchdog.updateAvailableNetworks(
                 mQualifiedNetworkSelector.getFilteredScanDetails());
+        mWifiMetrics.countScanResults(scanDetails);
         if (candidate != null) {
             localLog(listenerName + ": QNS candidate-" + candidate.SSID);
             connectToNetwork(candidate);
diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java
index e9d6a5a..83db610 100644
--- a/service/java/com/android/server/wifi/WifiMetrics.java
+++ b/service/java/com/android/server/wifi/WifiMetrics.java
@@ -24,6 +24,7 @@
 
 import com.android.server.wifi.hotspot2.NetworkDetail;
 import com.android.server.wifi.util.InformationElementUtil;
+import com.android.server.wifi.util.ScanResultUtil;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -130,6 +131,8 @@
                         mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
                                 .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
                     }
+                    mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
+                            .passpoint = config.isPasspoint();
                     // If there's a ScanResult candidate associated with this config already, get it and
                     // log (more accurate) metrics from it
                     ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
@@ -476,13 +479,13 @@
                 WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
         mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID;
         if (scanResult.capabilities != null) {
-            if (scanResult.capabilities.contains("WEP")) {
+            if (ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
                 mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
                         WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
-            } else if (scanResult.capabilities.contains("PSK")) {
+            } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)) {
                 mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
                         WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
-            } else if (scanResult.capabilities.contains("EAP")) {
+            } else if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
                 mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
                         WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
             }
@@ -515,6 +518,18 @@
         }
     }
 
+    void setNumHiddenNetworks(int num) {
+        synchronized (mLock) {
+            mWifiLogProto.numHiddenNetworks = num;
+        }
+    }
+
+    void setNumPasspointNetworks(int num) {
+        synchronized (mLock) {
+            mWifiLogProto.numPasspointNetworks = num;
+        }
+    }
+
     void setNumNetworksAddedByUser(int num) {
         synchronized (mLock) {
             mWifiLogProto.numNetworksAddedByUser = num;
@@ -826,6 +841,59 @@
     }
 
     /**
+     * Counts all the different types of networks seen in a set of scan results
+     */
+    public void countScanResults(List<ScanDetail> scanDetails) {
+        if (scanDetails == null) {
+            return;
+        }
+        int totalResults = 0;
+        int openNetworks = 0;
+        int personalNetworks = 0;
+        int enterpriseNetworks = 0;
+        int hiddenNetworks = 0;
+        int hotspot2r1Networks = 0;
+        int hotspot2r2Networks = 0;
+        for (ScanDetail scanDetail : scanDetails) {
+            NetworkDetail networkDetail = scanDetail.getNetworkDetail();
+            ScanResult scanResult = scanDetail.getScanResult();
+            totalResults++;
+            if (networkDetail != null) {
+                if (networkDetail.isHiddenBeaconFrame()) {
+                    hiddenNetworks++;
+                }
+                if (networkDetail.getHSRelease() != null) {
+                    if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
+                        hotspot2r1Networks++;
+                    } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
+                        hotspot2r2Networks++;
+                    }
+                }
+            }
+            if (scanResult != null && scanResult.capabilities != null) {
+                if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
+                    enterpriseNetworks++;
+                } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)
+                        || ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
+                    personalNetworks++;
+                } else {
+                    openNetworks++;
+                }
+            }
+        }
+        synchronized (mLock) {
+            mWifiLogProto.numTotalScanResults += totalResults;
+            mWifiLogProto.numOpenNetworkScanResults += openNetworks;
+            mWifiLogProto.numPersonalNetworkScanResults += personalNetworks;
+            mWifiLogProto.numEnterpriseNetworkScanResults += enterpriseNetworks;
+            mWifiLogProto.numHiddenNetworkScanResults += hiddenNetworks;
+            mWifiLogProto.numHotspot2R1NetworkScanResults += hotspot2r1Networks;
+            mWifiLogProto.numHotspot2R2NetworkScanResults += hotspot2r2Networks;
+            mWifiLogProto.numScans++;
+        }
+    }
+
+    /**
      * Increment count of Watchdog successes.
      */
     public void incrementNumLastResortWatchdogSuccesses() {
@@ -834,6 +902,7 @@
         }
     }
 
+
     public static final String PROTO_DUMP_ARG = "wifiMetricsProto";
     /**
      * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager
@@ -876,6 +945,9 @@
                         + mWifiLogProto.numPersonalNetworks);
                 pw.println("mWifiLogProto.numEnterpriseNetworks="
                         + mWifiLogProto.numEnterpriseNetworks);
+                pw.println("mWifiLogProto.numHiddenNetworks=" + mWifiLogProto.numHiddenNetworks);
+                pw.println("mWifiLogProto.numPasspointNetworks="
+                        + mWifiLogProto.numPasspointNetworks);
                 pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled);
                 pw.println("mWifiLogProto.isScanningAlwaysEnabled="
                         + mWifiLogProto.isScanningAlwaysEnabled);
@@ -975,6 +1047,21 @@
                 } else {
                     pw.println("()");
                 }
+                pw.println("mWifiLogProto.numTotalScanResults="
+                        + mWifiLogProto.numTotalScanResults);
+                pw.println("mWifiLogProto.numOpenNetworkScanResults="
+                        + mWifiLogProto.numOpenNetworkScanResults);
+                pw.println("mWifiLogProto.numPersonalNetworkScanResults="
+                        + mWifiLogProto.numPersonalNetworkScanResults);
+                pw.println("mWifiLogProto.numEnterpriseNetworkScanResults="
+                        + mWifiLogProto.numEnterpriseNetworkScanResults);
+                pw.println("mWifiLogProto.numHiddenNetworkScanResults="
+                        + mWifiLogProto.numHiddenNetworkScanResults);
+                pw.println("mWifiLogProto.numHotspot2R1NetworkScanResults="
+                        + mWifiLogProto.numHotspot2R1NetworkScanResults);
+                pw.println("mWifiLogProto.numHotspot2R2NetworkScanResults="
+                        + mWifiLogProto.numHotspot2R2NetworkScanResults);
+                pw.println("mWifiLogProto.numScans=" + mWifiLogProto.numScans);
             }
         }
     }
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java
index 320fc4a..cfd7a22 100644
--- a/service/java/com/android/server/wifi/WifiStateMachine.java
+++ b/service/java/com/android/server/wifi/WifiStateMachine.java
@@ -7551,6 +7551,8 @@
         int numEnterpriseNetworks = 0;
         int numNetworksAddedByUser = 0;
         int numNetworksAddedByApps = 0;
+        int numHiddenNetworks = 0;
+        int numPasspoint = 0;
         for (WifiConfiguration config : mWifiConfigManager.getSavedNetworks()) {
             if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
                 numOpenNetworks++;
@@ -7564,6 +7566,12 @@
             } else {
                 numNetworksAddedByApps++;
             }
+            if (config.hiddenSSID) {
+                numHiddenNetworks++;
+            }
+            if (config.isPasspoint()) {
+                numPasspoint++;
+            }
         }
         mWifiMetrics.setNumSavedNetworks(numSavedNetworks);
         mWifiMetrics.setNumOpenNetworks(numOpenNetworks);
@@ -7571,17 +7579,8 @@
         mWifiMetrics.setNumEnterpriseNetworks(numEnterpriseNetworks);
         mWifiMetrics.setNumNetworksAddedByUser(numNetworksAddedByUser);
         mWifiMetrics.setNumNetworksAddedByApps(numNetworksAddedByApps);
-
-        /* <TODO> decide how to access WifiServiecImpl.isLocationEnabled() or if to do it manually
-        mWifiMetrics.setIsLocationEnabled(Settings.Secure.getInt(
-                mContext.getContentResolver(),
-                Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF)
-                != Settings.Secure.LOCATION_MODE_OFF);
-                */
-
-        /* <TODO> decide how statemachine will access WifiSettingsStore
-        mWifiMetrics.setIsScanningAlwaysEnabled(mSettingsStore.isScanningAlwaysAvailable());
-         */
+        mWifiMetrics.setNumHiddenNetworks(numHiddenNetworks);
+        mWifiMetrics.setNumPasspointNetworks(numPasspoint);
     }
 
     private static String getLinkPropertiesSummary(LinkProperties lp) {
diff --git a/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java b/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java
index ae7b9bf..69255d7 100644
--- a/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java
+++ b/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java
@@ -56,6 +56,8 @@
     private final String mSSID;
     private final long mHESSID;
     private final long mBSSID;
+    // True if the SSID is potentially from a hidden network
+    private final boolean mIsHiddenSsid;
 
     // BSS Load element:
     private final int mStationCount;
@@ -125,6 +127,7 @@
         mBSSID = Utils.parseMac(bssid);
 
         String ssid = null;
+        boolean isHiddenSsid = false;
         byte[] ssidOctets = null;
 
         InformationElementUtil.BssLoad bssLoad = new InformationElementUtil.BssLoad();
@@ -230,10 +233,18 @@
                     ssid = new String(ssidOctets, StandardCharsets.ISO_8859_1);
                 }
             }
+            isHiddenSsid = true;
+            for (byte byteVal : ssidOctets) {
+                if (byteVal != 0) {
+                    isHiddenSsid = false;
+                    break;
+                }
+            }
         }
 
         mSSID = ssid;
         mHESSID = interworking.hessid;
+        mIsHiddenSsid = isHiddenSsid;
         mStationCount = bssLoad.stationCount;
         mChannelUtilization = bssLoad.channelUtilization;
         mCapacity = bssLoad.capacity;
@@ -260,7 +271,9 @@
         }
 
         // If trafficIndicationMap is not valid, mDtimPeriod will be negative
-        mDtimInterval = trafficIndicationMap.mDtimPeriod;
+        if (trafficIndicationMap.isValid()) {
+            mDtimInterval = trafficIndicationMap.mDtimPeriod;
+        }
 
         int maxRateA = 0;
         int maxRateB = 0;
@@ -310,6 +323,7 @@
 
     private NetworkDetail(NetworkDetail base, Map<Constants.ANQPElementType, ANQPElement> anqpElements) {
         mSSID = base.mSSID;
+        mIsHiddenSsid = base.mIsHiddenSsid;
         mBSSID = base.mBSSID;
         mHESSID = base.mHESSID;
         mStationCount = base.mStationCount;
@@ -497,6 +511,28 @@
         return toMACString(mBSSID);
     }
 
+    /**
+     * Evaluates the ScanResult this NetworkDetail is built from
+     * returns true if built from a Beacon Frame
+     * returns false if built from a Probe Response
+     */
+    public boolean isBeaconFrame() {
+        // Beacon frames have a 'Traffic Indication Map' Information element
+        // Probe Responses do not. This is indicated by a DTIM period > 0
+        return mDtimInterval > 0;
+    }
+
+    /**
+     * Evaluates the ScanResult this NetworkDetail is built from
+     * returns true if built from a hidden Beacon Frame
+     * returns false if not hidden or not a Beacon
+     */
+    public boolean isHiddenBeaconFrame() {
+        // Hidden networks are not 80211 standard, but it is common for a hidden network beacon
+        // frame to either send zero-value bytes as the SSID, or to send no bytes at all.
+        return isBeaconFrame() && mIsHiddenSsid;
+    }
+
     public static String toMACString(long mac) {
         StringBuilder sb = new StringBuilder();
         boolean first = true;
@@ -510,5 +546,4 @@
         }
         return sb.toString();
     }
-
 }
diff --git a/service/java/com/android/server/wifi/util/InformationElementUtil.java b/service/java/com/android/server/wifi/util/InformationElementUtil.java
index fb802b9..6a7b560 100644
--- a/service/java/com/android/server/wifi/util/InformationElementUtil.java
+++ b/service/java/com/android/server/wifi/util/InformationElementUtil.java
@@ -19,9 +19,10 @@
 
 import android.net.wifi.ScanResult.InformationElement;
 import android.util.Log;
+
 import com.android.server.wifi.anqp.Constants;
 import com.android.server.wifi.hotspot2.NetworkDetail;
-import java.net.ProtocolException;
+
 import java.nio.BufferUnderflowException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -592,7 +593,7 @@
             } catch (BufferUnderflowException e) {
                 return;
             }
-            if (mLength <= MAX_TIM_LENGTH) {
+            if (mLength <= MAX_TIM_LENGTH && mDtimPeriod > 0) {
                 mValid = true;
             }
         }
diff --git a/service/proto/wifi.proto b/service/proto/wifi.proto
index 862c866..b2ced3c 100644
--- a/service/proto/wifi.proto
+++ b/service/proto/wifi.proto
@@ -196,6 +196,36 @@
 
   // Counts the occurrences of each alert reason.
   repeated AlertReasonCount alert_reason_count = 47;
+
+  // Total number of saved hidden networks
+  optional int32 num_hidden_networks = 37;
+
+  // Total number of saved passpoint / hotspot 2.0 networks
+  optional int32 num_passpoint_networks = 38;
+
+  // Total number of scan results
+  optional int32 num_total_scan_results = 39;
+
+  // Total number of scan results for open networks
+  optional int32 num_open_network_scan_results = 40;
+
+  // Total number of scan results for personal networks
+  optional int32 num_personal_network_scan_results = 41;
+
+  // Total number of scan results for enterprise networks
+  optional int32 num_enterprise_network_scan_results = 42;
+
+  // Total number of scan results for hidden networks
+  optional int32 num_hidden_network_scan_results = 43;
+
+  // Total number of scan results for hotspot 2.0 r1 networks
+  optional int32 num_hotspot2_r1_network_scan_results = 44;
+
+  // Total number of scan results for hotspot 2.0 r2 networks
+  optional int32 num_hotspot2_r2_network_scan_results = 45;
+
+  // Total number of scans handled by framework (oneshot or otherwise)
+  optional int32 num_scans = 46;
 }
 
 // Information that gets logged for every WiFi connection.
@@ -267,7 +297,7 @@
   // Authentication scheme of the router.
   optional Auth authentication = 4;
 
-  // If the router is hidded.
+  // If the router is hidden.
   optional bool hidden = 5;
 
   // Channel information.
@@ -275,6 +305,9 @@
 
   // whether ipv6 is supported.
   optional bool supports_ipv6 = 7;
+
+  // If the router is a passpoint / hotspot 2.0 network
+  optional bool passpoint = 8;
 }
 
 message ConnectionEvent {
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
index 6f4e106..93742be 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
@@ -33,6 +33,8 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -143,6 +145,8 @@
     private static final int NUM_OPEN_NETWORKS = 2;
     private static final int NUM_PERSONAL_NETWORKS = 3;
     private static final int NUM_ENTERPRISE_NETWORKS = 5;
+    private static final int NUM_HIDDEN_NETWORKS = 3;
+    private static final int NUM_PASSPOINT_NETWORKS = 4;
     private static final boolean TEST_VAL_IS_LOCATION_ENABLED = true;
     private static final boolean IS_SCANNING_ALWAYS_ENABLED = true;
     private static final int NUM_NEWTORKS_ADDED_BY_USER = 13;
@@ -174,6 +178,44 @@
     private static final int NUM_LAST_RESORT_WATCHDOG_SUCCESSES = 5;
     private static final int NUM_RSSI_LEVELS_TO_INCREMENT = 20;
     private static final int FIRST_RSSI_LEVEL = -80;
+    private static final int NUM_OPEN_NETWORK_SCAN_RESULTS = 1;
+    private static final int NUM_PERSONAL_NETWORK_SCAN_RESULTS = 4;
+    private static final int NUM_ENTERPRISE_NETWORK_SCAN_RESULTS = 3;
+    private static final int NUM_HIDDEN_NETWORK_SCAN_RESULTS = 1;
+    private static final int NUM_HOTSPOT2_R1_NETWORK_SCAN_RESULTS = 1;
+    private static final int NUM_HOTSPOT2_R2_NETWORK_SCAN_RESULTS = 2;
+    private static final int NUM_SCANS = 5;
+    private static final int NUM_TOTAL_SCAN_RESULTS = 8;
+
+    private ScanDetail buildMockScanDetail(boolean hidden, NetworkDetail.HSRelease hSRelease,
+            String capabilities) {
+        ScanDetail mockScanDetail = mock(ScanDetail.class);
+        NetworkDetail mockNetworkDetail = mock(NetworkDetail.class);
+        ScanResult mockScanResult = mock(ScanResult.class);
+        when(mockScanDetail.getNetworkDetail()).thenReturn(mockNetworkDetail);
+        when(mockScanDetail.getScanResult()).thenReturn(mockScanResult);
+        when(mockNetworkDetail.isHiddenBeaconFrame()).thenReturn(hidden);
+        when(mockNetworkDetail.getHSRelease()).thenReturn(hSRelease);
+        mockScanResult.capabilities = capabilities;
+        return mockScanDetail;
+    }
+
+    private List<ScanDetail> buildMockScanDetailList() {
+        List<ScanDetail> mockScanDetails = new ArrayList<ScanDetail>();
+        mockScanDetails.add(buildMockScanDetail(true, null, "[ESS]"));
+        mockScanDetails.add(buildMockScanDetail(false, null, "[WPA2-PSK-CCMP][ESS]"));
+        mockScanDetails.add(buildMockScanDetail(false, null, "[WPA-PSK-CCMP]"));
+        mockScanDetails.add(buildMockScanDetail(false, null, "[WPA-PSK-CCMP]"));
+        mockScanDetails.add(buildMockScanDetail(false, null, "[WEP]"));
+        mockScanDetails.add(buildMockScanDetail(false, NetworkDetail.HSRelease.R2,
+                "[WPA-EAP-CCMP]"));
+        mockScanDetails.add(buildMockScanDetail(false, NetworkDetail.HSRelease.R2,
+                "[WPA2-EAP+FT/EAP-CCMP]"));
+        mockScanDetails.add(buildMockScanDetail(false, NetworkDetail.HSRelease.R1,
+                "[WPA-EAP-CCMP]"));
+        return mockScanDetails;
+    }
+
     /**
      * Set simple metrics, increment others
      */
@@ -182,6 +224,8 @@
         mWifiMetrics.setNumOpenNetworks(NUM_OPEN_NETWORKS);
         mWifiMetrics.setNumPersonalNetworks(NUM_PERSONAL_NETWORKS);
         mWifiMetrics.setNumEnterpriseNetworks(NUM_ENTERPRISE_NETWORKS);
+        mWifiMetrics.setNumHiddenNetworks(NUM_HIDDEN_NETWORKS);
+        mWifiMetrics.setNumPasspointNetworks(NUM_PASSPOINT_NETWORKS);
         mWifiMetrics.setNumNetworksAddedByUser(NUM_NEWTORKS_ADDED_BY_USER);
         mWifiMetrics.setNumNetworksAddedByApps(NUM_NEWTORKS_ADDED_BY_APPS);
         mWifiMetrics.setIsLocationEnabled(TEST_VAL_IS_LOCATION_ENABLED);
@@ -272,6 +316,10 @@
         mWifiMetrics.incrementAlertReasonCount(1);
         mWifiMetrics.incrementAlertReasonCount(1);
         mWifiMetrics.incrementAlertReasonCount(2);
+        List<ScanDetail> mockScanDetails = buildMockScanDetailList();
+        for (int i = 0; i < NUM_SCANS; i++) {
+            mWifiMetrics.countScanResults(mockScanDetails);
+        }
     }
 
     /**
@@ -290,6 +338,8 @@
         assertEquals("mDeserializedWifiMetrics.numNetworksAddedByUser "
                         + "== NUM_NEWTORKS_ADDED_BY_USER",
                 mDeserializedWifiMetrics.numNetworksAddedByUser, NUM_NEWTORKS_ADDED_BY_USER);
+        assertEquals(NUM_HIDDEN_NETWORKS, mDeserializedWifiMetrics.numHiddenNetworks);
+        assertEquals(NUM_PASSPOINT_NETWORKS, mDeserializedWifiMetrics.numPasspointNetworks);
         assertEquals("mDeserializedWifiMetrics.numNetworksAddedByApps "
                         + "== NUM_NEWTORKS_ADDED_BY_APPS",
                 mDeserializedWifiMetrics.numNetworksAddedByApps, NUM_NEWTORKS_ADDED_BY_APPS);
@@ -359,6 +409,22 @@
         assertEquals(3, mDeserializedWifiMetrics.alertReasonCount[1].count);
         assertEquals(1, mDeserializedWifiMetrics.alertReasonCount[2].count);
         assertEquals(3, mDeserializedWifiMetrics.alertReasonCount.length);
+        assertEquals(NUM_TOTAL_SCAN_RESULTS * NUM_SCANS,
+                mDeserializedWifiMetrics.numTotalScanResults);
+        assertEquals(NUM_OPEN_NETWORK_SCAN_RESULTS * NUM_SCANS,
+                mDeserializedWifiMetrics.numOpenNetworkScanResults);
+        assertEquals(NUM_PERSONAL_NETWORK_SCAN_RESULTS * NUM_SCANS,
+                mDeserializedWifiMetrics.numPersonalNetworkScanResults);
+        assertEquals(NUM_ENTERPRISE_NETWORK_SCAN_RESULTS * NUM_SCANS,
+                mDeserializedWifiMetrics.numEnterpriseNetworkScanResults);
+        assertEquals(NUM_HIDDEN_NETWORK_SCAN_RESULTS * NUM_SCANS,
+                mDeserializedWifiMetrics.numHiddenNetworkScanResults);
+        assertEquals(NUM_HOTSPOT2_R1_NETWORK_SCAN_RESULTS * NUM_SCANS,
+                mDeserializedWifiMetrics.numHotspot2R1NetworkScanResults);
+        assertEquals(NUM_HOTSPOT2_R2_NETWORK_SCAN_RESULTS * NUM_SCANS,
+                mDeserializedWifiMetrics.numHotspot2R2NetworkScanResults);
+        assertEquals(NUM_SCANS,
+                mDeserializedWifiMetrics.numScans);
     }
 
     /**