Changeset 1743
- Timestamp:
- 10/10/07 14:58:34
- Files:
-
- trunk/cherrypy/test/test_states.py (modified) (8 diffs)
- trunk/cherrypy/test/test_states_demo.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/cherrypy/test/test_states.py
r1690 r1743 12 12 import cherrypy 13 13 engine = cherrypy.engine 14 14 thisdir = os.path.join(os.getcwd(), os.path.dirname(__file__)) 15 PID_file_path = os.path.join(thisdir,'pid_for_test_daemonize') 15 16 16 17 class Root: … … 295 296 raise 296 297 298 class 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") 297 349 db_connection = None 298 350 … … 300 352 helper.setConfig(conf) 301 353 ServerStateTests.server_class = server 354 DaemonizeTest.server_class = server 302 355 suite = helper.CPTestLoader.loadTestsFromTestCase(ServerStateTests) 356 daemon_suite = helper.CPTestLoader.loadTestsFromTestCase(DaemonizeTest) 303 357 try: 304 358 global db_connection … … 314 368 except ImportError: 315 369 helper.CPTestRunner.run(suite) 370 helper.CPTestRunner.run(daemon_suite) 316 371 else: 317 372 tr = pyconquer.Logger("cherrypy") … … 320 375 tr.start() 321 376 helper.CPTestRunner.run(suite) 377 helper.CPTestRunner.run(daemon_suite) 322 378 finally: 323 379 tr.stop() … … 335 391 336 392 if host: 337 ServerStateTests.HOST = host393 DaemonizeTest.HOST = ServerStateTests.HOST = host 338 394 339 395 if port: 340 ServerStateTests.PORT = port396 DaemonizeTest.PORT = ServerStateTests.PORT = port 341 397 342 398 if ssl: … … 345 401 conf['server.ssl_certificate'] = serverpem 346 402 conf['server.ssl_private_key'] = serverpem 347 ServerStateTests.scheme = "https"348 ServerStateTests.HTTP_CONN = httplib.HTTPSConnection403 DaemonizeTest.scheme = ServerStateTests.scheme = "https" 404 DaemonizeTest.HTTP_CONN = ServerStateTests.HTTP_CONN = httplib.HTTPSConnection 349 405 350 406 def _run(server): … … 353 409 run(server, conf) 354 410 _run("cherrypy._cpwsgi.CPWSGIServer") 355 356 357 411 358 412 if __name__ == "__main__": trunk/cherrypy/test/test_states_demo.py
r1631 r1743 5 5 6 6 import cherrypy 7 7 from cherrypy.restsrv.plugins import daemonize, PIDFile 8 thisdir = os.path.join(os.getcwd(), os.path.dirname(__file__)) 9 PID_file_path = os.path.join(thisdir,'pid_for_test_daemonize') 8 10 9 11 class Root: … … 29 31 stop.exposed = True 30 32 31 32 33 if __name__ == '__main__': 33 34 conf = {"server.socket_host": sys.argv[1], … … 36 37 } 37 38 38 if sys.argv[3:] == ['-ssl']:39 if '-ssl' in sys.argv[3:]: 39 40 localDir = os.path.dirname(__file__) 40 41 serverpem = os.path.join(os.getcwd(), localDir, 'test.pem') 41 42 conf['server.ssl_certificate'] = serverpem 42 43 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 44 63 # This is in a special order for a reason: 45 64 # it allows test_states to wait_for_occupied_port 46 65 # 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)

