[Zope3-checkins] SVN: Zope3/trunk/src/zope/app/twisted/ Backed out 40781 due to windos failures. I need to rethink the

Jim Fulton jim at zope.com
Wed Dec 14 15:42:49 EST 2005


Log message for revision 40782:
  Backed out 40781 due to windos failures.  I need to rethink the
  approach a bit. Sigh.
  

Changed:
  D   Zope3/trunk/src/zope/app/twisted/asyncore_main_loop.py
  U   Zope3/trunk/src/zope/app/twisted/main.py
  D   Zope3/trunk/src/zope/app/twisted/tests/test_asyncore_main_loop.py
  D   Zope3/trunk/src/zope/app/twisted/tests/test_zeo.py

-=-
Deleted: Zope3/trunk/src/zope/app/twisted/asyncore_main_loop.py
===================================================================
--- Zope3/trunk/src/zope/app/twisted/asyncore_main_loop.py	2005-12-14 19:43:16 UTC (rev 40781)
+++ Zope3/trunk/src/zope/app/twisted/asyncore_main_loop.py	2005-12-14 20:42:48 UTC (rev 40782)
@@ -1,78 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Run the asyncore main loop
-
-This module provides a function that tries to run the asyncore main loop.
-
-If the asyncore socket map is empty when the function is called, then the
-function exits immediately:
-
-    >>> run(None)
-
-If the loop dies due to an exception, then a panic is logged anf the failure
-handler passed is called:
-
-    >>> def failed():
-    ...     print "FAILED!"
-
-    >>> import asyncore
-    >>> class BadDispatcher(asyncore.dispatcher):
-    ...     _fileno = 42
-    ...     def readable(self):
-    ...         raise SystemError("I am evil")
-
-    >>> import zope.testing.loggingsupport
-    >>> handler = zope.testing.loggingsupport.InstalledHandler('ZEO.twisted')
-
-    >>> BadDispatcher().add_channel()
-
-    >>> run(failed)
-    FAILED!
-
-    >>> print handler
-    ZEO.twisted CRITICAL
-      The asyncore main loop died unexpectedly!
-
-    >>> print handler.records[0].exc_info[1]
-    I am evil
-
-$Id$
-"""
-
-import logging
-import sys
-import threading
-
-import ThreadedAsync
-logger = logging.getLogger('ZEO.twisted')
-
-def run(onerror):
-    try:
-        ThreadedAsync.loop()
-    except:
-        exc_info = sys.exc_info()
-        logger.critical("The asyncore main loop died unexpectedly!",
-                        exc_info = exc_info,
-                        )
-        onerror()
-    
-def run_in_thread(reactor):
-    thread = threading.Thread(
-        target=run,
-        args=(reactor, ),
-        )
-    thread.setDaemon(True)
-    thread.start()
-
-        

Modified: Zope3/trunk/src/zope/app/twisted/main.py
===================================================================
--- Zope3/trunk/src/zope/app/twisted/main.py	2005-12-14 19:43:16 UTC (rev 40781)
+++ Zope3/trunk/src/zope/app/twisted/main.py	2005-12-14 20:42:48 UTC (rev 40782)
@@ -33,7 +33,6 @@
 import zope.app.appsetup.interfaces
 from zope.app import wsgi
 from zope.app.twisted import log
-from zope.app.twisted import asyncore_main_loop
 
 CONFIG_FILENAME = "zope.conf"
 
@@ -80,14 +79,6 @@
     c1 = time.clock()
     logging.info("Startup time: %.3f sec real, %.3f sec CPU", t1-t0, c1-c0)
 
-    # Start the ThreadedAsync main loop.  This will either end immediately,
-    # or keep going if ZEO is around.  We don't actually care which.
-    def failed():
-        global RESTART_ON_SHUTDOWN
-        RESTART_ON_SHUTDOWN = True
-        reactor.callFromThread(reactor.stop)
-    reactor.callWhenRunning(asyncore_main_loop.run_in_thread, failed)
-
     reactor.run()
 
     if RESTART_ON_SHUTDOWN:

Deleted: Zope3/trunk/src/zope/app/twisted/tests/test_asyncore_main_loop.py
===================================================================
--- Zope3/trunk/src/zope/app/twisted/tests/test_asyncore_main_loop.py	2005-12-14 19:43:16 UTC (rev 40781)
+++ Zope3/trunk/src/zope/app/twisted/tests/test_asyncore_main_loop.py	2005-12-14 20:42:48 UTC (rev 40782)
@@ -1,38 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""XXX short summary goes here.
-
-$Id$
-"""
-
-import asyncore
-import unittest
-from zope.testing import doctest
-
-def setUp(test):
-    test.globs['saved-socket-map'] = asyncore.socket_map.copy()
-    asyncore.socket_map.clear()
-
-def tearDown(test):
-    test.globs['handler'].uninstall()
-    asyncore.socket_map.clear()
-    asyncore.socket_map.update(test.globs['saved-socket-map'])
-
-def test_suite():
-    return doctest.DocTestSuite('zope.app.twisted.asyncore_main_loop',
-                                setUp=setUp, tearDown=tearDown)
-
-if __name__ == '__main__':
-    unittest.main(defaultTest='test_suite')
-

Deleted: Zope3/trunk/src/zope/app/twisted/tests/test_zeo.py
===================================================================
--- Zope3/trunk/src/zope/app/twisted/tests/test_zeo.py	2005-12-14 19:43:16 UTC (rev 40781)
+++ Zope3/trunk/src/zope/app/twisted/tests/test_zeo.py	2005-12-14 20:42:48 UTC (rev 40782)
@@ -1,364 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-r"""Test that ZEO is handled correctly.
-
-This is a rather evil test that involves setting up a real ZEO server
-ans some clients. We'll borrow some evil infrastructure from ZEO to do
-this.
-
-We'll start by setting up and starting a ZEO server.  
-
-    >>> zeo_port = ZEO.tests.testZEO.get_port()
-    >>> zconf = ZEO.tests.forker.ZEOConfig(('', zeo_port))
-    >>> zport, adminaddr, pid, path = ZEO.tests.forker.start_zeo_server(
-    ...     '<demostorage 1>\n</demostorage>\n', zconf, zeo_port)
-
-We'll set up and start two Zope servers that are clients of the
-storage server:
-
-    >>> instance_dir = tempfile.mkdtemp('zeo', 'test')
-    >>> inst1 = Instance(instance_dir, '1', zeo_port)
-    >>> inst1.start()
-    >>> inst2 = Instance(instance_dir, '2', zeo_port)
-    >>> inst2.start()
-
-Lets visit the public view of the top folder for both servers.
-Before we make each of these calls, we'll wait for the server to
-come up:
-
-    >>> inst1.wait()
-    >>> print inst1.main_page()
-    <...
-    <table ...
-        <thead> 
-          <tr>
-            ...
-            <th>Name</th>
-            <th>Title</th>
-            <th>Created</th>
-            <th>Modified</th>
-            ...
-
-    >>> inst2.wait()
-    >>> print inst2.main_page()
-    <...
-    <table ...
-        <thead> 
-          <tr>
-            ...
-            <th>Name</th>
-            <th>Title</th>
-            <th>Created</th>
-            <th>Modified</th>
-            ...
-
-Now, if we add a folder on one server, it should appear on the other:
-
-    >>> from zope.testbrowser.browser import Browser
-    >>> browser = Browser()
-    >>> browser.open(inst1.url + '@@contents.html')
-    >>> browser.getLink('Folder').click()
-    >>> browser.getControl(name='new_value').value = 'newfolder'
-    >>> browser.getControl('Apply').click()
-
-    >>> 'newfolder' in inst1.main_page()
-    True
-
-    >>> 'newfolder' in inst2.main_page()
-    True
-
-Note that we use main_page because testbrowser, unfortunately, asks for
-robots.txt on every request.  This defeats the test we are trying to
-do here. Why?  The original symptom was that, when a change was made
-on one ZEO client, then the change wouldn't be seen on the other
-client on the first request. Subsequent requests would see the change
-because ZODB syncs the storages at the end of each transaction.  The
-request for robots.txt causes the database to sync, which prevents us
-from seeing the bug.
-
-Cleanup:
-
-    >>> browser.mech_browser.close() # TODO: Browser needs close.
-    >>> inst1.stop()
-    >>> inst2.stop()
-    >>> ZEO.tests.forker.shutdown_zeo_server(('localhost', zeo_port))
-    >>> shutil.rmtree(instance_dir)
-
-$Id$
-"""
-import asyncore
-import errno
-import httplib
-import os
-import sys
-import shutil
-import socket
-import tempfile
-import time
-import unittest
-from zope.testing import doctest
-import ZEO.tests.testZEO
-import ZEO.tests.forker
-
-class Instance:
-
-    def __init__(self, dir=None, name=None, zeo_port=1):
-        if dir is None:
-            self.dir = tempfile.mkdtemp('zeo', 'test')
-        else:
-            self.dir = os.path.join(dir, name)
-            os.mkdir(self.dir)
-
-        self.path = sys.path
-        self.python = sys.executable
-        self.config = os.path.join(self.dir, 'zope.conf')
-        self.zeo_port = zeo_port
-        self.port = ZEO.tests.testZEO.get_port()
-        #print >> sys.stderr, 'port', self.port
-        self.socket = os.path.join(self.dir, 'socket')
-        self.z3log = os.path.join(self.dir, 'z3.log')
-        self.accesslog = os.path.join(self.dir, 'access.log')
-        self.sitezcml = os.path.join(self.dir, 'site.zcml')
-        for file in self.files:
-            getattr(self, file)()
-
-    files = 'runzope', 'site_zcml', 'zdaemon_conf', 'zope_conf', 'zopectl'
-
-    def runzope(self):
-        template = """
-        import sys
-        sys.path[:] = %(path)r
-        from zope.app.twisted.main import main
-        main(["-C", %(config)r] + sys.argv[1:])
-        """
-        template = '\n'.join([l.strip() for l in template.split('\n')])
-        mkfile(self.dir, "runzope", template, self.__dict__)
-
-    def site_zcml(self):
-        template = """
-        <configure xmlns="http://namespaces.zope.org/zope">
-
-        <include package="zope.app" />
-        <include package="zope.app.twisted" />
-        <securityPolicy
-            component="zope.security.simplepolicies.PermissiveSecurityPolicy" />
-        
-        <unauthenticatedPrincipal
-            id="zope.anybody"
-            title="Unauthenticated User" />
-        
-        <principal
-            id="zope.manager"
-            title="Manager"
-            login="jim"
-            password="123"
-            />
-        
-        </configure>
-        """
-        mkfile(self.dir, "site.zcml", template, self.__dict__)
-
-    def zdaemon_conf(self):
-        self.runzope = os.path.join(self.dir, 'runzope')
-        template = """
-        <runner>
-          program %(python)s %(runzope)s
-          daemon on
-          socket-name %(socket)s
-        </runner>
-        <eventlog>
-          <logfile>
-            path %(z3log)s
-          </logfile>
-        </eventlog>
-        """
-        mkfile(self.dir, "zdaemon.conf", template, self.__dict__)
-
-    def zope_conf(self):
-        template = """
-        site-definition %(sitezcml)s
-        threads 1
-        <server>
-          type HTTP
-          address localhost:%(port)s
-        </server>
-        <zodb>
-        <zeoclient>
-          server localhost:%(zeo_port)s
-          storage 1
-          cache-size 20MB
-        </zeoclient>
-        </zodb>
-        <accesslog>
-          <logfile>
-            path %(accesslog)s
-          </logfile>
-        </accesslog>
-        <eventlog>
-          <logfile>
-            path %(z3log)s
-          </logfile>
-        </eventlog>
-        """
-        mkfile(self.dir, "zope.conf", template, self.__dict__)
-
-    def zopectl(self):
-        template = """
-        import os, sys, StringIO
-        CONFIG_FILE = os.path.join(%(dir)r, "zdaemon.conf")
-        sys.path[:] = %(path)r
-        import zope.app.twisted.controller
-        zope.app.twisted.controller.INSTANCE_HOME = %(dir)r
-        sys.stdout = StringIO.StringIO()
-        zope.app.twisted.controller.main(["-C", CONFIG_FILE] + sys.argv[1:])
-        """
-        template = '\n'.join([l.strip() for l in template.split('\n')])
-        mkfile(self.dir, "zopectl", template, self.__dict__)
-
-    def start(self):
-        os.spawnv(os.P_NOWAIT, sys.executable,
-                  (sys.executable,
-                   os.path.join(self.dir, "zopectl"),
-                   'start'),
-                  )
-
-    def stop(self):
-        os.spawnv(os.P_WAIT, sys.executable,
-                  (sys.executable,
-                   os.path.join(self.dir, "zopectl"),
-                   'stop'),
-                  )
-
-    def main_page(self):
-        connection = httplib.HTTPConnection('localhost', self.port)
-        connection.request('GET', self.url)
-        response = connection.getresponse()
-        if response.status != 200:
-            raise AssertionError(response.status)
-        body = response.read()
-        connection.close()
-        return body
-
-    def wait(self):
-        addr = 'localhost', self.port
-        for i in range(120):
-            time.sleep(0.25)
-            try:
-                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-                s.connect(addr)
-                s.close()
-                break
-            except socket.error, e:
-                if e[0] not in (errno.ECONNREFUSED, errno.ECONNRESET):
-                    raise
-                s.close()
-
-    url = property(lambda self: 'http://localhost:%d/' % self.port)
-    
-def mkfile(dir, name, template, kw):
-    f = open(os.path.join(dir, name), 'w')
-    f.write(template % kw)
-    f.close()
-
-class BadInstance(Instance):
-
-    files = 'runzope', 'site_zcml', 'zope_conf'
-
-    def runzope(self):
-        template = """
-        import sys
-        sys.path[:] = %(path)r
-        from zope.app.twisted.main import main
-        from zope.app.twisted.tests.test_zeo import BadDispatcher
-        BadDispatcher().add_channel()
-        main(["-C", %(config)r] + sys.argv[1:])
-        """
-        template = '\n'.join([l.strip() for l in template.split('\n')])
-        mkfile(self.dir, "runzope", template, self.__dict__)
-
-    def zope_conf(self):
-        template = """
-        site-definition %(sitezcml)s
-        threads 1
-        <server>
-          type HTTP
-          address localhost:%(port)s
-        </server>
-        <zodb>
-        <demostorage>
-        </demostorage>
-        </zodb>
-        <accesslog>
-          <logfile>
-            path %(accesslog)s
-          </logfile>
-        </accesslog>
-        <eventlog>
-          <logfile>
-            path %(z3log)s
-          </logfile>
-        </eventlog>
-        """
-        mkfile(self.dir, "zope.conf", template, self.__dict__)
-
-    def start(self):
-        return os.spawnv(os.P_WAIT, sys.executable,
-                         (sys.executable,
-                          os.path.join(self.dir, "runzope"),
-                          )
-                         )
-
-class BadDispatcher(asyncore.dispatcher):
-    _fileno = 42
-    def readable(self):
-        raise SystemError("I am evil")
-
-def test_asyncore_failure_causes_zope_failure():
-    """
-
-A failure of the asyncore mail loop should cause a zope process to fail:
-
-    >>> bad = BadInstance()
-    >>> bad.start()
-    1
-
-And puts a panic in the event log:
-
-    >>> print open(bad.z3log).read()
-    ------
-    ... CRITICAL ZEO.twisted The asyncore main loop died unexpectedly!
-    Traceback (most recent call last):
-    ...
-        raise SystemError("I am evil")
-    SystemError: I am evil
-    <BLANKLINE>
-
-
-Cleanup:
-
-    >>> shutil.rmtree(bad.dir)
-
-"""
-        
-def test_suite():
-    suite = doctest.DocTestSuite(
-        optionflags=doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE,
-        )
-    suite.level = 2
-    return suite
-
-
-if __name__ == '__main__':
-    unittest.main(defaultTest='test_suite')
-



More information about the Zope3-Checkins mailing list