~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/__init__.py

Show diffs side-by-side

added added

removed removed

Lines of Context:
799
799
    _log_file_name = None
800
800
    # record lsprof data when performing benchmark calls.
801
801
    _gather_lsprof_in_benchmarks = False
 
802
    # Mutable attributes defined in bzrlib.tests.TestCase and
 
803
    # testtools.TestCase that should not be shallow copied by clone_test.
 
804
    # This is ugly, but probably the best we can do until testtools provide a
 
805
    # nicer way to deal with this, see
 
806
    # <https://bugs.launchpad.net/testtools/+bug/637725>.
 
807
    _attrs_to_deepcopy = (
 
808
        '_cleanups', 'exception_handlers', '_unique_id_gen',
 
809
        '_traceback_id_gen', '_TestCase__details',
 
810
        '_TestCase__exception_handlers')
802
811
 
803
812
    def __init__(self, methodName='testMethod'):
804
 
        self.__methodName = methodName
805
813
        super(TestCase, self).__init__(methodName)
806
814
        self._cleanups = []
807
815
        self._directory_isolation = True
811
819
            (TestNotApplicable, self._do_not_applicable))
812
820
 
813
821
    def __copy__(self):
814
 
        return self.__class__(self.__methodName)
 
822
        # XXX: This method works around the lack of a way to correctly clone a
 
823
        # test with current testtools.  See
 
824
        # <https://bugs.launchpad.net/testtools/+bug/637725>.
 
825
        # The work around is to:
 
826
        #  - shallow copy self.__dict__
 
827
        #  - deep copy individual attributes in the _attrs_to_deepcopy black
 
828
        #    list.
 
829
        #  - create a new instance (skipping __init__) with the new __dict__.
 
830
        attrs = self.__dict__.copy()
 
831
        for attr_name in self._attrs_to_deepcopy:
 
832
            if attr_name in attrs:
 
833
                attrs[attr_name] = copy.deepcopy(attrs[attr_name])
 
834
        # Some Python voodoo to create an instance without invoking its
 
835
        # __init__, because we've already constructed the __dict__ to use.
 
836
        new_instance = self.__class__.__new__(self.__class__)
 
837
        new_instance.__dict__ = attrs
 
838
        return new_instance
815
839
 
816
840
    def setUp(self):
817
841
        super(TestCase, self).setUp()