LayoutTestsAutoTest.java revision 2a197b128a2317eec6efaa0a21e529cdf534c6f2
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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Instrumentation; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 22ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2; 23b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport android.util.Log; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedOutputStream; 26ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.BufferedReader; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 28ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileNotFoundException; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 30ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileReader; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 3236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddyimport java.io.InputStream; 3336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddyimport java.io.OutputStream; 34ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.util.Vector; 35ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 36ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//TestRecorder creates two files, one for passing tests 37ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//and another for failing tests and writes the paths to 38ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//layout tests one line at a time. TestRecorder does not 39ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project//have ability to clear the results. 40ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectclass MyTestRecorder { 41ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private BufferedOutputStream mBufferedOutputPassedStream; 42ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private BufferedOutputStream mBufferedOutputFailedStream; 43ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private BufferedOutputStream mBufferedOutputNoresultStream; 444010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu private BufferedOutputStream mBufferedOutputTimedoutStream; 45ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 46ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void passed(String layout_file) { 47ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 48ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputPassedStream.write(layout_file.getBytes()); 49ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputPassedStream.write('\n'); 50ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputPassedStream.flush(); 51ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch(Exception e) { 52ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project e.printStackTrace(); 53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 56ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void failed(String layout_file) { 57ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputFailedStream.write(layout_file.getBytes()); 59ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputFailedStream.write('\n'); 60ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputFailedStream.flush(); 61ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch(Exception e) { 62ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project e.printStackTrace(); 63ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 64ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 65ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 66ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void noresult(String layout_file) { 67ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 68ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputNoresultStream.write(layout_file.getBytes()); 69ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputNoresultStream.write('\n'); 70ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputNoresultStream.flush(); 71ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch(Exception e) { 72ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project e.printStackTrace(); 73ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 74ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 75ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 764010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu public void timedout(String url) { 774010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu try { 784010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu mBufferedOutputTimedoutStream.write(url.getBytes()); 794010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu mBufferedOutputTimedoutStream.write('\n'); 804010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu mBufferedOutputTimedoutStream.flush(); 814010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu } catch (Exception e) { 824010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu e.printStackTrace(); 834010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu } 844010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu } 854010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 86ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public MyTestRecorder(boolean resume) { 87ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 88ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File resultsPassedFile = new File("/sdcard/layout_tests_passed.txt"); 89ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File resultsFailedFile = new File("/sdcard/layout_tests_failed.txt"); 90ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File noExpectedResultFile = new File("/sdcard/layout_tests_nontext.txt"); 914010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu File resultTimedoutFile = new File("/sdcard/layout_tests_timedout.txt"); 92ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 93ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputPassedStream = 94ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project new BufferedOutputStream(new FileOutputStream(resultsPassedFile, resume)); 95ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputFailedStream = 96ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project new BufferedOutputStream(new FileOutputStream(resultsFailedFile, resume)); 97ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputNoresultStream = 98ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project new BufferedOutputStream(new FileOutputStream(noExpectedResultFile, resume)); 994010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu mBufferedOutputTimedoutStream = 1004010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu new BufferedOutputStream(new FileOutputStream(resultTimedoutFile, resume)); 101ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (Exception e) { 102ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project e.printStackTrace(); 103ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 104ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 105ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 106ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void close() { 107ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 108ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputPassedStream.close(); 109ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputFailedStream.close(); 110ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mBufferedOutputNoresultStream.close(); 1114010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu mBufferedOutputTimedoutStream.close(); 112ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (Exception e) { 113ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project e.printStackTrace(); 114ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 115ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 116ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project} 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 119ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectpublic class LayoutTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> { 120ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 121ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private static final String LOGTAG = "LayoutTests"; 122ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project static final int DEFAULT_TIMEOUT_IN_MILLIS = 5000; 123ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 124ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project static final String LAYOUT_TESTS_ROOT = "/sdcard/android/layout_tests/"; 125ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project static final String LAYOUT_TESTS_RESULT_DIR = "/sdcard/android/layout_tests_results/"; 126ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project static final String ANDROID_EXPECTED_RESULT_DIR = "/sdcard/android/expected_results/"; 127ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project static final String LAYOUT_TESTS_LIST_FILE = "/sdcard/android/layout_tests_list.txt"; 128ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project static final String TEST_STATUS_FILE = "/sdcard/android/running_test.txt"; 12936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy static final String LAYOUT_TESTS_RESULTS_REFERENCE_FILES[] = { 13036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy "results/layout_tests_passed.txt", 13136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy "results/layout_tests_failed.txt", 13236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy "results/layout_tests_nontext.txt", 13336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy "results/layout_tests_crashed.txt", 13436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy "run_layout_tests.py" 13536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy }; 13636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 13736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy static final String LAYOUT_RESULTS_FAILED_RESULT_FILE = "results/layout_tests_failed.txt"; 13836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy static final String LAYOUT_RESULTS_NONTEXT_RESULT_FILE = "results/layout_tests_nontext.txt"; 13936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy static final String LAYOUT_RESULTS_CRASHED_RESULT_FILE = "results/layout_tests_crashed.txt"; 14036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy static final String LAYOUT_TESTS_RUNNER = "run_layout_tests.py"; 141ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 142ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private MyTestRecorder mResultRecorder; 143ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private Vector<String> mTestList; 144ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private boolean mRebaselineResults; 145ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private String mTestPathPrefix; 146b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu private boolean mFinished; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutTestsAutoTest() { 149ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project super("com.android.dumprendertree", TestShellActivity.class); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This function writes the result of the layout test to 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Am status so that it can be picked up from a script. 154ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void passOrFailCallback(String file, boolean result) { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Instrumentation inst = getInstrumentation(); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle bundle = new Bundle(); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.putBoolean(file, result); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inst.sendStatus(0, bundle); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 160ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 161ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void getTestList() { 162ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Read test list. 163ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 164ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project BufferedReader inReader = new BufferedReader(new FileReader(LAYOUT_TESTS_LIST_FILE)); 165ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String line = inReader.readLine(); 166ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project while (line != null) { 167ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (line.startsWith(mTestPathPrefix)) 168ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mTestList.add(line); 169ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project line = inReader.readLine(); 170ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 171ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project inReader.close(); 172ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v(LOGTAG, "Test list has " + mTestList.size() + " test(s)."); 173ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (Exception e) { 174ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "Error while reading test list : " + e.getMessage()); 175ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 176ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 177ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 178ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void resumeTestList() { 179ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // read out the test name it stoped last time. 180ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 181ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project BufferedReader inReader = new BufferedReader(new FileReader(TEST_STATUS_FILE)); 182ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String line = inReader.readLine(); 183ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project for (int i = 0; i < mTestList.size(); i++) { 184ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (mTestList.elementAt(i).equals(line)) { 185ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mTestList = new Vector<String>(mTestList.subList(i+1, mTestList.size())); 186ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project break; 187ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 188ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 189ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project inReader.close(); 190ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (Exception e) { 191ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "Error reading " + TEST_STATUS_FILE); 192ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 193ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 194ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 195ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void clearTestStatus() { 196ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Delete TEST_STATUS_FILE 197ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 198ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File f = new File(TEST_STATUS_FILE); 199ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (f.delete()) 200ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v(LOGTAG, "Deleted " + TEST_STATUS_FILE); 201ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project else 202ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE); 203ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (Exception e) { 204ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE + " : " + e.getMessage()); 205ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 206ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 207ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 208ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void updateTestStatus(String s) { 209ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Write TEST_STATUS_FILE 210ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 211ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(TEST_STATUS_FILE)); 212ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project bos.write(s.getBytes()); 213ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project bos.close(); 214ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (Exception e) { 215ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "Cannot update file " + TEST_STATUS_FILE); 216ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 217ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 218ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 219ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private String getResultFile(String test) { 220ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String shortName = test.substring(0, test.lastIndexOf('.')); 221ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Write actual results to result directory. 222ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return shortName.replaceFirst(LAYOUT_TESTS_ROOT, LAYOUT_TESTS_RESULT_DIR) + "-result.txt"; 223ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 224ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 225ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private String getExpectedResultFile(String test) { 2262a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu int pos = test.lastIndexOf('.'); 2272a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu if(pos == -1) 2282a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu return null; 2292a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu String shortName = test.substring(0, pos); 230ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return shortName + "-expected.txt"; 231ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 232ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 233ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private String getAndroidExpectedResultFile(String expectedResultFile) { 234ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return expectedResultFile.replaceFirst(LAYOUT_TESTS_ROOT, ANDROID_EXPECTED_RESULT_DIR); 235ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 236ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 237ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Wrap up 238ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void failedCase(String file) { 239ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.w("Layout test: ", file + " failed"); 240ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mResultRecorder.failed(file); 241ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 243ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void passedCase(String file) { 244ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v("Layout test:", file + " passed"); 245ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mResultRecorder.passed(file); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 248ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void noresultCase(String file) { 249ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v("Layout test:", file + " no expected result"); 250ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mResultRecorder.noresult(file); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 252ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 253ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void processResult(String testFile, String actualResultFile, String expectedResultFile) { 254ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v(LOGTAG, " Processing result: " + testFile); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 256ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File actual = new File(actualResultFile); 257ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File expected = new File(expectedResultFile); 258ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (actual.exists() && expected.exists()) { 259ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 260ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project boolean passing = true; 261ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project BufferedReader fr = new BufferedReader(new FileReader(actual)); 262ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project BufferedReader fe = new BufferedReader(new FileReader(expected)); 263ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project while (true) { 264ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String s1 = fr.readLine(); 265ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String s2 = fe.readLine(); 266ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (s1 == null && s2 == null) 267ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project break; // both files are the same 268ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (s1 == null || s2 == null || !s1.equals(s2)) { 269ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project passing = false; 270ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project break; 271ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 272ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 273ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 274ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (passing) { 275ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project passedCase(testFile); 276ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } else { 277ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project failedCase(testFile); 278ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 279ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 280ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project fe.close(); 281ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project fr.close(); 282ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (FileNotFoundException ex) { 283ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "File not found : " + ex.getMessage()); 284ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (IOException ex) { 285ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "IO Error : " + ex.getMessage()); 286ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 287ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 288ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 289ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 290ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!expected.exists()) { 291ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project noresultCase(testFile); 292ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 293ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 294ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 295ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void runTestAndWaitUntilDone(TestShellActivity activity, String test, int timeout) { 296ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.setCallback(new TestShellCallback() { 297ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void finished() { 298ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (LayoutTestsAutoTest.this) { 299b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu mFinished = true; 300ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LayoutTestsAutoTest.this.notifyAll(); 301ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 3024010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu } 3034010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 3044010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu public void timedOut(String url) { 3054010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu } 306ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project }); 307ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 308ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String resultFile = getResultFile(test); 3092a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu if(resultFile == null) { 3102a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu //simply ignore this test 3112a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu return; 3122a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu } 313ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (mRebaselineResults) { 314ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String expectedResultFile = getExpectedResultFile(test); 315ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File f = new File(expectedResultFile); 316ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (f.exists()) { 317ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; // don't run test and don't overwrite default tests. 318ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 319ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 320ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project resultFile = getAndroidExpectedResultFile(expectedResultFile); 321ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 322ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 323b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu mFinished = false; 324ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 325ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.setClass(activity, TestShellActivity.class); 326ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 327ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.TEST_URL, "file://" + test); 328ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.RESULT_FILE, resultFile); 329ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout); 330ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.startActivity(intent); 331ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 332ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Wait until done. 333ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (this) { 334b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu while(!mFinished){ 335b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu try { 336b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu this.wait(); 337b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } catch (InterruptedException e) { } 338b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 339ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 340ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 341ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!mRebaselineResults) { 342ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String expectedResultFile = getExpectedResultFile(test); 343ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File f = new File(expectedResultFile); 344ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!f.exists()) { 345ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project expectedResultFile = getAndroidExpectedResultFile(expectedResultFile); 346ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 347ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 348ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project processResult(test, resultFile, expectedResultFile); 349ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 350ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 351ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Invokes running of layout tests 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // and waits till it has finished running. 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void executeLayoutTests(boolean resume) { 355ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation(); 356ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // A convenient method to be called by another activity. 357ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 358ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (runner.mTestPath == null) { 359ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "No test specified"); 360ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 361ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 362ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 363ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project this.mTestList = new Vector<String>(); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 365ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Read settings 366ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 367ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project this.mTestPathPrefix = 368ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project (new File(LAYOUT_TESTS_ROOT + runner.mTestPath)).getCanonicalPath(); 369ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (IOException e) { 370ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "Cannot find test path prefix: " + e.getMessage()); 371ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 372ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 373ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 374ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project this.mRebaselineResults = runner.mRebaseline; 375ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 376ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project int timeout = runner.mTimeoutInMillis; 377ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (timeout <= 0) { 378ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project timeout = DEFAULT_TIMEOUT_IN_MILLIS; 379ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 380ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 381ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project this.mResultRecorder = new MyTestRecorder(resume); 382ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 383ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!resume) 384ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project clearTestStatus(); 385ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 386ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project getTestList(); 387ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (resume) 388ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project resumeTestList(); 389ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 390ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project TestShellActivity activity = (TestShellActivity) getActivity(); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 392ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Run tests. 393ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project for (int i = 0; i < mTestList.size(); i++) { 394ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String s = mTestList.elementAt(i); 395ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project updateTestStatus(s); 396ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Run tests 397ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project runTestAndWaitUntilDone(activity, s, runner.mTimeoutInMillis); 398ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 400ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project updateTestStatus("#DONE"); 401ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 402ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.finish(); 403ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 406ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private String getTestPath() { 407ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation(); 408ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 409ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String test_path = LAYOUT_TESTS_ROOT; 410ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (runner.mTestPath != null) { 411ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project test_path += runner.mTestPath; 412ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 413ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 414ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project test_path = new File(test_path).getCanonicalPath(); 415ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (IOException e) { 416ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e("LayoutTestsAutoTest", "Cannot get cannonical path " + e.getMessage()); 417ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 418ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.v("LayoutTestsAutoTest", " Test path : " + test_path); 419ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 420ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return test_path; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void generateTestList() { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 425ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File tests_list = new File(LAYOUT_TESTS_LIST_FILE); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tests_list, false)); 427ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project findTestsRecursively(bos, getTestPath()); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bos.flush(); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bos.close(); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOGTAG, "Error when creating test list: " + e.getMessage()); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void findTestsRecursively(BufferedOutputStream bos, String dir) throws IOException { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(LOGTAG, "Searching tests under " + dir); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File d = new File(dir); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!d.isDirectory()) { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new AssertionError("A directory expected, but got " + dir); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] files = d.list(); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < files.length; i++) { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s = dir + "/" + files[i]; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FileFilter.ignoreTest(s)) { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(LOGTAG, " Ignoring: " + s); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s.toLowerCase().endsWith(".html") 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || s.toLowerCase().endsWith(".xml")) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bos.write(s.getBytes()); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bos.write('\n'); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = new File(s); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (f.isDirectory()) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project findTestsRecursively(bos, s); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(LOGTAG, "Skipping " + s); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Running all the layout tests at once sometimes 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // causes the dumprendertree to run out of memory. 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // So, additional tests are added to run the tests 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in chunks. 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startLayoutTests() { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 473ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project File tests_list = new File(LAYOUT_TESTS_LIST_FILE); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!tests_list.exists()) 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project generateTestList(); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e.printStackTrace(); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project executeLayoutTests(false); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resumeLayoutTests() { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project executeLayoutTests(true); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 48736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy public void copyResultsAndRunnerAssetsToCache() { 48836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy try { 48936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy String out_dir = getActivity().getApplicationContext().getCacheDir().getPath() + "/"; 49036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 49136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy for( int i=0; i< LAYOUT_TESTS_RESULTS_REFERENCE_FILES.length; i++) { 49236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy InputStream in = getActivity().getAssets().open(LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]); 49336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy OutputStream out = new FileOutputStream(out_dir + LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]); 49436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 49536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy byte[] buf = new byte[2048]; 49636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy int len; 49736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 498b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu while ((len = in.read(buf)) >= 0 ) { 49936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy out.write(buf, 0, len); 50036fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy } 50136fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy out.close(); 50236fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy in.close(); 50336fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy } 50436fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy }catch (IOException e) { 50536fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy e.printStackTrace(); 50636fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy } 50736fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 50836fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy } 50936fd6d243ee5414618e8bc2cbdc6c0a6f311157fSridhar Gurivireddy 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 511