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