julen / pootle

Web-based translation and translation management tool

This URL has Read+Write access

pootle / test_cmdlineserver.py
100644 76 lines (69 sloc) 3.126 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env python
 
"""Server environment for testing simplewebserver (command line web server)
This uses the basic environment from test_create and runs a web server in a separate thread
The top-level tests are then in test_client / test_ie / test_mozilla etc
These can then be layered on top of this server"""
 
from Pootle import test_create
from jToolkit.web import simplewebserver
from jToolkit import errors
import urllib2
import time
 
class TestCmdlineServer(test_create.NoReuse):
    # this is called from setup_class in test_create.TestCreate
    def setup_webserver(self):
        """setup the webserver that will be used for the tests"""
        print "setting up web server"
        webserverclass = simplewebserver.jToolkitHTTPServer(simplewebserver.ThreadedHTTPServer)
        options = simplewebserver.WebOptionParser().parse_args([])[0]
        options.port = 0
        options.servertype = 'standard'
        errorhandler = errors.ConsoleErrorHandler()
        webserver = webserverclass(options, errorhandler)
        return webserver
 
    def setup_method(self, method):
        """starts a new simplewebserver in a separate thread"""
        try:
            test_create.NoReuse.setup_method(self, method)
        except Exception, e:
            print "exception in test_create setup_method:", e
            test_create.NoReuse.teardown_method(self, method)
            raise
        print "finished setup_method phase 1"
        # self.webserver.options.port = self.port
        self.baseaddress = "http://%s:%d/" % (self.webserver.hostname, self.webserver.port)
        ThreadClass = self.webserver.ThreadClass
        self.webserverthread = ThreadClass(target = simplewebserver.run, name="webserver", args=(self.server, self.webserver.options))
        self.webserverthread.start()
        # wait until it actually is started
        waited = 0.0
        sleep = 0.001
        maxwait = 3.0
        while not hasattr(self.webserver, "stop"):
            time.sleep(sleep)
            waited += sleep
            if sleep > maxwait:
                raise RuntimeError("webserver failed to start in %0.1f seconds" % maxwait)
 
    def teardown_method(self, method):
        """close the web server for this method"""
        try:
            self.server.sessioncache.clear()
            self.webserver.setstop(True)
            # ping the webserver to make it stop
            waited = 0.0
            sleep = 0.05
            max_wait = 5.0
            while self.webserverthread.isAlive():
                time.sleep(sleep)
                if not self.webserverthread.isAlive():
                    break
                # if the webserver is sleeping a request should wake it up...
                # try:
                # x = urllib2.urlopen(self.baseaddress)
                # except Exception, e:
                # pass
                waited += sleep
                sleep += 0.05
                if waited >= max_wait:
                    raise RuntimeError("webserver failed to stop in %0.1f seconds" % (waited))
finally:
            test_create.NoReuse.teardown_method(self, method)