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