Enable wifi before device policy wifi tests start.

This change makes sure wifi is on in setUp() before any wifi test in
managed profile, and restores it to the original on/off state after the
test.

Bug: 32814821
Bug: 33380760
Test: cts-tradefed run cts -t com.android.cts.devicepolicy.ManagedProfileTest#testProfileWifiCleanup
Change-Id: Iaebc2dd772b6f18c07d11db550c3bf1808574b75
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml b/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
index a36001c..0a3fab3 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
@@ -19,6 +19,7 @@
 
     <uses-sdk android:minSdkVersion="20"/>
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
     <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
     <uses-permission android:name="android.permission.BLUETOOTH" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/WifiTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/WifiTest.java
index 685ad82..124ebe8 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/WifiTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/WifiTest.java
@@ -23,6 +23,7 @@
 import android.os.SystemClock;
 import android.test.AndroidTestCase;
 
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import static com.android.compatibility.common.util.WifiConfigCreator.ACTION_CREATE_WIFI_CONFIG;
@@ -50,10 +51,27 @@
     // Shared WifiManager instance.
     private WifiManager mWifiManager;
 
+    // Original setting of WifiManager.isWifiEnabled() before setup.
+    private boolean mWifiEnabled;
+
     @Override
     public void setUp() throws Exception {
         super.setUp();
         mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
+        mWifiEnabled = mWifiManager.isWifiEnabled();
+        if (!mWifiEnabled) {
+            mWifiManager.setWifiEnabled(true);
+            awaitWifiEnabledState(true);
+        }
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        if (!mWifiEnabled) {
+            mWifiManager.setWifiEnabled(false);
+            awaitWifiEnabledState(false);
+        }
+        super.tearDown();
     }
 
     /**
@@ -92,7 +110,6 @@
             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             getContext().startActivity(intent);
         }
-
         assertTrue(awaitNetworkState(NETWORK_SSID, /* exists */ false));
     }
 
@@ -123,6 +140,23 @@
     }
 
     /**
+     * Block until {@link WifiManager#isWifiEnabled()} returns {@param enabled}. Wait for up to
+     * {@link WifiTest#UPDATE_TIMEOUT_MS} milliseconds, in increments of
+     * {@link WifiTest#UPDATE_INTERVAL_MS}.
+     */
+    private void awaitWifiEnabledState(boolean enabled) throws RuntimeException {
+        for (int probes = 0; probes * UPDATE_INTERVAL_MS <= UPDATE_TIMEOUT_MS; probes++) {
+            if (probes != 0) {
+                SystemClock.sleep(UPDATE_INTERVAL_MS);
+            }
+            if (mWifiManager.isWifiEnabled() == enabled) {
+                return;
+            }
+        }
+        throw new RuntimeException("Waited too long for wifi enabled state = " + enabled);
+    }
+
+    /**
      * Internal method to find an existing {@link WifiConfiguration} with the given SSID.
      *
      * @return A {@link WifiConfiguration} matching the specification, or {@code null} if no such
@@ -132,9 +166,12 @@
         if (!ssid.startsWith("\"")) {
             ssid = '"' + ssid + '"';
         }
-        for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) {
-            if (ssid.equals(config.SSID)) {
-                return config;
+        final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+        if (configs != null) {
+            for (WifiConfiguration config : configs) {
+                if (ssid.equals(config.SSID)) {
+                    return config;
+                }
             }
         }
         return null;