Backport TelephonyManagerTest Enhancements

- Support MEIDS Starting with 97, 98, and 99 (Bug 3041176)
- Checking of ESNs
- Probe "hardware_id" for non-telephony devices

Change-Id: If0ef902bd5262348fb82e93230fec8683a4e2c09
diff --git a/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java b/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
index 9ecbf20..b89124e 100644
--- a/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
@@ -21,11 +21,13 @@
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
 
+import android.content.ContentResolver;
 import android.content.Context;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.os.Looper;
 import android.os.cts.TestThread;
+import android.provider.Settings;
 import android.telephony.CellLocation;
 import android.telephony.PhoneStateListener;
 import android.telephony.TelephonyManager;
@@ -289,10 +291,12 @@
                 break;
 
             case TelephonyManager.PHONE_TYPE_CDMA:
-                assertMeidDeviceId(deviceId);
+                assertCdmaDeviceId(deviceId);
                 break;
 
             case TelephonyManager.PHONE_TYPE_NONE:
+                assertNull(deviceId);
+                assertHardwareId();
                 assertMacAddressReported();
                 break;
 
@@ -363,16 +367,48 @@
         assertEquals(message, decimalIdentifier, reportingBodyIdentifier < decimalBound);
     }
 
-    private static void assertMeidDeviceId(String deviceId) {
-        assertHexadecimalMeidFormat(deviceId);
-        assertReportingBodyIdentifier(deviceId, false); // Must be hexadecimal identifier
+    private static void assertCdmaDeviceId(String deviceId) {
+        if (deviceId.length() == 14) {
+            assertMeidFormat(deviceId);
+        } else if (deviceId.length() == 8) {
+            assertHexadecimalEsnFormat(deviceId);
+        } else {
+            fail("device id on CDMA must be 14-digit hex MEID or 8-digit hex ESN.");
+        }
     }
 
-    private static void assertHexadecimalMeidFormat(String deviceId) {
-        // MEID must NOT include the check digit.
-        String meidPattern = "[0-9a-fA-F]{14}";
-        assertTrue("MEID hex device id " + deviceId + " does not match pattern " + meidPattern,
-                Pattern.matches(meidPattern, deviceId));
+    private static void assertHexadecimalEsnFormat(String deviceId) {
+        String esnPattern = "[0-9a-fA-F]{8}";
+        assertTrue("ESN hex device id " + deviceId + " does not match pattern " + esnPattern,
+                   Pattern.matches(esnPattern, deviceId));
+        assertFalse("ESN hex device id " + deviceId + " must not be a pseudo-ESN",
+                    "80".equals(deviceId.substring(0, 2)));
+    }
+
+    private static void assertMeidFormat(String deviceId) {
+        if (deviceId.substring(0, 2).matches("99|98|97")) {
+            // MEID must NOT include the check digit.
+            String meidPattern = "(99|98|97)[0-9]{12}";
+            assertTrue("MEID device id " + deviceId + " does not match pattern " + meidPattern,
+                    Pattern.matches(meidPattern, deviceId));
+        } else {
+            // MEID must NOT include the check digit.
+            String meidPattern = "[0-9a-fA-F]{14}";
+            assertTrue("MEID device id " + deviceId + " does not match pattern " + meidPattern,
+                    Pattern.matches(meidPattern, deviceId));
+            assertReportingBodyIdentifier(deviceId, false);
+        }
+    }
+
+    private void assertHardwareId() {
+        ContentResolver resolver = mContext.getContentResolver();
+        String hardwareId = Settings.Secure.getString(resolver, "hardware_id");
+        assertNotNull("Non-telephony devices must define a Settings.Secure 'hardware_id' property.",
+                hardwareId);
+        assertTrue("Hardware id must be no longer than 20 characters.",
+                hardwareId.length() <= 20);
+        assertTrue("Hardware id must be alphanumeric.",
+                Pattern.matches("[0-9A-Za-z]+", hardwareId));
     }
 
     private void assertMacAddressReported() {