Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

Changeset 1743

Show
Ignore:
Timestamp:
10/10/07 14:58:34
Author:
lakin
Message:

Test suite: added a test which re-produces the bug with daemonize that's documented in #646.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/cherrypy/test/test_states.py

    r1690 r1743  
    1212import cherrypy 
    1313engine = cherrypy.engine 
    14  
     14thisdir = os.path.join(os.getcwd(), os.path.dirname(__file__)) 
     15PID_file_path = os.path.join(thisdir,'pid_for_test_daemonize') 
    1516 
    1617class Root: 
     
    295296                raise 
    296297 
     298class DaemonizeTest(helper.CPWebCase): 
     299    def test_0_Daemonize(self): 
     300        if not self.server_class: 
     301            print "skipped (no server) ", 
     302            return 
     303        if os.name not in ['posix']:  
     304            print "skipped (not on posix) ", 
     305            return 
     306 
     307 
     308        # Start the demo script in a new process 
     309        demoscript = os.path.join(os.getcwd(), os.path.dirname(__file__), 
     310                                  "test_states_demo.py") 
     311        host = cherrypy.server.socket_host 
     312        port = cherrypy.server.socket_port 
     313        cherrypy._cpserver.wait_for_free_port(host, port) 
     314         
     315        args = [sys.executable, demoscript, host, str(port), '-daemonize'] 
     316        if self.scheme == "https": 
     317            args.append('-ssl') 
     318        # Spawn the process and wait, when this returns, the original process 
     319        # is finished.  If it daemonized properly, we should still be able 
     320        # to access pages. 
     321        exit_code = os.spawnl(os.P_WAIT, sys.executable, *args) 
     322        cherrypy._cpserver.wait_for_occupied_port(host, port) 
     323 
     324        # Give the server some time to start up 
     325        time.sleep(2) 
     326 
     327        # Get the PID from the file. 
     328        pid = int(open(PID_file_path).read()) 
     329        try: 
     330            # Just get the pid of the daemonization process. 
     331            self.getPage("/pid") 
     332            self.assertStatus(200) 
     333            page_pid = int(self.body) 
     334            self.assertEqual(page_pid, pid) 
     335        finally: 
     336            # Shut down the spawned process 
     337            self.getPage("/stop") 
     338         
     339        try: 
     340            print os.waitpid(pid, 0) 
     341        except OSError, x: 
     342            if x.args != (10, 'No child processes'): 
     343                raise 
     344 
     345        # Wait until here to test the exit code because we want to ensure 
     346        # that we wait for the daemon to finish running before we fail. 
     347        if exit_code != 0: 
     348            self.fail("Daemonized process failed to exit cleanly") 
    297349db_connection = None 
    298350 
     
    300352    helper.setConfig(conf) 
    301353    ServerStateTests.server_class = server 
     354    DaemonizeTest.server_class = server 
    302355    suite = helper.CPTestLoader.loadTestsFromTestCase(ServerStateTests) 
     356    daemon_suite = helper.CPTestLoader.loadTestsFromTestCase(DaemonizeTest) 
    303357    try: 
    304358        global db_connection 
     
    314368        except ImportError: 
    315369            helper.CPTestRunner.run(suite) 
     370            helper.CPTestRunner.run(daemon_suite) 
    316371        else: 
    317372            tr = pyconquer.Logger("cherrypy") 
     
    320375                tr.start() 
    321376                helper.CPTestRunner.run(suite) 
     377                helper.CPTestRunner.run(daemon_suite) 
    322378            finally: 
    323379                tr.stop() 
     
    335391     
    336392    if host: 
    337         ServerStateTests.HOST = host 
     393        DaemonizeTest.HOST = ServerStateTests.HOST = host 
    338394     
    339395    if port: 
    340         ServerStateTests.PORT = port 
     396        DaemonizeTest.PORT = ServerStateTests.PORT = port 
    341397     
    342398    if ssl: 
     
    345401        conf['server.ssl_certificate'] = serverpem 
    346402        conf['server.ssl_private_key'] = serverpem 
    347         ServerStateTests.scheme = "https" 
    348         ServerStateTests.HTTP_CONN = httplib.HTTPSConnection 
     403        DaemonizeTest.scheme = ServerStateTests.scheme = "https" 
     404        DaemonizeTest.HTTP_CONN = ServerStateTests.HTTP_CONN = httplib.HTTPSConnection 
    349405     
    350406    def _run(server): 
     
    353409        run(server, conf) 
    354410    _run("cherrypy._cpwsgi.CPWSGIServer") 
    355  
    356  
    357411 
    358412if __name__ == "__main__": 
  • trunk/cherrypy/test/test_states_demo.py

    r1631 r1743  
    55 
    66import cherrypy 
    7  
     7from cherrypy.restsrv.plugins import daemonize, PIDFile 
     8thisdir = os.path.join(os.getcwd(), os.path.dirname(__file__)) 
     9PID_file_path = os.path.join(thisdir,'pid_for_test_daemonize') 
    810 
    911class Root: 
     
    2931    stop.exposed = True 
    3032 
    31  
    3233if __name__ == '__main__': 
    3334    conf = {"server.socket_host": sys.argv[1], 
     
    3637            } 
    3738     
    38     if sys.argv[3:] == ['-ssl']: 
     39    if '-ssl' in sys.argv[3:]: 
    3940        localDir = os.path.dirname(__file__) 
    4041        serverpem = os.path.join(os.getcwd(), localDir, 'test.pem') 
    4142        conf['server.ssl_certificate'] = serverpem 
    4243        conf['server.ssl_private_key'] = serverpem 
    43      
     44 
     45    if '-daemonize' in sys.argv[3:]: 
     46        # Sometimes an exception happens during exit, try to make sure we get   
     47        # a non_zero exit code. 
     48        old_exitfunc = sys.exitfunc 
     49        def exitfunc(): 
     50            try: 
     51                old_exitfunc() 
     52            except SystemExit: 
     53                raise 
     54            except: 
     55                raise SystemExit(1) 
     56        sys.exitfunc = exitfunc 
     57 
     58        cherrypy.engine.subscribe('start', daemonize) 
     59        pid_file = PIDFile(cherrypy.engine, PID_file_path) 
     60 
     61    cherrypy.engine.subscribe('start', cherrypy.server.quickstart)    
     62 
    4463    # This is in a special order for a reason: 
    4564    # it allows test_states to wait_for_occupied_port 
    4665    # and then immediately call getPage without getting 503. 
    47     cherrypy.config.update(conf) 
    48     cherrypy.tree.mount(Root(), config={'global': conf}) 
    49     cherrypy.server.quickstart() 
    50     cherrypy.engine.start() 
    51     cherrypy.engine.block() 
     66    try: 
     67        cherrypy.config.update(conf) 
     68        cherrypy.tree.mount(Root(), config={'global': conf}) 
     69        cherrypy.engine.start() 
     70        cherrypy.engine.block() 
     71        sys.exit(0) 
     72    except Exception: 
     73        sys.exit(1) 

Hosted by WebFaction

Log in as guest/cpguest to create tickets