partially move jank tests to instrumentation based
* created an updated CtsJankTestBase class to include common
metrics reporting tasks
* converted scrolling jank test to instrumentation based
* OpenGL jank test not converted yet due to framework issue
with getting frame stats from SurfaceView
Change-Id: I4e33ec46eeca777b5e5fea74bd2a6df9bb998ab8
diff --git a/CtsTestCaseList.mk b/CtsTestCaseList.mk
index 392a04b..f382227 100644
--- a/CtsTestCaseList.mk
+++ b/CtsTestCaseList.mk
@@ -128,6 +128,7 @@
CtsGraphicsTestCases \
CtsGraphics2TestCases \
CtsHardwareTestCases \
+ CtsJankTestCases \
CtsJobSchedulerDeviceTestCases \
CtsJniTestCases \
CtsKeystoreTestCases \
diff --git a/suite/cts/deviceTests/jank2/Android.mk b/suite/cts/deviceTests/jank2/Android.mk
new file mode 100644
index 0000000..346297e
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/Android.mk
@@ -0,0 +1,29 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsJankTestCases
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner ub-uiautomator ub-janktesthelper
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/suite/cts/deviceTests/jank2/AndroidManifest.xml b/suite/cts/deviceTests/jank2/AndroidManifest.xml
new file mode 100644
index 0000000..a4c8337
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/AndroidManifest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.cts.jank">
+
+ <application>
+ <uses-library android:name="android.test.runner"/>
+ </application>
+
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="android.cts.jank"
+ android:label="Jank tests">
+ <meta-data android:name="listener"
+ android:value="com.android.cts.runner.CtsTestRunListener" />
+ </instrumentation>
+
+</manifest>
diff --git a/suite/cts/deviceTests/jank2/AndroidTest.xml b/suite/cts/deviceTests/jank2/AndroidTest.xml
new file mode 100644
index 0000000..2fbbac7
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/AndroidTest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="CTS Jank test config">
+ <include name="common-config" />
+ <option name="cts-apk-installer:test-file-name" value="CtsDeviceUi.apk" />
+</configuration>
diff --git a/suite/cts/deviceTests/jank2/src/android/cts/jank/CtsJankTestBase.java b/suite/cts/deviceTests/jank2/src/android/cts/jank/CtsJankTestBase.java
new file mode 100644
index 0000000..cb5c122
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/src/android/cts/jank/CtsJankTestBase.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2015 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.cts.jank;
+
+import android.cts.util.DeviceReportLog;
+import android.os.Bundle;
+import android.support.test.jank.JankTestBase;
+import android.support.test.jank.WindowContentFrameStatsMonitor;
+import android.support.test.uiautomator.UiDevice;
+
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+
+public abstract class CtsJankTestBase extends JankTestBase {
+
+ private UiDevice mDevice;
+ private DeviceReportLog mLog;
+
+ @Override
+ public void afterTest(Bundle metrics) {
+ String source = String.format("%s#%s", getClass().getCanonicalName(), getName());
+ mLog.printValue(source, WindowContentFrameStatsMonitor.KEY_AVG_FPS,
+ metrics.getDouble(WindowContentFrameStatsMonitor.KEY_AVG_FPS),
+ ResultType.HIGHER_BETTER, ResultUnit.FPS);
+ mLog.printValue(source, WindowContentFrameStatsMonitor.KEY_AVG_LONGEST_FRAME,
+ metrics.getDouble(WindowContentFrameStatsMonitor.KEY_AVG_LONGEST_FRAME),
+ ResultType.LOWER_BETTER, ResultUnit.MS);
+ mLog.printValue(source, WindowContentFrameStatsMonitor.KEY_MAX_NUM_JANKY,
+ metrics.getInt(WindowContentFrameStatsMonitor.KEY_MAX_NUM_JANKY),
+ ResultType.LOWER_BETTER, ResultUnit.COUNT);
+ mLog.printSummary(WindowContentFrameStatsMonitor.KEY_AVG_NUM_JANKY,
+ metrics.getDouble(WindowContentFrameStatsMonitor.KEY_AVG_NUM_JANKY),
+ ResultType.LOWER_BETTER, ResultUnit.COUNT);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mLog = new DeviceReportLog();
+ // fix device orientation
+ mDevice = UiDevice.getInstance(getInstrumentation());
+ mDevice.setOrientationNatural();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ mLog.deliverReportToHost(getInstrumentation());
+ // restore device orientation
+ mDevice.unfreezeRotation();
+ super.tearDown();
+ }
+
+ protected UiDevice getUiDevice() {
+ return mDevice;
+ }
+}
diff --git a/suite/cts/deviceTests/jank2/src/android/cts/jank/ui/CtsDeviceJankUi.java b/suite/cts/deviceTests/jank2/src/android/cts/jank/ui/CtsDeviceJankUi.java
new file mode 100644
index 0000000..884f83c
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/src/android/cts/jank/ui/CtsDeviceJankUi.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015 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.cts.jank.ui;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.cts.jank.CtsJankTestBase;
+import android.os.SystemClock;
+import android.support.test.jank.JankTest;
+import android.support.test.jank.WindowContentFrameStatsMonitor;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.Direction;
+import android.support.test.uiautomator.Until;
+import android.widget.ListView;
+
+import java.io.IOException;
+
+public class CtsDeviceJankUi extends CtsJankTestBase {
+ private final static int NUM_ELEMENTS = 1000;
+ private static final long DEFAULT_ANIMATION_TIME = 2 * 1000;
+ private static final long POST_SCROLL_IDLE_TIME = 2 *1000;
+ private final static String PACKAGE = "com.android.cts.ui";
+ private final static String CLASS = PACKAGE + ".ScrollingActivity";
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ // launch the activity as part of the set up
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setComponent(new ComponentName(PACKAGE, CLASS));
+ intent.putExtra("num_elements", NUM_ELEMENTS);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ getInstrumentation().getTargetContext().startActivity(intent);
+ getUiDevice().wait(Until.hasObject(By.pkg(PACKAGE)), DEFAULT_ANIMATION_TIME);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ getUiDevice().pressHome();
+ super.tearDown();
+ }
+
+ @JankTest(expectedFrames=50, defaultIterationCount=5)
+ @WindowContentFrameStatsMonitor
+ public void testScrolling() throws IOException {
+ getUiDevice().findObject(By.clazz(ListView.class)).fling(Direction.DOWN);
+ SystemClock.sleep(POST_SCROLL_IDLE_TIME);
+ }
+}
diff --git a/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java b/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java
deleted file mode 100644
index ea1f685..0000000
--- a/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2013 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.jank.ui;
-
-import android.util.Log;
-import android.widget.ListView;
-
-import com.android.cts.jank.CtsJankTestBase;
-import com.android.uiautomator.core.UiScrollable;
-import com.android.uiautomator.core.UiSelector;
-import com.android.uiautomator.platform.SurfaceFlingerHelper;
-
-public class CtsDeviceJankUi extends CtsJankTestBase {
- private final static String TAG = CtsDeviceJankUi.class.getName();
- private final static String PACKAGE = "com.android.cts.ui";
- private final static String COMPONENT =
- PACKAGE + "/" + PACKAGE + ".ScrollingActivity";
- private final static int NUM_ELEMENTS = 1000;
- private static String APP_WINDOW_NAME = COMPONENT;
-
- // TODO(stuartscott): expand deviceTests/ui app to have a more complex UI
- /**
- * Runs the ScrollingActivity and measures jank during a scroll.
- */
- public void testScrolling() throws Exception {
- // Start activity command
- final StringBuilder sb = new StringBuilder();
- sb.append(String.format(START_CMD, COMPONENT));
- sb.append(String.format(INTENT_INTEGER_EXTRA, "num_elements", NUM_ELEMENTS));
- final String startCommand = sb.toString();
- final String stopCommand = String.format(STOP_CMD, PACKAGE);
-
- Log.i(TAG, "Start command: " + startCommand);
- Log.i(TAG, "Stop command: " + stopCommand);
-
- setIteration(NUM_ITERATIONS);
- for (int i = 0; i < NUM_ITERATIONS; i++) {
- // Stop any existing instances
- runShellCommand(stopCommand);
- // Start activity
- runShellCommand(startCommand);
-
- // Wait for the activity to start
- sleep(SLEEP_TIME / 2);
-
- UiScrollable list = new UiScrollable(
- new UiSelector().className(ListView.class.getName()));
-
- // Start systrace
- startTrace(mTestCaseName, i);
-
- // Clear SurfaceFlinger buffer
- Log.i(TAG, "Clearing SurfaceFlinger buffer");
- SurfaceFlingerHelper.clearBuffer(APP_WINDOW_NAME);
-
- list.flingToEnd(2);
-
- // Dump SurfaceFlinger buffer
- Log.i(TAG, "Dumping SurfaceFlinger buffer");
- boolean result = SurfaceFlingerHelper.dumpFrameLatency(APP_WINDOW_NAME, true);
- assertTrue("SurfaceFlingerHelper could not get timestamps", result);
-
- // Stop systrace
- endTrace();
-
- // Record results
- recordResults(mTestCaseName, i);
- }
- // Save aggregated results
- saveResults(mTestCaseName);
- // Stop any remaining instances
- runShellCommand(stopCommand);
- }
-}
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
deleted file mode 100644
index a07171e..0000000
--- a/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2013 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.jank.ui;
-
-import com.android.cts.jank.CtsHostJankTest;
-import com.android.cts.util.AbiUtils;
-import java.io.File;
-
-public class CtsHostJankUi extends CtsHostJankTest {
-
- private static final String APK_PACKAGE = "com.android.cts";
- private static final String APK = "CtsDeviceUi.apk";
- private static final String PACKAGE = "com.android.cts.jank.ui";
- private static final String HOST_CLASS = CtsHostJankUi.class.getName();
- private static final String DEVICE_CLASS = PACKAGE + ".CtsDeviceJankUi";
- private static final String JAR_NAME = "CtsDeviceJank.jar";
-
- public CtsHostJankUi() {
- super(JAR_NAME, DEVICE_CLASS, HOST_CLASS);
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- // Install the app.
- mDevice.uninstallPackage(APK_PACKAGE);
- File app = mBuild.getTestApp(APK);
- String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
- mDevice.installPackage(app, false, options);
- }
-
- @Override
- protected void tearDown() throws Exception {
- // Uninstall the app.
- mDevice.uninstallPackage(APK_PACKAGE);
- super.tearDown();
- }
-
- public void testScrolling() throws Exception {
- runUiAutomatorTest("testScrolling");
- }
-}
diff --git a/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java b/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
index 94761fb..fb6691d 100644
--- a/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
+++ b/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
@@ -89,6 +89,7 @@
List<String> classPath = new ArrayList<String>();
classPath.add("./prebuilts/misc/common/tradefed/tradefed-prebuilt.jar");
classPath.add("./prebuilts/misc/common/ub-uiautomator/ub-uiautomator.jar");
+ classPath.add("./prebuilts/misc/common/ub-janktesthelper/ub-janktesthelper.jar");
return join(classPath, ":");
}
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 4d04e1a..31229b1 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -335,6 +335,7 @@
'com.android.cts.dram' : [],
'com.android.cts.filesystemperf' : [],
'com.android.cts.jank' : [],
+ 'com.android.cts.jank2' : [],
'com.android.cts.opengl' : [],
'com.android.cts.simplecpu' : [],
'com.android.cts.ui' : [],