| Index: tools/telemetry/third_party/coverage/tests/test_config.py
|
| diff --git a/tools/telemetry/third_party/coverage/tests/test_config.py b/tools/telemetry/third_party/coverage/tests/test_config.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..93a7bbf6c332e13a5e5f8d522ff0000820a6f0a8
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/coverage/tests/test_config.py
|
| @@ -0,0 +1,405 @@
|
| +# coding: utf-8
|
| +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
|
| +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
|
| +
|
| +"""Test the config file handling for coverage.py"""
|
| +
|
| +import sys
|
| +import os
|
| +
|
| +import coverage
|
| +from coverage.misc import CoverageException
|
| +
|
| +from tests.coveragetest import CoverageTest
|
| +
|
| +
|
| +class ConfigTest(CoverageTest):
|
| + """Tests of the different sources of configuration settings."""
|
| +
|
| + def test_default_config(self):
|
| + # Just constructing a coverage() object gets the right defaults.
|
| + cov = coverage.Coverage()
|
| + self.assertFalse(cov.config.timid)
|
| + self.assertFalse(cov.config.branch)
|
| + self.assertEqual(cov.config.data_file, ".coverage")
|
| +
|
| + def test_arguments(self):
|
| + # Arguments to the constructor are applied to the configuration.
|
| + cov = coverage.Coverage(timid=True, data_file="fooey.dat")
|
| + self.assertTrue(cov.config.timid)
|
| + self.assertFalse(cov.config.branch)
|
| + self.assertEqual(cov.config.data_file, "fooey.dat")
|
| +
|
| + def test_config_file(self):
|
| + # A .coveragerc file will be read into the configuration.
|
| + self.make_file(".coveragerc", """\
|
| + # This is just a bogus .rc file for testing.
|
| + [run]
|
| + timid = True
|
| + data_file = .hello_kitty.data
|
| + """)
|
| + cov = coverage.Coverage()
|
| + self.assertTrue(cov.config.timid)
|
| + self.assertFalse(cov.config.branch)
|
| + self.assertEqual(cov.config.data_file, ".hello_kitty.data")
|
| +
|
| + def test_named_config_file(self):
|
| + # You can name the config file what you like.
|
| + self.make_file("my_cov.ini", """\
|
| + [run]
|
| + timid = True
|
| + ; I wouldn't really use this as a data file...
|
| + data_file = delete.me
|
| + """)
|
| + cov = coverage.Coverage(config_file="my_cov.ini")
|
| + self.assertTrue(cov.config.timid)
|
| + self.assertFalse(cov.config.branch)
|
| + self.assertEqual(cov.config.data_file, "delete.me")
|
| +
|
| + def test_ignored_config_file(self):
|
| + # You can disable reading the .coveragerc file.
|
| + self.make_file(".coveragerc", """\
|
| + [run]
|
| + timid = True
|
| + data_file = delete.me
|
| + """)
|
| + cov = coverage.Coverage(config_file=False)
|
| + self.assertFalse(cov.config.timid)
|
| + self.assertFalse(cov.config.branch)
|
| + self.assertEqual(cov.config.data_file, ".coverage")
|
| +
|
| + def test_config_file_then_args(self):
|
| + # The arguments override the .coveragerc file.
|
| + self.make_file(".coveragerc", """\
|
| + [run]
|
| + timid = True
|
| + data_file = weirdo.file
|
| + """)
|
| + cov = coverage.Coverage(timid=False, data_file=".mycov")
|
| + self.assertFalse(cov.config.timid)
|
| + self.assertFalse(cov.config.branch)
|
| + self.assertEqual(cov.config.data_file, ".mycov")
|
| +
|
| + def test_data_file_from_environment(self):
|
| + # There's an environment variable for the data_file.
|
| + self.make_file(".coveragerc", """\
|
| + [run]
|
| + timid = True
|
| + data_file = weirdo.file
|
| + """)
|
| + self.set_environ("COVERAGE_FILE", "fromenv.dat")
|
| + cov = coverage.Coverage()
|
| + self.assertEqual(cov.config.data_file, "fromenv.dat")
|
| + # But the constructor arguments override the environment variable.
|
| + cov = coverage.Coverage(data_file="fromarg.dat")
|
| + self.assertEqual(cov.config.data_file, "fromarg.dat")
|
| +
|
| + def test_parse_errors(self):
|
| + # Im-parsable values raise CoverageException, with details.
|
| + bad_configs_and_msgs = [
|
| + ("[run]\ntimid = maybe?\n", r"maybe[?]"),
|
| + ("timid = 1\n", r"timid = 1"),
|
| + ("[run\n", r"\[run"),
|
| + ("[report]\nexclude_lines = foo(\n",
|
| + r"Invalid \[report\].exclude_lines value 'foo\(': "
|
| + r"(unbalanced parenthesis|missing \))"),
|
| + ("[report]\npartial_branches = foo[\n",
|
| + r"Invalid \[report\].partial_branches value 'foo\[': "
|
| + r"(unexpected end of regular expression|unterminated character set)"),
|
| + ("[report]\npartial_branches_always = foo***\n",
|
| + r"Invalid \[report\].partial_branches_always value "
|
| + r"'foo\*\*\*': "
|
| + r"multiple repeat"),
|
| + ]
|
| +
|
| + for bad_config, msg in bad_configs_and_msgs:
|
| + print("Trying %r" % bad_config)
|
| + self.make_file(".coveragerc", bad_config)
|
| + with self.assertRaisesRegex(CoverageException, msg):
|
| + coverage.Coverage()
|
| +
|
| + def test_environment_vars_in_config(self):
|
| + # Config files can have $envvars in them.
|
| + self.make_file(".coveragerc", """\
|
| + [run]
|
| + data_file = $DATA_FILE.fooey
|
| + branch = $OKAY
|
| + [report]
|
| + exclude_lines =
|
| + the_$$one
|
| + another${THING}
|
| + x${THING}y
|
| + x${NOTHING}y
|
| + huh$${X}what
|
| + """)
|
| + self.set_environ("DATA_FILE", "hello-world")
|
| + self.set_environ("THING", "ZZZ")
|
| + self.set_environ("OKAY", "yes")
|
| + cov = coverage.Coverage()
|
| + self.assertEqual(cov.config.data_file, "hello-world.fooey")
|
| + self.assertEqual(cov.config.branch, True)
|
| + self.assertEqual(
|
| + cov.config.exclude_list,
|
| + ["the_$one", "anotherZZZ", "xZZZy", "xy", "huh${X}what"]
|
| + )
|
| +
|
| + def test_tweaks_after_constructor(self):
|
| + # Arguments to the constructor are applied to the configuration.
|
| + cov = coverage.Coverage(timid=True, data_file="fooey.dat")
|
| + cov.set_option("run:timid", False)
|
| +
|
| + self.assertFalse(cov.config.timid)
|
| + self.assertFalse(cov.config.branch)
|
| + self.assertEqual(cov.config.data_file, "fooey.dat")
|
| +
|
| + self.assertFalse(cov.get_option("run:timid"))
|
| + self.assertFalse(cov.get_option("run:branch"))
|
| + self.assertEqual(cov.get_option("run:data_file"), "fooey.dat")
|
| +
|
| + def test_tweak_error_checking(self):
|
| + # Trying to set an unknown config value raises an error.
|
| + cov = coverage.Coverage()
|
| + with self.assertRaises(CoverageException):
|
| + cov.set_option("run:xyzzy", 12)
|
| + with self.assertRaises(CoverageException):
|
| + cov.set_option("xyzzy:foo", 12)
|
| + with self.assertRaises(CoverageException):
|
| + _ = cov.get_option("run:xyzzy")
|
| + with self.assertRaises(CoverageException):
|
| + _ = cov.get_option("xyzzy:foo")
|
| +
|
| + def test_tweak_plugin_options(self):
|
| + # Plugin options have a more flexible syntax.
|
| + cov = coverage.Coverage()
|
| + cov.set_option("run:plugins", ["fooey.plugin", "xyzzy.coverage.plugin"])
|
| + cov.set_option("fooey.plugin:xyzzy", 17)
|
| + cov.set_option("xyzzy.coverage.plugin:plugh", ["a", "b"])
|
| + with self.assertRaises(CoverageException):
|
| + cov.set_option("no_such.plugin:foo", 23)
|
| +
|
| + self.assertEqual(cov.get_option("fooey.plugin:xyzzy"), 17)
|
| + self.assertEqual(cov.get_option("xyzzy.coverage.plugin:plugh"), ["a", "b"])
|
| + with self.assertRaises(CoverageException):
|
| + _ = cov.get_option("no_such.plugin:foo")
|
| +
|
| + def test_unknown_option(self):
|
| + self.make_file(".coveragerc", """\
|
| + [run]
|
| + xyzzy = 17
|
| + """)
|
| + msg = r"Unrecognized option '\[run\] xyzzy=' in config file .coveragerc"
|
| + with self.assertRaisesRegex(CoverageException, msg):
|
| + _ = coverage.Coverage()
|
| +
|
| + def test_misplaced_option(self):
|
| + self.make_file(".coveragerc", """\
|
| + [report]
|
| + branch = True
|
| + """)
|
| + msg = r"Unrecognized option '\[report\] branch=' in config file .coveragerc"
|
| + with self.assertRaisesRegex(CoverageException, msg):
|
| + _ = coverage.Coverage()
|
| +
|
| + def test_unknown_option_in_other_ini_file(self):
|
| + self.make_file("setup.cfg", """\
|
| + [coverage:run]
|
| + huh = what?
|
| + """)
|
| + msg = r"Unrecognized option '\[coverage:run\] huh=' in config file setup.cfg"
|
| + with self.assertRaisesRegex(CoverageException, msg):
|
| + _ = coverage.Coverage()
|
| +
|
| +
|
| +class ConfigFileTest(CoverageTest):
|
| + """Tests of the config file settings in particular."""
|
| +
|
| + def setUp(self):
|
| + super(ConfigFileTest, self).setUp()
|
| + # Parent class saves and restores sys.path, we can just modify it.
|
| + # Add modules to the path so we can import plugins.
|
| + sys.path.append(self.nice_file(os.path.dirname(__file__), 'modules'))
|
| +
|
| + # This sample file tries to use lots of variation of syntax...
|
| + # The {section} placeholder lets us nest these settings in another file.
|
| + LOTSA_SETTINGS = """\
|
| + # This is a settings file for coverage.py
|
| + [{section}run]
|
| + timid = yes
|
| + data_file = something_or_other.dat
|
| + branch = 1
|
| + cover_pylib = TRUE
|
| + parallel = on
|
| + include = a/ , b/
|
| + concurrency = thread
|
| + plugins =
|
| + plugins.a_plugin
|
| + plugins.another
|
| +
|
| + [{section}report]
|
| + ; these settings affect reporting.
|
| + exclude_lines =
|
| + if 0:
|
| +
|
| + pragma:?\\s+no cover
|
| + another_tab
|
| +
|
| + ignore_errors = TRUE
|
| + omit =
|
| + one, another, some_more,
|
| + yet_more
|
| + precision = 3
|
| +
|
| + partial_branches =
|
| + pragma:?\\s+no branch
|
| + partial_branches_always =
|
| + if 0:
|
| + while True:
|
| +
|
| + show_missing= TruE
|
| + skip_covered = TruE
|
| +
|
| + [{section}html]
|
| +
|
| + directory = c:\\tricky\\dir.somewhere
|
| + extra_css=something/extra.css
|
| + title = Title & nums # nums!
|
| + [{section}xml]
|
| + output=mycov.xml
|
| + package_depth = 17
|
| +
|
| + [{section}paths]
|
| + source =
|
| + .
|
| + /home/ned/src/
|
| +
|
| + other = other, /home/ned/other, c:\\Ned\\etc
|
| +
|
| + [{section}plugins.a_plugin]
|
| + hello = world
|
| + ; comments still work.
|
| + names = Jane/John/Jenny
|
| + """
|
| +
|
| + # Just some sample setup.cfg text from the docs.
|
| + SETUP_CFG = """\
|
| + [bdist_rpm]
|
| + release = 1
|
| + packager = Jane Packager <janep@pysoft.com>
|
| + doc_files = CHANGES.txt
|
| + README.txt
|
| + USAGE.txt
|
| + doc/
|
| + examples/
|
| + """
|
| +
|
| + def assert_config_settings_are_correct(self, cov):
|
| + """Check that `cov` has all the settings from LOTSA_SETTINGS."""
|
| + self.assertTrue(cov.config.timid)
|
| + self.assertEqual(cov.config.data_file, "something_or_other.dat")
|
| + self.assertTrue(cov.config.branch)
|
| + self.assertTrue(cov.config.cover_pylib)
|
| + self.assertTrue(cov.config.parallel)
|
| + self.assertEqual(cov.config.concurrency, "thread")
|
| +
|
| + self.assertEqual(cov.get_exclude_list(), ["if 0:", r"pragma:?\s+no cover", "another_tab"])
|
| + self.assertTrue(cov.config.ignore_errors)
|
| + self.assertEqual(cov.config.include, ["a/", "b/"])
|
| + self.assertEqual(cov.config.omit, ["one", "another", "some_more", "yet_more"])
|
| + self.assertEqual(cov.config.precision, 3)
|
| +
|
| + self.assertEqual(cov.config.partial_list, [r"pragma:?\s+no branch"])
|
| + self.assertEqual(cov.config.partial_always_list, ["if 0:", "while True:"])
|
| + self.assertEqual(cov.config.plugins, ["plugins.a_plugin", "plugins.another"])
|
| + self.assertTrue(cov.config.show_missing)
|
| + self.assertTrue(cov.config.skip_covered)
|
| + self.assertEqual(cov.config.html_dir, r"c:\tricky\dir.somewhere")
|
| + self.assertEqual(cov.config.extra_css, "something/extra.css")
|
| + self.assertEqual(cov.config.html_title, "Title & nums # nums!")
|
| +
|
| + self.assertEqual(cov.config.xml_output, "mycov.xml")
|
| + self.assertEqual(cov.config.xml_package_depth, 17)
|
| +
|
| + self.assertEqual(cov.config.paths, {
|
| + 'source': ['.', '/home/ned/src/'],
|
| + 'other': ['other', '/home/ned/other', 'c:\\Ned\\etc']
|
| + })
|
| +
|
| + self.assertEqual(cov.config.get_plugin_options("plugins.a_plugin"), {
|
| + 'hello': 'world',
|
| + 'names': 'Jane/John/Jenny',
|
| + })
|
| + self.assertEqual(cov.config.get_plugin_options("plugins.another"), {})
|
| +
|
| + def test_config_file_settings(self):
|
| + self.make_file(".coveragerc", self.LOTSA_SETTINGS.format(section=""))
|
| + cov = coverage.Coverage()
|
| + self.assert_config_settings_are_correct(cov)
|
| +
|
| + def test_config_file_settings_in_setupcfg(self):
|
| + # Configuration will be read from setup.cfg from sections prefixed with
|
| + # "coverage:"
|
| + nested = self.LOTSA_SETTINGS.format(section="coverage:")
|
| + self.make_file("setup.cfg", nested + "\n" + self.SETUP_CFG)
|
| + cov = coverage.Coverage()
|
| + self.assert_config_settings_are_correct(cov)
|
| +
|
| + def test_config_file_settings_in_setupcfg_if_coveragerc_specified(self):
|
| + # Configuration will be read from setup.cfg from sections prefixed with
|
| + # "coverage:", even if the API said to read from a (non-existent)
|
| + # .coveragerc file.
|
| + nested = self.LOTSA_SETTINGS.format(section="coverage:")
|
| + self.make_file("setup.cfg", nested + "\n" + self.SETUP_CFG)
|
| + cov = coverage.Coverage(config_file=".coveragerc")
|
| + self.assert_config_settings_are_correct(cov)
|
| +
|
| + def test_setupcfg_only_if_not_coveragerc(self):
|
| + self.make_file(".coveragerc", """\
|
| + [run]
|
| + include = foo
|
| + """)
|
| + self.make_file("setup.cfg", """\
|
| + [coverage:run]
|
| + omit = bar
|
| + branch = true
|
| + """)
|
| + cov = coverage.Coverage()
|
| + self.assertEqual(cov.config.include, ["foo"])
|
| + self.assertEqual(cov.config.omit, None)
|
| + self.assertEqual(cov.config.branch, False)
|
| +
|
| + def test_setupcfg_only_if_prefixed(self):
|
| + self.make_file("setup.cfg", """\
|
| + [run]
|
| + omit = bar
|
| + branch = true
|
| + """)
|
| + cov = coverage.Coverage()
|
| + self.assertEqual(cov.config.omit, None)
|
| + self.assertEqual(cov.config.branch, False)
|
| +
|
| + def test_non_ascii(self):
|
| + self.make_file(".coveragerc", """\
|
| + [html]
|
| + title = tabblo & «ταБЬℓσ» # numbers
|
| + """)
|
| + cov = coverage.Coverage()
|
| +
|
| + self.assertEqual(cov.config.html_title, "tabblo & «ταБЬℓσ» # numbers")
|
| +
|
| + def test_unreadable_config(self):
|
| + # If a config file is explicitly specified, then it is an error for it
|
| + # to not be readable.
|
| + bad_files = [
|
| + "nosuchfile.txt",
|
| + ".",
|
| + ]
|
| + for bad_file in bad_files:
|
| + msg = "Couldn't read %r as a config file" % bad_file
|
| + with self.assertRaisesRegex(CoverageException, msg):
|
| + coverage.Coverage(config_file=bad_file)
|
| +
|
| + def test_nocoveragerc_file_when_specified(self):
|
| + cov = coverage.Coverage(config_file=".coveragerc")
|
| + self.assertFalse(cov.config.timid)
|
| + self.assertFalse(cov.config.branch)
|
| + self.assertEqual(cov.config.data_file, ".coverage")
|
|
|