LayoutTestsAutoTest.java revision 8cd303aec6f11ea9fece70f6e3d82efb607f8637
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
19f3d924ca0d3e8225824eb50540962e1890fea6f2Guang Zhuimport com.android.dumprendertree.TestShellActivity.DumpDataType;
20f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhuimport com.android.dumprendertree.forwarder.AdbUtils;
21f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhuimport com.android.dumprendertree.forwarder.ForwardServer;
226bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhuimport com.android.dumprendertree.forwarder.ForwardService;
23f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Instrumentation;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
27ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2;
28b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport android.util.Log;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedOutputStream;
31ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.BufferedReader;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
33ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileNotFoundException;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
35ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileReader;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
3736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddyimport java.io.InputStream;
3836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddyimport java.io.OutputStream;
39ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.util.Vector;
40ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
41ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//TestRecorder creates two files, one for passing tests
42ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//and another for failing tests and writes the paths to
43ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//layout tests one line at a time. TestRecorder does not
44ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//have ability to clear the results.
45ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectclass MyTestRecorder {
46ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private BufferedOutputStream mBufferedOutputPassedStream;
47ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private BufferedOutputStream mBufferedOutputFailedStream;
48ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private BufferedOutputStream mBufferedOutputNoresultStream;
494010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu    private BufferedOutputStream mBufferedOutputTimedoutStream;
50f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
51ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void passed(String layout_file) {
52ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.write(layout_file.getBytes());
54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.write('\n');
55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.flush();
56ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch(Exception e) {
57ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
59ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
60f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
61ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void failed(String layout_file) {
62ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
63ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.write(layout_file.getBytes());
64ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.write('\n');
65ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.flush();
66ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch(Exception e) {
67ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
68ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
69ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
70f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
71ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void noresult(String layout_file) {
72ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
73ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputNoresultStream.write(layout_file.getBytes());
74ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputNoresultStream.write('\n');
75ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputNoresultStream.flush();
76ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch(Exception e) {
77ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
78ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
79ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
80f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
814010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu    public void timedout(String url) {
824010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu        try {
834010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            mBufferedOutputTimedoutStream.write(url.getBytes());
844010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            mBufferedOutputTimedoutStream.write('\n');
854010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            mBufferedOutputTimedoutStream.flush();
864010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu        } catch (Exception e) {
874010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            e.printStackTrace();
884010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu        }
894010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu    }
90f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
91ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public MyTestRecorder(boolean resume) {
92ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
93ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File resultsPassedFile = new File("/sdcard/layout_tests_passed.txt");
94ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File resultsFailedFile = new File("/sdcard/layout_tests_failed.txt");
95ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File noExpectedResultFile = new File("/sdcard/layout_tests_nontext.txt");
964010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            File resultTimedoutFile = new File("/sdcard/layout_tests_timedout.txt");
97f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
98ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream =
99ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                new BufferedOutputStream(new FileOutputStream(resultsPassedFile, resume));
100ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream =
101ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                new BufferedOutputStream(new FileOutputStream(resultsFailedFile, resume));
102ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputNoresultStream =
103ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                new BufferedOutputStream(new FileOutputStream(noExpectedResultFile, resume));
1044010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            mBufferedOutputTimedoutStream =
1054010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu                new BufferedOutputStream(new FileOutputStream(resultTimedoutFile, resume));
106ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
107ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
108ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
109ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
110f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
111ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void close() {
112ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
113ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.close();
114ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.close();
115ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputNoresultStream.close();
1164010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            mBufferedOutputTimedoutStream.close();
117ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
118ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
119ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
120ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
121ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project}
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
124ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectpublic class LayoutTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> {
125ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
126ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private static final String LOGTAG = "LayoutTests";
127ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final int DEFAULT_TIMEOUT_IN_MILLIS = 5000;
128f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
129ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String LAYOUT_TESTS_ROOT = "/sdcard/android/layout_tests/";
130ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String LAYOUT_TESTS_RESULT_DIR = "/sdcard/android/layout_tests_results/";
131ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String ANDROID_EXPECTED_RESULT_DIR = "/sdcard/android/expected_results/";
132ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String LAYOUT_TESTS_LIST_FILE = "/sdcard/android/layout_tests_list.txt";
133ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String TEST_STATUS_FILE = "/sdcard/android/running_test.txt";
13436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_TESTS_RESULTS_REFERENCE_FILES[] = {
13536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_passed.txt",
13636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_failed.txt",
13736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_nontext.txt",
13836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_crashed.txt",
13936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "run_layout_tests.py"
14036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    };
14136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
14236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_RESULTS_FAILED_RESULT_FILE = "results/layout_tests_failed.txt";
14336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_RESULTS_NONTEXT_RESULT_FILE = "results/layout_tests_nontext.txt";
14436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_RESULTS_CRASHED_RESULT_FILE = "results/layout_tests_crashed.txt";
14536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_TESTS_RUNNER = "run_layout_tests.py";
146ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
147ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private MyTestRecorder mResultRecorder;
148ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private Vector<String> mTestList;
149ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private boolean mRebaselineResults;
150ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String mTestPathPrefix;
151b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu    private boolean mFinished;
152f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public LayoutTestsAutoTest() {
154ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project      super("com.android.dumprendertree", TestShellActivity.class);
155b937ba138fd75116cb773405e34c1312353b6b57Guang Zhu    }
156b937ba138fd75116cb773405e34c1312353b6b57Guang Zhu
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This function writes the result of the layout test to
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Am status so that it can be picked up from a script.
159ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void passOrFailCallback(String file, boolean result) {
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      Instrumentation inst = getInstrumentation();
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      Bundle bundle = new Bundle();
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      bundle.putBoolean(file, result);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      inst.sendStatus(0, bundle);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
165f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
166ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void getTestList() {
167ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Read test list.
168ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
169ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            BufferedReader inReader = new BufferedReader(new FileReader(LAYOUT_TESTS_LIST_FILE));
170ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String line = inReader.readLine();
171ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            while (line != null) {
172ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                if (line.startsWith(mTestPathPrefix))
173ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    mTestList.add(line);
174ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                line = inReader.readLine();
175ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
176ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            inReader.close();
177ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.v(LOGTAG, "Test list has " + mTestList.size() + " test(s).");
178ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
179ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "Error while reading test list : " + e.getMessage());
180ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
181ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
182f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
183ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void resumeTestList() {
184ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // read out the test name it stoped last time.
185ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
186f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            String line = FsUtils.readTestStatus(TEST_STATUS_FILE);
187ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            for (int i = 0; i < mTestList.size(); i++) {
188ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                if (mTestList.elementAt(i).equals(line)) {
189ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    mTestList = new Vector<String>(mTestList.subList(i+1, mTestList.size()));
190ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    break;
191ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
192ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
193ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
194ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "Error reading " + TEST_STATUS_FILE);
195ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
196ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
197f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
198ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void clearTestStatus() {
199ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Delete TEST_STATUS_FILE
200ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
201ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File f = new File(TEST_STATUS_FILE);
202ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (f.delete())
203ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.v(LOGTAG, "Deleted " + TEST_STATUS_FILE);
204ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            else
205ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE);
206ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
207ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE + " : " + e.getMessage());
208ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
209ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
210f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
211ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getResultFile(String test) {
212ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        String shortName = test.substring(0, test.lastIndexOf('.'));
213ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Write actual results to result directory.
214ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        return shortName.replaceFirst(LAYOUT_TESTS_ROOT, LAYOUT_TESTS_RESULT_DIR) + "-result.txt";
215ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
216f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
217ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getExpectedResultFile(String test) {
2182a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        int pos = test.lastIndexOf('.');
2192a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        if(pos == -1)
2202a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu            return null;
2212a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        String shortName = test.substring(0, pos);
222f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        return shortName + "-expected.txt";
223ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
224ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
225ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getAndroidExpectedResultFile(String expectedResultFile) {
226ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        return expectedResultFile.replaceFirst(LAYOUT_TESTS_ROOT, ANDROID_EXPECTED_RESULT_DIR);
227ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
228ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
229ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    // Wrap up
230ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void failedCase(String file) {
231ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.w("Layout test: ", file + " failed");
232f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        mResultRecorder.failed(file);
233ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
235ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void passedCase(String file) {
236ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v("Layout test:", file + " passed");
237ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mResultRecorder.passed(file);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
240ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void noresultCase(String file) {
241ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v("Layout test:", file + " no expected result");
242ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mResultRecorder.noresult(file);
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
244f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
245ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void processResult(String testFile, String actualResultFile, String expectedResultFile) {
246ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v(LOGTAG, "  Processing result: " + testFile);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
248ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        File actual = new File(actualResultFile);
249ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        File expected = new File(expectedResultFile);
250ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (actual.exists() && expected.exists()) {
251ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            try {
252ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                if (FsUtils.diffIgnoreSpaces(actualResultFile, expectedResultFile)) {
253ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    passedCase(testFile);
254ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                } else {
255ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    failedCase(testFile);
256ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
257ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            } catch (FileNotFoundException ex) {
258ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOGTAG, "File not found : " + ex.getMessage());
259ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            } catch (IOException ex) {
260ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOGTAG, "IO Error : " + ex.getMessage());
261ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
262ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            return;
263ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
264ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
265ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (!expected.exists()) {
266ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            noresultCase(testFile);
267ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
268ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
269f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
270ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void runTestAndWaitUntilDone(TestShellActivity activity, String test, int timeout) {
271ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.setCallback(new TestShellCallback() {
272ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            public void finished() {
273ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                synchronized (LayoutTestsAutoTest.this) {
274b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                    mFinished = true;
275ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    LayoutTestsAutoTest.this.notifyAll();
276ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
2774010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            }
278f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
2794010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            public void timedOut(String url) {
2804a40a039c020d339df14896448defa59efcc910dGuang Zhu                Log.v(LOGTAG, "layout timeout: " + url);
2814010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            }
282ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        });
283ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
284ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        String resultFile = getResultFile(test);
2852a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        if(resultFile == null) {
2862a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu            //simply ignore this test
2872a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu            return;
2882a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        }
289ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (mRebaselineResults) {
290ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String expectedResultFile = getExpectedResultFile(test);
291ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File f = new File(expectedResultFile);
292ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (f.exists()) {
293ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                return;  // don't run test and don't overwrite default tests.
294ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
295ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
296ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            resultFile = getAndroidExpectedResultFile(expectedResultFile);
297ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
298f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
299b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu        mFinished = false;
300ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Intent intent = new Intent(Intent.ACTION_VIEW);
301ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.setClass(activity, TestShellActivity.class);
302ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
3036bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        intent.putExtra(TestShellActivity.TEST_URL, FsUtils.getTestUrl(test));
304ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.putExtra(TestShellActivity.RESULT_FILE, resultFile);
305ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout);
306ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.startActivity(intent);
307f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
308ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Wait until done.
309ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        synchronized (this) {
310b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            while(!mFinished){
311b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                try {
312b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                    this.wait();
313b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                } catch (InterruptedException e) { }
314b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            }
315ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
316f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
317ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (!mRebaselineResults) {
318ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String expectedResultFile = getExpectedResultFile(test);
319ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File f = new File(expectedResultFile);
320ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (!f.exists()) {
321ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                expectedResultFile = getAndroidExpectedResultFile(expectedResultFile);
322ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
323f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
324ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            processResult(test, resultFile, expectedResultFile);
325ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
326f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu    }
327f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Invokes running of layout tests
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // and waits till it has finished running.
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void executeLayoutTests(boolean resume) {
331ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
332ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // A convenient method to be called by another activity.
333ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
334ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (runner.mTestPath == null) {
335ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "No test specified");
336ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            return;
337ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
338ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
339ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        this.mTestList = new Vector<String>();
340f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
341ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Read settings
3428cd303aec6f11ea9fece70f6e3d82efb607f8637Guang Zhu        this.mTestPathPrefix = (new File(LAYOUT_TESTS_ROOT + runner.mTestPath)).getAbsolutePath();
343ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        this.mRebaselineResults = runner.mRebaseline;
344f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
345ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        int timeout = runner.mTimeoutInMillis;
346ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (timeout <= 0) {
347ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            timeout = DEFAULT_TIMEOUT_IN_MILLIS;
348ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
349f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
350ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        this.mResultRecorder = new MyTestRecorder(resume);
351f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
352ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (!resume)
353ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            clearTestStatus();
354f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
355ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        getTestList();
356ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (resume)
357ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            resumeTestList();
358ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
359f3d924ca0d3e8225824eb50540962e1890fea6f2Guang Zhu        TestShellActivity activity = getActivity();
360f3d924ca0d3e8225824eb50540962e1890fea6f2Guang Zhu        activity.setDefaultDumpDataType(DumpDataType.DUMP_AS_TEXT);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
362ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Run tests.
363f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        int addr = -1;
364f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        try{
365f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu            addr = AdbUtils.resolve("android-browser-test.mtv.corp.google.com");
366f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        } catch (IOException ioe) {
367f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu            Log.w(LOGTAG, "error while resolving test host name", ioe);
368f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        }
369f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        if(addr == -1) {
370f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu            Log.w(LOGTAG, "failed to resolve test host. http tests will fail.");
371f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        }
372ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        for (int i = 0; i < mTestList.size(); i++) {
373ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String s = mTestList.elementAt(i);
374f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            FsUtils.updateTestStatus(TEST_STATUS_FILE, s);
375ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            // Run tests
376ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            runTestAndWaitUntilDone(activity, s, runner.mTimeoutInMillis);
377ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        FsUtils.updateTestStatus(TEST_STATUS_FILE, "#DONE");
3806bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        ForwardService.getForwardService().stopForwardService();
381ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.finish();
382ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
384ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getTestPath() {
385ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
386ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
387ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        String test_path = LAYOUT_TESTS_ROOT;
388ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (runner.mTestPath != null) {
389ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            test_path += runner.mTestPath;
390ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
3918cd303aec6f11ea9fece70f6e3d82efb607f8637Guang Zhu        test_path = new File(test_path).getAbsolutePath();
392ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v("LayoutTestsAutoTest", " Test path : " + test_path);
393f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
394ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        return test_path;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
396f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void generateTestList() {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
399ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tests_list, false));
401f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            FsUtils.findLayoutTestsRecursively(bos, getTestPath());
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bos.flush();
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bos.close();
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       } catch (Exception e) {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           Log.e(LOGTAG, "Error when creating test list: " + e.getMessage());
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Running all the layout tests at once sometimes
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // causes the dumprendertree to run out of memory.
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // So, additional tests are added to run the tests
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // in chunks.
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startLayoutTests() {
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
415ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!tests_list.exists())
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              generateTestList();
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            e.printStackTrace();
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
421f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        executeLayoutTests(false);
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void resumeLayoutTests() {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        executeLayoutTests(true);
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
42936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    public void copyResultsAndRunnerAssetsToCache() {
43036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy        try {
43136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy            String out_dir = getActivity().getApplicationContext().getCacheDir().getPath() + "/";
43236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
43336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy            for( int i=0; i< LAYOUT_TESTS_RESULTS_REFERENCE_FILES.length; i++) {
43436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                InputStream in = getActivity().getAssets().open(LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]);
43536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                OutputStream out = new FileOutputStream(out_dir + LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]);
43636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
43736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                byte[] buf = new byte[2048];
43836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                int len;
43936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
440b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                while ((len = in.read(buf)) >= 0 ) {
44136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                    out.write(buf, 0, len);
44236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                }
44336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                out.close();
44436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                in.close();
44536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy            }
44636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy        }catch (IOException e) {
44736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          e.printStackTrace();
44836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy        }
44936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
45036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    }
45136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
453