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