diff options
| author | Robert Collins <robertc@robertcollins.net> | 2008-12-08 11:40:38 +1100 |
|---|---|---|
| committer | Robert Collins <robertc@robertcollins.net> | 2008-12-08 11:40:38 +1100 |
| commit | 18c5bd4f9736990c5e4c7173a1c39a49faa3f99d (patch) | |
| tree | 420cc5c03893e2ab7cfcb17143b6dfbdcfd10dac /python | |
| parent | 89c349ed68391358088242c1cc660351791cbd7f (diff) | |
| parent | 24ec56b54f6bb1b1d1d13a8314213c7c68902514 (diff) | |
| download | subunit-git-18c5bd4f9736990c5e4c7173a1c39a49faa3f99d.tar.gz | |
Merge tags branch to resolve conflicts
Diffstat (limited to 'python')
| -rw-r--r-- | python/subunit/__init__.py | 35 | ||||
| -rw-r--r-- | python/subunit/tests/test_test_protocol.py | 53 |
2 files changed, 86 insertions, 2 deletions
diff --git a/python/subunit/__init__.py b/python/subunit/__init__.py index d6093b9..b207176 100644 --- a/python/subunit/__init__.py +++ b/python/subunit/__init__.py @@ -44,7 +44,10 @@ def join_dir(base_path, path): class TestProtocolServer(object): - """A class for receiving results from a TestProtocol client.""" + """A class for receiving results from a TestProtocol client. + + :ivar tags: The current tags associated with the protocol stream. + """ OUTSIDE_TEST = 0 TEST_STARTED = 1 @@ -68,6 +71,7 @@ class TestProtocolServer(object): self.state = TestProtocolServer.OUTSIDE_TEST self.client = client self._stream = stream + self.tags = set() def _addError(self, offset, line): if (self.state == TestProtocolServer.TEST_STARTED and @@ -166,6 +170,23 @@ class TestProtocolServer(object): else: self.stdOutLineReceived(line) + def _handleTags(self, offset, line): + """Process a tags command.""" + tags = line[offset:].split() + new_tags = set() + gone_tags = set() + for tag in tags: + if tag[0] == '-': + gone_tags.add(tag[1:]) + else: + new_tags.add(tag) + if self.state == TestProtocolServer.OUTSIDE_TEST: + update_tags = self.tags + else: + update_tags = self._current_test.tags + update_tags.update(new_tags) + update_tags.difference_update(gone_tags) + def lineReceived(self, line): """Call the appropriate local method for the received line.""" if line == "]\n": @@ -192,6 +213,8 @@ class TestProtocolServer(object): self._addSkip(offset, line) elif cmd in ('success', 'successful'): self._addSuccess(offset, line) + elif cmd in ('tags'): + self._handleTags(offset, line) elif cmd == 'xfail': self._addExpectedFail(offset, line) else: @@ -236,6 +259,7 @@ class TestProtocolServer(object): self._current_test = RemotedTestCase(line[offset:-1]) self.current_test_description = line[offset:-1] self.client.startTest(self._current_test) + self._current_test.tags = set(self.tags) else: self.stdOutLineReceived(line) @@ -297,7 +321,14 @@ def RemoteError(description=""): class RemotedTestCase(unittest.TestCase): - """A class to represent test cases run in child processes.""" + """A class to represent test cases run in child processes. + + Instances of this class are used to provide the python test API a TestCase + that can be printed to the screen, introspected for metadata and so on. + However, as they are a simply a memoisation of a test that was actually + run in the past by a separate process, they cannot perform any interactive + actions. + """ def __eq__ (self, other): try: diff --git a/python/subunit/tests/test_test_protocol.py b/python/subunit/tests/test_test_protocol.py index 9c17106..9088819 100644 --- a/python/subunit/tests/test_test_protocol.py +++ b/python/subunit/tests/test_test_protocol.py @@ -694,6 +694,59 @@ class TestTestProtocolServerAddSuccess(unittest.TestCase): self.success_quoted_bracket("success:") +class TestTestProtocolServerStreamTags(unittest.TestCase): + """Test managing tags on the protocol level.""" + + def setUp(self): + self.client = MockTestProtocolServerClient() + self.protocol = subunit.TestProtocolServer(self.client) + + def test_initial_tags(self): + self.protocol.lineReceived("tags: foo bar:baz quux\n") + self.assertEqual(set(["foo", "bar:baz", "quux"]), + self.protocol.tags) + + def test_minus_removes_tags(self): + self.protocol.lineReceived("tags: foo bar\n") + self.protocol.lineReceived("tags: -bar quux\n") + self.assertEqual(set(["foo", "quux"]), + self.protocol.tags) + + def test_tags_get_set_on_test_no_tags(self): + self.protocol.lineReceived("test mcdonalds farm\n") + test = self.client.start_calls[-1] + self.assertEqual(set(), test.tags) + + def test_tags_get_set_on_test_protocol_tags_only(self): + self.protocol.lineReceived("tags: foo bar\n") + self.protocol.lineReceived("test mcdonalds farm\n") + test = self.client.start_calls[-1] + self.assertEqual(set(["foo", "bar"]), test.tags) + + def test_tags_get_set_on_test_simple(self): + self.protocol.lineReceived("test mcdonalds farm\n") + test = self.client.start_calls[-1] + self.protocol.lineReceived("tags: foo bar\n") + self.assertEqual(set(["foo", "bar"]), test.tags) + self.assertEqual(set(), self.protocol.tags) + + def test_tags_get_set_on_test_minus_removes(self): + self.protocol.lineReceived("test mcdonalds farm\n") + test = self.client.start_calls[-1] + self.protocol.lineReceived("tags: foo bar\n") + self.protocol.lineReceived("tags: -bar quux\n") + self.assertEqual(set(["foo", "quux"]), test.tags) + self.assertEqual(set(), self.protocol.tags) + + def test_test_tags_inherit_protocol_tags(self): + self.protocol.lineReceived("tags: foo bar\n") + self.protocol.lineReceived("test mcdonalds farm\n") + test = self.client.start_calls[-1] + self.protocol.lineReceived("tags: -bar quux\n") + self.assertEqual(set(["foo", "quux"]), test.tags) + self.assertEqual(set(["foo", "bar"]), self.protocol.tags) + + class TestRemotedTestCase(unittest.TestCase): def test_simple(self): |
