LayoutTestsAutoTest.java revision 2a197b128a2317eec6efaa0a21e529cdf534c6f2
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.dumprendertree;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Instrumentation;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
22ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2;
23b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport android.util.Log;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedOutputStream;
26ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.BufferedReader;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
28ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileNotFoundException;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
30ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileReader;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
3236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddyimport java.io.InputStream;
3336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddyimport java.io.OutputStream;
34ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.util.Vector;
35ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
36ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//TestRecorder creates two files, one for passing tests
37ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//and another for failing tests and writes the paths to
38ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//layout tests one line at a time. TestRecorder does not
39ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//have ability to clear the results.
40ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectclass MyTestRecorder {
41ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private BufferedOutputStream mBufferedOutputPassedStream;
42ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private BufferedOutputStream mBufferedOutputFailedStream;
43ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private BufferedOutputStream mBufferedOutputNoresultStream;
444010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu    private BufferedOutputStream mBufferedOutputTimedoutStream;
45ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
46ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void passed(String layout_file) {
47ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
48ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.write(layout_file.getBytes());
49ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.write('\n');
50ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.flush();
51ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch(Exception e) {
52ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
56ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void failed(String layout_file) {
57ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.write(layout_file.getBytes());
59ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.write('\n');
60ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.flush();
61ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch(Exception e) {
62ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
63ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
64ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
65ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
66ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void noresult(String layout_file) {
67ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
68ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputNoresultStream.write(layout_file.getBytes());
69ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputNoresultStream.write('\n');
70ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputNoresultStream.flush();
71ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch(Exception e) {
72ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
73ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
74ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
75ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
764010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu    public void timedout(String url) {
774010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu        try {
784010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            mBufferedOutputTimedoutStream.write(url.getBytes());
794010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            mBufferedOutputTimedoutStream.write('\n');
804010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            mBufferedOutputTimedoutStream.flush();
814010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu        } catch (Exception e) {
824010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            e.printStackTrace();
834010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu        }
844010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu    }
854010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu
86ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public MyTestRecorder(boolean resume) {
87ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
88ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File resultsPassedFile = new File("/sdcard/layout_tests_passed.txt");
89ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File resultsFailedFile = new File("/sdcard/layout_tests_failed.txt");
90ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File noExpectedResultFile = new File("/sdcard/layout_tests_nontext.txt");
914010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            File resultTimedoutFile = new File("/sdcard/layout_tests_timedout.txt");
92ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
93ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream =
94ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                new BufferedOutputStream(new FileOutputStream(resultsPassedFile, resume));
95ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream =
96ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                new BufferedOutputStream(new FileOutputStream(resultsFailedFile, resume));
97ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputNoresultStream =
98ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                new BufferedOutputStream(new FileOutputStream(noExpectedResultFile, resume));
994010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            mBufferedOutputTimedoutStream =
1004010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu                new BufferedOutputStream(new FileOutputStream(resultTimedoutFile, resume));
101ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
102ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
103ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
104ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
105ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
106ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void close() {
107ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
108ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.close();
109ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.close();
110ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputNoresultStream.close();
1114010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            mBufferedOutputTimedoutStream.close();
112ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
113ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
114ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
115ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
116ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project}
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
119ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectpublic class LayoutTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> {
120ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
121ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private static final String LOGTAG = "LayoutTests";
122ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final int DEFAULT_TIMEOUT_IN_MILLIS = 5000;
123ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
124ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String LAYOUT_TESTS_ROOT = "/sdcard/android/layout_tests/";
125ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String LAYOUT_TESTS_RESULT_DIR = "/sdcard/android/layout_tests_results/";
126ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String ANDROID_EXPECTED_RESULT_DIR = "/sdcard/android/expected_results/";
127ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String LAYOUT_TESTS_LIST_FILE = "/sdcard/android/layout_tests_list.txt";
128ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String TEST_STATUS_FILE = "/sdcard/android/running_test.txt";
12936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_TESTS_RESULTS_REFERENCE_FILES[] = {
13036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_passed.txt",
13136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_failed.txt",
13236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_nontext.txt",
13336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_crashed.txt",
13436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "run_layout_tests.py"
13536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    };
13636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
13736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_RESULTS_FAILED_RESULT_FILE = "results/layout_tests_failed.txt";
13836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_RESULTS_NONTEXT_RESULT_FILE = "results/layout_tests_nontext.txt";
13936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_RESULTS_CRASHED_RESULT_FILE = "results/layout_tests_crashed.txt";
14036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_TESTS_RUNNER = "run_layout_tests.py";
141ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
142ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private MyTestRecorder mResultRecorder;
143ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private Vector<String> mTestList;
144ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private boolean mRebaselineResults;
145ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String mTestPathPrefix;
146b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu    private boolean mFinished;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public LayoutTestsAutoTest() {
149ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project      super("com.android.dumprendertree", TestShellActivity.class);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This function writes the result of the layout test to
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Am status so that it can be picked up from a script.
154ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void passOrFailCallback(String file, boolean result) {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      Instrumentation inst = getInstrumentation();
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      Bundle bundle = new Bundle();
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      bundle.putBoolean(file, result);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      inst.sendStatus(0, bundle);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
160ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
161ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void getTestList() {
162ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Read test list.
163ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
164ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            BufferedReader inReader = new BufferedReader(new FileReader(LAYOUT_TESTS_LIST_FILE));
165ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String line = inReader.readLine();
166ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            while (line != null) {
167ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                if (line.startsWith(mTestPathPrefix))
168ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    mTestList.add(line);
169ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                line = inReader.readLine();
170ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
171ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            inReader.close();
172ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.v(LOGTAG, "Test list has " + mTestList.size() + " test(s).");
173ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
174ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "Error while reading test list : " + e.getMessage());
175ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
176ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
177ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
178ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void resumeTestList() {
179ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // read out the test name it stoped last time.
180ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
181ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            BufferedReader inReader = new BufferedReader(new FileReader(TEST_STATUS_FILE));
182ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String line = inReader.readLine();
183ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            for (int i = 0; i < mTestList.size(); i++) {
184ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                if (mTestList.elementAt(i).equals(line)) {
185ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    mTestList = new Vector<String>(mTestList.subList(i+1, mTestList.size()));
186ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    break;
187ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
188ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
189ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            inReader.close();
190ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
191ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "Error reading " + TEST_STATUS_FILE);
192ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
193ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
194ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
195ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void clearTestStatus() {
196ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Delete TEST_STATUS_FILE
197ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
198ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File f = new File(TEST_STATUS_FILE);
199ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (f.delete())
200ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.v(LOGTAG, "Deleted " + TEST_STATUS_FILE);
201ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            else
202ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE);
203ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
204ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE + " : " + e.getMessage());
205ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
206ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
207ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
208ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void updateTestStatus(String s) {
209ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Write TEST_STATUS_FILE
210ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
211ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(TEST_STATUS_FILE));
212ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            bos.write(s.getBytes());
213ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            bos.close();
214ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
215ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "Cannot update file " + TEST_STATUS_FILE);
216ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
217ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
218ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
219ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getResultFile(String test) {
220ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        String shortName = test.substring(0, test.lastIndexOf('.'));
221ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Write actual results to result directory.
222ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        return shortName.replaceFirst(LAYOUT_TESTS_ROOT, LAYOUT_TESTS_RESULT_DIR) + "-result.txt";
223ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
224ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
225ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getExpectedResultFile(String test) {
2262a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        int pos = test.lastIndexOf('.');
2272a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        if(pos == -1)
2282a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu            return null;
2292a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        String shortName = test.substring(0, pos);
230ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        return shortName + "-expected.txt";
231ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
232ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
233ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getAndroidExpectedResultFile(String expectedResultFile) {
234ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        return expectedResultFile.replaceFirst(LAYOUT_TESTS_ROOT, ANDROID_EXPECTED_RESULT_DIR);
235ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
236ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
237ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    // Wrap up
238ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void failedCase(String file) {
239ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.w("Layout test: ", file + " failed");
240ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mResultRecorder.failed(file);
241ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
243ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void passedCase(String file) {
244ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v("Layout test:", file + " passed");
245ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mResultRecorder.passed(file);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
248ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void noresultCase(String file) {
249ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v("Layout test:", file + " no expected result");
250ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mResultRecorder.noresult(file);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
252ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
253ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void processResult(String testFile, String actualResultFile, String expectedResultFile) {
254ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v(LOGTAG, "  Processing result: " + testFile);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
256ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        File actual = new File(actualResultFile);
257ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        File expected = new File(expectedResultFile);
258ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (actual.exists() && expected.exists()) {
259ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            try {
260ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                boolean passing = true;
261ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                BufferedReader fr = new BufferedReader(new FileReader(actual));
262ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                BufferedReader fe = new BufferedReader(new FileReader(expected));
263ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                while (true) {
264ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    String s1 = fr.readLine();
265ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    String s2 = fe.readLine();
266ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    if (s1 == null && s2 == null)
267ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                        break; // both files are the same
268ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    if (s1 == null || s2 == null || !s1.equals(s2)) {
269ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                        passing = false;
270ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                        break;
271ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    }
272ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
273ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
274ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                if (passing) {
275ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    passedCase(testFile);
276ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                } else {
277ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    failedCase(testFile);
278ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
279ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
280ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                fe.close();
281ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                fr.close();
282ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            } catch (FileNotFoundException ex) {
283ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOGTAG, "File not found : " + ex.getMessage());
284ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            } catch (IOException ex) {
285ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOGTAG, "IO Error : " + ex.getMessage());
286ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
287ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            return;
288ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
289ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
290ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (!expected.exists()) {
291ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            noresultCase(testFile);
292ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
293ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
294ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
295ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void runTestAndWaitUntilDone(TestShellActivity activity, String test, int timeout) {
296ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.setCallback(new TestShellCallback() {
297ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            public void finished() {
298ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                synchronized (LayoutTestsAutoTest.this) {
299b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                    mFinished = true;
300ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    LayoutTestsAutoTest.this.notifyAll();
301ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
3024010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            }
3034010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu
3044010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            public void timedOut(String url) {
3054010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            }
306ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        });
307ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
308ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        String resultFile = getResultFile(test);
3092a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        if(resultFile == null) {
3102a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu            //simply ignore this test
3112a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu            return;
3122a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        }
313ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (mRebaselineResults) {
314ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String expectedResultFile = getExpectedResultFile(test);
315ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File f = new File(expectedResultFile);
316ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (f.exists()) {
317ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                return;  // don't run test and don't overwrite default tests.
318ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
319ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
320ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            resultFile = getAndroidExpectedResultFile(expectedResultFile);
321ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
322ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
323b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu        mFinished = false;
324ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Intent intent = new Intent(Intent.ACTION_VIEW);
325ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.setClass(activity, TestShellActivity.class);
326ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
327ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.putExtra(TestShellActivity.TEST_URL, "file://" + test);
328ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.putExtra(TestShellActivity.RESULT_FILE, resultFile);
329ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout);
330ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.startActivity(intent);
331ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
332ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Wait until done.
333ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        synchronized (this) {
334b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            while(!mFinished){
335b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                try {
336b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                    this.wait();
337b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                } catch (InterruptedException e) { }
338b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            }
339ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
340ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
341ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (!mRebaselineResults) {
342ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String expectedResultFile = getExpectedResultFile(test);
343ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File f = new File(expectedResultFile);
344ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (!f.exists()) {
345ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                expectedResultFile = getAndroidExpectedResultFile(expectedResultFile);
346ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
347ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
348ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            processResult(test, resultFile, expectedResultFile);
349ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
350ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
351ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Invokes running of layout tests
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // and waits till it has finished running.
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void executeLayoutTests(boolean resume) {
355ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
356ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // A convenient method to be called by another activity.
357ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
358ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (runner.mTestPath == null) {
359ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "No test specified");
360ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            return;
361ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
362ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
363ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        this.mTestList = new Vector<String>();
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
365ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Read settings
366ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
367ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            this.mTestPathPrefix =
368ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                (new File(LAYOUT_TESTS_ROOT + runner.mTestPath)).getCanonicalPath();
369ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (IOException e) {
370ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "Cannot find test path prefix: " + e.getMessage());
371ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            return;
372ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
373ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
374ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        this.mRebaselineResults = runner.mRebaseline;
375ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
376ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        int timeout = runner.mTimeoutInMillis;
377ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (timeout <= 0) {
378ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            timeout = DEFAULT_TIMEOUT_IN_MILLIS;
379ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
380ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
381ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        this.mResultRecorder = new MyTestRecorder(resume);
382ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
383ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (!resume)
384ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            clearTestStatus();
385ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
386ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        getTestList();
387ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (resume)
388ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            resumeTestList();
389ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
390ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        TestShellActivity activity = (TestShellActivity) getActivity();
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
392ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Run tests.
393ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        for (int i = 0; i < mTestList.size(); i++) {
394ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String s = mTestList.elementAt(i);
395ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            updateTestStatus(s);
396ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            // Run tests
397ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            runTestAndWaitUntilDone(activity, s, runner.mTimeoutInMillis);
398ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
400ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        updateTestStatus("#DONE");
401ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
402ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.finish();
403ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
406ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getTestPath() {
407ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
408ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
409ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        String test_path = LAYOUT_TESTS_ROOT;
410ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (runner.mTestPath != null) {
411ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            test_path += runner.mTestPath;
412ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
413ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
414ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            test_path = new File(test_path).getCanonicalPath();
415ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (IOException e) {
416ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e("LayoutTestsAutoTest", "Cannot get cannonical path " + e.getMessage());
417ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
418ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v("LayoutTestsAutoTest", " Test path : " + test_path);
419ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
420ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        return test_path;
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void generateTestList() {
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
425ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tests_list, false));
427ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            findTestsRecursively(bos, getTestPath());
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bos.flush();
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bos.close();
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       } catch (Exception e) {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           Log.e(LOGTAG, "Error when creating test list: " + e.getMessage());
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void findTestsRecursively(BufferedOutputStream bos, String dir) throws IOException {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         Log.v(LOGTAG, "Searching tests under " + dir);
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         File d = new File(dir);
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         if (!d.isDirectory()) {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             throw new AssertionError("A directory expected, but got " + dir);
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         String[] files = d.list();
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         for (int i = 0; i < files.length; i++) {
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             String s = dir + "/" + files[i];
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             if (FileFilter.ignoreTest(s)) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 Log.v(LOGTAG, "  Ignoring: " + s);
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 continue;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             if (s.toLowerCase().endsWith(".html")
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 || s.toLowerCase().endsWith(".xml")) {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 bos.write(s.getBytes());
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 bos.write('\n');
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 continue;
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             }
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             File f = new File(s);
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             if (f.isDirectory()) {
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 findTestsRecursively(bos, s);
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 continue;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             }
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             Log.v(LOGTAG, "Skipping " + s);
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Running all the layout tests at once sometimes
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // causes the dumprendertree to run out of memory.
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // So, additional tests are added to run the tests
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // in chunks.
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startLayoutTests() {
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
473ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!tests_list.exists())
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              generateTestList();
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            e.printStackTrace();
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        executeLayoutTests(false);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void resumeLayoutTests() {
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        executeLayoutTests(true);
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
48736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    public void copyResultsAndRunnerAssetsToCache() {
48836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy        try {
48936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy            String out_dir = getActivity().getApplicationContext().getCacheDir().getPath() + "/";
49036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
49136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy            for( int i=0; i< LAYOUT_TESTS_RESULTS_REFERENCE_FILES.length; i++) {
49236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                InputStream in = getActivity().getAssets().open(LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]);
49336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                OutputStream out = new FileOutputStream(out_dir + LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]);
49436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
49536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                byte[] buf = new byte[2048];
49636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                int len;
49736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
498b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                while ((len = in.read(buf)) >= 0 ) {
49936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                    out.write(buf, 0, len);
50036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                }
50136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                out.close();
50236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                in.close();
50336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy            }
50436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy        }catch (IOException e) {
50536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          e.printStackTrace();
50636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy        }
50736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
50836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    }
50936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
511