[Erp5-report] r45695 jm - /erp5/trunk/products/ERP5Type/tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Apr 27 17:05:55 CEST 2011


Author: jm
Date: Wed Apr 27 17:05:54 2011
New Revision: 45695

URL: http://svn.erp5.org?rev=45695&view=rev
Log:
Initial support for NEO storage in unit tests (--neostorage option)

This only implements an equivalent of DemoStorage:
- use 'BTree' as backend storage (entirely in RAM)
- not yet compatible with --load/--save

Modified:
    erp5/trunk/products/ERP5Type/tests/custom_zodb.py
    erp5/trunk/products/ERP5Type/tests/runUnitTest.py

Modified: erp5/trunk/products/ERP5Type/tests/custom_zodb.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/custom_zodb.py?rev=45695&r1=45694&r2=45695&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/custom_zodb.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/custom_zodb.py [utf8] Wed Apr 27 17:05:54 2011
@@ -20,6 +20,7 @@ instance_home = os.environ['INSTANCE_HOM
 zserver_list = os.environ.get('zserver', '').split(',')
 os.environ['zserver'] = zserver_list[0]
 
+neo_storage = 'neo_storage' in os.environ
 zeo_client = os.environ.get('zeo_client')
 if zeo_client:
   zeo_client = zeo_client.rsplit(':', 1)
@@ -28,7 +29,8 @@ if zeo_client:
 try:
   activity_node = int(os.environ['activity_node'])
 except KeyError:
-  activity_node = (zeo_client or 'zeo_server' in os.environ) and 1 or None
+  activity_node = (zeo_client or neo_storage or 'zeo_server' in os.environ
+                  ) and 1 or None
 
 data_fs_path = os.environ.get('erp5_tests_data_fs_path',
                               os.path.join(instance_home, 'var', 'Data.fs'))
@@ -88,7 +90,7 @@ for static_dir in static_dir_list:
     os.mkdir(static_dir)
 
 zeo_server_pid = None
-zeo_client_pid_list = []
+node_pid_list = []
 
 ZEvent = sys.modules.get('ZServer.PubCore.ZEvent')
 def fork():
@@ -103,43 +105,61 @@ def fork():
     instance_random.seed(instance_random.random())
   return pid
 
-while not zeo_client:
-  if activity_node:
-    r, zeo_client = os.pipe()
-    zeo_server_pid = fork()
-    if zeo_server_pid:
-      save_mysql = None
-      os.close(zeo_client)
-      zeo_client = eval(os.fdopen(r).read())
-      continue
-    else:
-      zeo_client_pid_list = activity_node = None
-      os.close(r)
-      signal.signal(signal.SIGINT, signal.SIG_IGN)
-  elif activity_node is not None:
-    # run ZEO server but no need to fork
-    zeo_server_pid = 0
-
-  if save:
-    Storage = FileStorage(data_fs_path)
-  elif load:
-    Storage = FileStorage(data_fs_path, read_only=True)
-    Storage._is_read_only = False # XXX for Zope 2.8
-    Storage = DemoStorage(base=Storage)
-  else:
-    Storage = DemoStorage()
-  break
-else:
+def forkNodes():
+  global node_pid_list
   for i in xrange(1, activity_node):
     pid = fork()
     if not pid:
-      zeo_client_pid_list = None
+      node_pid_list = None
       os.environ['zserver'] = i < len(zserver_list) and zserver_list[i] or ''
       break
-    zeo_client_pid_list.append(pid)
-  # Zope 2.12: do not import ClientStorage before forking due to client trigger
-  from ZEO.ClientStorage import ClientStorage
-  Storage = ClientStorage(zeo_client)
+    node_pid_list.append(pid)
+
+if neo_storage:
+  if load or save or zeo_client:
+    raise Exception("--neo_storage conflicts with --load/save/zeo_client")
+  from neo.tests.functional import NEOCluster
+  neo_cluster = NEOCluster(range(2), partitions=4, adapter='BTree',
+                           temp_dir=os.getcwd(), verbose=False)
+  sigint = signal.signal(signal.SIGINT, signal.SIG_IGN)
+  neo_cluster.start()
+  signal.signal(signal.SIGINT, sigint)
+  forkNodes()
+  Storage = neo_cluster.getZODBStorage()
+else:
+  neo_cluster = None
+  while not zeo_client:
+    if activity_node:
+      r, zeo_client = os.pipe()
+      zeo_server_pid = fork()
+      if zeo_server_pid:
+        save_mysql = None
+        os.close(zeo_client)
+        zeo_client = eval(os.fdopen(r).read())
+        continue
+      else:
+        node_pid_list = activity_node = None
+        os.close(r)
+        signal.signal(signal.SIGINT, signal.SIG_IGN)
+    elif activity_node is not None:
+      # run ZEO server but no need to fork
+      zeo_server_pid = 0
+
+    if save:
+      Storage = FileStorage(data_fs_path)
+    elif load:
+      Storage = FileStorage(data_fs_path, read_only=True)
+      Storage._is_read_only = False # XXX for Zope 2.8
+      Storage = DemoStorage(base=Storage)
+    else:
+      Storage = DemoStorage()
+    break
+  else:
+    forkNodes()
+    # Zope 2.12: do not import ClientStorage
+    # before forking due to client trigger
+    from ZEO.ClientStorage import ClientStorage
+    Storage = ClientStorage(zeo_client)
 
-if zeo_client_pid_list is not None:
+if node_pid_list is not None:
   _print("Instance at %r loaded ... " % instance_home)

Modified: erp5/trunk/products/ERP5Type/tests/runUnitTest.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/runUnitTest.py?rev=45695&r1=45694&r2=45695&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/runUnitTest.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/runUnitTest.py [utf8] Wed Apr 27 17:05:54 2011
@@ -128,6 +128,8 @@ Options:
                              Make ZServer listen on given host:port
                              If used with --activity_node=, this can be a
                              comma-separated list of addresses.
+  --neo_storage              Use a volatile NEO storage instead of a DemoStorage
+                             (not compatible with --save or --load).
   --products_path=path,path  Comma-separated list of products paths locations
                              which shall be used in test environment.
   --sys_path=path,path       Comma-separated list of paths which will be used to
@@ -486,12 +488,12 @@ def runUnitTestList(test_list, verbosity
 
   import Lifetime
   from ZEO.ClientStorage import ClientStorage
-  from Zope2.custom_zodb import \
-      save_mysql, zeo_server_pid, zeo_client_pid_list, Storage
+  from Zope2.custom_zodb import Storage, save_mysql, \
+      node_pid_list, neo_cluster, zeo_server_pid
   def shutdown(signum, frame, signum_set=set()):
     Lifetime.shutdown(0)
     signum_set.add(signum)
-    if zeo_client_pid_list is None and len(signum_set) > 1:
+    if node_pid_list is None and len(signum_set) > 1:
       # in case of ^C, a child should also receive a SIGHUP from the parent,
       # so we merge the first 2 different signals in a single exception
       signum_set.remove(signal.SIGHUP)
@@ -508,7 +510,7 @@ def runUnitTestList(test_list, verbosity
                       or not load)
     if zeo_server_pid == 0:
       suite = ZEOServerTestCase('asyncore_loop')
-    elif zeo_client_pid_list is None or not test_list:
+    elif node_pid_list is None or not test_list:
       suite = ProcessingNodeTestCase('processing_node')
       if not (dummy or load):
         _print('WARNING: either --save or --load should be used because static'
@@ -538,7 +540,7 @@ def runUnitTestList(test_list, verbosity
       if run_only:
         ERP5TypeTestLoader.filter_test_list = None
 
-    if zeo_client_pid_list is None:
+    if node_pid_list is None:
       result = suite()
     else:
       if not test_list:
@@ -548,16 +550,18 @@ def runUnitTestList(test_list, verbosity
   finally:
     ProcessingNodeTestCase.unregisterNode()
     Storage.close()
-    if zeo_client_pid_list is not None:
+    if node_pid_list is not None:
       # Wait that child processes exit. Stop ZEO storage (if any) after all
       # other nodes disconnected.
-      for pid in zeo_client_pid_list:
+      for pid in node_pid_list:
         os.kill(pid, signal.SIGHUP)
-      for pid in zeo_client_pid_list:
+      for pid in node_pid_list:
         os.waitpid(pid, 0)
       if zeo_server_pid:
         os.kill(zeo_server_pid, signal.SIGHUP)
         os.waitpid(zeo_server_pid, 0)
+      if neo_cluster:
+        neo_cluster.stop()
 
   if save:
     os.chdir(instance_home)
@@ -584,7 +588,7 @@ def runUnitTestList(test_list, verbosity
           if e.errno != errno.ENOENT:
             raise
         os.rename(static_dir, backup_path)
-    elif zeo_client_pid_list is not None:
+    elif node_pid_list is not None:
       _print('WARNING: No static files saved. You will have to do it manually.')
 
   return result
@@ -633,6 +637,7 @@ def main(argument_list=None):
         "zeo_client=",
         "zeo_server=",
         "zserver=",
+        "neo_storage",
         "products_path=",
         "sys_path=",
         "instance_home=",
@@ -732,6 +737,8 @@ def main(argument_list=None):
       os.environ["zeo_server"] = arg
     elif opt == "--zserver":
       os.environ["zserver"] = arg
+    elif opt == "--neo_storage":
+      os.environ["neo_storage"] = ""
     elif opt == "--products_path":
       os.environ["PRODUCTS_PATH"] = arg
     elif opt == "--sys_path":



More information about the Erp5-report mailing list