LoadTestsAutoTest.java revision ba87e3e6c985e7175152993b5efcc7dd2f0e1c93
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 19ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.app.Activity; 20ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.app.Instrumentation; 21ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.app.Instrumentation.ActivityMonitor; 22ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.content.Intent; 23ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 24ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.util.Log; 25ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 26ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.os.Bundle; 27ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2; 28ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 29ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport com.android.dumprendertree.TestShellActivity; 30ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport com.android.dumprendertree.TestShellCallback; 31ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 32ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.InputStream; 33ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.OutputStream; 34ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileOutputStream; 35ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.IOException; 36ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 37ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectclass StreamPipe extends Thread { 38ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project InputStream in; 39ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project OutputStream out; 40ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 41ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project StreamPipe(InputStream in, OutputStream out) { 42ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project this.in = in; 43ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project this.out = out; 44ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 45ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 46ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void run() { 47ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 48ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project byte[] buf = new byte[1024]; 49ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project int nofb = this.in.read(buf); 50ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project while (nofb != -1) { 51ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project this.out.write(buf, 0, nofb); 52ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project nofb = this.in.read(buf); 53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (IOException e) { 55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project e.printStackTrace(); 56ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 57ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project} 59ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 60ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectpublic class LoadTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> { 61ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 62ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private final static String LOGTAG = "LoadTest"; 63ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private final static String LOAD_TEST_RESULT = "/sdcard/load_test_result.txt"; 64ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 65ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public LoadTestsAutoTest() { 66ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project super("com.android.dumprendertree", TestShellActivity.class); 67ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 68ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 69ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // This function writes the result of the layout test to 70ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Am status so that it can be picked up from a script. 71ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void passOrFailCallback(String file, boolean result) { 72ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Instrumentation inst = getInstrumentation(); 73ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Bundle bundle = new Bundle(); 74ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project bundle.putBoolean(file, result); 75ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project inst.sendStatus(0, bundle); 76ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 77ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 78ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Invokes running of layout tests 79ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // and waits till it has finished running. 80ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void runTest() { 81ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation(); 82ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 83ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (runner.mTestPath == null) { 84ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "No test specified"); 85ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 86ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 87ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 88ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project TestShellActivity activity = (TestShellActivity) getActivity(); 89ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 90ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Run tests 91ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis); 92ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 93ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // TODO(fqian): let am instrumentation pass in the command line, currently 94ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // am instrument does not allow spaces in the command. 95ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project runPostShellCommand("/system/bin/dumpsys meminfo"); 96ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 97ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Kill activity 98ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.finish(); 99ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 100ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 101ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void runPostShellCommand(String cmd) { 102ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (cmd == null || cmd.length() == 0) 103ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 104ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 105ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 106ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Call dumpsys meminfo 107ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Process proc = Runtime.getRuntime().exec(cmd); 108ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Append output to LOAD_TEST_RESULT 109ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project InputStream input = proc.getInputStream(); 110ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project InputStream error = proc.getErrorStream(); 111ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project FileOutputStream out = new FileOutputStream(LOAD_TEST_RESULT, true); 112ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 113ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project StreamPipe p_in = new StreamPipe(input, out); 114ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project StreamPipe p_err = new StreamPipe(error, System.err); 115ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 116ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project p_in.start(); 117ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project p_err.start(); 118ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 119ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project proc.waitFor(); 120ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (IOException e) { 121ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, e.getMessage()); 122ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (InterruptedException e) { 123ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, e.getMessage()); 124ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 125ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 126ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 127ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // A convenient method to be called by another activity. 128ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void runTestAndWaitUntilDone(TestShellActivity activity, String url, int timeout) { 129ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.setCallback(new TestShellCallback() { 130ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void finished() { 131ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (LoadTestsAutoTest.this) { 132ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LoadTestsAutoTest.this.notifyAll(); 133ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 134ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 135ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project }); 136ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 137ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 138ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.setClass(activity, TestShellActivity.class); 139ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 140ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.TEST_URL, url); 141ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout); 142ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.RESULT_FILE, LOAD_TEST_RESULT); 143ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.startActivity(intent); 144ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 145ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Wait until done. 146ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (this) { 147ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 148ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project this.wait(); 149ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (InterruptedException e) { } 150ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 151ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 152ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project} 153