FileFilter.java revision 177eb38ef571e8602547dfd9ba78376822e18e01
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 212910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.io.BufferedReader; 222910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.io.File; 232910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.io.FileNotFoundException; 242910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.io.FileReader; 252910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.io.IOException; 262910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.util.ArrayList; 272910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.util.Arrays; 282910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.util.HashSet; 292910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.util.List; 302910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskiimport java.util.Set; 312910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 322910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski/** 332910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * A utility to filter out some files/directories from the views and tests that run. 342910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski */ 352910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowskipublic class FileFilter { 362910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski private static final String LOG_TAG = "FileFilter"; 372910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 382910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski private static final String TEST_EXPECTATIONS_TXT_PATH = 392910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski "platform/android/test_expectations.txt"; 402910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 412910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski private static final String TOKEN_SKIP = "SKIP"; 422910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski private static final String TOKEN_IGNORE_RESULT = "IGNORE_RESULT"; 432910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski private static final String TOKEN_SLOW = "SLOW"; 442910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 452910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski private final Set<String> mSkipList = new HashSet<String>(); 462910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski private final Set<String> mIgnoreResultList = new HashSet<String>(); 472910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski private final Set<String> mSlowList = new HashSet<String>(); 482910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 492910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski private final String mRootDirPath; 502910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 512910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski public FileFilter(String rootDirPath) { 522910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** It may or may not contain a trailing slash */ 532910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski this.mRootDirPath = rootDirPath; 542910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 552910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski reloadConfiguration(); 562910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 572910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 582910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski private static final String trimTrailingSlashIfPresent(String path) { 592910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski File file = new File(path); 602910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski return file.getPath(); 612910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 622910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 632910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski public void reloadConfiguration() { 642910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski Log.d(LOG_TAG + "::reloadConfiguration", "Begin."); 652910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 662910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski File txt_exp = new File(mRootDirPath, TEST_EXPECTATIONS_TXT_PATH); 672910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 682910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski BufferedReader bufferedReader; 692910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski try { 702910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski bufferedReader = 712910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski new BufferedReader(new FileReader(txt_exp)); 722910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 732910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski String line; 742910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski String entry; 752910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski String[] parts; 762910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski String path; 772910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski Set<String> tokens; 782910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski Boolean skipped; 792910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski while (true) { 802910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski line = bufferedReader.readLine(); 812910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski if (line == null) { 822910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski break; 832910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 842910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 852910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** Remove the comment and trim */ 862910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski entry = line.split("//", 2)[0].trim(); 872910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 882910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** Omit empty lines, advance to next line */ 892910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski if (entry.isEmpty()) { 902910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski continue; 912910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 922910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 932910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** Split on whitespace into path part and the rest */ 942910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski parts = entry.split("\\s", 2); 952910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 962910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** At this point parts.length >= 1 */ 972910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski if (parts.length == 1) { 982910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski Log.w(LOG_TAG + "::reloadConfiguration", 992910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski "There are no options specified for the test!"); 1002910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski continue; 1012910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1022910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1032910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski path = trimTrailingSlashIfPresent(parts[0]); 1042910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1052910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** Split on whitespace */ 1062910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski tokens = new HashSet<String>(Arrays.asList(parts[1].split("\\s", 0))); 1072910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1082910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** Chose the right collections to add to */ 1092910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski skipped = false; 1102910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski if (tokens.contains(TOKEN_SKIP)) { 1112910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski mSkipList.add(path); 1122910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski skipped = true; 1132910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1142910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1152910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** If test is on skip list we ignore any further options */ 1162910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski if (skipped) { 1172910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski continue; 1182910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1192910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1202910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski if (tokens.contains(TOKEN_IGNORE_RESULT)) { 1212910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski mIgnoreResultList.add(path); 1222910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1232910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1242910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski if (tokens.contains(TOKEN_SLOW)) { 1252910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski mSlowList.add(path); 1262910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1272910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1282910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } catch (FileNotFoundException e) { 1292910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski Log.w(LOG_TAG + "::reloadConfiguration", "File not found: " + txt_exp.getPath()); 1302910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } catch (IOException e) { 1312910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski Log.e(LOG_TAG + "::reloadConfiguration", "IOException: " + e.getMessage()); 1322910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1332910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1342910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1352910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** 1362910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * Checks if test is supposed to be skipped. 1372910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * 1382910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * <p> 1392910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html 1402910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * 1412910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @param testPath 1422910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * - a relative path within LayoutTests folder 1432910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @return if the test is supposed to be skipped 1442910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski */ 1452910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski public boolean isSkip(String testPath) { 1462910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski for (String prefix : getPrefixes(testPath)) { 1472910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski if (mSkipList.contains(prefix)) { 1482910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski return true; 1492910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1502910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1512910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1522910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski return false; 1532910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1542910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1552910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** 1562910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * Checks if test result is supposed to be ignored. 1572910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * 1582910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * <p> 1592910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html 1602910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * 1612910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @param testPath 1622910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * - a relative path within LayoutTests folder 1632910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @return if the test result is supposed to be ignored 1642910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski */ 1652910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski public boolean isIgnoreRes(String testPath) { 1662910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski for (String prefix : getPrefixes(testPath)) { 1672910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski if (mIgnoreResultList.contains(prefix)) { 1682910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski return true; 1692910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1702910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1712910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1722910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski return false; 1732910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1742910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1752910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** 1762910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * Checks if test is slow and should have timeout increased. 1772910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * 1782910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * <p> 1792910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html 1802910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * 1812910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @param testPath 1822910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * - a relative path within LayoutTests folder 1832910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @return if the test is slow and should have timeout increased. 1842910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski */ 1852910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski public boolean isSlow(String testPath) { 1862910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski for (String prefix : getPrefixes(testPath)) { 1872910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski if (mSlowList.contains(prefix)) { 1882910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski return true; 1892910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1902910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1912910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1922910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski return false; 1932910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 1942910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 1952910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** 1962910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * Returns the list of all path prefixes of the given path. 1972910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * 1982910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * <p> 1992910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * e.g. this/is/a/path returns the list: this this/is this/is/a this/is/a/path 2002910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * 2012910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @param path 2022910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @return the list of all path prefixes of the given path. 2032910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski */ 2042910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski private static List<String> getPrefixes(String path) { 2052910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski File file = new File(path); 2062910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski List<String> prefixes = new ArrayList<String>(8); 2072910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 2082910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski do { 2092910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski prefixes.add(file.getPath()); 2102910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski file = file.getParentFile(); 2112910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } while (file != null); 2122910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 2132910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski return prefixes; 2142910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 2152910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 2162910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** 2172910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * Checks if the directory may contain tests or contains just helper files. 2182910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * 2192910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @param dirName 2202910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @return 2212910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * if the directory may contain tests 2222910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski */ 2232910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski public static boolean isTestDir(String dirName) { 2242910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski return (!dirName.equals("script-tests") 2252910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski && !dirName.equals("resources") 2262910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski && !dirName.startsWith(".")); 2272910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 2282910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski 2292910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski /** 230177eb38ef571e8602547dfd9ba78376822e18e01Ben Murdoch * Checks if the file is a test. 231177eb38ef571e8602547dfd9ba78376822e18e01Ben Murdoch * Currently we run .html and .xhtml tests. 2322910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * 2332910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @param testName 2342910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * @return 2352910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski * if the file is a test 2362910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski */ 2372910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski public static boolean isTestFile(String testName) { 238177eb38ef571e8602547dfd9ba78376822e18e01Ben Murdoch return testName.endsWith(".html") || testName.endsWith(".xhtml"); 2392910c123aade7619858fa972369cfae6c70e2087Maksymilian Osowski } 240177eb38ef571e8602547dfd9ba78376822e18e01Ben Murdoch} 241