12910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski/*
22910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * Copyright (C) 2010 The Android Open Source Project
32910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski *
42910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * Licensed under the Apache License, Version 2.0 (the "License");
52910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * you may not use this file except in compliance with the License.
62910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * You may obtain a copy of the License at
72910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski *
82910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * http://www.apache.org/licenses/LICENSE-2.0
92910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski *
102910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * Unless required by applicable law or agreed to in writing, software
112910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * distributed under the License is distributed on an "AS IS" BASIS,
122910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * See the License for the specific language governing permissions and
142910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * limitations under the License.
152910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski */
162910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
172910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskipackage com.android.dumprendertree2;
182910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
192910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport android.util.Log;
202910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
21c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport com.android.dumprendertree2.forwarder.ForwarderManager;
22c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
232910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.io.BufferedReader;
242910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.io.File;
252910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.io.FileNotFoundException;
262910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.io.IOException;
27c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.io.InputStream;
28c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.io.InputStreamReader;
29c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.io.StringReader;
30c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.net.MalformedURLException;
31c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.net.URL;
32c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.net.URLConnection;
332910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.util.ArrayList;
342910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.util.Arrays;
352910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.util.HashSet;
362910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.util.List;
372910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.util.Set;
382910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
392910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski/**
402910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * A utility to filter out some files/directories from the views and tests that run.
412910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski */
422910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskipublic class FileFilter {
432910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    private static final String LOG_TAG = "FileFilter";
442910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
452910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    private static final String TEST_EXPECTATIONS_TXT_PATH =
462910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski            "platform/android/test_expectations.txt";
472910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
48c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    private static final String HTTP_TESTS_PATH = "http/tests/";
49c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    private static final String SSL_PATH = "ssl/";
50c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
515f21f5a4a9f240e1c35ab86b2f3a332f0d541cf0Maksymilian Osowski    private static final String TOKEN_CRASH = "CRASH";
526ae5ce4b409759d36f2350e96ff2242e1385b147Maksymilian Osowski    private static final String TOKEN_FAIL = "FAIL";
532910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    private static final String TOKEN_SLOW = "SLOW";
542910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
555f21f5a4a9f240e1c35ab86b2f3a332f0d541cf0Maksymilian Osowski    private final Set<String> mCrashList = new HashSet<String>();
566ae5ce4b409759d36f2350e96ff2242e1385b147Maksymilian Osowski    private final Set<String> mFailList = new HashSet<String>();
572910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    private final Set<String> mSlowList = new HashSet<String>();
582910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
5934c68912be678ad50a70c1bfa54a91444e993df5Steve Block    public FileFilter() {
60c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        loadTestExpectations();
612910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    }
622910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
632910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    private static final String trimTrailingSlashIfPresent(String path) {
642910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        File file = new File(path);
652910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        return file.getPath();
662910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    }
672910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
68c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    public void loadTestExpectations() {
69c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        URL url = null;
702910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        try {
7184cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti            url = new URL(ForwarderManager.getHostSchemePort(false) +
7284cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti                    "LayoutTests/" + TEST_EXPECTATIONS_TXT_PATH);
73c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        } catch (MalformedURLException e) {
74c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            assert false;
75c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        }
762910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
77c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        try {
78c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            InputStream inputStream = null;
79c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            BufferedReader bufferedReader = null;
80c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            try {
8184cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti                byte[] httpAnswer = FsUtils.readDataFromUrl(url);
8284cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti                if (httpAnswer == null) {
8384cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti                    Log.w(LOG_TAG, "loadTestExpectations(): File not found: " +
8484cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti                            TEST_EXPECTATIONS_TXT_PATH);
8584cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti                    return;
8684cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti                }
8784cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti                bufferedReader = new BufferedReader(new StringReader(
8884cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti                        new String(httpAnswer)));
89c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                String line;
90c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                String entry;
91c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                String[] parts;
92c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                String path;
93c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                Set<String> tokens;
94c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                while (true) {
95c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    line = bufferedReader.readLine();
96c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    if (line == null) {
97c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                        break;
98c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    }
99c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
100c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    /** Remove the comment and trim */
101c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    entry = line.split("//", 2)[0].trim();
102c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
103c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    /** Omit empty lines, advance to next line */
104c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    if (entry.isEmpty()) {
105c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                        continue;
106c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    }
107c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
108c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    /** Split on whitespace into path part and the rest */
109c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    parts = entry.split("\\s", 2);
110c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
111c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    /** At this point parts.length >= 1 */
112c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    if (parts.length == 1) {
113c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                        Log.w(LOG_TAG + "::reloadConfiguration",
114c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                                "There are no options specified for the test!");
115c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                        continue;
116c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    }
117c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
118c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    path = trimTrailingSlashIfPresent(parts[0]);
119c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
120c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    /** Split on whitespace */
12184cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti                    tokens = new HashSet<String>(Arrays.asList(
12284cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti                            parts[1].split("\\s", 0)));
123c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
124c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    /** Chose the right collections to add to */
1255f21f5a4a9f240e1c35ab86b2f3a332f0d541cf0Maksymilian Osowski                    if (tokens.contains(TOKEN_CRASH)) {
1265f21f5a4a9f240e1c35ab86b2f3a332f0d541cf0Maksymilian Osowski                        mCrashList.add(path);
127c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
1286ae5ce4b409759d36f2350e96ff2242e1385b147Maksymilian Osowski                        /** If test is on skip list we ignore any further options */
129c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                        continue;
130c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    }
131c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
1326ae5ce4b409759d36f2350e96ff2242e1385b147Maksymilian Osowski                    if (tokens.contains(TOKEN_FAIL)) {
1336ae5ce4b409759d36f2350e96ff2242e1385b147Maksymilian Osowski                        mFailList.add(path);
134c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    }
135c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    if (tokens.contains(TOKEN_SLOW)) {
136c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                        mSlowList.add(path);
137c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    }
1382910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski                }
139c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            } finally {
140c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                if (inputStream != null) {
141c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    inputStream.close();
1422910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski                }
143c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                if (bufferedReader != null) {
144c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    bufferedReader.close();
1452910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski                }
1462910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski            }
1472910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        } catch (IOException e) {
148c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            Log.e(LOG_TAG, "url=" + url, e);
1492910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        }
1502910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    }
1512910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
1522910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    /**
1535f21f5a4a9f240e1c35ab86b2f3a332f0d541cf0Maksymilian Osowski     * Checks if test is expected to crash.
1542910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *
1552910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * <p>
1562910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html
1572910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *
1582910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * @param testPath
1592910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *            - a relative path within LayoutTests folder
1602910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * @return if the test is supposed to be skipped
1612910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     */
1625f21f5a4a9f240e1c35ab86b2f3a332f0d541cf0Maksymilian Osowski    public boolean isCrash(String testPath) {
1632910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        for (String prefix : getPrefixes(testPath)) {
1645f21f5a4a9f240e1c35ab86b2f3a332f0d541cf0Maksymilian Osowski            if (mCrashList.contains(prefix)) {
1652910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski                return true;
1662910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski            }
1672910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        }
1682910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
1692910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        return false;
1702910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    }
1712910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
1722910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    /**
1736ae5ce4b409759d36f2350e96ff2242e1385b147Maksymilian Osowski     * Checks if test result is supposed to be "failed".
1742910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *
1752910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * <p>
1762910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html
1772910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *
1782910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * @param testPath
1792910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *            - a relative path within LayoutTests folder
1806ae5ce4b409759d36f2350e96ff2242e1385b147Maksymilian Osowski     * @return if the test result is supposed to be "failed"
1812910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     */
1826ae5ce4b409759d36f2350e96ff2242e1385b147Maksymilian Osowski    public boolean isFail(String testPath) {
1832910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        for (String prefix : getPrefixes(testPath)) {
1846ae5ce4b409759d36f2350e96ff2242e1385b147Maksymilian Osowski            if (mFailList.contains(prefix)) {
1852910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski                return true;
1862910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski            }
1872910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        }
1882910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
1892910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        return false;
1902910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    }
1912910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
1922910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    /**
1932910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * Checks if test is slow and should have timeout increased.
1942910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *
1952910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * <p>
1962910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html
1972910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *
1982910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * @param testPath
1992910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *            - a relative path within LayoutTests folder
2002910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * @return if the test is slow and should have timeout increased.
2012910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     */
2022910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    public boolean isSlow(String testPath) {
2032910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        for (String prefix : getPrefixes(testPath)) {
2042910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski            if (mSlowList.contains(prefix)) {
2052910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski                return true;
2062910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski            }
2072910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        }
2082910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
2092910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        return false;
2102910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    }
2112910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
2122910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    /**
2132910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * Returns the list of all path prefixes of the given path.
2142910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *
2152910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * <p>
2162910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * e.g. this/is/a/path returns the list: this this/is this/is/a this/is/a/path
2172910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *
2182910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * @param path
2192910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * @return the list of all path prefixes of the given path.
2202910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     */
2212910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    private static List<String> getPrefixes(String path) {
2222910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        File file = new File(path);
2232910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        List<String> prefixes = new ArrayList<String>(8);
2242910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
2252910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        do {
2262910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski            prefixes.add(file.getPath());
2272910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski            file = file.getParentFile();
2282910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        } while (file != null);
2292910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
2302910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        return prefixes;
2312910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    }
2322910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
2332910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    /**
2342910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * Checks if the directory may contain tests or contains just helper files.
2352910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *
2362910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * @param dirName
2372910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * @return
2382910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *      if the directory may contain tests
2392910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     */
2402910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    public static boolean isTestDir(String dirName) {
2412910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski        return (!dirName.equals("script-tests")
2423c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski                && !dirName.equals("resources") && !dirName.startsWith("."));
2432910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    }
2442910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski
2452910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    /**
246177eb38ef571e8602547dfd9ba78376822e18e01Ben Murdoch     * Checks if the file is a test.
247ace92b871a020a3d662511ea8b1aab30334015deIain Merrick     * Currently we run .html, .xhtml and .php tests.
248ace92b871a020a3d662511ea8b1aab30334015deIain Merrick     *
249ace92b871a020a3d662511ea8b1aab30334015deIain Merrick     * @warning You MUST also call isTestDir() on the parent directory before
250ace92b871a020a3d662511ea8b1aab30334015deIain Merrick     * assuming that a file is a test.
2512910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     *
2522910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     * @param testName
253ca501d20360ffee3a37fc87538daf8281f8a14edSteve Block     * @return if the file is a test
2542910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski     */
2552910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    public static boolean isTestFile(String testName) {
256ace92b871a020a3d662511ea8b1aab30334015deIain Merrick        return testName.endsWith(".html")
257ace92b871a020a3d662511ea8b1aab30334015deIain Merrick            || testName.endsWith(".xhtml")
258ace92b871a020a3d662511ea8b1aab30334015deIain Merrick            || testName.endsWith(".php");
2592910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski    }
2603c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski
2613c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski    /**
262c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     * Return a URL of the test on the server.
263c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     *
264c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     * @param relativePath
265ca501d20360ffee3a37fc87538daf8281f8a14edSteve Block     * @param allowHttps Whether to allow the use of HTTPS, even if the file is in the SSL
266ca501d20360ffee3a37fc87538daf8281f8a14edSteve Block     *     directory.
267c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     * @return a URL of the test on the server
268c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     */
269ca501d20360ffee3a37fc87538daf8281f8a14edSteve Block    public static URL getUrl(String relativePath, boolean allowHttps) {
270c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        String urlBase = ForwarderManager.getHostSchemePort(false);
271c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
272c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        /**
273c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski         * URL is formed differently for HTTP vs non-HTTP tests, because HTTP tests
274c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski         * expect different document root. See run_apache2.py and .conf file for details
275c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski         */
276c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        if (relativePath.startsWith(HTTP_TESTS_PATH)) {
277c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            relativePath = relativePath.substring(HTTP_TESTS_PATH.length());
278ca501d20360ffee3a37fc87538daf8281f8a14edSteve Block            if (relativePath.startsWith(SSL_PATH) && allowHttps) {
279c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                urlBase = ForwarderManager.getHostSchemePort(true);
280c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            }
281c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        } else {
282c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            relativePath = "LayoutTests/" + relativePath;
283c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        }
284c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
285c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        try {
286c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            return new URL(urlBase + relativePath);
287c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        } catch (MalformedURLException e) {
288c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            Log.e(LOG_TAG, "Malformed URL!", e);
289c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        }
290c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
291c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        return null;
292c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    }
293c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
294c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    /**
2953c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski     * If the path contains extension (e.g .foo at the end of the file) then it changes
2963c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski     * this (.foo) into newEnding (so it has to contain the dot if we want to preserve it).
2973c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski     *
2983c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski     * <p>If the path doesn't contain an extension, it adds the ending to the path.
2993c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski     *
3003c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski     * @param relativePath
3013c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski     * @param newEnding
3023c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski     * @return
3033c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski     *      a new path, containing the newExtension
3043c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski     */
3053c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski    public static String setPathEnding(String relativePath, String newEnding) {
3063c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski        int dotPos = relativePath.lastIndexOf('.');
3073c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski        if (dotPos == -1) {
3083c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski            return relativePath + newEnding;
3093c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski        }
3103c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski
3113c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski        return relativePath.substring(0, dotPos) + newEnding;
3123c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski    }
31334c68912be678ad50a70c1bfa54a91444e993df5Steve Block}
314