Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1767ab6d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Perftests for StrictMode"

parents 893798e2 714abd36
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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"
+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
+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();
    }
}
+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);
    }
}