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

Commit 55ca1f4c authored by gopinath's avatar gopinath Committed by Gopinath Elanchezhian
Browse files

Add support for hot launch in App launch test.

force-stop-app option is added to control hot launch and
cold launch.

Bug: b/73091210

Test:
am instrument -w -r   -e debug false -e launch_directory /sdcard
-e apps "Calculator^Calculator|Clock^Clock" -e trial_launch true
-e log false -e timeout_msec 300000 -e force-stop-app false
-e launch_order CYCLIC -e simpleperf_cmd "simpleperf stat -a"
-e launch_iterations 10 com.android.tests.applaunch/android.test.InstrumentationTestRunner

Change-Id: I4b0f7a61c46e8091e69cad9fa65b5b34f680252d
parent 0f3f71f4
Loading
Loading
Loading
Loading
+46 −20
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ public class AppLaunch extends InstrumentationTestCase {
    private static final String KEY_TRACE_BUFFERSIZE = "trace_bufferSize";
    private static final String KEY_TRACE_DUMPINTERVAL = "tracedump_interval";
    private static final String KEY_COMPILER_FILTERS = "compiler_filters";
    private static final String KEY_FORCE_STOP_APP = "force_stop_app";

    private static final String SIMPLEPERF_APP_CMD =
            "simpleperf --log fatal stat --csv -e cpu-cycles,major-faults --app %s & %s";
@@ -103,6 +104,7 @@ public class AppLaunch extends InstrumentationTestCase {
    private static final String DROP_CACHE_SCRIPT = "/data/local/tmp/dropCache.sh";
    private static final String APP_LAUNCH_CMD = "am start -W -n";
    private static final String SUCCESS_MESSAGE = "Status: ok";
    private static final String WARNING_MESSAGE = "Warning:";
    private static final String COMPILE_SUCCESS = "Success";
    private static final String THIS_TIME = "ThisTime:";
    private static final String LAUNCH_ITERATION = "LAUNCH_ITERATION - %d";
@@ -125,6 +127,7 @@ public class AppLaunch extends InstrumentationTestCase {
    private String mLaunchOrder = null;
    private boolean mDropCache = false;
    private int mLaunchIterations = 10;
    private boolean mForceStopApp = true;
    private int mTraceLaunchCount = 0;
    private String mTraceDirectoryStr = null;
    private Bundle mResult = new Bundle();
@@ -246,7 +249,7 @@ public class AppLaunch extends InstrumentationTestCase {
                    // We only need to run a trial for the speed-profile filter, but we always
                    // run one for "applaunch.txt" consistency.
                    AppLaunchResult launchResult =
                        startApp(launch.getApp(), true, launch.getLaunchReason());
                        startApp(launch.getApp(), launch.getLaunchReason());
                    if (launchResult.mLaunchTime < 0) {
                        addLaunchResult(launch, new AppLaunchResult());
                        // simply pass the app if launch isn't successful
@@ -274,7 +277,7 @@ public class AppLaunch extends InstrumentationTestCase {
                    }
                    // In the "applaunch.txt" file app launches are referenced using
                    // "LAUNCH_ITERATION - ITERATION NUM"
                    launchResults = startApp(launch.getApp(), true, launch.getLaunchReason());
                    launchResults = startApp(launch.getApp(), launch.getLaunchReason());
                    if (launchResults.mLaunchTime < 0) {
                        addLaunchResult(launch, new AppLaunchResult());
                        // if it fails once, skip the rest of the launches
@@ -295,14 +298,18 @@ public class AppLaunch extends InstrumentationTestCase {
                        atraceLogger.atraceStart(traceCategoriesSet, traceBufferSize,
                                traceDumpInterval, rootTraceSubDir,
                                String.format("%s-%s", launch.getApp(), launch.getLaunchReason()));
                        startApp(launch.getApp(), true, launch.getLaunchReason());
                        startApp(launch.getApp(), launch.getLaunchReason());
                        sleep(POST_LAUNCH_IDLE_TIMEOUT);
                    } finally {
                        // Stop the trace
                        atraceLogger.atraceStop();
                    }
                }
                if(mForceStopApp) {
                    closeApp(launch.getApp());
                } else {
                    startHomeIntent();
                }
                sleep(BETWEEN_LAUNCH_SLEEP_TIMEOUT);
            }
        } finally {
@@ -425,6 +432,10 @@ public class AppLaunch extends InstrumentationTestCase {
        if (launchIterations != null) {
            mLaunchIterations = Integer.parseInt(launchIterations);
        }
        String forceStopApp = args.getString(KEY_FORCE_STOP_APP);
        if (forceStopApp != null) {
            mForceStopApp = Boolean.parseBoolean(forceStopApp);
        }
        String appList = args.getString(KEY_APPS);
        if (appList == null)
            return;
@@ -522,8 +533,8 @@ public class AppLaunch extends InstrumentationTestCase {
        }
    }

    private AppLaunchResult startApp(String appName, boolean forceStopBeforeLaunch,
            String launchReason) throws NameNotFoundException, RemoteException {
    private AppLaunchResult startApp(String appName, String launchReason)
            throws NameNotFoundException, RemoteException {
        Log.i(TAG, "Starting " + appName);

        Intent startIntent = mNameToIntent.get(appName);
@@ -532,8 +543,7 @@ public class AppLaunch extends InstrumentationTestCase {
            mResult.putString(mNameToResultKey.get(appName), "App does not exist");
            return new AppLaunchResult();
        }
        AppLaunchRunnable runnable = new AppLaunchRunnable(startIntent, forceStopBeforeLaunch,
                launchReason);
        AppLaunchRunnable runnable = new AppLaunchRunnable(startIntent, launchReason);
        Thread t = new Thread(runnable);
        t.start();
        try {
@@ -682,13 +692,10 @@ public class AppLaunch extends InstrumentationTestCase {
    private class AppLaunchRunnable implements Runnable {
        private Intent mLaunchIntent;
        private AppLaunchResult mLaunchResult;
        private boolean mForceStopBeforeLaunch;
        private String mLaunchReason;

        public AppLaunchRunnable(Intent intent, boolean forceStopBeforeLaunch,
                String launchReason) {
        public AppLaunchRunnable(Intent intent, String launchReason) {
            mLaunchIntent = intent;
            mForceStopBeforeLaunch = forceStopBeforeLaunch;
            mLaunchReason = launchReason;
            mLaunchResult = new AppLaunchResult();
        }
@@ -702,7 +709,7 @@ public class AppLaunch extends InstrumentationTestCase {
            try {
                String packageName = mLaunchIntent.getComponent().getPackageName();
                String componentName = mLaunchIntent.getComponent().flattenToShortString();
                if (mForceStopBeforeLaunch) {
                if (mForceStopApp) {
                    mAm.forceStopPackage(packageName, UserHandle.USER_CURRENT);
                }
                String launchCmd = String.format("%s %s", APP_LAUNCH_CMD, componentName);
@@ -752,10 +759,11 @@ public class AppLaunch extends InstrumentationTestCase {
            String launchTime = "-1";
            String cpuCycles = "-1";
            String majorFaults = "-1";
            boolean launchSuccess = false;
            boolean coldLaunchSuccess = false;
            boolean hotLaunchSuccess = false;
            try {
                InputStream inputStream = new FileInputStream(parcelDesc.getFileDescriptor());
                /* SAMPLE OUTPUT :
                /* SAMPLE OUTPUT : Cold launch
                Starting: Intent { cmp=com.google.android.calculator/com.android.calculator2.Calculator }
                Status: ok
                Activity: com.google.android.calculator/com.android.calculator2.Calculator
@@ -763,6 +771,15 @@ public class AppLaunch extends InstrumentationTestCase {
                TotalTime: 357
                WaitTime: 377
                Complete*/
                /* SAMPLE OUTPUT : Hot launch
                Starting: Intent { cmp=com.google.android.calculator/com.android.calculator2.Calculator }
                Warning: Activity not started, its current task has been brought to the front
                Status: ok
                Activity: com.google.android.calculator/com.android.calculator2.CalculatorGoogle
                ThisTime: 60
                TotalTime: 60
                WaitTime: 67
                Complete*/
                /* WITH SIMPLEPERF :
                Performance counter statistics,
                6595722690,cpu-cycles,4.511040,GHz,(100%),
@@ -776,24 +793,33 @@ public class AppLaunch extends InstrumentationTestCase {
                mBufferedWriter.write(headerInfo);
                mBufferedWriter.newLine();
                while ((line = bufferedReader.readLine()) != null) {
                    if (lineCount == 2 && line.contains(SUCCESS_MESSAGE)) {
                        launchSuccess = true;
                    if (lineCount == 2 && line.startsWith(SUCCESS_MESSAGE)) {
                        coldLaunchSuccess = true;
                    }
                    if (lineCount == 2 && line.startsWith(WARNING_MESSAGE)) {
                        hotLaunchSuccess = true;
                    }
                    // Parse TotalTime which is the launch time
                    if (launchSuccess && lineCount == 5) {
                    if (coldLaunchSuccess && lineCount == 5) {
                        String launchSplit[] = line.split(":");
                        launchTime = launchSplit[1].trim();
                    }
                    if (hotLaunchSuccess && lineCount == 6) {
                        String launchSplit[] = line.split(":");
                        launchTime = launchSplit[1].trim();
                    }

                    if (mSimplePerfAppOnly) {
                        // Parse simpleperf output.
                        if (lineCount == 9) {
                        if ((lineCount == 9 && coldLaunchSuccess)
                                || (lineCount == 10 && hotLaunchSuccess)) {
                            if (!line.contains("cpu-cycles")) {
                                Log.e(TAG, "Error in simpleperf output");
                            } else {
                                cpuCycles = line.split(",")[0].trim();
                            }
                        } else if (lineCount == 10) {
                        } else if ((lineCount == 10 && coldLaunchSuccess)
                                || (lineCount == 11 && hotLaunchSuccess)) {
                            if (!line.contains("major-faults")) {
                                Log.e(TAG, "Error in simpleperf output");
                            } else {