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; 216bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhuimport com.android.dumprendertree.forwarder.ForwardService; 22f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 230006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhuimport android.content.Context; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 258b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauerimport android.os.Environment; 26ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2; 27b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport android.util.Log; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedOutputStream; 30ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.BufferedReader; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 32ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileNotFoundException; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 34ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileReader; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 3636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddyimport java.io.InputStream; 3736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddyimport java.io.OutputStream; 38ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.util.Vector; 39ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 40cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block// TestRecorder creates four files ... 415ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block// - passing tests 425ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block// - failing tests 43cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block// - tests for which results are ignored 445ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block// - tests with no text results available 455ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block// TestRecorder does not have the ability to clear the results. 46ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectclass MyTestRecorder { 47ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private BufferedOutputStream mBufferedOutputPassedStream; 48ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private BufferedOutputStream mBufferedOutputFailedStream; 49cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block private BufferedOutputStream mBufferedOutputIgnoreResultStream; 505ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block private BufferedOutputStream mBufferedOutputNoResultStream; 51f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 52ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void passed(String layout_file) { 53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputPassedStream.write(layout_file.getBytes()); 55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputPassedStream.write('\n'); 56ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputPassedStream.flush(); 57ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch(Exception e) { 58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project e.printStackTrace(); 59ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 60ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 61f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 62ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void failed(String layout_file) { 63ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 64ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputFailedStream.write(layout_file.getBytes()); 65ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputFailedStream.write('\n'); 66ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputFailedStream.flush(); 67ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch(Exception e) { 68ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project e.printStackTrace(); 69ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 70ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 71f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 72cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block public void ignoreResult(String layout_file) { 73cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block try { 74cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block mBufferedOutputIgnoreResultStream.write(layout_file.getBytes()); 75cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block mBufferedOutputIgnoreResultStream.write('\n'); 76cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block mBufferedOutputIgnoreResultStream.flush(); 77cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block } catch(Exception e) { 78cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block e.printStackTrace(); 79cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block } 80cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block } 81cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block 825ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block public void noResult(String layout_file) { 83ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 845ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block mBufferedOutputNoResultStream.write(layout_file.getBytes()); 855ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block mBufferedOutputNoResultStream.write('\n'); 865ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block mBufferedOutputNoResultStream.flush(); 87ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch(Exception e) { 88ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project e.printStackTrace(); 89ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 90ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 91f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 92ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public MyTestRecorder(boolean resume) { 93ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 948b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer File externalDir = Environment.getExternalStorageDirectory(); 958b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer File resultsPassedFile = new File(externalDir, "layout_tests_passed.txt"); 968b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer File resultsFailedFile = new File(externalDir, "layout_tests_failed.txt"); 978b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer File resultsIgnoreResultFile = new File(externalDir, "layout_tests_ignored.txt"); 988b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer File noExpectedResultFile = new File(externalDir, "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 1318b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer static final String EXTERNAL_DIR = Environment.getExternalStorageDirectory().toString(); 13271716223201a01a4f4b6fe182ad97720b7d06124Guang Zhu static final String LAYOUT_TESTS_ROOT = EXTERNAL_DIR + "/webkit/layout_tests/"; 13371716223201a01a4f4b6fe182ad97720b7d06124Guang Zhu static final String LAYOUT_TESTS_RESULT_DIR = EXTERNAL_DIR + "/webkit/layout_tests_results/"; 13471716223201a01a4f4b6fe182ad97720b7d06124Guang Zhu static final String ANDROID_EXPECTED_RESULT_DIR = EXTERNAL_DIR + "/webkit/expected_results/"; 13571716223201a01a4f4b6fe182ad97720b7d06124Guang Zhu static final String LAYOUT_TESTS_LIST_FILE = EXTERNAL_DIR + "/webkit/layout_tests_list.txt"; 13671716223201a01a4f4b6fe182ad97720b7d06124Guang Zhu static final String TEST_STATUS_FILE = EXTERNAL_DIR + "/webkit/running_test.txt"; 13736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy static final String LAYOUT_TESTS_RESULTS_REFERENCE_FILES[] = { 13836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy "results/layout_tests_passed.txt", 13936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy "results/layout_tests_failed.txt", 14036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy "results/layout_tests_nontext.txt", 14136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy "results/layout_tests_crashed.txt", 14236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy "run_layout_tests.py" 14336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy }; 14436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 14536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy static final String LAYOUT_RESULTS_FAILED_RESULT_FILE = "results/layout_tests_failed.txt"; 14636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy static final String LAYOUT_RESULTS_NONTEXT_RESULT_FILE = "results/layout_tests_nontext.txt"; 14736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy static final String LAYOUT_RESULTS_CRASHED_RESULT_FILE = "results/layout_tests_crashed.txt"; 14836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy static final String LAYOUT_TESTS_RUNNER = "run_layout_tests.py"; 149ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 150ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private MyTestRecorder mResultRecorder; 151ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private Vector<String> mTestList; 152cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block // Whether we should ignore the result for the corresponding test. Ordered same as mTestList. 153cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block private Vector<Boolean> mTestListIgnoreResult; 154ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private boolean mRebaselineResults; 15512077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block // The JavaScript engine currently in use. This determines which set of Android-specific 15612077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block // expected test results we use. 15712077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block private String mJsEngine; 158ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private String mTestPathPrefix; 159b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu private boolean mFinished; 160521d9a798613cc9ad850f42343d2fbfa6c98f5c7Kristian Monsen private int mTestCount; 161fb4b88fddb95ae37bafb304bec8d7f0a0d447dd9Kristian Monsen private int mResumeIndex; 162f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutTestsAutoTest() { 1646c15f6003a69e664f132342be2252a77e480495bGuang Zhu super(TestShellActivity.class); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 166f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 167ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void getTestList() { 168ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Read test list. 169ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 170ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project BufferedReader inReader = new BufferedReader(new FileReader(LAYOUT_TESTS_LIST_FILE)); 171ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String line = inReader.readLine(); 172ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project while (line != null) { 173cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block if (line.startsWith(mTestPathPrefix)) { 174cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block String[] components = line.split(" "); 175cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block mTestList.add(components[0]); 176cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block mTestListIgnoreResult.add(components.length > 1 && components[1].equals("IGNORE_RESULT")); 177cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block } 178ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project line = inReader.readLine(); 179ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 180ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project inReader.close(); 181ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v(LOGTAG, "Test list has " + mTestList.size() + " test(s)."); 182ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (Exception e) { 183ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "Error while reading test list : " + e.getMessage()); 184ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 185521d9a798613cc9ad850f42343d2fbfa6c98f5c7Kristian Monsen mTestCount = mTestList.size(); 186ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 187f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 188ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void resumeTestList() { 189ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // read out the test name it stoped last time. 190ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 191f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu String line = FsUtils.readTestStatus(TEST_STATUS_FILE); 192ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project for (int i = 0; i < mTestList.size(); i++) { 193ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (mTestList.elementAt(i).equals(line)) { 194ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mTestList = new Vector<String>(mTestList.subList(i+1, mTestList.size())); 195cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block mTestListIgnoreResult = new Vector<Boolean>(mTestListIgnoreResult.subList(i+1, mTestListIgnoreResult.size())); 196fb4b88fddb95ae37bafb304bec8d7f0a0d447dd9Kristian Monsen mResumeIndex = i + 1; 197ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project break; 198ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 199ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 200ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (Exception e) { 201ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "Error reading " + TEST_STATUS_FILE); 202ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 203ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 204f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 205ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void clearTestStatus() { 206ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Delete TEST_STATUS_FILE 207ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 208ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File f = new File(TEST_STATUS_FILE); 209ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (f.delete()) 210ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v(LOGTAG, "Deleted " + TEST_STATUS_FILE); 211ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project else 212ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE); 213ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (Exception e) { 214ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE + " : " + e.getMessage()); 215ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 216ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 217f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu 218ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private String getResultFile(String test) { 219ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String shortName = test.substring(0, test.lastIndexOf('.')); 220ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Write actual results to result directory. 221ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return shortName.replaceFirst(LAYOUT_TESTS_ROOT, LAYOUT_TESTS_RESULT_DIR) + "-result.txt"; 222ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 223f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 22412077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block // Gets the file which contains WebKit's expected results for this test. 225ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private String getExpectedResultFile(String test) { 22612077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block // The generic result is at <path>/<name>-expected.txt 22712077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block // First try the Android-specific result at 22812077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block // platform/android-<js-engine>/<path>/<name>-expected.txt 229a88837573e4b99dafd901cfc36589e3ab9449873Steve Block // then 230a88837573e4b99dafd901cfc36589e3ab9449873Steve Block // platform/android/<path>/<name>-expected.txt 2312a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu int pos = test.lastIndexOf('.'); 23212077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block if (pos == -1) 2332a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu return null; 23412077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block String genericExpectedResult = test.substring(0, pos) + "-expected.txt"; 23512077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block String androidExpectedResultsDir = "platform/android-" + mJsEngine + "/"; 236a88837573e4b99dafd901cfc36589e3ab9449873Steve Block String androidExpectedResult = genericExpectedResult.replaceFirst(LAYOUT_TESTS_ROOT, 237a88837573e4b99dafd901cfc36589e3ab9449873Steve Block LAYOUT_TESTS_ROOT + androidExpectedResultsDir); 23812077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block File f = new File(androidExpectedResult); 239a88837573e4b99dafd901cfc36589e3ab9449873Steve Block if (f.exists()) 240a88837573e4b99dafd901cfc36589e3ab9449873Steve Block return androidExpectedResult; 241a88837573e4b99dafd901cfc36589e3ab9449873Steve Block androidExpectedResultsDir = "platform/android/"; 242a88837573e4b99dafd901cfc36589e3ab9449873Steve Block androidExpectedResult = genericExpectedResult.replaceFirst(LAYOUT_TESTS_ROOT, 243a88837573e4b99dafd901cfc36589e3ab9449873Steve Block LAYOUT_TESTS_ROOT + androidExpectedResultsDir); 244a88837573e4b99dafd901cfc36589e3ab9449873Steve Block f = new File(androidExpectedResult); 24512077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block return f.exists() ? androidExpectedResult : genericExpectedResult; 246ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 247ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 24812077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block // Gets the file which contains the actual results of running the test on 24912077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block // Android, generated by a previous run which set a new baseline. 250ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private String getAndroidExpectedResultFile(String expectedResultFile) { 251ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return expectedResultFile.replaceFirst(LAYOUT_TESTS_ROOT, ANDROID_EXPECTED_RESULT_DIR); 252ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 253ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 254ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Wrap up 255ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void failedCase(String file) { 256ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.w("Layout test: ", file + " failed"); 257f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu mResultRecorder.failed(file); 258ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 260ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void passedCase(String file) { 261ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v("Layout test:", file + " passed"); 262ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mResultRecorder.passed(file); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 265cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block private void ignoreResultCase(String file) { 266cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block Log.v("Layout test:", file + " ignore result"); 267cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block mResultRecorder.ignoreResult(file); 268cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block } 269cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block 2705ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block private void noResultCase(String file) { 271ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v("Layout test:", file + " no expected result"); 2725ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block mResultRecorder.noResult(file); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 274f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 275cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block private void processResult(String testFile, String actualResultFile, String expectedResultFile, boolean ignoreResult) { 276ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v(LOGTAG, " Processing result: " + testFile); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 278cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block if (ignoreResult) { 279cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block ignoreResultCase(testFile); 280cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block return; 281cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block } 282cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block 283ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File actual = new File(actualResultFile); 284ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File expected = new File(expectedResultFile); 285ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (actual.exists() && expected.exists()) { 286ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 287ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu if (FsUtils.diffIgnoreSpaces(actualResultFile, expectedResultFile)) { 288ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project passedCase(testFile); 289ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } else { 290ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project failedCase(testFile); 291ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 292ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (FileNotFoundException ex) { 293ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "File not found : " + ex.getMessage()); 294ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (IOException ex) { 295ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "IO Error : " + ex.getMessage()); 296ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 297ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 298ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 299ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 300ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!expected.exists()) { 3015ac2a3bd697cb86022aa7d4dc0c8fbd6a10b8193Steve Block noResultCase(testFile); 302ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 303ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 304f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 3059b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch private void runTestAndWaitUntilDone(TestShellActivity activity, String test, int timeout, boolean ignoreResult, int testNumber) { 306ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.setCallback(new TestShellCallback() { 307ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void finished() { 308ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (LayoutTestsAutoTest.this) { 309b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu mFinished = true; 310ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LayoutTestsAutoTest.this.notifyAll(); 311ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 3124010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu } 313f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 3144010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu public void timedOut(String url) { 3154a40a039c020d339df14896448defa59efcc910dGuang Zhu Log.v(LOGTAG, "layout timeout: " + url); 3164010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu } 3173ae8c42152d890ab771053fa6b16b038ee44326dGuang Zhu 3183ae8c42152d890ab771053fa6b16b038ee44326dGuang Zhu @Override 3193ae8c42152d890ab771053fa6b16b038ee44326dGuang Zhu public void dumpResult(String webViewDump) { 3203ae8c42152d890ab771053fa6b16b038ee44326dGuang Zhu } 321ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project }); 322ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 323ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String resultFile = getResultFile(test); 32412077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block if (resultFile == null) { 32512077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block // Simply ignore this test. 3262a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu return; 3272a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu } 328ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (mRebaselineResults) { 329ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String expectedResultFile = getExpectedResultFile(test); 330ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File f = new File(expectedResultFile); 331ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (f.exists()) { 332ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; // don't run test and don't overwrite default tests. 333ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 334ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 335ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project resultFile = getAndroidExpectedResultFile(expectedResultFile); 336ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 337f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 338b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu mFinished = false; 339ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 340ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.setClass(activity, TestShellActivity.class); 341ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 3426bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu intent.putExtra(TestShellActivity.TEST_URL, FsUtils.getTestUrl(test)); 343ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.RESULT_FILE, resultFile); 344ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout); 3459b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch intent.putExtra(TestShellActivity.TOTAL_TEST_COUNT, mTestCount); 3469b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch intent.putExtra(TestShellActivity.CURRENT_TEST_NUMBER, testNumber); 3475d53c19a10ab677d2ebcec0bfecc3b628663f407Guang Zhu intent.putExtra(TestShellActivity.STOP_ON_REF_ERROR, true); 348ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.startActivity(intent); 349f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 350ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Wait until done. 351ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (this) { 352b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu while(!mFinished){ 353b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu try { 354b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu this.wait(); 355b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } catch (InterruptedException e) { } 356b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 357ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 358f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 359ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!mRebaselineResults) { 360ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String expectedResultFile = getExpectedResultFile(test); 361ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File f = new File(expectedResultFile); 362ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!f.exists()) { 363ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project expectedResultFile = getAndroidExpectedResultFile(expectedResultFile); 364ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 365f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 366cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block processResult(test, resultFile, expectedResultFile, ignoreResult); 367ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 368f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu } 369f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Invokes running of layout tests 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // and waits till it has finished running. 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void executeLayoutTests(boolean resume) { 373ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation(); 374ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // A convenient method to be called by another activity. 375ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 376ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (runner.mTestPath == null) { 377ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "No test specified"); 378ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 379ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 380ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 381ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project this.mTestList = new Vector<String>(); 382cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block this.mTestListIgnoreResult = new Vector<Boolean>(); 383f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 384ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Read settings 38512077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block mTestPathPrefix = (new File(LAYOUT_TESTS_ROOT + runner.mTestPath)).getAbsolutePath(); 38612077e1179b4035ae2b1a44ccf9cd540e14b182eSteve Block mRebaselineResults = runner.mRebaseline; 387c1d8651538cf01881c42d638c836ff6405037ffeSteve Block // V8 is the default JavaScript engine. 388c1d8651538cf01881c42d638c836ff6405037ffeSteve Block mJsEngine = runner.mJsEngine == null ? "v8" : runner.mJsEngine; 389f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 390ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project int timeout = runner.mTimeoutInMillis; 391ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (timeout <= 0) { 392ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project timeout = DEFAULT_TIMEOUT_IN_MILLIS; 393ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 394f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 395ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project this.mResultRecorder = new MyTestRecorder(resume); 396f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 397ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!resume) 398ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project clearTestStatus(); 399f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 400ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project getTestList(); 401ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (resume) 402ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project resumeTestList(); 403ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 404f3d924ca0d3e8225824eb50540962e1890fea6f2Guang Zhu TestShellActivity activity = getActivity(); 4056c15f6003a69e664f132342be2252a77e480495bGuang Zhu activity.setDefaultDumpDataType(DumpDataType.EXT_REPR); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 407ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Run tests. 408ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project for (int i = 0; i < mTestList.size(); i++) { 409ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String s = mTestList.elementAt(i); 410cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block boolean ignoreResult = mTestListIgnoreResult.elementAt(i); 411f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu FsUtils.updateTestStatus(TEST_STATUS_FILE, s); 412ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Run tests 4139b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch // i is 0 based, but test count is 1 based so add 1 to i here. 4149b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch runTestAndWaitUntilDone(activity, s, runner.mTimeoutInMillis, ignoreResult, 4159b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch i + 1 + mResumeIndex); 416ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 418f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu FsUtils.updateTestStatus(TEST_STATUS_FILE, "#DONE"); 4196bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu ForwardService.getForwardService().stopForwardService(); 420ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.finish(); 421ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 423ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private String getTestPath() { 424ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation(); 425ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 426ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String test_path = LAYOUT_TESTS_ROOT; 427ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (runner.mTestPath != null) { 428ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project test_path += runner.mTestPath; 429ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 4308cd303aec6f11ea9fece70f6e3d82efb607f8637Guang Zhu test_path = new File(test_path).getAbsolutePath(); 431ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v("LayoutTestsAutoTest", " Test path : " + test_path); 432f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 433ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return test_path; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 435f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void generateTestList() { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 438ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File tests_list = new File(LAYOUT_TESTS_LIST_FILE); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tests_list, false)); 4409b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch FsUtils.writeLayoutTestListRecursively(bos, getTestPath(), false); // Don't ignore results 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bos.flush(); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bos.close(); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "Error when creating test list: " + e.getMessage()); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Running all the layout tests at once sometimes 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // causes the dumprendertree to run out of memory. 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // So, additional tests are added to run the tests 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in chunks. 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startLayoutTests() { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 454ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File tests_list = new File(LAYOUT_TESTS_LIST_FILE); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!tests_list.exists()) 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project generateTestList(); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e.printStackTrace(); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 460f4bf552b5a5046e7648f405115ee48917b15b9aaGuang Zhu 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project executeLayoutTests(false); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resumeLayoutTests() { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project executeLayoutTests(true); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 46836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy public void copyResultsAndRunnerAssetsToCache() { 46936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy try { 4700006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhu Context targetContext = getInstrumentation().getTargetContext(); 4710006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhu File cacheDir = targetContext.getCacheDir(); 47236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 47336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy for( int i=0; i< LAYOUT_TESTS_RESULTS_REFERENCE_FILES.length; i++) { 4740006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhu InputStream in = targetContext.getAssets().open( 4750006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhu LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]); 4760006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhu OutputStream out = new FileOutputStream(new File(cacheDir, 4770006952a8dc5a115cceb597ac53ec5bce703fd4fGuang Zhu LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i])); 47836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 47936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy byte[] buf = new byte[2048]; 48036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy int len; 48136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 482b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu while ((len = in.read(buf)) >= 0 ) { 48336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy out.write(buf, 0, len); 48436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy } 48536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy out.close(); 48636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy in.close(); 48736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy } 48836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy }catch (IOException e) { 48936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy e.printStackTrace(); 49036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy } 49136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 49236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy } 49336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 495