Improve CTS tests to really check background network restrictions.

BUG: 26685616
Change-Id: If2b1649435b0a4e5b8c383eb3196807a03359d70
diff --git a/tests/cts/hostside/app/src/com/android/cts/net/hostside/ConnectivityManagerTest.java b/tests/cts/hostside/app/src/com/android/cts/net/hostside/ConnectivityManagerTest.java
index 300e39d..34c8d28 100644
--- a/tests/cts/hostside/app/src/com/android/cts/net/hostside/ConnectivityManagerTest.java
+++ b/tests/cts/hostside/app/src/com/android/cts/net/hostside/ConnectivityManagerTest.java
@@ -25,9 +25,14 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkInfo;
 import android.test.InstrumentationTestCase;
 import android.util.Log;
 
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
 /**
  * Tests for the {@link ConnectivityManager} API.
  *
@@ -38,27 +43,36 @@
 public class ConnectivityManagerTest extends InstrumentationTestCase {
     private static final String TAG = "ConnectivityManagerTest";
 
-    static final String MANIFEST_RECEIVER = "ManifestReceiver";
-    static final String DYNAMIC_RECEIVER = "DynamicReceiver";
+    private static final String MANIFEST_RECEIVER = "ManifestReceiver";
+    private static final String DYNAMIC_RECEIVER = "DynamicReceiver";
 
-    private ConnectivityManager mCM;
+    private static final String STATUS_NETWORK_UNAVAILABLE_PREFIX = "NetworkUnavailable:";
+    private static final String STATUS_NETWORK_AVAILABLE_PREFIX = "NetworkAvailable:";
+
+    private ConnectivityManager mCm;
+    private int mUid;
 
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        mCM = (ConnectivityManager) getInstrumentation().getContext().getSystemService(
-                Activity.CONNECTIVITY_SERVICE);
+        final Context context = getInstrumentation().getContext();
+        mCm = (ConnectivityManager) context.getSystemService(Activity.CONNECTIVITY_SERVICE);
+        mUid = context.getPackageManager()
+                .getPackageInfo(context.getPackageName(), 0).applicationInfo.uid;
+        final boolean metered = mCm.isActiveNetworkMetered();
+        Log.i(TAG, getName() + ": uid=" + mUid + ", metered=" + metered);
+        assertTrue("Active network is not metered", metered);
    }
 
-    public void testGetRestrictBackgroundStatus_disabled() {
+    public void testGetRestrictBackgroundStatus_disabled() throws Exception {
         assertRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_DISABLED);
     }
 
-    public void testGetRestrictBackgroundStatus_whitelisted() {
+    public void testGetRestrictBackgroundStatus_whitelisted() throws Exception {
         assertRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_WHITELISTED);
     }
 
-    public void testGetRestrictBackgroundStatus_enabled() {
+    public void testGetRestrictBackgroundStatus_enabled() throws Exception {
         assertRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_ENABLED);
     }
 
@@ -102,11 +116,34 @@
         return prefs.getInt(action, 0);
     }
 
-    private void assertRestrictBackgroundStatus(int expectedStatus) {
-        final String expected = toString(expectedStatus);
+    private void assertRestrictBackgroundStatus(int expectedApiStatus) throws InterruptedException {
+        // First asserts the API returns the proper value...
+        final String expected = toString(expectedApiStatus);
         Log.d(TAG, getName() + " (expecting " + expected + ")");
-        final int actualStatus = mCM.getRestrictBackgroundStatus();
-        assertEquals("wrong status", expected, toString(actualStatus));
+        final int apiStatus = mCm.getRestrictBackgroundStatus();
+        String actualApiStatus = toString(apiStatus);
+        assertEquals("wrong status", expected, actualApiStatus);
+
+        //...then use a background thread to verify the actual network status.
+        final LinkedBlockingQueue<String> result = new LinkedBlockingQueue<>(1);
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+              Log.d(TAG, "Running on thread " + Thread.currentThread().getName());
+              final Network network = mCm.getActiveNetwork();
+              final NetworkInfo networkInfo = mCm.getActiveNetworkInfo();
+              Log.d(TAG, "activeNetwork: " + network + " activeNetworkInfo: " + networkInfo);
+              final String prefix = network == null ?
+                      STATUS_NETWORK_UNAVAILABLE_PREFIX : STATUS_NETWORK_AVAILABLE_PREFIX;
+              result.offer(prefix + networkInfo);
+            }
+        }, "CheckNetworkThread").start();
+        final String actualNetworkStatus = result.poll(10, TimeUnit.SECONDS);
+        assertNotNull("timeout waiting for background thread", actualNetworkStatus);
+        final String expectedPrefix = apiStatus == RESTRICT_BACKGROUND_STATUS_ENABLED ?
+                STATUS_NETWORK_UNAVAILABLE_PREFIX : STATUS_NETWORK_AVAILABLE_PREFIX;
+        assertTrue("Wrong network status for API status " + actualApiStatus + ": "
+                + actualNetworkStatus, actualNetworkStatus.startsWith(expectedPrefix));
     }
 
     private String toString(int status) {
diff --git a/tests/cts/hostside/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java b/tests/cts/hostside/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java
index 9f0bfb8..2b0b1c1 100644
--- a/tests/cts/hostside/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java
+++ b/tests/cts/hostside/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java
@@ -18,23 +18,29 @@
 
 import com.android.ddmlib.Log;
 import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.WifiHelper;
 
 public class HostsideRestrictBackgroundNetworkTests extends HostsideNetworkTestCase {
     private static final String TEST_APP2_PKG = "com.android.cts.net.hostside.app2";
     private static final String TEST_APP2_APK = "CtsHostsideNetworkTestsApp2.apk";
 
     private int mUid;
+    private WifiHelper mWifiHelper;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
+        mUid = getUid(TEST_PKG);
+        mWifiHelper = new WifiHelper(getDevice());
+
+        setWifiMeteredStatus(true);
         setRestrictBackground(false);
+
         uninstallPackage(TEST_APP2_PKG, false);
         installPackage(TEST_APP2_APK);
 
         startBroadcastReceiverService();
-        mUid = getUid(TEST_PKG);
     }
 
     @Override
@@ -43,6 +49,7 @@
 
         uninstallPackage(TEST_APP2_PKG, true);
         setRestrictBackground(false);
+        setWifiMeteredStatus(false);
     }
 
     public void testGetRestrictBackgroundStatus_disabled() throws Exception {
@@ -151,6 +158,25 @@
                 + expected + ", got " + actual);
     }
 
+    private void setWifiMeteredStatus(boolean metered) throws DeviceNotAvailableException {
+        mWifiHelper.enableWifi();
+        // TODO: if it's not guaranteed the device has wi-fi, we need to change the tests
+        // to make the actual verification of restrictions optional.
+        final String netId = mWifiHelper.getSSID();
+        assertNotNull("null SSID", netId);
+        assertFalse("empty SSID", netId.trim().isEmpty());
+
+        Log.i(TAG, "Setting wi-fi network " + netId + " metered status to " + metered);
+        final String setCommand = "cmd netpolicy set metered-network " + netId + " "+ metered;
+        final String result = runCommand(setCommand);
+        assertTrue("Command '" + setCommand + "' failed: " + result, result.trim().isEmpty());
+
+        // Sanity check.
+        final String newStatus = runCommand("cmd netpolicy get metered-network " + netId);
+        assertEquals("Metered status of wi-fi network " + netId + " not set properly",
+                newStatus.trim(), Boolean.toString(metered));
+    }
+
     private void setRestrictBackground(boolean enabled) throws DeviceNotAvailableException {
         runCommand("cmd netpolicy set restrict-background " + enabled);
         final String output = runCommand("cmd netpolicy get restrict-background ").trim();