OLD | NEW |
(Empty) | |
| 1 # -*- coding: utf-8 -*- |
| 2 # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 |
| 3 # For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt |
| 4 |
| 5 """Tests that our test infrastructure is really working!""" |
| 6 |
| 7 import datetime |
| 8 import os |
| 9 import sys |
| 10 |
| 11 from coverage.backunittest import TestCase |
| 12 from coverage.backward import to_bytes |
| 13 from coverage.files import actual_path |
| 14 from coverage.test_helpers import EnvironmentAwareMixin, TempDirMixin |
| 15 |
| 16 from tests.coveragetest import CoverageTest |
| 17 |
| 18 |
| 19 class TestingTest(TestCase): |
| 20 """Tests of helper methods on `backunittest.TestCase`.""" |
| 21 |
| 22 def test_assert_count_equal(self): |
| 23 self.assertCountEqual(set(), set()) |
| 24 self.assertCountEqual(set([1,2,3]), set([3,1,2])) |
| 25 with self.assertRaises(AssertionError): |
| 26 self.assertCountEqual(set([1,2,3]), set()) |
| 27 with self.assertRaises(AssertionError): |
| 28 self.assertCountEqual(set([1,2,3]), set([4,5,6])) |
| 29 |
| 30 |
| 31 class TempDirMixinTest(TempDirMixin, TestCase): |
| 32 """Test the methods in TempDirMixin.""" |
| 33 |
| 34 def file_text(self, fname): |
| 35 """Return the text read from a file.""" |
| 36 with open(fname, "rb") as f: |
| 37 return f.read().decode('ascii') |
| 38 |
| 39 def test_make_file(self): |
| 40 # A simple file. |
| 41 self.make_file("fooey.boo", "Hello there") |
| 42 self.assertEqual(self.file_text("fooey.boo"), "Hello there") |
| 43 # A file in a sub-directory |
| 44 self.make_file("sub/another.txt", "Another") |
| 45 self.assertEqual(self.file_text("sub/another.txt"), "Another") |
| 46 # A second file in that sub-directory |
| 47 self.make_file("sub/second.txt", "Second") |
| 48 self.assertEqual(self.file_text("sub/second.txt"), "Second") |
| 49 # A deeper directory |
| 50 self.make_file("sub/deeper/evenmore/third.txt") |
| 51 self.assertEqual(self.file_text("sub/deeper/evenmore/third.txt"), "") |
| 52 |
| 53 def test_make_file_newline(self): |
| 54 self.make_file("unix.txt", "Hello\n") |
| 55 self.assertEqual(self.file_text("unix.txt"), "Hello\n") |
| 56 self.make_file("dos.txt", "Hello\n", newline="\r\n") |
| 57 self.assertEqual(self.file_text("dos.txt"), "Hello\r\n") |
| 58 self.make_file("mac.txt", "Hello\n", newline="\r") |
| 59 self.assertEqual(self.file_text("mac.txt"), "Hello\r") |
| 60 |
| 61 def test_make_file_non_ascii(self): |
| 62 self.make_file("unicode.txt", "tabblo: «ταБЬℓσ»") |
| 63 with open("unicode.txt", "rb") as f: |
| 64 text = f.read() |
| 65 self.assertEqual(text, to_bytes("tabblo: «ταБЬℓσ»")) |
| 66 |
| 67 |
| 68 class EnvironmentAwareMixinTest(EnvironmentAwareMixin, TestCase): |
| 69 """Tests of test_helpers.EnvironmentAwareMixin.""" |
| 70 |
| 71 def test_setting_and_cleaning_env_vars(self): |
| 72 # The before state. |
| 73 # Not sure what environment variables are available in all of our |
| 74 # different testing environments, so try a bunch. |
| 75 for envvar in ["HOME", "HOMEDIR", "USER", "SYSTEMDRIVE", "TEMP"]: # pr
agma: part covered |
| 76 if envvar in os.environ: |
| 77 original_text = os.environ[envvar] |
| 78 new_text = "Some Strange Text" |
| 79 break |
| 80 # pylint: disable=undefined-loop-variable |
| 81 self.assertNotEqual(original_text, new_text) |
| 82 self.assertNotIn("XYZZY_PLUGH", os.environ) |
| 83 |
| 84 # Change the environment. |
| 85 self.set_environ(envvar, new_text) |
| 86 self.set_environ("XYZZY_PLUGH", "Vogon") |
| 87 |
| 88 self.assertEqual(os.environ[envvar], new_text) |
| 89 self.assertEqual(os.environ["XYZZY_PLUGH"], "Vogon") |
| 90 |
| 91 # Do the clean ups early. |
| 92 self.doCleanups() |
| 93 |
| 94 # The environment should be restored. |
| 95 self.assertEqual(os.environ[envvar], original_text) |
| 96 self.assertNotIn("XYZZY_PLUGH", os.environ) |
| 97 |
| 98 |
| 99 class CoverageTestTest(CoverageTest): |
| 100 """Test the methods in `CoverageTest`.""" |
| 101 |
| 102 def test_arcz_to_arcs(self): |
| 103 self.assertEqual(self.arcz_to_arcs(".1 12 2."), [(-1, 1), (1, 2), (2, -1
)]) |
| 104 self.assertEqual(self.arcz_to_arcs("-11 12 2-5"), [(-1, 1), (1, 2), (2,
-5)]) |
| 105 self.assertEqual( |
| 106 self.arcz_to_arcs("-QA CB IT Z-A"), |
| 107 [(-26, 10), (12, 11), (18, 29), (35, -10)] |
| 108 ) |
| 109 |
| 110 def test_file_exists(self): |
| 111 self.make_file("whoville.txt", "We are here!") |
| 112 self.assert_exists("whoville.txt") |
| 113 self.assert_doesnt_exist("shadow.txt") |
| 114 with self.assertRaises(AssertionError): |
| 115 self.assert_doesnt_exist("whoville.txt") |
| 116 with self.assertRaises(AssertionError): |
| 117 self.assert_exists("shadow.txt") |
| 118 |
| 119 def test_assert_startwith(self): |
| 120 self.assert_starts_with("xyzzy", "xy") |
| 121 self.assert_starts_with("xyz\nabc", "xy") |
| 122 self.assert_starts_with("xyzzy", ("x", "z")) |
| 123 with self.assertRaises(AssertionError): |
| 124 self.assert_starts_with("xyz", "a") |
| 125 with self.assertRaises(AssertionError): |
| 126 self.assert_starts_with("xyz\nabc", "a") |
| 127 |
| 128 def test_assert_recent_datetime(self): |
| 129 def now_delta(seconds): |
| 130 """Make a datetime `seconds` seconds from now.""" |
| 131 return datetime.datetime.now() + datetime.timedelta(seconds=seconds) |
| 132 |
| 133 # Default delta is 10 seconds. |
| 134 self.assert_recent_datetime(now_delta(0)) |
| 135 self.assert_recent_datetime(now_delta(-9)) |
| 136 with self.assertRaises(AssertionError): |
| 137 self.assert_recent_datetime(now_delta(-11)) |
| 138 with self.assertRaises(AssertionError): |
| 139 self.assert_recent_datetime(now_delta(1)) |
| 140 |
| 141 # Delta is settable. |
| 142 self.assert_recent_datetime(now_delta(0), seconds=120) |
| 143 self.assert_recent_datetime(now_delta(-100), seconds=120) |
| 144 with self.assertRaises(AssertionError): |
| 145 self.assert_recent_datetime(now_delta(-1000), seconds=120) |
| 146 with self.assertRaises(AssertionError): |
| 147 self.assert_recent_datetime(now_delta(1), seconds=120) |
| 148 |
| 149 def test_sub_python_is_this_python(self): |
| 150 # Try it with a Python command. |
| 151 os.environ['COV_FOOBAR'] = 'XYZZY' |
| 152 self.make_file("showme.py", """\ |
| 153 import os, sys |
| 154 print(sys.executable) |
| 155 print(os.__file__) |
| 156 print(os.environ['COV_FOOBAR']) |
| 157 """) |
| 158 out = self.run_command("python showme.py").splitlines() |
| 159 self.assertEqual(actual_path(out[0]), actual_path(sys.executable)) |
| 160 self.assertEqual(out[1], os.__file__) |
| 161 self.assertEqual(out[2], 'XYZZY') |
| 162 |
| 163 # Try it with a "coverage debug sys" command. |
| 164 out = self.run_command("coverage debug sys").splitlines() |
| 165 # "environment: COV_FOOBAR = XYZZY" or "COV_FOOBAR = XYZZY" |
| 166 executable = next(l for l in out if "executable:" in l) # pragma: pa
rt covered |
| 167 executable = executable.split(":", 1)[1].strip() |
| 168 self.assertTrue(same_python_executable(executable, sys.executable)) |
| 169 environ = next(l for l in out if "COV_FOOBAR" in l) # pragma: pa
rt covered |
| 170 _, _, environ = environ.rpartition(":") |
| 171 self.assertEqual(environ.strip(), "COV_FOOBAR = XYZZY") |
| 172 |
| 173 |
| 174 def same_python_executable(e1, e2): |
| 175 """Determine if `e1` and `e2` refer to the same Python executable. |
| 176 |
| 177 Either path could include symbolic links. The two paths might not refer |
| 178 to the exact same file, but if they are in the same directory and their |
| 179 numeric suffixes aren't different, they are the same executable. |
| 180 |
| 181 """ |
| 182 e1 = os.path.abspath(os.path.realpath(e1)) |
| 183 e2 = os.path.abspath(os.path.realpath(e2)) |
| 184 |
| 185 if os.path.dirname(e1) != os.path.dirname(e2): |
| 186 return False # pragma: only failure |
| 187 |
| 188 e1 = os.path.basename(e1) |
| 189 e2 = os.path.basename(e2) |
| 190 |
| 191 if e1 == "python" or e2 == "python" or e1 == e2: |
| 192 # Python and Python2.3: OK |
| 193 # Python2.3 and Python: OK |
| 194 # Python and Python: OK |
| 195 # Python2.3 and Python2.3: OK |
| 196 return True |
| 197 |
| 198 return False # pragma: only failure |
OLD | NEW |