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