[AWARE] CTS for Aware data-path creation

Test Aware data-path creation API flow - failure.

Note: testing limited to failure since single device
testing doesn't have a peer

Bug: 30556108
Test: CTS tests pass
Change-Id: Ie15ad57d7331b21fbb6706091691bd5f87e1264e
diff --git a/tests/cts/net/src/android/net/wifi/aware/cts/SingleDeviceTest.java b/tests/cts/net/src/android/net/wifi/aware/cts/SingleDeviceTest.java
index ab87815..fcd0454 100644
--- a/tests/cts/net/src/android/net/wifi/aware/cts/SingleDeviceTest.java
+++ b/tests/cts/net/src/android/net/wifi/aware/cts/SingleDeviceTest.java
@@ -20,6 +20,9 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
 import android.net.wifi.WifiManager;
 import android.net.wifi.aware.AttachCallback;
 import android.net.wifi.aware.Characteristics;
@@ -32,6 +35,8 @@
 import android.net.wifi.aware.SubscribeDiscoverySession;
 import android.net.wifi.aware.WifiAwareManager;
 import android.net.wifi.aware.WifiAwareSession;
+import android.os.Handler;
+import android.os.HandlerThread;
 import android.test.AndroidTestCase;
 
 import java.util.ArrayDeque;
@@ -54,10 +59,17 @@
     static private final int WAIT_FOR_AWARE_CHANGE_SECS = 10;
 
     private final Object mLock = new Object();
+    private final HandlerThread mHandlerThread = new HandlerThread("SingleDeviceTest");
+    private final Handler mHandler;
+    {
+        mHandlerThread.start();
+        mHandler = new Handler(mHandlerThread.getLooper());
+    }
 
     private WifiAwareManager mWifiAwareManager;
     private WifiManager mWifiManager;
     private WifiManager.WifiLock mWifiLock;
+    private ConnectivityManager mConnectivityManager;
 
     // used to store any WifiAwareSession allocated during tests - will clean-up after tests
     private List<WifiAwareSession> mSessions = new ArrayList<>();
@@ -291,6 +303,27 @@
         }
     }
 
+    private class NetworkCallbackTest extends ConnectivityManager.NetworkCallback {
+        private CountDownLatch mBlocker = new CountDownLatch(1);
+
+        @Override
+        public void onUnavailable() {
+            mBlocker.countDown();
+        }
+
+        /**
+         * Wait for the onUnavailable() callback to be triggered. Returns true if triggered,
+         * otherwise (timed-out, interrupted) returns false.
+         */
+        boolean waitForOnUnavailable() {
+            try {
+                return mBlocker.await(WAIT_FOR_AWARE_CHANGE_SECS, TimeUnit.SECONDS);
+            } catch (InterruptedException e) {
+                return false;
+            }
+        }
+    }
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -311,6 +344,10 @@
             mWifiManager.setWifiEnabled(true);
         }
 
+        mConnectivityManager = (ConnectivityManager) getContext().getSystemService(
+                Context.CONNECTIVITY_SERVICE);
+        assertNotNull("Connectivity Manager", mConnectivityManager);
+
         IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(WifiAwareManager.ACTION_WIFI_AWARE_STATE_CHANGED);
         WifiAwareBroadcastReceiver receiver = new WifiAwareBroadcastReceiver();
@@ -421,7 +458,7 @@
         for (int i = 0; i < numIterations; ++i) {
             AttachCallbackTest attachCb = new AttachCallbackTest();
             IdentityChangedListenerTest identityL = new IdentityChangedListenerTest();
-            mWifiAwareManager.attach(attachCb, identityL, null);
+            mWifiAwareManager.attach(attachCb, identityL, mHandler);
             assertEquals("Wi-Fi Aware attach: iteration " + i, AttachCallbackTest.ATTACHED,
                     attachCb.waitForAnyCallback());
             assertTrue("Wi-Fi Aware attach: iteration " + i, identityL.waitForListener());
@@ -457,7 +494,7 @@
         DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
 
         // 1. publish
-        session.publish(publishConfig, discoveryCb, null);
+        session.publish(publishConfig, discoveryCb, mHandler);
         assertTrue("Publish started",
                 discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_PUBLISH_STARTED));
         PublishDiscoverySession discoverySession = discoveryCb.getPublishDiscoverySession();
@@ -501,7 +538,7 @@
         DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
 
         // 1. subscribe
-        session.subscribe(subscribeConfig, discoveryCb, null);
+        session.subscribe(subscribeConfig, discoveryCb, mHandler);
         assertTrue("Subscribe started",
                 discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_SUBSCRIBE_STARTED));
         SubscribeDiscoverySession discoverySession = discoveryCb.getSubscribeDiscoverySession();
@@ -543,7 +580,7 @@
         DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
 
         // 1. publish
-        session.publish(publishConfig, discoveryCb, null);
+        session.publish(publishConfig, discoveryCb, mHandler);
         assertTrue("Publish started",
                 discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_PUBLISH_STARTED));
         PublishDiscoverySession discoverySession = discoveryCb.getPublishDiscoverySession();
@@ -561,11 +598,72 @@
         session.destroy();
     }
 
+    /**
+     * Request an Aware data-path on a Publish discovery session (which can be done with a null
+     * peer - to accept all requests). Validate that times-out.
+     */
+    public void testDataPathInContextOfDiscoveryFail() {
+        if (!TestUtils.shouldTestWifiAware(getContext())) {
+            return;
+        }
+
+        WifiAwareSession session = attachAndGetSession();
+
+        PublishConfig publishConfig = new PublishConfig.Builder().setServiceName(
+                "ValidName").build();
+        DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
+        NetworkCallbackTest networkCb = new NetworkCallbackTest();
+
+        // 1. publish
+        session.publish(publishConfig, discoveryCb, mHandler);
+        assertTrue("Publish started",
+                discoveryCb.waitForCallback(DiscoverySessionCallbackTest.ON_PUBLISH_STARTED));
+        PublishDiscoverySession discoverySession = discoveryCb.getPublishDiscoverySession();
+        assertNotNull("Publish session", discoverySession);
+
+        // 2. request an AWARE network
+        NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
+                NetworkCapabilities.TRANSPORT_WIFI_AWARE).setNetworkSpecifier(
+                discoverySession.createNetworkSpecifier(null, null)).build();
+        mConnectivityManager.requestNetwork(nr, networkCb, 2000);
+        assertTrue("OnUnavailable received", networkCb.waitForOnUnavailable());
+
+        discoverySession.destroy();
+        session.destroy();
+    }
+
+    /**
+     * Request an Aware data-path as a Responder with no peer MAC address (i.e. accept any peer
+     * request). Validate that times-out.
+     */
+    public void testDataPathOutOfBandFail() {
+        if (!TestUtils.shouldTestWifiAware(getContext())) {
+            return;
+        }
+
+        WifiAwareSession session = attachAndGetSession();
+
+        PublishConfig publishConfig = new PublishConfig.Builder().setServiceName(
+                "ValidName").build();
+        DiscoverySessionCallbackTest discoveryCb = new DiscoverySessionCallbackTest();
+        NetworkCallbackTest networkCb = new NetworkCallbackTest();
+
+        // 1. request an AWARE network
+        NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
+                NetworkCapabilities.TRANSPORT_WIFI_AWARE).setNetworkSpecifier(
+                session.createNetworkSpecifier(
+                        WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER, null, null)).build();
+        mConnectivityManager.requestNetwork(nr, networkCb, 2000);
+        assertTrue("OnUnavailable received", networkCb.waitForOnUnavailable());
+
+        session.destroy();
+    }
+
     // local utilities
 
     private WifiAwareSession attachAndGetSession() {
         AttachCallbackTest attachCb = new AttachCallbackTest();
-        mWifiAwareManager.attach(attachCb, null);
+        mWifiAwareManager.attach(attachCb, mHandler);
         int cbCalled = attachCb.waitForAnyCallback();
         assertEquals("Wi-Fi Aware attach", AttachCallbackTest.ATTACHED, cbCalled);