diff options
Diffstat (limited to 'bitbake/lib/hashserv/tests.py')
| -rw-r--r-- | bitbake/lib/hashserv/tests.py | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/bitbake/lib/hashserv/tests.py b/bitbake/lib/hashserv/tests.py index e2b762dbf0..e851535c59 100644 --- a/bitbake/lib/hashserv/tests.py +++ b/bitbake/lib/hashserv/tests.py | |||
| @@ -15,28 +15,32 @@ import tempfile | |||
| 15 | import threading | 15 | import threading |
| 16 | import unittest | 16 | import unittest |
| 17 | import socket | 17 | import socket |
| 18 | import time | ||
| 19 | import signal | ||
| 18 | 20 | ||
| 19 | def _run_server(server, idx): | 21 | def server_prefunc(server, idx): |
| 20 | # logging.basicConfig(level=logging.DEBUG, filename='bbhashserv.log', filemode='w', | 22 | logging.basicConfig(level=logging.DEBUG, filename='bbhashserv.log', filemode='w', |
| 21 | # format='%(levelname)s %(filename)s:%(lineno)d %(message)s') | 23 | format='%(levelname)s %(filename)s:%(lineno)d %(message)s') |
| 24 | server.logger.debug("Running server %d" % idx) | ||
| 22 | sys.stdout = open('bbhashserv-%d.log' % idx, 'w') | 25 | sys.stdout = open('bbhashserv-%d.log' % idx, 'w') |
| 23 | sys.stderr = sys.stdout | 26 | sys.stderr = sys.stdout |
| 24 | server.serve_forever() | ||
| 25 | |||
| 26 | 27 | ||
| 27 | class HashEquivalenceTestSetup(object): | 28 | class HashEquivalenceTestSetup(object): |
| 28 | METHOD = 'TestMethod' | 29 | METHOD = 'TestMethod' |
| 29 | 30 | ||
| 30 | server_index = 0 | 31 | server_index = 0 |
| 31 | 32 | ||
| 32 | def start_server(self, dbpath=None, upstream=None, read_only=False): | 33 | def start_server(self, dbpath=None, upstream=None, read_only=False, prefunc=server_prefunc): |
| 33 | self.server_index += 1 | 34 | self.server_index += 1 |
| 34 | if dbpath is None: | 35 | if dbpath is None: |
| 35 | dbpath = os.path.join(self.temp_dir.name, "db%d.sqlite" % self.server_index) | 36 | dbpath = os.path.join(self.temp_dir.name, "db%d.sqlite" % self.server_index) |
| 36 | 37 | ||
| 37 | def cleanup_thread(thread): | 38 | def cleanup_server(server): |
| 38 | thread.terminate() | 39 | if server.process.exitcode is not None: |
| 39 | thread.join() | 40 | return |
| 41 | |||
| 42 | server.process.terminate() | ||
| 43 | server.process.join() | ||
| 40 | 44 | ||
| 41 | server = create_server(self.get_server_addr(self.server_index), | 45 | server = create_server(self.get_server_addr(self.server_index), |
| 42 | dbpath, | 46 | dbpath, |
| @@ -44,9 +48,8 @@ class HashEquivalenceTestSetup(object): | |||
| 44 | read_only=read_only) | 48 | read_only=read_only) |
| 45 | server.dbpath = dbpath | 49 | server.dbpath = dbpath |
| 46 | 50 | ||
| 47 | server.thread = multiprocessing.Process(target=_run_server, args=(server, self.server_index)) | 51 | server.serve_as_process(prefunc=prefunc, args=(self.server_index,)) |
| 48 | server.thread.start() | 52 | self.addCleanup(cleanup_server, server) |
| 49 | self.addCleanup(cleanup_thread, server.thread) | ||
| 50 | 53 | ||
| 51 | def cleanup_client(client): | 54 | def cleanup_client(client): |
| 52 | client.close() | 55 | client.close() |
| @@ -283,6 +286,33 @@ class HashEquivalenceCommonTests(object): | |||
| 283 | self.assertClientGetHash(self.client, taskhash2, None) | 286 | self.assertClientGetHash(self.client, taskhash2, None) |
| 284 | 287 | ||
| 285 | 288 | ||
| 289 | def test_slow_server_start(self): | ||
| 290 | """ | ||
| 291 | Ensures that the server will exit correctly even if it gets a SIGTERM | ||
| 292 | before entering the main loop | ||
| 293 | """ | ||
| 294 | |||
| 295 | event = multiprocessing.Event() | ||
| 296 | |||
| 297 | def prefunc(server, idx): | ||
| 298 | nonlocal event | ||
| 299 | server_prefunc(server, idx) | ||
| 300 | event.wait() | ||
| 301 | |||
| 302 | def do_nothing(signum, frame): | ||
| 303 | pass | ||
| 304 | |||
| 305 | old_signal = signal.signal(signal.SIGTERM, do_nothing) | ||
| 306 | self.addCleanup(signal.signal, signal.SIGTERM, old_signal) | ||
| 307 | |||
| 308 | _, server = self.start_server(prefunc=prefunc) | ||
| 309 | server.process.terminate() | ||
| 310 | time.sleep(30) | ||
| 311 | event.set() | ||
| 312 | server.process.join(300) | ||
| 313 | self.assertIsNotNone(server.process.exitcode, "Server did not exit in a timely manner!") | ||
| 314 | |||
| 315 | |||
| 286 | class TestHashEquivalenceUnixServer(HashEquivalenceTestSetup, HashEquivalenceCommonTests, unittest.TestCase): | 316 | class TestHashEquivalenceUnixServer(HashEquivalenceTestSetup, HashEquivalenceCommonTests, unittest.TestCase): |
| 287 | def get_server_addr(self, server_idx): | 317 | def get_server_addr(self, server_idx): |
| 288 | return "unix://" + os.path.join(self.temp_dir.name, 'sock%d' % server_idx) | 318 | return "unix://" + os.path.join(self.temp_dir.name, 'sock%d' % server_idx) |
