Index: tools/telemetry/third_party/coverage/tests/test_testing.py |
diff --git a/tools/telemetry/third_party/coverage/tests/test_testing.py b/tools/telemetry/third_party/coverage/tests/test_testing.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..54ab894d940ab646675548dfee76fcf1a57257d5 |
--- /dev/null |
+++ b/tools/telemetry/third_party/coverage/tests/test_testing.py |
@@ -0,0 +1,198 @@ |
+# -*- 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 |
+ |
+"""Tests that our test infrastructure is really working!""" |
+ |
+import datetime |
+import os |
+import sys |
+ |
+from coverage.backunittest import TestCase |
+from coverage.backward import to_bytes |
+from coverage.files import actual_path |
+from coverage.test_helpers import EnvironmentAwareMixin, TempDirMixin |
+ |
+from tests.coveragetest import CoverageTest |
+ |
+ |
+class TestingTest(TestCase): |
+ """Tests of helper methods on `backunittest.TestCase`.""" |
+ |
+ def test_assert_count_equal(self): |
+ self.assertCountEqual(set(), set()) |
+ self.assertCountEqual(set([1,2,3]), set([3,1,2])) |
+ with self.assertRaises(AssertionError): |
+ self.assertCountEqual(set([1,2,3]), set()) |
+ with self.assertRaises(AssertionError): |
+ self.assertCountEqual(set([1,2,3]), set([4,5,6])) |
+ |
+ |
+class TempDirMixinTest(TempDirMixin, TestCase): |
+ """Test the methods in TempDirMixin.""" |
+ |
+ def file_text(self, fname): |
+ """Return the text read from a file.""" |
+ with open(fname, "rb") as f: |
+ return f.read().decode('ascii') |
+ |
+ def test_make_file(self): |
+ # A simple file. |
+ self.make_file("fooey.boo", "Hello there") |
+ self.assertEqual(self.file_text("fooey.boo"), "Hello there") |
+ # A file in a sub-directory |
+ self.make_file("sub/another.txt", "Another") |
+ self.assertEqual(self.file_text("sub/another.txt"), "Another") |
+ # A second file in that sub-directory |
+ self.make_file("sub/second.txt", "Second") |
+ self.assertEqual(self.file_text("sub/second.txt"), "Second") |
+ # A deeper directory |
+ self.make_file("sub/deeper/evenmore/third.txt") |
+ self.assertEqual(self.file_text("sub/deeper/evenmore/third.txt"), "") |
+ |
+ def test_make_file_newline(self): |
+ self.make_file("unix.txt", "Hello\n") |
+ self.assertEqual(self.file_text("unix.txt"), "Hello\n") |
+ self.make_file("dos.txt", "Hello\n", newline="\r\n") |
+ self.assertEqual(self.file_text("dos.txt"), "Hello\r\n") |
+ self.make_file("mac.txt", "Hello\n", newline="\r") |
+ self.assertEqual(self.file_text("mac.txt"), "Hello\r") |
+ |
+ def test_make_file_non_ascii(self): |
+ self.make_file("unicode.txt", "tabblo: «ταБЬℓσ»") |
+ with open("unicode.txt", "rb") as f: |
+ text = f.read() |
+ self.assertEqual(text, to_bytes("tabblo: «ταБЬℓσ»")) |
+ |
+ |
+class EnvironmentAwareMixinTest(EnvironmentAwareMixin, TestCase): |
+ """Tests of test_helpers.EnvironmentAwareMixin.""" |
+ |
+ def test_setting_and_cleaning_env_vars(self): |
+ # The before state. |
+ # Not sure what environment variables are available in all of our |
+ # different testing environments, so try a bunch. |
+ for envvar in ["HOME", "HOMEDIR", "USER", "SYSTEMDRIVE", "TEMP"]: # pragma: part covered |
+ if envvar in os.environ: |
+ original_text = os.environ[envvar] |
+ new_text = "Some Strange Text" |
+ break |
+ # pylint: disable=undefined-loop-variable |
+ self.assertNotEqual(original_text, new_text) |
+ self.assertNotIn("XYZZY_PLUGH", os.environ) |
+ |
+ # Change the environment. |
+ self.set_environ(envvar, new_text) |
+ self.set_environ("XYZZY_PLUGH", "Vogon") |
+ |
+ self.assertEqual(os.environ[envvar], new_text) |
+ self.assertEqual(os.environ["XYZZY_PLUGH"], "Vogon") |
+ |
+ # Do the clean ups early. |
+ self.doCleanups() |
+ |
+ # The environment should be restored. |
+ self.assertEqual(os.environ[envvar], original_text) |
+ self.assertNotIn("XYZZY_PLUGH", os.environ) |
+ |
+ |
+class CoverageTestTest(CoverageTest): |
+ """Test the methods in `CoverageTest`.""" |
+ |
+ def test_arcz_to_arcs(self): |
+ self.assertEqual(self.arcz_to_arcs(".1 12 2."), [(-1, 1), (1, 2), (2, -1)]) |
+ self.assertEqual(self.arcz_to_arcs("-11 12 2-5"), [(-1, 1), (1, 2), (2, -5)]) |
+ self.assertEqual( |
+ self.arcz_to_arcs("-QA CB IT Z-A"), |
+ [(-26, 10), (12, 11), (18, 29), (35, -10)] |
+ ) |
+ |
+ def test_file_exists(self): |
+ self.make_file("whoville.txt", "We are here!") |
+ self.assert_exists("whoville.txt") |
+ self.assert_doesnt_exist("shadow.txt") |
+ with self.assertRaises(AssertionError): |
+ self.assert_doesnt_exist("whoville.txt") |
+ with self.assertRaises(AssertionError): |
+ self.assert_exists("shadow.txt") |
+ |
+ def test_assert_startwith(self): |
+ self.assert_starts_with("xyzzy", "xy") |
+ self.assert_starts_with("xyz\nabc", "xy") |
+ self.assert_starts_with("xyzzy", ("x", "z")) |
+ with self.assertRaises(AssertionError): |
+ self.assert_starts_with("xyz", "a") |
+ with self.assertRaises(AssertionError): |
+ self.assert_starts_with("xyz\nabc", "a") |
+ |
+ def test_assert_recent_datetime(self): |
+ def now_delta(seconds): |
+ """Make a datetime `seconds` seconds from now.""" |
+ return datetime.datetime.now() + datetime.timedelta(seconds=seconds) |
+ |
+ # Default delta is 10 seconds. |
+ self.assert_recent_datetime(now_delta(0)) |
+ self.assert_recent_datetime(now_delta(-9)) |
+ with self.assertRaises(AssertionError): |
+ self.assert_recent_datetime(now_delta(-11)) |
+ with self.assertRaises(AssertionError): |
+ self.assert_recent_datetime(now_delta(1)) |
+ |
+ # Delta is settable. |
+ self.assert_recent_datetime(now_delta(0), seconds=120) |
+ self.assert_recent_datetime(now_delta(-100), seconds=120) |
+ with self.assertRaises(AssertionError): |
+ self.assert_recent_datetime(now_delta(-1000), seconds=120) |
+ with self.assertRaises(AssertionError): |
+ self.assert_recent_datetime(now_delta(1), seconds=120) |
+ |
+ def test_sub_python_is_this_python(self): |
+ # Try it with a Python command. |
+ os.environ['COV_FOOBAR'] = 'XYZZY' |
+ self.make_file("showme.py", """\ |
+ import os, sys |
+ print(sys.executable) |
+ print(os.__file__) |
+ print(os.environ['COV_FOOBAR']) |
+ """) |
+ out = self.run_command("python showme.py").splitlines() |
+ self.assertEqual(actual_path(out[0]), actual_path(sys.executable)) |
+ self.assertEqual(out[1], os.__file__) |
+ self.assertEqual(out[2], 'XYZZY') |
+ |
+ # Try it with a "coverage debug sys" command. |
+ out = self.run_command("coverage debug sys").splitlines() |
+ # "environment: COV_FOOBAR = XYZZY" or "COV_FOOBAR = XYZZY" |
+ executable = next(l for l in out if "executable:" in l) # pragma: part covered |
+ executable = executable.split(":", 1)[1].strip() |
+ self.assertTrue(same_python_executable(executable, sys.executable)) |
+ environ = next(l for l in out if "COV_FOOBAR" in l) # pragma: part covered |
+ _, _, environ = environ.rpartition(":") |
+ self.assertEqual(environ.strip(), "COV_FOOBAR = XYZZY") |
+ |
+ |
+def same_python_executable(e1, e2): |
+ """Determine if `e1` and `e2` refer to the same Python executable. |
+ |
+ Either path could include symbolic links. The two paths might not refer |
+ to the exact same file, but if they are in the same directory and their |
+ numeric suffixes aren't different, they are the same executable. |
+ |
+ """ |
+ e1 = os.path.abspath(os.path.realpath(e1)) |
+ e2 = os.path.abspath(os.path.realpath(e2)) |
+ |
+ if os.path.dirname(e1) != os.path.dirname(e2): |
+ return False # pragma: only failure |
+ |
+ e1 = os.path.basename(e1) |
+ e2 = os.path.basename(e2) |
+ |
+ if e1 == "python" or e2 == "python" or e1 == e2: |
+ # Python and Python2.3: OK |
+ # Python2.3 and Python: OK |
+ # Python and Python: OK |
+ # Python2.3 and Python2.3: OK |
+ return True |
+ |
+ return False # pragma: only failure |