LayoutTestsAutoTest.java revision cf0fd7892b7208ebfa35809b63fc8e4d60e4d466
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
41cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block// TestRecorder creates four files ...
425ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block// - passing tests
435ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block// - failing tests
44cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block// - tests for which results are ignored
455ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block// - tests with no text results available
465ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block// TestRecorder does not have the ability to clear the results.
47ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectclass MyTestRecorder {
48ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private BufferedOutputStream mBufferedOutputPassedStream;
49ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private BufferedOutputStream mBufferedOutputFailedStream;
50cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block    private BufferedOutputStream mBufferedOutputIgnoreResultStream;
515ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block    private BufferedOutputStream mBufferedOutputNoResultStream;
52f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void passed(String layout_file) {
54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.write(layout_file.getBytes());
56ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.write('\n');
57ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.flush();
58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch(Exception e) {
59ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
60ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
61ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
62f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
63ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void failed(String layout_file) {
64ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
65ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.write(layout_file.getBytes());
66ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.write('\n');
67ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.flush();
68ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch(Exception e) {
69ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
70ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
71ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
72f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
73cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block    public void ignoreResult(String layout_file) {
74cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block        try {
75cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            mBufferedOutputIgnoreResultStream.write(layout_file.getBytes());
76cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            mBufferedOutputIgnoreResultStream.write('\n');
77cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            mBufferedOutputIgnoreResultStream.flush();
78cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block        } catch(Exception e) {
79cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            e.printStackTrace();
80cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block        }
81cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block    }
82cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block
835ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block    public void noResult(String layout_file) {
84ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
855ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block            mBufferedOutputNoResultStream.write(layout_file.getBytes());
865ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block            mBufferedOutputNoResultStream.write('\n');
875ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block            mBufferedOutputNoResultStream.flush();
88ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch(Exception e) {
89ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
90ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
91ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
92f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
93ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public MyTestRecorder(boolean resume) {
94ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
95ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File resultsPassedFile = new File("/sdcard/layout_tests_passed.txt");
96ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File resultsFailedFile = new File("/sdcard/layout_tests_failed.txt");
97cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            File resultsIgnoreResultFile = new File("/sdcard/layout_tests_ignored.txt");
98ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File noExpectedResultFile = new File("/sdcard/layout_tests_nontext.txt");
99f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
100ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream =
101ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                new BufferedOutputStream(new FileOutputStream(resultsPassedFile, resume));
102ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream =
103ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                new BufferedOutputStream(new FileOutputStream(resultsFailedFile, resume));
104cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            mBufferedOutputIgnoreResultStream =
105cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                new BufferedOutputStream(new FileOutputStream(resultsIgnoreResultFile, resume));
1065ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block            mBufferedOutputNoResultStream =
107ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                new BufferedOutputStream(new FileOutputStream(noExpectedResultFile, resume));
108ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
109ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
110ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
111ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
112f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
113ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void close() {
114ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
115ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputPassedStream.close();
116ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBufferedOutputFailedStream.close();
117cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            mBufferedOutputIgnoreResultStream.close();
1185ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block            mBufferedOutputNoResultStream.close();
119ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
120ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            e.printStackTrace();
121ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
122ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
123ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project}
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
126ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectpublic class LayoutTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> {
127ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
128ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private static final String LOGTAG = "LayoutTests";
129ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final int DEFAULT_TIMEOUT_IN_MILLIS = 5000;
130f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
131ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String LAYOUT_TESTS_ROOT = "/sdcard/android/layout_tests/";
132ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String LAYOUT_TESTS_RESULT_DIR = "/sdcard/android/layout_tests_results/";
133ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String ANDROID_EXPECTED_RESULT_DIR = "/sdcard/android/expected_results/";
134ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String LAYOUT_TESTS_LIST_FILE = "/sdcard/android/layout_tests_list.txt";
135ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    static final String TEST_STATUS_FILE = "/sdcard/android/running_test.txt";
13636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_TESTS_RESULTS_REFERENCE_FILES[] = {
13736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_passed.txt",
13836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_failed.txt",
13936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_nontext.txt",
14036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "results/layout_tests_crashed.txt",
14136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          "run_layout_tests.py"
14236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    };
14336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
14436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_RESULTS_FAILED_RESULT_FILE = "results/layout_tests_failed.txt";
14536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_RESULTS_NONTEXT_RESULT_FILE = "results/layout_tests_nontext.txt";
14636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_RESULTS_CRASHED_RESULT_FILE = "results/layout_tests_crashed.txt";
14736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    static final String LAYOUT_TESTS_RUNNER = "run_layout_tests.py";
148ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
149ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private MyTestRecorder mResultRecorder;
150ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private Vector<String> mTestList;
151cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block    // Whether we should ignore the result for the corresponding test. Ordered same as mTestList.
152cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block    private Vector<Boolean> mTestListIgnoreResult;
153ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private boolean mRebaselineResults;
15412077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block    // The JavaScript engine currently in use. This determines which set of Android-specific
15512077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block    // expected test results we use.
15612077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block    private String mJsEngine;
157ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String mTestPathPrefix;
158b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu    private boolean mFinished;
159f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public LayoutTestsAutoTest() {
161ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project      super("com.android.dumprendertree", TestShellActivity.class);
162b937ba138fd75116cb773405e34c1312353b6b57Guang Zhu    }
163b937ba138fd75116cb773405e34c1312353b6b57Guang Zhu
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This function writes the result of the layout test to
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Am status so that it can be picked up from a script.
166ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void passOrFailCallback(String file, boolean result) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      Instrumentation inst = getInstrumentation();
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      Bundle bundle = new Bundle();
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      bundle.putBoolean(file, result);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      inst.sendStatus(0, bundle);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
172f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
173ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void getTestList() {
174ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Read test list.
175ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
176ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            BufferedReader inReader = new BufferedReader(new FileReader(LAYOUT_TESTS_LIST_FILE));
177ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String line = inReader.readLine();
178ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            while (line != null) {
179cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                if (line.startsWith(mTestPathPrefix)) {
180cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                    String[] components = line.split(" ");
181cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                    mTestList.add(components[0]);
182cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                    mTestListIgnoreResult.add(components.length > 1 && components[1].equals("IGNORE_RESULT"));
183cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                }
184ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                line = inReader.readLine();
185ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
186ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            inReader.close();
187ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.v(LOGTAG, "Test list has " + mTestList.size() + " test(s).");
188ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
189ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "Error while reading test list : " + e.getMessage());
190ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
191ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
192f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
193ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void resumeTestList() {
194ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // read out the test name it stoped last time.
195ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
196f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            String line = FsUtils.readTestStatus(TEST_STATUS_FILE);
197ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            for (int i = 0; i < mTestList.size(); i++) {
198ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                if (mTestList.elementAt(i).equals(line)) {
199ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    mTestList = new Vector<String>(mTestList.subList(i+1, mTestList.size()));
200cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                    mTestListIgnoreResult = new Vector<Boolean>(mTestListIgnoreResult.subList(i+1, mTestListIgnoreResult.size()));
201ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    break;
202ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
203ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
204ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
205ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "Error reading " + TEST_STATUS_FILE);
206ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
207ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
208f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
209ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void clearTestStatus() {
210ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Delete TEST_STATUS_FILE
211ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
212ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File f = new File(TEST_STATUS_FILE);
213ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (f.delete())
214ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.v(LOGTAG, "Deleted " + TEST_STATUS_FILE);
215ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            else
216ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE);
217ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (Exception e) {
218ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE + " : " + e.getMessage());
219ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
220ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
221f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
222ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getResultFile(String test) {
223ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        String shortName = test.substring(0, test.lastIndexOf('.'));
224ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Write actual results to result directory.
225ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        return shortName.replaceFirst(LAYOUT_TESTS_ROOT, LAYOUT_TESTS_RESULT_DIR) + "-result.txt";
226ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
227f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
22812077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block    // Gets the file which contains WebKit's expected results for this test.
229ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getExpectedResultFile(String test) {
23012077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        // The generic result is at <path>/<name>-expected.txt
23112077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        // First try the Android-specific result at
23212077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        // platform/android-<js-engine>/<path>/<name>-expected.txt
2332a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        int pos = test.lastIndexOf('.');
23412077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        if (pos == -1)
2352a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu            return null;
23612077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        String genericExpectedResult = test.substring(0, pos) + "-expected.txt";
23712077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        String androidExpectedResultsDir = "platform/android-" + mJsEngine + "/";
23812077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        String androidExpectedResult =
23912077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block            genericExpectedResult.replaceFirst(LAYOUT_TESTS_ROOT, LAYOUT_TESTS_ROOT + androidExpectedResultsDir);
24012077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        File f = new File(androidExpectedResult);
24112077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        return f.exists() ? androidExpectedResult : genericExpectedResult;
242ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
243ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
24412077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block    // Gets the file which contains the actual results of running the test on
24512077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block    // Android, generated by a previous run which set a new baseline.
246ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getAndroidExpectedResultFile(String expectedResultFile) {
247ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        return expectedResultFile.replaceFirst(LAYOUT_TESTS_ROOT, ANDROID_EXPECTED_RESULT_DIR);
248ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
249ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
250ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    // Wrap up
251ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void failedCase(String file) {
252ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.w("Layout test: ", file + " failed");
253f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        mResultRecorder.failed(file);
254ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
256ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void passedCase(String file) {
257ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v("Layout test:", file + " passed");
258ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mResultRecorder.passed(file);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
261cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block    private void ignoreResultCase(String file) {
262cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block        Log.v("Layout test:", file + " ignore result");
263cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block        mResultRecorder.ignoreResult(file);
264cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block    }
265cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block
2665ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block    private void noResultCase(String file) {
267ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v("Layout test:", file + " no expected result");
2685ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block        mResultRecorder.noResult(file);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
270f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
271cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block    private void processResult(String testFile, String actualResultFile, String expectedResultFile, boolean ignoreResult) {
272ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v(LOGTAG, "  Processing result: " + testFile);
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
274cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block        if (ignoreResult) {
275cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            ignoreResultCase(testFile);
276cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            return;
277cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block        }
278cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block
279ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        File actual = new File(actualResultFile);
280ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        File expected = new File(expectedResultFile);
281ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (actual.exists() && expected.exists()) {
282ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            try {
283ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                if (FsUtils.diffIgnoreSpaces(actualResultFile, expectedResultFile)) {
284ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    passedCase(testFile);
285ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                } else {
286ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    failedCase(testFile);
287ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
288ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            } catch (FileNotFoundException ex) {
289ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOGTAG, "File not found : " + ex.getMessage());
290ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            } catch (IOException ex) {
291ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOGTAG, "IO Error : " + ex.getMessage());
292ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
293ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            return;
294ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
295ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
296ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (!expected.exists()) {
2975ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block            noResultCase(testFile);
298ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
299ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
300f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
301cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block    private void runTestAndWaitUntilDone(TestShellActivity activity, String test, int timeout, boolean ignoreResult) {
302ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.setCallback(new TestShellCallback() {
303ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            public void finished() {
304ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                synchronized (LayoutTestsAutoTest.this) {
305b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                    mFinished = true;
306ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    LayoutTestsAutoTest.this.notifyAll();
307ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
3084010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            }
309f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
3104010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            public void timedOut(String url) {
3114a40a039c020d339df14896448defa59efcc910dGuang Zhu                Log.v(LOGTAG, "layout timeout: " + url);
3124010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            }
313ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        });
314ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
315ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        String resultFile = getResultFile(test);
31612077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        if (resultFile == null) {
31712077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block            // Simply ignore this test.
3182a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu            return;
3192a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        }
320ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (mRebaselineResults) {
321ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String expectedResultFile = getExpectedResultFile(test);
322ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File f = new File(expectedResultFile);
323ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (f.exists()) {
324ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                return;  // don't run test and don't overwrite default tests.
325ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
326ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
327ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            resultFile = getAndroidExpectedResultFile(expectedResultFile);
328ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
329f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
330b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu        mFinished = false;
331ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Intent intent = new Intent(Intent.ACTION_VIEW);
332ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.setClass(activity, TestShellActivity.class);
333ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
3346bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        intent.putExtra(TestShellActivity.TEST_URL, FsUtils.getTestUrl(test));
335ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.putExtra(TestShellActivity.RESULT_FILE, resultFile);
336ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout);
337ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.startActivity(intent);
338f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
339ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Wait until done.
340ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        synchronized (this) {
341b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            while(!mFinished){
342b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                try {
343b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                    this.wait();
344b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                } catch (InterruptedException e) { }
345b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            }
346ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
347f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
348ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (!mRebaselineResults) {
349ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String expectedResultFile = getExpectedResultFile(test);
350ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File f = new File(expectedResultFile);
351ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (!f.exists()) {
352ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                expectedResultFile = getAndroidExpectedResultFile(expectedResultFile);
353ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
354f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
355cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            processResult(test, resultFile, expectedResultFile, ignoreResult);
356ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
357f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu    }
358f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Invokes running of layout tests
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // and waits till it has finished running.
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void executeLayoutTests(boolean resume) {
362ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
363ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // A convenient method to be called by another activity.
364ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
365ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (runner.mTestPath == null) {
366ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "No test specified");
367ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            return;
368ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
369ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
370ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        this.mTestList = new Vector<String>();
371cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block        this.mTestListIgnoreResult = new Vector<Boolean>();
372f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
373ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Read settings
37412077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        mTestPathPrefix = (new File(LAYOUT_TESTS_ROOT + runner.mTestPath)).getAbsolutePath();
37512077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        mRebaselineResults = runner.mRebaseline;
37612077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        // JSC is the default JavaScript engine.
37712077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block        mJsEngine = runner.mJsEngine == null ? "jsc" : runner.mJsEngine;
378f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
379ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        int timeout = runner.mTimeoutInMillis;
380ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (timeout <= 0) {
381ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            timeout = DEFAULT_TIMEOUT_IN_MILLIS;
382ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
383f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
384ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        this.mResultRecorder = new MyTestRecorder(resume);
385f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
386ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (!resume)
387ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            clearTestStatus();
388f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
389ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        getTestList();
390ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (resume)
391ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            resumeTestList();
392ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
393f3d924ca0d3e8225824eb50540962e1890fea6f2Guang Zhu        TestShellActivity activity = getActivity();
394f3d924ca0d3e8225824eb50540962e1890fea6f2Guang Zhu        activity.setDefaultDumpDataType(DumpDataType.DUMP_AS_TEXT);
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
396ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Run tests.
397f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        int addr = -1;
398f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        try{
399f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu            addr = AdbUtils.resolve("android-browser-test.mtv.corp.google.com");
400f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        } catch (IOException ioe) {
401f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu            Log.w(LOGTAG, "error while resolving test host name", ioe);
402f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        }
403f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        if(addr == -1) {
404f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu            Log.w(LOGTAG, "failed to resolve test host. http tests will fail.");
405f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu        }
406ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        for (int i = 0; i < mTestList.size(); i++) {
407ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String s = mTestList.elementAt(i);
408cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            boolean ignoreResult = mTestListIgnoreResult.elementAt(i);
409f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            FsUtils.updateTestStatus(TEST_STATUS_FILE, s);
410ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            // Run tests
411cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            runTestAndWaitUntilDone(activity, s, runner.mTimeoutInMillis, ignoreResult);
412ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
414f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        FsUtils.updateTestStatus(TEST_STATUS_FILE, "#DONE");
4156bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        ForwardService.getForwardService().stopForwardService();
416ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.finish();
417ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private String getTestPath() {
420ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
421ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
422ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        String test_path = LAYOUT_TESTS_ROOT;
423ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (runner.mTestPath != null) {
424ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            test_path += runner.mTestPath;
425ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
4268cd303aec6f11ea9fece70f6e3d82efb607f8637Guang Zhu        test_path = new File(test_path).getAbsolutePath();
427ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Log.v("LayoutTestsAutoTest", " Test path : " + test_path);
428f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
429ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        return test_path;
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
431f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void generateTestList() {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
434ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tests_list, false));
436cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            FsUtils.findLayoutTestsRecursively(bos, getTestPath(), false); // Don't ignore results
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bos.flush();
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bos.close();
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       } catch (Exception e) {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           Log.e(LOGTAG, "Error when creating test list: " + e.getMessage());
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Running all the layout tests at once sometimes
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // causes the dumprendertree to run out of memory.
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // So, additional tests are added to run the tests
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // in chunks.
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startLayoutTests() {
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
450ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!tests_list.exists())
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              generateTestList();
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            e.printStackTrace();
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
456f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        executeLayoutTests(false);
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void resumeLayoutTests() {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        executeLayoutTests(true);
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
46436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    public void copyResultsAndRunnerAssetsToCache() {
46536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy        try {
46636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy            String out_dir = getActivity().getApplicationContext().getCacheDir().getPath() + "/";
46736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
46836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy            for( int i=0; i< LAYOUT_TESTS_RESULTS_REFERENCE_FILES.length; i++) {
46936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                InputStream in = getActivity().getAssets().open(LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]);
47036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                OutputStream out = new FileOutputStream(out_dir + LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]);
47136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
47236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                byte[] buf = new byte[2048];
47336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                int len;
47436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
475b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                while ((len = in.read(buf)) >= 0 ) {
47636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                    out.write(buf, 0, len);
47736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                }
47836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                out.close();
47936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy                in.close();
48036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy            }
48136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy        }catch (IOException e) {
48236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy          e.printStackTrace();
48336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy        }
48436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
48536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy    }
48636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
488