Rev 2554: Overhaul RepositoryTestAdapter to be cleaner and more modular. in sftp://rookery/~/public_html/baz2.0/per-repository-test-setup

Robert Collins robertc at robertcollins.net
Wed Jun 27 08:41:42 BST 2007


At sftp://rookery/~/public_html/baz2.0/per-repository-test-setup

------------------------------------------------------------
revno: 2554
revision-id: robertc at robertcollins.net-20070627074138-2as9koyepbawsm8n
parent: pqm at pqm.ubuntu.com-20070626191000-flte155pupv54bcs
committer: Robert Collins <robertc at robertcollins.net>
branch nick: per-repository-test-setup
timestamp: Wed 2007-06-27 17:41:38 +1000
message:
  Overhaul RepositoryTestAdapter to be cleaner and more modular.
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
  bzrlib/tests/repository_implementations/__init__.py __init__.py-20060131092037-9564957a7d4a841b
  bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
=== modified file 'NEWS'
--- a/NEWS	2007-06-25 17:46:47 +0000
+++ b/NEWS	2007-06-27 07:41:38 +0000
@@ -57,6 +57,10 @@
       running the test suite and cuts the time by about half.
       (Andrew Bennetts, Martin Pool)
 
+    * Add scenarios as a public attribute on RepositoryTestAdapter to allow
+      modification of the generated scenarios before adaption and easier
+      testing. (Robert Collins)
+
   BUGFIXES:
 
     * Work around python-2.4.1 inhability to correctly parse the

=== modified file 'bzrlib/repository.py'
--- a/bzrlib/repository.py	2007-06-21 03:29:39 +0000
+++ b/bzrlib/repository.py	2007-06-27 07:41:38 +0000
@@ -1802,25 +1802,53 @@
         self._transport_readonly_server = transport_readonly_server
         self._vfs_transport_factory = vfs_transport_factory
         self._formats = formats
+        self.scenarios = self.formats_to_scenarios(formats)
     
     def adapt(self, test):
+        """Return a TestSuite containing a copy of test for each scenario."""
         result = unittest.TestSuite()
-        for repository_format, bzrdir_format in self._formats:
-            from copy import deepcopy
-            new_test = deepcopy(test)
-            new_test.transport_server = self._transport_server
-            new_test.transport_readonly_server = self._transport_readonly_server
+        for scenario in self.scenarios:
+            result.addTest(self.adapt_test_to_scenario(test, scenario))
+        return result
+
+    def adapt_test_to_scenario(self, test, scenario):
+        """Copy test and apply scenario to it.
+
+        :param test: A test to adapt.
+        :param scenario: A tuple describing the scenarion.
+            The first element of the tuple is the new test id.
+            The second element is a dict containing attributes to set on the
+            test.
+        :return: The adapted test.
+        """
+        from copy import deepcopy
+        new_test = deepcopy(test)
+        for name, value in scenario[1].items():
+            setattr(new_test, name, value)
+        def make_new_test_id():
+            new_id = "%s(%s)" % (new_test.id(), scenario[0])
+            return lambda: new_id
+        new_test.id = make_new_test_id()
+        return new_test
+
+    def formats_to_scenarios(self, formats):
+        """Transform the input formats to a list of scenarios.
+
+        :param formats: A list of (repository_format, bzrdir_format).
+        """
+        result = []
+        for repository_format, bzrdir_format in formats:
+            scenario = (repository_format.__class__.__name__,
+                {"transport_server":self._transport_server,
+                 "transport_readonly_server":self._transport_readonly_server,
+                 "bzrdir_format":bzrdir_format,
+                 "repository_format":repository_format,
+                 })
             # Only override the test's vfs_transport_factory if one was
             # specified, otherwise just leave the default in place.
             if self._vfs_transport_factory:
-                new_test.vfs_transport_factory = self._vfs_transport_factory
-            new_test.bzrdir_format = bzrdir_format
-            new_test.repository_format = repository_format
-            def make_new_test_id():
-                new_id = "%s(%s)" % (new_test.id(), repository_format.__class__.__name__)
-                return lambda: new_id
-            new_test.id = make_new_test_id()
-            result.addTest(new_test)
+                scenario[1]['vfs_transport_factory'] = self._vfs_transport_factory
+            result.append(scenario)
         return result
 
 

=== modified file 'bzrlib/tests/repository_implementations/__init__.py'
--- a/bzrlib/tests/repository_implementations/__init__.py	2007-05-10 14:11:22 +0000
+++ b/bzrlib/tests/repository_implementations/__init__.py	2007-06-27 07:41:38 +0000
@@ -49,7 +49,10 @@
         if format is None:
             # Create a repository of the type we are trying to test.
             made_control = self.make_bzrdir(relpath)
-            return self.repository_format.initialize(made_control)
+            repo = self.repository_format.initialize(made_control)
+            if getattr(self, "repository_to_test_repository"):
+                repo = self.repository_to_test_repository(repo)
+            return repo
         else:
             return super(TestCaseWithRepository, self).make_repository(
                 relpath, format)

=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py	2007-06-18 13:55:14 +0000
+++ b/bzrlib/tests/test_selftest.py	2007-06-27 07:41:38 +0000
@@ -221,40 +221,133 @@
 class TestRepositoryProviderAdapter(TestCase):
     """A group of tests that test the repository implementation test adapter."""
 
-    def test_adapted_tests(self):
-        # check that constructor parameters are passed through to the adapted
-        # test.
+    def test_constructor(self):
+        # check that constructor parameters are passed through to the
+        # scenarios.
         from bzrlib.repository import RepositoryTestProviderAdapter
-        input_test = TestRepositoryProviderAdapter(
-            "test_adapted_tests")
         server1 = "a"
         server2 = "b"
         formats = [("c", "C"), ("d", "D")]
         adapter = RepositoryTestProviderAdapter(server1, server2, formats)
-        suite = adapter.adapt(input_test)
-        tests = list(iter(suite))
-        self.assertEqual(2, len(tests))
-        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
-        self.assertEqual(tests[0].repository_format, formats[0][0])
-        self.assertEqual(tests[0].transport_server, server1)
-        self.assertEqual(tests[0].transport_readonly_server, server2)
-        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
-        self.assertEqual(tests[1].repository_format, formats[1][0])
-        self.assertEqual(tests[1].transport_server, server1)
-        self.assertEqual(tests[1].transport_readonly_server, server2)
+        self.assertEqual([
+            ('str',
+             {'bzrdir_format': 'C',
+              'repository_format': 'c',
+              'transport_readonly_server': 'b',
+              'transport_server': 'a'}),
+            ('str',
+             {'bzrdir_format': 'D',
+              'repository_format': 'd',
+              'transport_readonly_server': 'b',
+              'transport_server': 'a'})],
+            adapter.scenarios)
 
     def test_setting_vfs_transport(self):
         """The vfs_transport_factory can be set optionally."""
         from bzrlib.repository import RepositoryTestProviderAdapter
-        input_test = TestRepositoryProviderAdapter(
-            "test_adapted_tests")
-        formats = [("c", "C")]
+        formats = [("a", "b"), ("c", "d")]
         adapter = RepositoryTestProviderAdapter(None, None, formats,
             vfs_transport_factory="vfs")
-        suite = adapter.adapt(input_test)
-        tests = list(iter(suite))
-        self.assertEqual(1, len(tests))
-        self.assertEqual(tests[0].vfs_transport_factory, "vfs")
+        self.assertEqual([
+            ('str',
+             {'bzrdir_format': 'b',
+              'repository_format': 'a',
+              'transport_readonly_server': None,
+              'transport_server': None,
+              'vfs_transport_factory': 'vfs'}),
+            ('str',
+             {'bzrdir_format': 'd',
+              'repository_format': 'c',
+              'transport_readonly_server': None,
+              'transport_server': None,
+              'vfs_transport_factory': 'vfs'})],
+            adapter.scenarios)
+
+    def test_adapt_applies_scenarios(self):
+        from bzrlib.repository import RepositoryTestProviderAdapter
+        input_test = TestRepositoryProviderAdapter(
+            "test_adapt_test_to_scenario")
+        adapter = RepositoryTestProviderAdapter(None, None, [])
+        adapter.scenarios = [("1", "dict"), ("2", "settings")]
+        calls = []
+        def capture_call(test, scenario):
+            calls.append((test, scenario))
+            return test
+        adapter.adapt_test_to_scenario = capture_call
+        adapter.adapt(input_test)
+        self.assertEqual([(input_test, ("1", "dict")),
+            (input_test, ("2", "settings"))], calls)
+
+    def test_formats_to_scenarios(self):
+        """The adapter can generate all the scenarios needed."""
+        from bzrlib.repository import RepositoryTestProviderAdapter
+        no_vfs_adapter = RepositoryTestProviderAdapter("server", "readonly",
+            [], None)
+        vfs_adapter = RepositoryTestProviderAdapter("server", "readonly",
+            [], vfs_transport_factory="vfs")
+        # no_vfs generate scenarios without vfs_transport_factor
+        formats = [("c", "C"), (1, "D")]
+        self.assertEqual([
+            ('str',
+             {'bzrdir_format': 'C',
+              'repository_format': 'c',
+              'transport_readonly_server': 'readonly',
+              'transport_server': 'server'}),
+            ('int',
+             {'bzrdir_format': 'D',
+              'repository_format': 1,
+              'transport_readonly_server': 'readonly',
+              'transport_server': 'server'})],
+            no_vfs_adapter.formats_to_scenarios(formats))
+        self.assertEqual([
+            ('str',
+             {'bzrdir_format': 'C',
+              'repository_format': 'c',
+              'transport_readonly_server': 'readonly',
+              'transport_server': 'server',
+              'vfs_transport_factory': 'vfs'}),
+            ('int',
+             {'bzrdir_format': 'D',
+              'repository_format': 1,
+              'transport_readonly_server': 'readonly',
+              'transport_server': 'server',
+              'vfs_transport_factory': 'vfs'})],
+            vfs_adapter.formats_to_scenarios(formats))
+
+    def test_adapt_test_to_scenario(self):
+        from bzrlib.repository import RepositoryTestProviderAdapter
+        input_test = TestRepositoryProviderAdapter(
+            "test_adapt_test_to_scenario")
+        adapter = RepositoryTestProviderAdapter(None, None, [],
+            vfs_transport_factory="vfs")
+        # setup two adapted tests
+        adapted_test1 = adapter.adapt_test_to_scenario(input_test,
+            ("new id",
+            {"bzrdir_format":"bzr_format",
+             "repository_format":"repo_fmt",
+             "transport_server":"transport_server",
+             "transport_readonly_server":"readonly-server"}))
+        adapted_test2 = adapter.adapt_test_to_scenario(input_test,
+            ("new id 2", {"bzrdir_format":None}))
+        # input_test should have been altered.
+        self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
+        # the new tests are mutually incompatible, ensuring it has 
+        # made new ones, and unspecified elements in the scenario
+        # should not have been altered.
+        self.assertEqual("bzr_format", adapted_test1.bzrdir_format)
+        self.assertEqual("repo_fmt", adapted_test1.repository_format)
+        self.assertEqual("transport_server", adapted_test1.transport_server)
+        self.assertEqual("readonly-server",
+            adapted_test1.transport_readonly_server)
+        self.assertEqual(
+            "bzrlib.tests.test_selftest.TestRepositoryProviderAdapter."
+            "test_adapt_test_to_scenario(new id)",
+            adapted_test1.id())
+        self.assertEqual(None, adapted_test2.bzrdir_format)
+        self.assertEqual(
+            "bzrlib.tests.test_selftest.TestRepositoryProviderAdapter."
+            "test_adapt_test_to_scenario(new id 2)",
+            adapted_test2.id())
 
 
 class TestInterRepositoryProviderAdapter(TestCase):



More information about the bazaar-commits mailing list