blob: 7ac0665c07b056289be85ea3883698b27393b79e [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.dumprendertree;
18
Guang Zhuf3d924c2009-09-01 11:57:16 -070019import com.android.dumprendertree.TestShellActivity.DumpDataType;
Guang Zhuf4bf5522009-07-23 14:19:35 -070020import com.android.dumprendertree.forwarder.AdbUtils;
Guang Zhu6bf18ba2009-09-15 23:47:20 -070021import com.android.dumprendertree.forwarder.ForwardService;
Guang Zhuf4bf5522009-07-23 14:19:35 -070022
Guang Zhu00069522010-12-06 11:17:38 -080023import android.content.Context;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080024import android.content.Intent;
Christian Mehlmauer8b85dce2010-07-19 20:11:27 +020025import android.os.Environment;
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070026import android.test.ActivityInstrumentationTestCase2;
Guang Zhub933f6692009-05-05 01:02:14 -070027import android.util.Log;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080028
29import java.io.BufferedOutputStream;
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070030import java.io.BufferedReader;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080031import java.io.File;
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070032import java.io.FileNotFoundException;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080033import java.io.FileOutputStream;
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070034import java.io.FileReader;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080035import java.io.IOException;
Sridhar Gurivireddy36fd6d22009-03-31 14:47:19 -070036import java.io.InputStream;
37import java.io.OutputStream;
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070038import java.util.Vector;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080039
Steve Blockcf0fd782010-03-09 13:54:09 +000040// TestRecorder creates four files ...
Steve Block5ac2a3b2010-03-09 14:36:00 +000041// - passing tests
42// - failing tests
Steve Blockcf0fd782010-03-09 13:54:09 +000043// - tests for which results are ignored
Steve Block5ac2a3b2010-03-09 14:36:00 +000044// - tests with no text results available
45// TestRecorder does not have the ability to clear the results.
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070046class MyTestRecorder {
47 private BufferedOutputStream mBufferedOutputPassedStream;
48 private BufferedOutputStream mBufferedOutputFailedStream;
Steve Blockcf0fd782010-03-09 13:54:09 +000049 private BufferedOutputStream mBufferedOutputIgnoreResultStream;
Steve Block5ac2a3b2010-03-09 14:36:00 +000050 private BufferedOutputStream mBufferedOutputNoResultStream;
Guang Zhuf4bf5522009-07-23 14:19:35 -070051
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070052 public void passed(String layout_file) {
53 try {
54 mBufferedOutputPassedStream.write(layout_file.getBytes());
55 mBufferedOutputPassedStream.write('\n');
56 mBufferedOutputPassedStream.flush();
57 } catch(Exception e) {
58 e.printStackTrace();
59 }
60 }
Guang Zhuf4bf5522009-07-23 14:19:35 -070061
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070062 public void failed(String layout_file) {
63 try {
64 mBufferedOutputFailedStream.write(layout_file.getBytes());
65 mBufferedOutputFailedStream.write('\n');
66 mBufferedOutputFailedStream.flush();
67 } catch(Exception e) {
68 e.printStackTrace();
69 }
70 }
Guang Zhuf4bf5522009-07-23 14:19:35 -070071
Steve Blockcf0fd782010-03-09 13:54:09 +000072 public void ignoreResult(String layout_file) {
73 try {
74 mBufferedOutputIgnoreResultStream.write(layout_file.getBytes());
75 mBufferedOutputIgnoreResultStream.write('\n');
76 mBufferedOutputIgnoreResultStream.flush();
77 } catch(Exception e) {
78 e.printStackTrace();
79 }
80 }
81
Steve Block5ac2a3b2010-03-09 14:36:00 +000082 public void noResult(String layout_file) {
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070083 try {
Steve Block5ac2a3b2010-03-09 14:36:00 +000084 mBufferedOutputNoResultStream.write(layout_file.getBytes());
85 mBufferedOutputNoResultStream.write('\n');
86 mBufferedOutputNoResultStream.flush();
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070087 } catch(Exception e) {
88 e.printStackTrace();
89 }
90 }
Guang Zhuf4bf5522009-07-23 14:19:35 -070091
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070092 public MyTestRecorder(boolean resume) {
93 try {
Christian Mehlmauer8b85dce2010-07-19 20:11:27 +020094 File externalDir = Environment.getExternalStorageDirectory();
95 File resultsPassedFile = new File(externalDir, "layout_tests_passed.txt");
96 File resultsFailedFile = new File(externalDir, "layout_tests_failed.txt");
97 File resultsIgnoreResultFile = new File(externalDir, "layout_tests_ignored.txt");
98 File noExpectedResultFile = new File(externalDir, "layout_tests_nontext.txt");
Guang Zhuf4bf5522009-07-23 14:19:35 -070099
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700100 mBufferedOutputPassedStream =
101 new BufferedOutputStream(new FileOutputStream(resultsPassedFile, resume));
102 mBufferedOutputFailedStream =
103 new BufferedOutputStream(new FileOutputStream(resultsFailedFile, resume));
Steve Blockcf0fd782010-03-09 13:54:09 +0000104 mBufferedOutputIgnoreResultStream =
105 new BufferedOutputStream(new FileOutputStream(resultsIgnoreResultFile, resume));
Steve Block5ac2a3b2010-03-09 14:36:00 +0000106 mBufferedOutputNoResultStream =
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700107 new BufferedOutputStream(new FileOutputStream(noExpectedResultFile, resume));
108 } catch (Exception e) {
109 e.printStackTrace();
110 }
111 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700112
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700113 public void close() {
114 try {
115 mBufferedOutputPassedStream.close();
116 mBufferedOutputFailedStream.close();
Steve Blockcf0fd782010-03-09 13:54:09 +0000117 mBufferedOutputIgnoreResultStream.close();
Steve Block5ac2a3b2010-03-09 14:36:00 +0000118 mBufferedOutputNoResultStream.close();
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700119 } catch (Exception e) {
120 e.printStackTrace();
121 }
122 }
123}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800124
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700125
126public class LayoutTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> {
127
128 private static final String LOGTAG = "LayoutTests";
129 static final int DEFAULT_TIMEOUT_IN_MILLIS = 5000;
Guang Zhuf4bf5522009-07-23 14:19:35 -0700130
Christian Mehlmauer8b85dce2010-07-19 20:11:27 +0200131 static final String EXTERNAL_DIR = Environment.getExternalStorageDirectory().toString();
Guang Zhu71716222011-01-12 22:57:41 -0800132 static final String LAYOUT_TESTS_ROOT = EXTERNAL_DIR + "/webkit/layout_tests/";
133 static final String LAYOUT_TESTS_RESULT_DIR = EXTERNAL_DIR + "/webkit/layout_tests_results/";
134 static final String ANDROID_EXPECTED_RESULT_DIR = EXTERNAL_DIR + "/webkit/expected_results/";
135 static final String LAYOUT_TESTS_LIST_FILE = EXTERNAL_DIR + "/webkit/layout_tests_list.txt";
136 static final String TEST_STATUS_FILE = EXTERNAL_DIR + "/webkit/running_test.txt";
Sridhar Gurivireddy36fd6d22009-03-31 14:47:19 -0700137 static final String LAYOUT_TESTS_RESULTS_REFERENCE_FILES[] = {
138 "results/layout_tests_passed.txt",
139 "results/layout_tests_failed.txt",
140 "results/layout_tests_nontext.txt",
141 "results/layout_tests_crashed.txt",
142 "run_layout_tests.py"
143 };
144
145 static final String LAYOUT_RESULTS_FAILED_RESULT_FILE = "results/layout_tests_failed.txt";
146 static final String LAYOUT_RESULTS_NONTEXT_RESULT_FILE = "results/layout_tests_nontext.txt";
147 static final String LAYOUT_RESULTS_CRASHED_RESULT_FILE = "results/layout_tests_crashed.txt";
148 static final String LAYOUT_TESTS_RUNNER = "run_layout_tests.py";
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700149
150 private MyTestRecorder mResultRecorder;
151 private Vector<String> mTestList;
Steve Blockcf0fd782010-03-09 13:54:09 +0000152 // Whether we should ignore the result for the corresponding test. Ordered same as mTestList.
153 private Vector<Boolean> mTestListIgnoreResult;
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700154 private boolean mRebaselineResults;
Steve Block12077e12010-02-25 12:50:33 +0000155 // The JavaScript engine currently in use. This determines which set of Android-specific
156 // expected test results we use.
157 private String mJsEngine;
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700158 private String mTestPathPrefix;
Guang Zhub933f6692009-05-05 01:02:14 -0700159 private boolean mFinished;
Kristian Monsen521d9a72010-05-25 20:12:47 +0100160 private int mTestCount;
Kristian Monsenfb4b88f2010-05-26 18:21:39 +0100161 private int mResumeIndex;
Guang Zhuf4bf5522009-07-23 14:19:35 -0700162
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800163 public LayoutTestsAutoTest() {
Guang Zhu6c15f602010-05-03 11:49:04 -0700164 super(TestShellActivity.class);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800165 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700166
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700167 private void getTestList() {
168 // Read test list.
169 try {
170 BufferedReader inReader = new BufferedReader(new FileReader(LAYOUT_TESTS_LIST_FILE));
171 String line = inReader.readLine();
172 while (line != null) {
Steve Blockcf0fd782010-03-09 13:54:09 +0000173 if (line.startsWith(mTestPathPrefix)) {
174 String[] components = line.split(" ");
175 mTestList.add(components[0]);
176 mTestListIgnoreResult.add(components.length > 1 && components[1].equals("IGNORE_RESULT"));
177 }
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700178 line = inReader.readLine();
179 }
180 inReader.close();
181 Log.v(LOGTAG, "Test list has " + mTestList.size() + " test(s).");
182 } catch (Exception e) {
183 Log.e(LOGTAG, "Error while reading test list : " + e.getMessage());
184 }
Kristian Monsen521d9a72010-05-25 20:12:47 +0100185 mTestCount = mTestList.size();
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700186 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700187
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700188 private void resumeTestList() {
189 // read out the test name it stoped last time.
190 try {
Guang Zhuf92bd422009-06-29 10:40:55 -0700191 String line = FsUtils.readTestStatus(TEST_STATUS_FILE);
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700192 for (int i = 0; i < mTestList.size(); i++) {
193 if (mTestList.elementAt(i).equals(line)) {
194 mTestList = new Vector<String>(mTestList.subList(i+1, mTestList.size()));
Steve Blockcf0fd782010-03-09 13:54:09 +0000195 mTestListIgnoreResult = new Vector<Boolean>(mTestListIgnoreResult.subList(i+1, mTestListIgnoreResult.size()));
Kristian Monsenfb4b88f2010-05-26 18:21:39 +0100196 mResumeIndex = i + 1;
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700197 break;
198 }
199 }
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700200 } catch (Exception e) {
201 Log.e(LOGTAG, "Error reading " + TEST_STATUS_FILE);
202 }
203 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700204
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700205 private void clearTestStatus() {
206 // Delete TEST_STATUS_FILE
207 try {
208 File f = new File(TEST_STATUS_FILE);
209 if (f.delete())
210 Log.v(LOGTAG, "Deleted " + TEST_STATUS_FILE);
211 else
212 Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE);
213 } catch (Exception e) {
214 Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE + " : " + e.getMessage());
215 }
216 }
Guang Zhuf92bd422009-06-29 10:40:55 -0700217
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700218 private String getResultFile(String test) {
219 String shortName = test.substring(0, test.lastIndexOf('.'));
220 // Write actual results to result directory.
221 return shortName.replaceFirst(LAYOUT_TESTS_ROOT, LAYOUT_TESTS_RESULT_DIR) + "-result.txt";
222 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700223
Steve Block12077e12010-02-25 12:50:33 +0000224 // Gets the file which contains WebKit's expected results for this test.
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700225 private String getExpectedResultFile(String test) {
Steve Block12077e12010-02-25 12:50:33 +0000226 // The generic result is at <path>/<name>-expected.txt
227 // First try the Android-specific result at
228 // platform/android-<js-engine>/<path>/<name>-expected.txt
Steve Blocka8883752010-07-12 17:50:06 +0100229 // then
230 // platform/android/<path>/<name>-expected.txt
Guang Zhu2a197b12009-05-18 14:37:23 -0700231 int pos = test.lastIndexOf('.');
Steve Block12077e12010-02-25 12:50:33 +0000232 if (pos == -1)
Guang Zhu2a197b12009-05-18 14:37:23 -0700233 return null;
Steve Block12077e12010-02-25 12:50:33 +0000234 String genericExpectedResult = test.substring(0, pos) + "-expected.txt";
235 String androidExpectedResultsDir = "platform/android-" + mJsEngine + "/";
Steve Blocka8883752010-07-12 17:50:06 +0100236 String androidExpectedResult = genericExpectedResult.replaceFirst(LAYOUT_TESTS_ROOT,
237 LAYOUT_TESTS_ROOT + androidExpectedResultsDir);
Steve Block12077e12010-02-25 12:50:33 +0000238 File f = new File(androidExpectedResult);
Steve Blocka8883752010-07-12 17:50:06 +0100239 if (f.exists())
240 return androidExpectedResult;
241 androidExpectedResultsDir = "platform/android/";
242 androidExpectedResult = genericExpectedResult.replaceFirst(LAYOUT_TESTS_ROOT,
243 LAYOUT_TESTS_ROOT + androidExpectedResultsDir);
244 f = new File(androidExpectedResult);
Steve Block12077e12010-02-25 12:50:33 +0000245 return f.exists() ? androidExpectedResult : genericExpectedResult;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800246 }
247
Steve Block12077e12010-02-25 12:50:33 +0000248 // Gets the file which contains the actual results of running the test on
249 // Android, generated by a previous run which set a new baseline.
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700250 private String getAndroidExpectedResultFile(String expectedResultFile) {
251 return expectedResultFile.replaceFirst(LAYOUT_TESTS_ROOT, ANDROID_EXPECTED_RESULT_DIR);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800252 }
253
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700254 // Wrap up
255 private void failedCase(String file) {
256 Log.w("Layout test: ", file + " failed");
Guang Zhuf4bf5522009-07-23 14:19:35 -0700257 mResultRecorder.failed(file);
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700258 }
259
260 private void passedCase(String file) {
261 Log.v("Layout test:", file + " passed");
262 mResultRecorder.passed(file);
263 }
264
Steve Blockcf0fd782010-03-09 13:54:09 +0000265 private void ignoreResultCase(String file) {
266 Log.v("Layout test:", file + " ignore result");
267 mResultRecorder.ignoreResult(file);
268 }
269
Steve Block5ac2a3b2010-03-09 14:36:00 +0000270 private void noResultCase(String file) {
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700271 Log.v("Layout test:", file + " no expected result");
Steve Block5ac2a3b2010-03-09 14:36:00 +0000272 mResultRecorder.noResult(file);
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700273 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700274
Steve Blockcf0fd782010-03-09 13:54:09 +0000275 private void processResult(String testFile, String actualResultFile, String expectedResultFile, boolean ignoreResult) {
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700276 Log.v(LOGTAG, " Processing result: " + testFile);
277
Steve Blockcf0fd782010-03-09 13:54:09 +0000278 if (ignoreResult) {
279 ignoreResultCase(testFile);
280 return;
281 }
282
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700283 File actual = new File(actualResultFile);
284 File expected = new File(expectedResultFile);
285 if (actual.exists() && expected.exists()) {
286 try {
Guang Zhuea48cd62009-11-12 10:18:14 -0800287 if (FsUtils.diffIgnoreSpaces(actualResultFile, expectedResultFile)) {
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700288 passedCase(testFile);
289 } else {
290 failedCase(testFile);
291 }
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700292 } catch (FileNotFoundException ex) {
293 Log.e(LOGTAG, "File not found : " + ex.getMessage());
294 } catch (IOException ex) {
295 Log.e(LOGTAG, "IO Error : " + ex.getMessage());
296 }
297 return;
298 }
299
300 if (!expected.exists()) {
Steve Block5ac2a3b2010-03-09 14:36:00 +0000301 noResultCase(testFile);
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700302 }
303 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700304
Ben Murdoch9b815d02010-06-01 18:45:10 +0100305 private void runTestAndWaitUntilDone(TestShellActivity activity, String test, int timeout, boolean ignoreResult, int testNumber) {
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700306 activity.setCallback(new TestShellCallback() {
307 public void finished() {
308 synchronized (LayoutTestsAutoTest.this) {
Guang Zhub933f6692009-05-05 01:02:14 -0700309 mFinished = true;
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700310 LayoutTestsAutoTest.this.notifyAll();
311 }
Guang Zhu4010ac32009-04-29 14:49:03 -0700312 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700313
Guang Zhu4010ac32009-04-29 14:49:03 -0700314 public void timedOut(String url) {
Guang Zhu4a40a032009-09-01 10:23:24 -0700315 Log.v(LOGTAG, "layout timeout: " + url);
Guang Zhu4010ac32009-04-29 14:49:03 -0700316 }
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700317 });
318
319 String resultFile = getResultFile(test);
Steve Block12077e12010-02-25 12:50:33 +0000320 if (resultFile == null) {
321 // Simply ignore this test.
Guang Zhu2a197b12009-05-18 14:37:23 -0700322 return;
323 }
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700324 if (mRebaselineResults) {
325 String expectedResultFile = getExpectedResultFile(test);
326 File f = new File(expectedResultFile);
327 if (f.exists()) {
328 return; // don't run test and don't overwrite default tests.
329 }
330
331 resultFile = getAndroidExpectedResultFile(expectedResultFile);
332 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700333
Guang Zhub933f6692009-05-05 01:02:14 -0700334 mFinished = false;
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700335 Intent intent = new Intent(Intent.ACTION_VIEW);
336 intent.setClass(activity, TestShellActivity.class);
337 intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Guang Zhu6bf18ba2009-09-15 23:47:20 -0700338 intent.putExtra(TestShellActivity.TEST_URL, FsUtils.getTestUrl(test));
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700339 intent.putExtra(TestShellActivity.RESULT_FILE, resultFile);
340 intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout);
Ben Murdoch9b815d02010-06-01 18:45:10 +0100341 intent.putExtra(TestShellActivity.TOTAL_TEST_COUNT, mTestCount);
342 intent.putExtra(TestShellActivity.CURRENT_TEST_NUMBER, testNumber);
Guang Zhu5d53c192010-07-14 17:17:54 -0700343 intent.putExtra(TestShellActivity.STOP_ON_REF_ERROR, true);
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700344 activity.startActivity(intent);
Guang Zhuf4bf5522009-07-23 14:19:35 -0700345
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700346 // Wait until done.
347 synchronized (this) {
Guang Zhub933f6692009-05-05 01:02:14 -0700348 while(!mFinished){
349 try {
350 this.wait();
351 } catch (InterruptedException e) { }
352 }
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700353 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700354
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700355 if (!mRebaselineResults) {
356 String expectedResultFile = getExpectedResultFile(test);
357 File f = new File(expectedResultFile);
358 if (!f.exists()) {
359 expectedResultFile = getAndroidExpectedResultFile(expectedResultFile);
360 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700361
Steve Blockcf0fd782010-03-09 13:54:09 +0000362 processResult(test, resultFile, expectedResultFile, ignoreResult);
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700363 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700364 }
365
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800366 // Invokes running of layout tests
367 // and waits till it has finished running.
368 public void executeLayoutTests(boolean resume) {
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700369 LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
370 // A convenient method to be called by another activity.
371
372 if (runner.mTestPath == null) {
373 Log.e(LOGTAG, "No test specified");
374 return;
375 }
376
377 this.mTestList = new Vector<String>();
Steve Blockcf0fd782010-03-09 13:54:09 +0000378 this.mTestListIgnoreResult = new Vector<Boolean>();
Guang Zhuf4bf5522009-07-23 14:19:35 -0700379
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700380 // Read settings
Steve Block12077e12010-02-25 12:50:33 +0000381 mTestPathPrefix = (new File(LAYOUT_TESTS_ROOT + runner.mTestPath)).getAbsolutePath();
382 mRebaselineResults = runner.mRebaseline;
Steve Blockc1d86512010-05-13 10:59:59 +0100383 // V8 is the default JavaScript engine.
384 mJsEngine = runner.mJsEngine == null ? "v8" : runner.mJsEngine;
Guang Zhuf4bf5522009-07-23 14:19:35 -0700385
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700386 int timeout = runner.mTimeoutInMillis;
387 if (timeout <= 0) {
388 timeout = DEFAULT_TIMEOUT_IN_MILLIS;
389 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700390
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700391 this.mResultRecorder = new MyTestRecorder(resume);
Guang Zhuf4bf5522009-07-23 14:19:35 -0700392
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700393 if (!resume)
394 clearTestStatus();
Guang Zhuf4bf5522009-07-23 14:19:35 -0700395
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700396 getTestList();
397 if (resume)
398 resumeTestList();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800399
Guang Zhuf3d924c2009-09-01 11:57:16 -0700400 TestShellActivity activity = getActivity();
Guang Zhu6c15f602010-05-03 11:49:04 -0700401 activity.setDefaultDumpDataType(DumpDataType.EXT_REPR);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800402
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700403 // Run tests.
404 for (int i = 0; i < mTestList.size(); i++) {
405 String s = mTestList.elementAt(i);
Steve Blockcf0fd782010-03-09 13:54:09 +0000406 boolean ignoreResult = mTestListIgnoreResult.elementAt(i);
Guang Zhuf92bd422009-06-29 10:40:55 -0700407 FsUtils.updateTestStatus(TEST_STATUS_FILE, s);
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700408 // Run tests
Ben Murdoch9b815d02010-06-01 18:45:10 +0100409 // i is 0 based, but test count is 1 based so add 1 to i here.
410 runTestAndWaitUntilDone(activity, s, runner.mTimeoutInMillis, ignoreResult,
411 i + 1 + mResumeIndex);
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700412 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800413
Guang Zhuf92bd422009-06-29 10:40:55 -0700414 FsUtils.updateTestStatus(TEST_STATUS_FILE, "#DONE");
Guang Zhu6bf18ba2009-09-15 23:47:20 -0700415 ForwardService.getForwardService().stopForwardService();
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700416 activity.finish();
417 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800418
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700419 private String getTestPath() {
420 LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
421
422 String test_path = LAYOUT_TESTS_ROOT;
423 if (runner.mTestPath != null) {
424 test_path += runner.mTestPath;
425 }
Guang Zhu8cd303a2010-02-22 16:16:24 -0800426 test_path = new File(test_path).getAbsolutePath();
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700427 Log.v("LayoutTestsAutoTest", " Test path : " + test_path);
Guang Zhuf4bf5522009-07-23 14:19:35 -0700428
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700429 return test_path;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800430 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700431
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800432 public void generateTestList() {
433 try {
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700434 File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800435 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tests_list, false));
Ben Murdoch9b815d02010-06-01 18:45:10 +0100436 FsUtils.writeLayoutTestListRecursively(bos, getTestPath(), false); // Don't ignore results
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800437 bos.flush();
438 bos.close();
439 } catch (Exception e) {
440 Log.e(LOGTAG, "Error when creating test list: " + e.getMessage());
441 }
442 }
443
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800444 // Running all the layout tests at once sometimes
445 // causes the dumprendertree to run out of memory.
446 // So, additional tests are added to run the tests
447 // in chunks.
448 public void startLayoutTests() {
449 try {
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -0700450 File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800451 if (!tests_list.exists())
452 generateTestList();
453 } catch (Exception e) {
454 e.printStackTrace();
455 }
Guang Zhuf4bf5522009-07-23 14:19:35 -0700456
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800457 executeLayoutTests(false);
458 }
459
460 public void resumeLayoutTests() {
461 executeLayoutTests(true);
462 }
Sridhar Gurivireddy36fd6d22009-03-31 14:47:19 -0700463
464 public void copyResultsAndRunnerAssetsToCache() {
465 try {
Guang Zhu00069522010-12-06 11:17:38 -0800466 Context targetContext = getInstrumentation().getTargetContext();
467 File cacheDir = targetContext.getCacheDir();
Sridhar Gurivireddy36fd6d22009-03-31 14:47:19 -0700468
469 for( int i=0; i< LAYOUT_TESTS_RESULTS_REFERENCE_FILES.length; i++) {
Guang Zhu00069522010-12-06 11:17:38 -0800470 InputStream in = targetContext.getAssets().open(
471 LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]);
472 OutputStream out = new FileOutputStream(new File(cacheDir,
473 LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]));
Sridhar Gurivireddy36fd6d22009-03-31 14:47:19 -0700474
475 byte[] buf = new byte[2048];
476 int len;
477
Guang Zhub933f6692009-05-05 01:02:14 -0700478 while ((len = in.read(buf)) >= 0 ) {
Sridhar Gurivireddy36fd6d22009-03-31 14:47:19 -0700479 out.write(buf, 0, len);
480 }
481 out.close();
482 in.close();
483 }
484 }catch (IOException e) {
485 e.printStackTrace();
486 }
487
488 }
489
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800490}