diff --git a/tests/cts/hostside/aidl/Android.mk b/tests/cts/hostside/aidl/Android.mk index 4aa55b6a08..58be21f608 100644 --- a/tests/cts/hostside/aidl/Android.mk +++ b/tests/cts/hostside/aidl/Android.mk @@ -17,6 +17,8 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_SDK_VERSION := current -LOCAL_SRC_FILES := com/android/cts/net/hostside/IRemoteSocketFactory.aidl +LOCAL_SRC_FILES := \ + com/android/cts/net/hostside/IMyService.aidl \ + com/android/cts/net/hostside/IRemoteSocketFactory.aidl LOCAL_MODULE := CtsHostsideNetworkTestsAidl include $(BUILD_STATIC_JAVA_LIBRARY) 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 new file mode 100644 index 0000000000..72d105990e --- /dev/null +++ b/tests/cts/hostside/aidl/com/android/cts/net/hostside/IMyService.aidl @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.cts.net.hostside; + +interface IMyService { + void registerBroadcastReceiver(); + int getCounters(String receiverName, String action); + String checkNetworkStatus(); + String getRestrictBackgroundStatus(); + void sendNotification(int notificationId, String notificationType); +} 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 6db9877463..7497758a70 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 @@ -54,25 +54,11 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation // Constants below must match values defined on app2's Common.java private static final String MANIFEST_RECEIVER = "ManifestReceiver"; private static final String DYNAMIC_RECEIVER = "DynamicReceiver"; - private static final String ACTION_GET_COUNTERS = - "com.android.cts.net.hostside.app2.action.GET_COUNTERS"; - private static final String ACTION_GET_RESTRICT_BACKGROUND_STATUS = - "com.android.cts.net.hostside.app2.action.GET_RESTRICT_BACKGROUND_STATUS"; - private static final String ACTION_CHECK_NETWORK = - "com.android.cts.net.hostside.app2.action.CHECK_NETWORK"; + private static final String ACTION_RECEIVER_READY = "com.android.cts.net.hostside.app2.action.RECEIVER_READY"; - static final String ACTION_SEND_NOTIFICATION = - "com.android.cts.net.hostside.app2.action.SEND_NOTIFICATION"; static final String ACTION_SHOW_TOAST = "com.android.cts.net.hostside.app2.action.SHOW_TOAST"; - private static final String EXTRA_ACTION = "com.android.cts.net.hostside.app2.extra.ACTION"; - private static final String EXTRA_RECEIVER_NAME = - "com.android.cts.net.hostside.app2.extra.RECEIVER_NAME"; - private static final String EXTRA_NOTIFICATION_ID = - "com.android.cts.net.hostside.app2.extra.NOTIFICATION_ID"; - private static final String EXTRA_NOTIFICATION_TYPE = - "com.android.cts.net.hostside.app2.extra.NOTIFICATION_TYPE"; protected static final String NOTIFICATION_TYPE_CONTENT = "CONTENT"; protected static final String NOTIFICATION_TYPE_DELETE = "DELETE"; @@ -99,6 +85,7 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation protected WifiManager mWfm; protected int mUid; private String mMeteredWifi; + private MyServiceClient mServiceClient; @Override protected void setUp() throws Exception { @@ -110,12 +97,21 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation mWfm = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); mUid = getUid(TEST_APP2_PKG); final int myUid = getUid(mContext.getPackageName()); + mServiceClient = new MyServiceClient(mContext); + mServiceClient.bind(); Log.i(TAG, "Apps status on " + getName() + ":\n" + "\ttest app: uid=" + myUid + ", state=" + getProcessStateByUid(myUid) + "\n" + "\tapp2: uid=" + mUid + ", state=" + getProcessStateByUid(mUid)); } + @Override + protected void tearDown() throws Exception { + mServiceClient.unbind(); + + super.tearDown(); + } + protected int getUid(String packageName) throws Exception { return mContext.getPackageManager().getPackageUid(packageName, 0); } @@ -171,19 +167,13 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation } protected int getNumberBroadcastsReceived(String receiverName, String action) throws Exception { - final Intent intent = new Intent(ACTION_GET_COUNTERS); - intent.putExtra(EXTRA_ACTION, ACTION_RESTRICT_BACKGROUND_CHANGED); - intent.putExtra(EXTRA_RECEIVER_NAME, receiverName); - final String resultData = sendOrderedBroadcast(intent); - assertNotNull("timeout waiting for ordered broadcast result", resultData); - return Integer.valueOf(resultData); + return mServiceClient.getCounters(receiverName, action); } protected void assertRestrictBackgroundStatus(int expectedStatus) throws Exception { - final Intent intent = new Intent(ACTION_GET_RESTRICT_BACKGROUND_STATUS); - final String resultData = sendOrderedBroadcast(intent); - assertNotNull("timeout waiting for ordered broadcast result", resultData); - final String actualStatus = toString(Integer.parseInt(resultData)); + final String status = mServiceClient.getRestrictBackgroundStatus(); + assertNotNull("didn't get API status from app2", status); + final String actualStatus = toString(Integer.parseInt(status)); assertEquals("wrong status", toString(expectedStatus), actualStatus); } @@ -329,15 +319,15 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation * @return error message with the mismatch (or empty if assertion passed). */ private String checkNetworkAccess(boolean expectAvailable) throws Exception { - String resultData = sendOrderedBroadcast(new Intent(ACTION_CHECK_NETWORK)); + final String resultData = mServiceClient.checkNetworkStatus(); if (resultData == null) { - return "timeout waiting for ordered broadcast"; + return "did not get network status from app2"; } // Network status format is described on MyBroadcastReceiver.checkNetworkStatus() final String[] parts = resultData.split(NETWORK_STATUS_SEPARATOR); assertEquals("Wrong network status: " + resultData, 5, parts.length); // Sanity check - final State state = State.valueOf(parts[0]); - final DetailedState detailedState = DetailedState.valueOf(parts[1]); + final State state = parts[0].equals("null") ? null : State.valueOf(parts[0]); + final DetailedState detailedState = parts[1].equals("null") ? null : DetailedState.valueOf(parts[1]); final boolean connected = Boolean.valueOf(parts[2]); final String connectionCheckDetails = parts[3]; final String networkInfo = parts[4]; @@ -694,9 +684,10 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation * {@link #runDeviceTests(String, String)} is executed. */ protected void registerBroadcastReceiver() throws Exception { - executeShellCommand("am startservice com.android.cts.net.hostside.app2/.MyService"); + mServiceClient.registerBroadcastReceiver(); + // Wait until receiver is ready. - final int maxTries = 5; + final int maxTries = 10; for (int i = 1; i <= maxTries; i++) { final String message = sendOrderedBroadcast(new Intent(ACTION_RECEIVER_READY), SECOND_IN_MS); @@ -781,13 +772,10 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation + "--receiver-foreground --receiver-registered-only"); } - protected void sendNotification(int notificationId, String notificationType) { - final Intent intent = new Intent(ACTION_SEND_NOTIFICATION); - intent.putExtra(EXTRA_NOTIFICATION_ID, notificationId); - intent.putExtra(EXTRA_NOTIFICATION_TYPE, notificationType); - Log.d(TAG, "Sending notification broadcast (id=" + notificationId + ", type=" - + notificationType + ": " + intent); - mContext.sendBroadcast(intent); + protected void sendNotification(int notificationId, String notificationType) throws Exception { + Log.d(TAG, "Sending notification broadcast (id=" + notificationId + + ", type=" + notificationType); + mServiceClient.sendNotification(notificationId, notificationType); } protected String showToast() { 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 new file mode 100644 index 0000000000..ff05d8c2fc --- /dev/null +++ b/tests/cts/hostside/app/src/com/android/cts/net/hostside/MyServiceClient.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.cts.net.hostside; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.ConditionVariable; +import android.os.IBinder; +import android.os.RemoteException; + +import com.android.cts.net.hostside.IMyService; + +import java.io.FileDescriptor; + +public class MyServiceClient { + private static final int TIMEOUT_MS = 5000; + private static final String PACKAGE = MyServiceClient.class.getPackage().getName(); + private static final String APP2_PACKAGE = PACKAGE + ".app2"; + private static final String SERVICE_NAME = APP2_PACKAGE + ".MyService"; + + private Context mContext; + private ServiceConnection mServiceConnection; + private IMyService mService; + + public MyServiceClient(Context context) { + mContext = context; + } + + public void bind() { + if (mService != null) { + throw new IllegalStateException("Already bound"); + } + + final ConditionVariable cv = new ConditionVariable(); + mServiceConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + mService = IMyService.Stub.asInterface(service); + cv.open(); + } + @Override + public void onServiceDisconnected(ComponentName name) { + mService = null; + } + }; + + final Intent intent = new Intent(); + intent.setComponent(new ComponentName(APP2_PACKAGE, SERVICE_NAME)); + // Needs to use BIND_ALLOW_OOM_MANAGEMENT and BIND_NOT_FOREGROUND so app2 does not run in + // the same process state as app + mContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE + | Context.BIND_ALLOW_OOM_MANAGEMENT | Context.BIND_NOT_FOREGROUND); + cv.block(TIMEOUT_MS); + if (mService == null) { + throw new IllegalStateException( + "Could not bind to MyService service after " + TIMEOUT_MS + "ms"); + } + } + + public void unbind() { + if (mService != null) { + mContext.unbindService(mServiceConnection); + } + } + + public void registerBroadcastReceiver() throws RemoteException { + mService.registerBroadcastReceiver(); + } + + public int getCounters(String receiverName, String action) throws RemoteException { + return mService.getCounters(receiverName, action); + } + + public String checkNetworkStatus() throws RemoteException { + return mService.checkNetworkStatus(); + } + + public String getRestrictBackgroundStatus() throws RemoteException { + return mService.getRestrictBackgroundStatus(); + } + + public void sendNotification(int notificationId, String notificationType) throws RemoteException { + mService.sendNotification(notificationId, notificationType); + } +} diff --git a/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java b/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java index e07c0f50d5..dc9a63036a 100644 --- a/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java +++ b/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java @@ -26,27 +26,13 @@ public final class Common { // AbstractRestrictBackgroundNetworkTestCase.java static final String MANIFEST_RECEIVER = "ManifestReceiver"; static final String DYNAMIC_RECEIVER = "DynamicReceiver"; - static final String ACTION_GET_COUNTERS = - "com.android.cts.net.hostside.app2.action.GET_COUNTERS"; - static final String ACTION_GET_RESTRICT_BACKGROUND_STATUS = - "com.android.cts.net.hostside.app2.action.GET_RESTRICT_BACKGROUND_STATUS"; - static final String ACTION_CHECK_NETWORK = - "com.android.cts.net.hostside.app2.action.CHECK_NETWORK"; + static final String ACTION_RECEIVER_READY = "com.android.cts.net.hostside.app2.action.RECEIVER_READY"; static final String ACTION_FINISH_ACTIVITY = "com.android.cts.net.hostside.app2.action.FINISH_ACTIVITY"; - static final String ACTION_SEND_NOTIFICATION = - "com.android.cts.net.hostside.app2.action.SEND_NOTIFICATION"; static final String ACTION_SHOW_TOAST = "com.android.cts.net.hostside.app2.action.SHOW_TOAST"; - static final String EXTRA_ACTION = "com.android.cts.net.hostside.app2.extra.ACTION"; - static final String EXTRA_RECEIVER_NAME = - "com.android.cts.net.hostside.app2.extra.RECEIVER_NAME"; - static final String EXTRA_NOTIFICATION_ID = - "com.android.cts.net.hostside.app2.extra.NOTIFICATION_ID"; - static final String EXTRA_NOTIFICATION_TYPE = - "com.android.cts.net.hostside.app2.extra.NOTIFICATION_TYPE"; static final String NOTIFICATION_TYPE_CONTENT = "CONTENT"; static final String NOTIFICATION_TYPE_DELETE = "DELETE"; diff --git a/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/MyBroadcastReceiver.java b/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/MyBroadcastReceiver.java index 733c3aa6a0..f59cba1252 100644 --- a/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/MyBroadcastReceiver.java +++ b/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/MyBroadcastReceiver.java @@ -18,16 +18,8 @@ package com.android.cts.net.hostside.app2; import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED; -import static com.android.cts.net.hostside.app2.Common.ACTION_CHECK_NETWORK; -import static com.android.cts.net.hostside.app2.Common.ACTION_GET_COUNTERS; -import static com.android.cts.net.hostside.app2.Common.ACTION_GET_RESTRICT_BACKGROUND_STATUS; import static com.android.cts.net.hostside.app2.Common.ACTION_RECEIVER_READY; -import static com.android.cts.net.hostside.app2.Common.ACTION_SEND_NOTIFICATION; import static com.android.cts.net.hostside.app2.Common.ACTION_SHOW_TOAST; -import static com.android.cts.net.hostside.app2.Common.EXTRA_ACTION; -import static com.android.cts.net.hostside.app2.Common.EXTRA_NOTIFICATION_ID; -import static com.android.cts.net.hostside.app2.Common.EXTRA_NOTIFICATION_TYPE; -import static com.android.cts.net.hostside.app2.Common.EXTRA_RECEIVER_NAME; import static com.android.cts.net.hostside.app2.Common.MANIFEST_RECEIVER; import static com.android.cts.net.hostside.app2.Common.NOTIFICATION_TYPE_ACTION; import static com.android.cts.net.hostside.app2.Common.NOTIFICATION_TYPE_ACTION_BUNDLE; @@ -56,14 +48,12 @@ import android.widget.Toast; import java.net.HttpURLConnection; import java.net.URL; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; /** * Receiver used to: *