[Checkins] SVN: zope.app.testing/trunk/ improve isolation of test product configuration so changes performed by

Fred L. Drake, Jr. fdrake at gmail.com
Fri Aug 22 09:37:36 EDT 2008


Log message for revision 90123:
  improve isolation of test product configuration so changes performed by
  test-specific setup (or inside tests!) do not leak to other tests
  

Changed:
  U   zope.app.testing/trunk/CHANGES.txt
  U   zope.app.testing/trunk/src/zope/app/testing/functional.py
  U   zope.app.testing/trunk/src/zope/app/testing/tests.py

-=-
Modified: zope.app.testing/trunk/CHANGES.txt
===================================================================
--- zope.app.testing/trunk/CHANGES.txt	2008-08-22 11:53:16 UTC (rev 90122)
+++ zope.app.testing/trunk/CHANGES.txt	2008-08-22 13:37:35 UTC (rev 90123)
@@ -2,6 +2,11 @@
 CHANGES
 =======
 
+3.5.3 (2008-08-22)
+------------------
+
+- Fix isolation enforcement for product configuration around individual tests.
+
 3.5.2 (2008-08-21)
 ------------------
 

Modified: zope.app.testing/trunk/src/zope/app/testing/functional.py
===================================================================
--- zope.app.testing/trunk/src/zope/app/testing/functional.py	2008-08-22 11:53:16 UTC (rev 90122)
+++ zope.app.testing/trunk/src/zope/app/testing/functional.py	2008-08-22 13:37:35 UTC (rev 90123)
@@ -17,6 +17,7 @@
 
 $Id$
 """
+import copy
 import logging
 import os.path
 import re
@@ -189,14 +190,18 @@
             # Make it silent but keep the log available for debugging
             logging.root.addHandler(logging.StreamHandler(self.log))
 
-            product_configs = []
+            self.old_product_config = copy.deepcopy(
+                zope.app.appsetup.product.saveConfiguration())
+            configs = []
             if product_config:
                 configs = zope.app.appsetup.product.loadConfiguration(
                     StringIO(product_config))
-                zope.app.appsetup.product.setProductConfigurations([
+                configs = [
                     zope.app.appsetup.product.FauxConfiguration(name, values)
                     for name, values in configs.items()
-                    ])
+                    ]
+            self.local_product_config = configs
+            zope.app.appsetup.product.setProductConfigurations(configs)
 
             self._base_storages = {}
             self.db = multi_database(
@@ -272,6 +277,8 @@
         abort()
         self.dbstack.append((self.db, self.connection))
         self.connection = None
+        zope.app.appsetup.product.setProductConfigurations(
+            self.local_product_config)
         self.db = self.app.db = multi_database(
             DerivedDatabaseFactory(name, self._base_storages)
             for name in self._database_names
@@ -289,6 +296,8 @@
         self._close_databases()
         assert self.dbstack == []
         zope.app.testing.setup.placefulTearDown()
+        zope.app.appsetup.product.restoreConfiguration(
+            self.old_product_config)
         self._config_file = False
         self._product_config = None
         self._database_names = None

Modified: zope.app.testing/trunk/src/zope/app/testing/tests.py
===================================================================
--- zope.app.testing/trunk/src/zope/app/testing/tests.py	2008-08-22 11:53:16 UTC (rev 90122)
+++ zope.app.testing/trunk/src/zope/app/testing/tests.py	2008-08-22 13:37:35 UTC (rev 90123)
@@ -489,8 +489,6 @@
         >>> setup = FunctionalTestSetup(
         ...     empty_zcml, product_config=product_config)
 
-        >>> setup.setUp()
-
     The configuration was visible to our database-opened subscriber:
 
         >>> pprint.pprint(config, width=1)
@@ -503,8 +501,25 @@
         {'key1': 'value1',
          'key2': 'value2'}
 
+    Let's run a test that mutates the product configuration:
+
+        >>> setup.setUp()
+        >>> zope.app.appsetup.product.setProductConfiguration(
+        ...     'abc', {'another': 'value'})
+        >>> zope.app.appsetup.product.getProductConfiguration('abc')
+        {'another': 'value'}
         >>> setup.tearDown()
 
+    A second test run in the layer sees the original product configuration:
+
+        >>> setup.setUp()
+        >>> config = zope.app.appsetup.product.getProductConfiguration(
+        ...     'abc')
+        >>> pprint.pprint(config, width=1)
+        {'key1': 'value1',
+         'key2': 'value2'}
+        >>> setup.tearDown()
+
     After the layer is cleaned up, there's no longer any product
     configuration:
 



More information about the Checkins mailing list