servo: Merge #19929 - Verify that all values in include.ini represent real directories (from terracotaPie:master); r=jdm

<!-- Please describe your changes on the following line: -->
wpt manifest(include.ini) contains directories as headers. With this test in **test-tidy** we check if they are present in respective wtp test folders.

---
- [X] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [X] These changes fix #19703

Source-Repo: https://github.com/servo/servo
Source-Revision: f84e9236aee15348dc9bb3555500117fef922e12

--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : 3c9eb35064df9e7743837a585e06677ca52c488f
This commit is contained in:
Timur Borkhodoev 2018-02-03 22:39:23 -05:00
Родитель f69b532a8e
Коммит 60879568da
3 изменённых файлов: 59 добавлений и 2 удалений

Просмотреть файл

@ -22,10 +22,19 @@ import colorama
import toml import toml
import voluptuous import voluptuous
import yaml import yaml
from licenseck import MPL, APACHE, COPYRIGHT, licenses_toml, licenses_dep_toml from licenseck import MPL, APACHE, COPYRIGHT, licenses_toml, licenses_dep_toml
topdir = os.path.abspath(os.path.dirname(sys.argv[0]))
wpt = os.path.join(topdir, "tests", "wpt")
def wpt_path(*args):
return os.path.join(wpt, *args)
sys.path.append(wpt_path("web-platform-tests", "tools", "wptrunner", "wptrunner"))
from wptmanifest import parser, node
CONFIG_FILE_PATH = os.path.join(".", "servo-tidy.toml") CONFIG_FILE_PATH = os.path.join(".", "servo-tidy.toml")
WPT_MANIFEST_PATH = wpt_path("include.ini")
# Default configs # Default configs
config = { config = {
@ -440,6 +449,38 @@ def check_shell(file_name, lines):
yield(idx + 1, "variable substitutions should use the full \"${VAR}\" form") yield(idx + 1, "variable substitutions should use the full \"${VAR}\" form")
def rec_parse(current_path, root_node):
dirs = []
for item in root_node.children:
if isinstance(item, node.DataNode):
next_depth = os.path.join(current_path, item.data)
dirs.append(next_depth)
dirs += rec_parse(next_depth, item)
return dirs
def check_manifest_dirs(config_file, print_text=True):
if not os.path.exists(config_file):
yield(config_file, 0, "%s manifest file is required but was not found" % config_file)
return
# Load configs from include.ini
with open(config_file) as content:
conf_file = content.read()
lines = conf_file.splitlines(True)
if print_text:
print '\rChecking the wpt manifest file...'
p = parser.parse(lines)
paths = rec_parse(wpt_path("web-platform-tests"), p)
for idx, path in enumerate(paths):
if path.endswith("_mozilla"):
continue
if not os.path.isdir(path):
yield(config_file, idx + 1, "Path in manifest was not found: {}".format(path))
def check_rust(file_name, lines): def check_rust(file_name, lines):
if not file_name.endswith(".rs") or \ if not file_name.endswith(".rs") or \
file_name.endswith(".mako.rs") or \ file_name.endswith(".mako.rs") or \
@ -1122,6 +1163,8 @@ def run_lint_scripts(only_changed_files=False, progress=True, stylo=False):
def scan(only_changed_files=False, progress=True, stylo=False): def scan(only_changed_files=False, progress=True, stylo=False):
# check config file for errors # check config file for errors
config_errors = check_config_file(CONFIG_FILE_PATH) config_errors = check_config_file(CONFIG_FILE_PATH)
# check ini directories exist
manifest_errors = check_manifest_dirs(WPT_MANIFEST_PATH)
# check directories contain expected files # check directories contain expected files
directory_errors = check_directory_files(config['check_ext']) directory_errors = check_directory_files(config['check_ext'])
# standard checks # standard checks
@ -1135,7 +1178,7 @@ def scan(only_changed_files=False, progress=True, stylo=False):
# other lint checks # other lint checks
lint_errors = run_lint_scripts(only_changed_files, progress, stylo=stylo) lint_errors = run_lint_scripts(only_changed_files, progress, stylo=stylo)
# chain all the iterators # chain all the iterators
errors = itertools.chain(config_errors, directory_errors, lint_errors, errors = itertools.chain(config_errors, manifest_errors, directory_errors, lint_errors,
file_errors, dep_license_errors) file_errors, dep_license_errors)
error = None error = None

Просмотреть файл

@ -0,0 +1,5 @@
skip: true
[html]
skip: false
[never_going_to_exist]
skip: false

Просмотреть файл

@ -33,6 +33,15 @@ class CheckTidiness(unittest.TestCase):
self.assertEqual("ignored directory './fake/dir' doesn't exist", errors.next()[2]) self.assertEqual("ignored directory './fake/dir' doesn't exist", errors.next()[2])
self.assertNoMoreErrors(errors) self.assertNoMoreErrors(errors)
def test_non_existing_wpt_manifest_checks(self):
wrong_path = "/wrong/path.ini"
errors = tidy.check_manifest_dirs(wrong_path, print_text=False)
self.assertEqual("%s manifest file is required but was not found" % wrong_path, errors.next()[2])
self.assertNoMoreErrors(errors)
errors = tidy.check_manifest_dirs(os.path.join(base_path, 'manifest-include.ini'), print_text=False)
self.assertTrue(errors.next()[2].endswith("never_going_to_exist"))
self.assertNoMoreErrors(errors)
def test_directory_checks(self): def test_directory_checks(self):
dirs = { dirs = {
os.path.join(base_path, "dir_check/webidl_plus"): ['webidl', 'test'], os.path.join(base_path, "dir_check/webidl_plus"): ['webidl', 'test'],