1ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project/* 2ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * 4ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * you may not use this file except in compliance with the License. 6ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * You may obtain a copy of the License at 7ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * 8ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * 10ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * See the License for the specific language governing permissions and 14ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * limitations under the License. 15ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project */ 16ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 17ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectpackage com.android.dumprendertree; 18ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 19f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhuimport com.android.dumprendertree.forwarder.AdbUtils; 20f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhuimport com.android.dumprendertree.forwarder.ForwardServer; 21f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu 22ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.app.Instrumentation; 230006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhuimport android.content.Context; 24ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.content.Intent; 25ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.os.Bundle; 26b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport android.os.Debug; 278b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauerimport android.os.Environment; 2840656be65870932592daf070c7cbbc382dda67b5Guang Zhuimport android.os.Process; 29ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2; 3040656be65870932592daf070c7cbbc382dda67b5Guang Zhuimport android.util.Log; 31ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 320006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhuimport java.io.File; 33ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileOutputStream; 34ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.IOException; 35b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport java.io.InputStream; 36b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport java.io.OutputStream; 37b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport java.io.PrintStream; 385794f2302209981c64425ea2b661b17f00b8f808Guang Zhuimport java.util.concurrent.CountDownLatch; 395794f2302209981c64425ea2b661b17f00b8f808Guang Zhuimport java.util.concurrent.TimeUnit; 40f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhuimport java.util.regex.Matcher; 41f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhuimport java.util.regex.Pattern; 42ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 43ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectpublic class LoadTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> { 44ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 45ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private final static String LOGTAG = "LoadTest"; 468b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer private final static String LOAD_TEST_RESULT = 478b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer Environment.getExternalStorageDirectory() + "/load_test_result.txt"; 485794f2302209981c64425ea2b661b17f00b8f808Guang Zhu private final static int MAX_GC_WAIT_SEC = 10; 49f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu private final static int LOCAL_PORT = 17171; 50b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu private boolean mFinished; 51b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu static final String LOAD_TEST_RUNNER_FILES[] = { 52b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu "run_page_cycler.py" 534010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu }; 54f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu private ForwardServer mForwardServer; 55b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 56ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public LoadTestsAutoTest() { 57f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu super(TestShellActivity.class); 58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 59ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 60ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // This function writes the result of the layout test to 61ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Am status so that it can be picked up from a script. 62ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void passOrFailCallback(String file, boolean result) { 63ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Instrumentation inst = getInstrumentation(); 64ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Bundle bundle = new Bundle(); 65ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project bundle.putBoolean(file, result); 66ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project inst.sendStatus(0, bundle); 67ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 68b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 69f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu private String setUpForwarding(String forwardInfo, String suite, String iteration) throws IOException { 70f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu // read forwarding information first 71f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu Pattern forwardPattern = Pattern.compile("(.*):(\\d+)/(.*)/"); 72f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu Matcher matcher = forwardPattern.matcher(forwardInfo); 73f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu if (!matcher.matches()) { 74f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu throw new RuntimeException("Invalid forward information"); 75f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu } 76f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu String host = matcher.group(1); 77f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu int port = Integer.parseInt(matcher.group(2)); 78f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu mForwardServer = new ForwardServer(LOCAL_PORT, AdbUtils.resolve(host), port); 79f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu mForwardServer.start(); 80f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu return String.format("http://127.0.0.1:%d/%s/%s/start.html?auto=1&iterations=%s", 81f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu LOCAL_PORT, matcher.group(3), suite, iteration); 82f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu } 83f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu 84ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Invokes running of layout tests 85ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // and waits till it has finished running. 86f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu public void runPageCyclerTest() throws IOException { 87ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation(); 88ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 89f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu if (runner.mPageCyclerSuite != null) { 90f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu // start forwarder to use page cycler suites hosted on external web server 91f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu if (runner.mPageCyclerForwardHost == null) { 92f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu throw new RuntimeException("no forwarder information provided"); 93f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu } 94f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu runner.mTestPath = setUpForwarding(runner.mPageCyclerForwardHost, 95f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu runner.mPageCyclerSuite, runner.mPageCyclerIteration); 96f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu Log.d(LOGTAG, "using path: " + runner.mTestPath); 97f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu } 98f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu 99ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (runner.mTestPath == null) { 100f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu throw new RuntimeException("No test specified"); 101ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 102b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 103c1635bf14ea1e7b388959b263bc21c0d8d77cda3Guang Zhu final TestShellActivity activity = (TestShellActivity) getActivity(); 104ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 1052a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu Log.v(LOGTAG, "About to run tests, calling gc first..."); 10640656be65870932592daf070c7cbbc382dda67b5Guang Zhu freeMem(); 1072a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu 108ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Run tests 1095dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis, 1105dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu runner.mGetDrawTime, runner.mSaveImagePath); 111ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 112c1635bf14ea1e7b388959b263bc21c0d8d77cda3Guang Zhu getInstrumentation().runOnMainSync(new Runnable() { 113c1635bf14ea1e7b388959b263bc21c0d8d77cda3Guang Zhu 114c1635bf14ea1e7b388959b263bc21c0d8d77cda3Guang Zhu @Override 115c1635bf14ea1e7b388959b263bc21c0d8d77cda3Guang Zhu public void run() { 116c1635bf14ea1e7b388959b263bc21c0d8d77cda3Guang Zhu activity.clearCache(); 117c1635bf14ea1e7b388959b263bc21c0d8d77cda3Guang Zhu } 118c1635bf14ea1e7b388959b263bc21c0d8d77cda3Guang Zhu }); 119f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu if (mForwardServer != null) { 120f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu mForwardServer.stop(); 121f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu mForwardServer = null; 122f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu } 1231f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu try { 1241f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu Thread.sleep(5000); 1251f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu } catch (InterruptedException e) { 1261f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu } 127b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu dumpMemoryInfo(); 128b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 129ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Kill activity 130ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.finish(); 131ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 132ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 13340656be65870932592daf070c7cbbc382dda67b5Guang Zhu private void freeMem() { 1343974be616399c144485e218ab6ed24dd922665f1Guang Zhu Log.v(LOGTAG, "freeMem: calling gc..."); 1355794f2302209981c64425ea2b661b17f00b8f808Guang Zhu final CountDownLatch latch = new CountDownLatch(1); 136f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu @SuppressWarnings("unused") 1375794f2302209981c64425ea2b661b17f00b8f808Guang Zhu Object dummy = new Object() { 138f6d1b3f125b06fcc4847be3cfb35e8ce21905676Guang Zhu // this object instance is used to track gc 1395794f2302209981c64425ea2b661b17f00b8f808Guang Zhu @Override 1405794f2302209981c64425ea2b661b17f00b8f808Guang Zhu protected void finalize() throws Throwable { 1415794f2302209981c64425ea2b661b17f00b8f808Guang Zhu latch.countDown(); 1425794f2302209981c64425ea2b661b17f00b8f808Guang Zhu super.finalize(); 1435794f2302209981c64425ea2b661b17f00b8f808Guang Zhu } 1445794f2302209981c64425ea2b661b17f00b8f808Guang Zhu }; 1455794f2302209981c64425ea2b661b17f00b8f808Guang Zhu dummy = null; 1465794f2302209981c64425ea2b661b17f00b8f808Guang Zhu System.gc(); 1475794f2302209981c64425ea2b661b17f00b8f808Guang Zhu try { 1485794f2302209981c64425ea2b661b17f00b8f808Guang Zhu if (!latch.await(MAX_GC_WAIT_SEC, TimeUnit.SECONDS)) { 1495794f2302209981c64425ea2b661b17f00b8f808Guang Zhu Log.w(LOGTAG, "gc did not happen in 10s"); 1505794f2302209981c64425ea2b661b17f00b8f808Guang Zhu } 1515794f2302209981c64425ea2b661b17f00b8f808Guang Zhu } catch (InterruptedException e) { 1525794f2302209981c64425ea2b661b17f00b8f808Guang Zhu //ignore 1535794f2302209981c64425ea2b661b17f00b8f808Guang Zhu } 15440656be65870932592daf070c7cbbc382dda67b5Guang Zhu } 15540656be65870932592daf070c7cbbc382dda67b5Guang Zhu 15640656be65870932592daf070c7cbbc382dda67b5Guang Zhu private void printRow(PrintStream ps, String format, Object...objs) { 15740656be65870932592daf070c7cbbc382dda67b5Guang Zhu ps.println(String.format(format, objs)); 15840656be65870932592daf070c7cbbc382dda67b5Guang Zhu } 15940656be65870932592daf070c7cbbc382dda67b5Guang Zhu 160b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu private void dumpMemoryInfo() { 161ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 16240656be65870932592daf070c7cbbc382dda67b5Guang Zhu freeMem(); 163b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu Log.v(LOGTAG, "Dumping memory information."); 164b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 165ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project FileOutputStream out = new FileOutputStream(LOAD_TEST_RESULT, true); 166b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu PrintStream ps = new PrintStream(out); 167b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 168b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.print("\n\n\n"); 16940656be65870932592daf070c7cbbc382dda67b5Guang Zhu ps.println("** MEMINFO in pid " + Process.myPid() 17040656be65870932592daf070c7cbbc382dda67b5Guang Zhu + " [com.android.dumprendertree] **"); 17140656be65870932592daf070c7cbbc382dda67b5Guang Zhu String formatString = "%17s %8s %8s %8s %8s"; 17240656be65870932592daf070c7cbbc382dda67b5Guang Zhu 17340656be65870932592daf070c7cbbc382dda67b5Guang Zhu long nativeMax = Debug.getNativeHeapSize() / 1024; 17440656be65870932592daf070c7cbbc382dda67b5Guang Zhu long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024; 17540656be65870932592daf070c7cbbc382dda67b5Guang Zhu long nativeFree = Debug.getNativeHeapFreeSize() / 1024; 17640656be65870932592daf070c7cbbc382dda67b5Guang Zhu Runtime runtime = Runtime.getRuntime(); 17740656be65870932592daf070c7cbbc382dda67b5Guang Zhu long dalvikMax = runtime.totalMemory() / 1024; 17840656be65870932592daf070c7cbbc382dda67b5Guang Zhu long dalvikFree = runtime.freeMemory() / 1024; 17940656be65870932592daf070c7cbbc382dda67b5Guang Zhu long dalvikAllocated = dalvikMax - dalvikFree; 18040656be65870932592daf070c7cbbc382dda67b5Guang Zhu 18140656be65870932592daf070c7cbbc382dda67b5Guang Zhu 18240656be65870932592daf070c7cbbc382dda67b5Guang Zhu Debug.MemoryInfo memInfo = new Debug.MemoryInfo(); 18340656be65870932592daf070c7cbbc382dda67b5Guang Zhu Debug.getMemoryInfo(memInfo); 18440656be65870932592daf070c7cbbc382dda67b5Guang Zhu 18540656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int nativeShared = memInfo.nativeSharedDirty; 18640656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int dalvikShared = memInfo.dalvikSharedDirty; 18740656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int otherShared = memInfo.otherSharedDirty; 18840656be65870932592daf070c7cbbc382dda67b5Guang Zhu 18940656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int nativePrivate = memInfo.nativePrivateDirty; 19040656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int dalvikPrivate = memInfo.dalvikPrivateDirty; 19140656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int otherPrivate = memInfo.otherPrivateDirty; 19240656be65870932592daf070c7cbbc382dda67b5Guang Zhu 19340656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "", "native", "dalvik", "other", "total"); 19440656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "size:", nativeMax, dalvikMax, "N/A", nativeMax + dalvikMax); 19540656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "allocated:", nativeAllocated, dalvikAllocated, "N/A", 19640656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativeAllocated + dalvikAllocated); 19740656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "free:", nativeFree, dalvikFree, "N/A", 19840656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativeFree + dalvikFree); 19940656be65870932592daf070c7cbbc382dda67b5Guang Zhu 20040656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "(Pss):", memInfo.nativePss, memInfo.dalvikPss, 20140656be65870932592daf070c7cbbc382dda67b5Guang Zhu memInfo.otherPss, memInfo.nativePss + memInfo.dalvikPss + memInfo.otherPss); 20240656be65870932592daf070c7cbbc382dda67b5Guang Zhu 20340656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "(shared dirty):", nativeShared, dalvikShared, otherShared, 20440656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativeShared + dalvikShared + otherShared); 20540656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "(priv dirty):", nativePrivate, dalvikPrivate, otherPrivate, 20640656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativePrivate + dalvikPrivate + otherPrivate); 207b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.print("\n\n\n"); 208b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.flush(); 209b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.close(); 210b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.flush(); 211b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.close(); 212ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (IOException e) { 213ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, e.getMessage()); 214b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 215ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 216b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 217ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // A convenient method to be called by another activity. 2185dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu private void runTestAndWaitUntilDone(TestShellActivity activity, String url, int timeout, 2195dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu boolean getDrawTime, String saveImagePath) { 220ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.setCallback(new TestShellCallback() { 221ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void finished() { 222ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (LoadTestsAutoTest.this) { 223b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu mFinished = true; 224ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LoadTestsAutoTest.this.notifyAll(); 225ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 226b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 22740656be65870932592daf070c7cbbc382dda67b5Guang Zhu 2284010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu public void timedOut(String url) { 2294010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu } 230ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project }); 231b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 232b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu mFinished = false; 233ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 234ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.setClass(activity, TestShellActivity.class); 235ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 236ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.TEST_URL, url); 237ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout); 238ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.RESULT_FILE, LOAD_TEST_RESULT); 2395dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu intent.putExtra(TestShellActivity.GET_DRAW_TIME, getDrawTime); 2405dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu if (saveImagePath != null) 2415dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu intent.putExtra(TestShellActivity.SAVE_IMAGE, saveImagePath); 242ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.startActivity(intent); 243b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 244ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Wait until done. 245ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (this) { 246b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu while(!mFinished) { 247b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu try { 248b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu this.wait(); 249b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } catch (InterruptedException e) { } 250b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 251ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 252b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 253b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 254b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu public void copyRunnerAssetsToCache() { 255b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu try { 2560006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhu Context targetContext = getInstrumentation().getTargetContext(); 2570006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhu File cacheDir = targetContext.getCacheDir(); 258b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 259b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu for( int i=0; i< LOAD_TEST_RUNNER_FILES.length; i++) { 2600006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhu InputStream in = targetContext.getAssets().open( 261b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu LOAD_TEST_RUNNER_FILES[i]); 262b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu OutputStream out = new FileOutputStream( 2630006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhu new File(cacheDir, LOAD_TEST_RUNNER_FILES[i])); 264b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 265b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu byte[] buf = new byte[2048]; 266b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu int len; 267b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 268b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu while ((len = in.read(buf)) >= 0 ) { 269b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.write(buf, 0, len); 270b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 271b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.close(); 272b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu in.close(); 273b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 274b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu }catch (IOException e) { 275b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu e.printStackTrace(); 276b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 277b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 278b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 279b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 280ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project} 281