Loading apct-tests/perftests/core/Android.mk +4 −1 Original line number Diff line number Diff line Loading @@ -4,11 +4,14 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ src/android/os/ISomeService.aidl LOCAL_STATIC_JAVA_LIBRARIES := \ android-support-test \ apct-perftests-utils \ guava \ legacy-android-test LOCAL_PACKAGE_NAME := CorePerfTests Loading apct-tests/perftests/core/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ <application> <uses-library android:name="android.test.runner" /> <activity android:name="android.perftests.utils.StubActivity" /> <service android:name="android.os.SomeService" android:exported="false" android:process=":some_service" /> </application> <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner" Loading apct-tests/perftests/core/src/android/os/ISomeService.aidl 0 → 100644 +5 −0 Original line number Diff line number Diff line package android.os; interface ISomeService { void readDisk(int times); } No newline at end of file apct-tests/perftests/core/src/android/os/SomeService.java 0 → 100644 +42 −0 Original line number Diff line number Diff line package android.os; import android.app.Service; import android.content.Intent; import java.io.File; import java.io.IOException; /** Service in separate process available for calling over binder. */ public class SomeService extends Service { private File mTempFile; @Override public void onCreate() { super.onCreate(); try { mTempFile = File.createTempFile("foo", "bar"); } catch (IOException e) { throw new RuntimeException(e); } } private final ISomeService.Stub mBinder = new ISomeService.Stub() { public void readDisk(int times) { for (int i = 0; i < times; i++) { mTempFile.exists(); } } }; @Override public IBinder onBind(Intent intent) { return mBinder; } @Override public void onDestroy() { super.onDestroy(); mTempFile.delete(); } } apct-tests/perftests/core/src/android/os/StrictModeTest.java 0 → 100644 +127 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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 android.os; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.net.Uri; import android.perftests.utils.BenchmarkState; import android.perftests.utils.PerfStatusReporter; import android.support.test.InstrumentationRegistry; import android.support.test.filters.LargeTest; import android.support.test.runner.AndroidJUnit4; import com.google.common.util.concurrent.SettableFuture; import java.io.File; import java.io.IOException; import java.util.concurrent.ExecutionException; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @LargeTest public class StrictModeTest { @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); @Test public void timeVmViolation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build()); causeVmViolations(state); } @Test public void timeVmViolationNoStrictMode() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); causeVmViolations(state); } private static void causeVmViolations(BenchmarkState state) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.parse("content://com.example/foobar"), "image/jpeg"); final Context context = InstrumentationRegistry.getTargetContext(); while (state.keepRunning()) { context.startActivity(intent); } } @Test public void timeThreadViolation() throws IOException { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); StrictMode.setThreadPolicy( new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build()); causeThreadViolations(state); } @Test public void timeThreadViolationNoStrictMode() throws IOException { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); causeThreadViolations(state); } private static void causeThreadViolations(BenchmarkState state) throws IOException { final File test = File.createTempFile("foo", "bar"); while (state.keepRunning()) { test.exists(); } test.delete(); } @Test public void timeCrossBinderThreadViolation() throws Exception { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); StrictMode.setThreadPolicy( new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build()); causeCrossProcessThreadViolations(state); } @Test public void timeCrossBinderThreadViolationNoStrictMode() throws Exception { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); causeCrossProcessThreadViolations(state); } private static void causeCrossProcessThreadViolations(BenchmarkState state) throws ExecutionException, InterruptedException, RemoteException { final Context context = InstrumentationRegistry.getTargetContext(); SettableFuture<IBinder> binder = SettableFuture.create(); ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { binder.set(service); } @Override public void onServiceDisconnected(ComponentName arg0) { binder.set(null); } }; context.bindService( new Intent(context, SomeService.class), connection, Context.BIND_AUTO_CREATE); ISomeService someService = ISomeService.Stub.asInterface(binder.get()); while (state.keepRunning()) { // Violate strictmode heavily. someService.readDisk(10); } context.unbindService(connection); } } Loading
apct-tests/perftests/core/Android.mk +4 −1 Original line number Diff line number Diff line Loading @@ -4,11 +4,14 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ src/android/os/ISomeService.aidl LOCAL_STATIC_JAVA_LIBRARIES := \ android-support-test \ apct-perftests-utils \ guava \ legacy-android-test LOCAL_PACKAGE_NAME := CorePerfTests Loading
apct-tests/perftests/core/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ <application> <uses-library android:name="android.test.runner" /> <activity android:name="android.perftests.utils.StubActivity" /> <service android:name="android.os.SomeService" android:exported="false" android:process=":some_service" /> </application> <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner" Loading
apct-tests/perftests/core/src/android/os/ISomeService.aidl 0 → 100644 +5 −0 Original line number Diff line number Diff line package android.os; interface ISomeService { void readDisk(int times); } No newline at end of file
apct-tests/perftests/core/src/android/os/SomeService.java 0 → 100644 +42 −0 Original line number Diff line number Diff line package android.os; import android.app.Service; import android.content.Intent; import java.io.File; import java.io.IOException; /** Service in separate process available for calling over binder. */ public class SomeService extends Service { private File mTempFile; @Override public void onCreate() { super.onCreate(); try { mTempFile = File.createTempFile("foo", "bar"); } catch (IOException e) { throw new RuntimeException(e); } } private final ISomeService.Stub mBinder = new ISomeService.Stub() { public void readDisk(int times) { for (int i = 0; i < times; i++) { mTempFile.exists(); } } }; @Override public IBinder onBind(Intent intent) { return mBinder; } @Override public void onDestroy() { super.onDestroy(); mTempFile.delete(); } }
apct-tests/perftests/core/src/android/os/StrictModeTest.java 0 → 100644 +127 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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 android.os; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.net.Uri; import android.perftests.utils.BenchmarkState; import android.perftests.utils.PerfStatusReporter; import android.support.test.InstrumentationRegistry; import android.support.test.filters.LargeTest; import android.support.test.runner.AndroidJUnit4; import com.google.common.util.concurrent.SettableFuture; import java.io.File; import java.io.IOException; import java.util.concurrent.ExecutionException; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @LargeTest public class StrictModeTest { @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); @Test public void timeVmViolation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build()); causeVmViolations(state); } @Test public void timeVmViolationNoStrictMode() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); causeVmViolations(state); } private static void causeVmViolations(BenchmarkState state) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.parse("content://com.example/foobar"), "image/jpeg"); final Context context = InstrumentationRegistry.getTargetContext(); while (state.keepRunning()) { context.startActivity(intent); } } @Test public void timeThreadViolation() throws IOException { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); StrictMode.setThreadPolicy( new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build()); causeThreadViolations(state); } @Test public void timeThreadViolationNoStrictMode() throws IOException { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); causeThreadViolations(state); } private static void causeThreadViolations(BenchmarkState state) throws IOException { final File test = File.createTempFile("foo", "bar"); while (state.keepRunning()) { test.exists(); } test.delete(); } @Test public void timeCrossBinderThreadViolation() throws Exception { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); StrictMode.setThreadPolicy( new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build()); causeCrossProcessThreadViolations(state); } @Test public void timeCrossBinderThreadViolationNoStrictMode() throws Exception { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); causeCrossProcessThreadViolations(state); } private static void causeCrossProcessThreadViolations(BenchmarkState state) throws ExecutionException, InterruptedException, RemoteException { final Context context = InstrumentationRegistry.getTargetContext(); SettableFuture<IBinder> binder = SettableFuture.create(); ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { binder.set(service); } @Override public void onServiceDisconnected(ComponentName arg0) { binder.set(null); } }; context.bindService( new Intent(context, SomeService.class), connection, Context.BIND_AUTO_CREATE); ISomeService someService = ISomeService.Stub.asInterface(binder.get()); while (state.keepRunning()) { // Violate strictmode heavily. someService.readDisk(10); } context.unbindService(connection); } }