OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Setups a local Rietveld instance to test against a live server for | 6 """Setups a local Rietveld instance to test against a live server for |
7 integration tests. | 7 integration tests. |
8 | 8 |
9 It makes sure Google AppEngine SDK is found, download Rietveld and Django code | 9 It makes sure Google AppEngine SDK is found, download Rietveld and Django code |
10 if necessary and starts the server on a free inbound TCP port. | 10 if necessary and starts the server on a free inbound TCP port. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 self.base_dir = base_dir | 51 self.base_dir = base_dir |
52 if not self.base_dir: | 52 if not self.base_dir: |
53 self.base_dir = os.path.dirname(os.path.abspath(__file__)) | 53 self.base_dir = os.path.dirname(os.path.abspath(__file__)) |
54 self.base_dir = os.path.realpath(os.path.join(self.base_dir, '..')) | 54 self.base_dir = os.path.realpath(os.path.join(self.base_dir, '..')) |
55 self.sdk_path = os.path.abspath( | 55 self.sdk_path = os.path.abspath( |
56 os.path.join(self.base_dir, '..', 'google_appengine')) | 56 os.path.join(self.base_dir, '..', 'google_appengine')) |
57 self.dev_app = os.path.join(self.sdk_path, 'dev_appserver.py') | 57 self.dev_app = os.path.join(self.sdk_path, 'dev_appserver.py') |
58 self.rietveld = os.path.join(self.base_dir, 'tests', 'rietveld') | 58 self.rietveld = os.path.join(self.base_dir, 'tests', 'rietveld') |
59 self.test_server = None | 59 self.test_server = None |
60 self.port = None | 60 self.port = None |
61 self.out = None | |
62 self.err = None | |
63 | 61 |
64 def install_prerequisites(self): | 62 def install_prerequisites(self): |
65 # First, verify the Google AppEngine SDK is available. | 63 # First, verify the Google AppEngine SDK is available. |
66 if not os.path.isfile(self.dev_app): | 64 if not os.path.isfile(self.dev_app): |
67 raise Failure('Install google_appengine sdk in %s' % self.sdk_path) | 65 raise Failure('Install google_appengine sdk in %s' % self.sdk_path) |
68 | 66 |
69 # Second, checkout rietveld if not available. | 67 # Second, checkout rietveld if not available. |
70 if not os.path.isdir(self.rietveld): | 68 if not os.path.isdir(self.rietveld): |
71 print('Checking out rietveld...') | 69 print('Checking out rietveld...') |
72 try: | 70 try: |
73 subprocess2.check_call( | 71 subprocess2.check_call( |
74 ['svn', 'co', '-q', 'http://rietveld.googlecode.com/svn/trunk@681', | 72 ['svn', 'co', '-q', 'http://rietveld.googlecode.com/svn/trunk@681', |
75 self.rietveld]) | 73 self.rietveld]) |
76 except subprocess2.CalledProcessError: | 74 except subprocess2.CalledProcessError: |
77 raise Failure('Failed to checkout rietveld') | 75 raise Failure('Failed to checkout rietveld') |
78 else: | 76 else: |
79 print('Syncing rietveld...') | 77 print('Syncing rietveld...') |
80 try: | 78 try: |
81 subprocess2.check_call( | 79 subprocess2.check_call( |
82 ['svn', 'up', '-q', '-r', '681'], cwd=self.rietveld) | 80 ['svn', 'up', '-q', '-r', '681'], cwd=self.rietveld) |
83 except subprocess2.CalledProcessError: | 81 except subprocess2.CalledProcessError: |
84 raise Failure('Failed to checkout rietveld') | 82 raise Failure('Failed to checkout rietveld') |
85 | 83 |
86 def start_server(self, verbose=False): | 84 def start_server(self, verbose=False): |
87 self.install_prerequisites() | 85 self.install_prerequisites() |
88 self.port = find_free_port() | 86 self.port = find_free_port() |
89 if verbose: | 87 if verbose: |
90 self.out = None | 88 pipe = None |
91 self.err = None | |
92 else: | 89 else: |
93 self.out = open(os.devnull, 'w') | 90 pipe = subprocess2.VOID |
94 self.err = open(os.devnull, 'w') | |
95 cmd = [ | 91 cmd = [ |
96 self.dev_app, | 92 self.dev_app, |
97 '--skip_sdk_update_check', | 93 '--skip_sdk_update_check', |
98 '.', | 94 '.', |
99 '--port=%d' % self.port, | 95 '--port=%d' % self.port, |
100 '--datastore_path=' + os.path.join(self.rietveld, 'tmp.db'), | 96 '--datastore_path=' + os.path.join(self.rietveld, 'tmp.db'), |
101 '-c'] | 97 '-c'] |
102 self.test_server = subprocess2.Popen( | 98 self.test_server = subprocess2.Popen( |
103 cmd, stdout=self.out, stderr=self.err, cwd=self.rietveld) | 99 cmd, stdout=pipe, stderr=pipe, cwd=self.rietveld) |
104 # Loop until port 127.0.0.1:port opens or the process dies. | 100 # Loop until port 127.0.0.1:port opens or the process dies. |
105 while not test_port(self.port): | 101 while not test_port(self.port): |
106 self.test_server.poll() | 102 self.test_server.poll() |
107 if self.test_server.returncode is not None: | 103 if self.test_server.returncode is not None: |
108 raise Failure( | 104 raise Failure( |
109 'Test rietveld instance failed early on port %s' % | 105 'Test rietveld instance failed early on port %s' % |
110 self.port) | 106 self.port) |
111 time.sleep(0.01) | 107 time.sleep(0.01) |
112 | 108 |
113 def stop_server(self): | 109 def stop_server(self): |
114 if self.test_server: | 110 if self.test_server: |
115 self.test_server.kill() | 111 self.test_server.kill() |
116 self.test_server.wait() | 112 self.test_server.wait() |
117 self.test_server = None | 113 self.test_server = None |
118 self.port = None | 114 self.port = None |
119 if self.out: | |
120 self.out.close() | |
121 self.out = None | |
122 if self.err: | |
123 self.err.close() | |
124 self.err = None | |
125 | 115 |
126 | 116 |
127 def main(): | 117 def main(): |
128 parser = optparse.OptionParser() | 118 parser = optparse.OptionParser() |
129 parser.add_option('-v', '--verbose', action='store_true') | 119 parser.add_option('-v', '--verbose', action='store_true') |
130 options, args = parser.parse_args() | 120 options, args = parser.parse_args() |
131 if args: | 121 if args: |
132 parser.error('Unknown arguments: %s' % ' '.join(args)) | 122 parser.error('Unknown arguments: %s' % ' '.join(args)) |
133 instance = LocalRietveld() | 123 instance = LocalRietveld() |
134 try: | 124 try: |
135 instance.start_server(verbose=options.verbose) | 125 instance.start_server(verbose=options.verbose) |
136 print 'Local rietveld instance started on port %d' % instance.port | 126 print 'Local rietveld instance started on port %d' % instance.port |
137 while True: | 127 while True: |
138 time.sleep(0.1) | 128 time.sleep(0.1) |
139 finally: | 129 finally: |
140 instance.stop_server() | 130 instance.stop_server() |
141 | 131 |
142 | 132 |
143 if __name__ == '__main__': | 133 if __name__ == '__main__': |
144 main() | 134 main() |
OLD | NEW |