From bed32ff5309f78970ac6790a510c2b2391d08ce2 Mon Sep 17 00:00:00 2001 From: junyulai Date: Wed, 31 Mar 2021 10:14:41 +0800 Subject: [PATCH] Fix NetworkCallback expecting wrong network By current wifi design, wifi will report disconnected and re-connected when changing from non-metered to metered. However, the cts test app listens for all network, which will get mobile network as active network when wifi is changing meteredness. This is not expected. And causes test failures when DUT has both wifi and mobile connections. Thus, this change pass request to track currently active network to the test app and register only for transport types of currently active network to prevent from getting unexpected network. Test: atest CtsHostsideNetworkTests:com.android.cts.net.HostsideNetworkCallbackTests Bug: 182516128 Ignore-AOSP-First: merge conflict with ag/13615939 which cannot be cherry-picked. Change-Id: I2dce6035b13472bbdc2609009d690aac96280033 --- .../aidl/com/android/cts/net/hostside/IMyService.aidl | 2 +- .../AbstractRestrictBackgroundNetworkTestCase.java | 7 +++++-- .../com/android/cts/net/hostside/MyServiceClient.java | 11 ++++++----- .../android/cts/net/hostside/NetworkCallbackTest.java | 9 ++++++++- .../cts/net/hostside/NetworkPolicyTestUtils.java | 2 +- .../com/android/cts/net/hostside/app2/MyService.java | 10 ++-------- 6 files changed, 23 insertions(+), 18 deletions(-) diff --git a/tests/cts/hostside/aidl/com/android/cts/net/hostside/IMyService.aidl b/tests/cts/hostside/aidl/com/android/cts/net/hostside/IMyService.aidl index fbbb68b747..28437c28a6 100644 --- a/tests/cts/hostside/aidl/com/android/cts/net/hostside/IMyService.aidl +++ b/tests/cts/hostside/aidl/com/android/cts/net/hostside/IMyService.aidl @@ -26,7 +26,7 @@ interface IMyService { String checkNetworkStatus(); String getRestrictBackgroundStatus(); void sendNotification(int notificationId, String notificationType); - void registerNetworkCallback(in INetworkCallback cb); + void registerNetworkCallback(in NetworkRequest request, in INetworkCallback cb); void unregisterNetworkCallback(); void scheduleJob(in JobInfo jobInfo); } diff --git a/tests/cts/hostside/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java b/tests/cts/hostside/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java index 140d8cd0ab..f9454ad052 100644 --- a/tests/cts/hostside/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java +++ b/tests/cts/hostside/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java @@ -49,6 +49,7 @@ import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo.DetailedState; import android.net.NetworkInfo.State; +import android.net.NetworkRequest; import android.os.BatteryManager; import android.os.Binder; import android.os.Bundle; @@ -750,8 +751,10 @@ public abstract class AbstractRestrictBackgroundNetworkTestCase { fail("app2 receiver is not ready"); } - protected void registerNetworkCallback(INetworkCallback cb) throws Exception { - mServiceClient.registerNetworkCallback(cb); + protected void registerNetworkCallback(final NetworkRequest request, INetworkCallback cb) + throws Exception { + Log.i(TAG, "Registering network callback for request: " + request); + mServiceClient.registerNetworkCallback(request, cb); } protected void unregisterNetworkCallback() throws Exception { diff --git a/tests/cts/hostside/app/src/com/android/cts/net/hostside/MyServiceClient.java b/tests/cts/hostside/app/src/com/android/cts/net/hostside/MyServiceClient.java index 1339be6e46..8b70f9b549 100644 --- a/tests/cts/hostside/app/src/com/android/cts/net/hostside/MyServiceClient.java +++ b/tests/cts/hostside/app/src/com/android/cts/net/hostside/MyServiceClient.java @@ -21,12 +21,11 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.net.NetworkRequest; import android.os.ConditionVariable; import android.os.IBinder; import android.os.RemoteException; -import com.android.cts.net.hostside.IMyService; - public class MyServiceClient { private static final int TIMEOUT_MS = 5000; private static final String PACKAGE = MyServiceClient.class.getPackage().getName(); @@ -94,12 +93,14 @@ public class MyServiceClient { return mService.getRestrictBackgroundStatus(); } - public void sendNotification(int notificationId, String notificationType) throws RemoteException { + public void sendNotification(int notificationId, String notificationType) + throws RemoteException { mService.sendNotification(notificationId, notificationType); } - public void registerNetworkCallback(INetworkCallback cb) throws RemoteException { - mService.registerNetworkCallback(cb); + public void registerNetworkCallback(final NetworkRequest request, INetworkCallback cb) + throws RemoteException { + mService.registerNetworkCallback(request, cb); } public void unregisterNetworkCallback() throws RemoteException { diff --git a/tests/cts/hostside/app/src/com/android/cts/net/hostside/NetworkCallbackTest.java b/tests/cts/hostside/app/src/com/android/cts/net/hostside/NetworkCallbackTest.java index 955317bbf6..36e2ffea08 100644 --- a/tests/cts/hostside/app/src/com/android/cts/net/hostside/NetworkCallbackTest.java +++ b/tests/cts/hostside/app/src/com/android/cts/net/hostside/NetworkCallbackTest.java @@ -19,6 +19,7 @@ package com.android.cts.net.hostside; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static com.android.cts.net.hostside.NetworkPolicyTestUtils.canChangeActiveNetworkMeteredness; +import static com.android.cts.net.hostside.NetworkPolicyTestUtils.getActiveNetworkCapabilities; import static com.android.cts.net.hostside.NetworkPolicyTestUtils.setRestrictBackground; import static com.android.cts.net.hostside.Property.BATTERY_SAVER_MODE; import static com.android.cts.net.hostside.Property.DATA_SAVER_MODE; @@ -29,6 +30,7 @@ import static org.junit.Assume.assumeTrue; import android.net.Network; import android.net.NetworkCapabilities; +import android.net.NetworkRequest; import android.util.Log; import org.junit.After; @@ -195,11 +197,16 @@ public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCa setBatterySaverMode(false); setRestrictBackground(false); + // Get transports of the active network, this has to be done before changing meteredness, + // since wifi will be disconnected when changing from non-metered to metered. + final NetworkCapabilities networkCapabilities = getActiveNetworkCapabilities(); + // Mark network as metered. mMeterednessConfiguration.configureNetworkMeteredness(true); // Register callback - registerNetworkCallback((INetworkCallback.Stub) mTestNetworkCallback); + registerNetworkCallback(new NetworkRequest.Builder() + .setCapabilities(networkCapabilities).build(), mTestNetworkCallback); // Wait for onAvailable() callback to ensure network is available before the test // and store the default network. mNetwork = mTestNetworkCallback.expectAvailableCallbackAndGetNetwork(); diff --git a/tests/cts/hostside/app/src/com/android/cts/net/hostside/NetworkPolicyTestUtils.java b/tests/cts/hostside/app/src/com/android/cts/net/hostside/NetworkPolicyTestUtils.java index 9d1d4188ca..7da1a212ad 100644 --- a/tests/cts/hostside/app/src/com/android/cts/net/hostside/NetworkPolicyTestUtils.java +++ b/tests/cts/hostside/app/src/com/android/cts/net/hostside/NetworkPolicyTestUtils.java @@ -208,7 +208,7 @@ public class NetworkPolicyTestUtils { } } - private static NetworkCapabilities getActiveNetworkCapabilities() { + static NetworkCapabilities getActiveNetworkCapabilities() { final Network activeNetwork = getConnectivityManager().getActiveNetwork(); assertNotNull("No active network available", activeNetwork); return getConnectivityManager().getNetworkCapabilities(activeNetwork); diff --git a/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/MyService.java b/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/MyService.java index 9e10d41d06..108c59cbf0 100644 --- a/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/MyService.java +++ b/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/MyService.java @@ -92,7 +92,7 @@ public class MyService extends Service { } @Override - public void registerNetworkCallback(INetworkCallback cb) { + public void registerNetworkCallback(final NetworkRequest request, INetworkCallback cb) { if (mNetworkCallback != null) { Log.d(TAG, "unregister previous network callback: " + mNetworkCallback); unregisterNetworkCallback(); @@ -140,7 +140,7 @@ public class MyService extends Service { } } }; - mCm.registerNetworkCallback(makeNetworkRequest(), mNetworkCallback); + mCm.registerNetworkCallback(request, mNetworkCallback); try { cb.asBinder().linkToDeath(() -> unregisterNetworkCallback(), 0); } catch (RemoteException e) { @@ -165,12 +165,6 @@ public class MyService extends Service { } }; - private NetworkRequest makeNetworkRequest() { - return new NetworkRequest.Builder() - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .build(); - } - @Override public IBinder onBind(Intent intent) { return mBinder;