diff options
author | Joshua Watt <JPEWhacker@gmail.com> | 2023-11-03 08:26:22 -0600 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2023-11-09 17:33:02 +0000 |
commit | 8ae00cf20d510995263cfc948e73b0556ffdbf32 (patch) | |
tree | a06d4136add1093a158c1219ce9844dc419a6b91 /bitbake/lib/hashserv | |
parent | 732ff20cf9d438537129612124a82b7789881c97 (diff) | |
download | poky-8ae00cf20d510995263cfc948e73b0556ffdbf32.tar.gz |
bitbake: hashserv: tests: Add external database tests
Adds support for running the hash equivalence test suite against an
external hash equivalence implementation.
(Bitbake rev: c1fbc3f68b94905d19ffcf4a6da5b27f0bf14599)
Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/hashserv')
-rw-r--r-- | bitbake/lib/hashserv/tests.py | 54 |
1 files changed, 44 insertions, 10 deletions
diff --git a/bitbake/lib/hashserv/tests.py b/bitbake/lib/hashserv/tests.py index 01ffd52c1d..4c98a280a5 100644 --- a/bitbake/lib/hashserv/tests.py +++ b/bitbake/lib/hashserv/tests.py | |||
@@ -51,13 +51,20 @@ class HashEquivalenceTestSetup(object): | |||
51 | server.serve_as_process(prefunc=prefunc, args=(self.server_index,)) | 51 | server.serve_as_process(prefunc=prefunc, args=(self.server_index,)) |
52 | self.addCleanup(cleanup_server, server) | 52 | self.addCleanup(cleanup_server, server) |
53 | 53 | ||
54 | return server | ||
55 | |||
56 | def start_client(self, server_address): | ||
54 | def cleanup_client(client): | 57 | def cleanup_client(client): |
55 | client.close() | 58 | client.close() |
56 | 59 | ||
57 | client = create_client(server.address) | 60 | client = create_client(server_address) |
58 | self.addCleanup(cleanup_client, client) | 61 | self.addCleanup(cleanup_client, client) |
59 | 62 | ||
60 | return (client, server) | 63 | return client |
64 | |||
65 | def start_test_server(self): | ||
66 | server = self.start_server() | ||
67 | return server.address | ||
61 | 68 | ||
62 | def setUp(self): | 69 | def setUp(self): |
63 | if sys.version_info < (3, 5, 0): | 70 | if sys.version_info < (3, 5, 0): |
@@ -66,7 +73,9 @@ class HashEquivalenceTestSetup(object): | |||
66 | self.temp_dir = tempfile.TemporaryDirectory(prefix='bb-hashserv') | 73 | self.temp_dir = tempfile.TemporaryDirectory(prefix='bb-hashserv') |
67 | self.addCleanup(self.temp_dir.cleanup) | 74 | self.addCleanup(self.temp_dir.cleanup) |
68 | 75 | ||
69 | (self.client, self.server) = self.start_server() | 76 | self.server_address = self.start_test_server() |
77 | |||
78 | self.client = self.start_client(self.server_address) | ||
70 | 79 | ||
71 | def assertClientGetHash(self, client, taskhash, unihash): | 80 | def assertClientGetHash(self, client, taskhash, unihash): |
72 | result = client.get_unihash(self.METHOD, taskhash) | 81 | result = client.get_unihash(self.METHOD, taskhash) |
@@ -206,7 +215,7 @@ class HashEquivalenceCommonTests(object): | |||
206 | 215 | ||
207 | def test_stress(self): | 216 | def test_stress(self): |
208 | def query_server(failures): | 217 | def query_server(failures): |
209 | client = Client(self.server.address) | 218 | client = Client(self.server_address) |
210 | try: | 219 | try: |
211 | for i in range(1000): | 220 | for i in range(1000): |
212 | taskhash = hashlib.sha256() | 221 | taskhash = hashlib.sha256() |
@@ -245,8 +254,10 @@ class HashEquivalenceCommonTests(object): | |||
245 | # the side client. It also verifies that the results are pulled into | 254 | # the side client. It also verifies that the results are pulled into |
246 | # the downstream database by checking that the downstream and side servers | 255 | # the downstream database by checking that the downstream and side servers |
247 | # match after the downstream is done waiting for all backfill tasks | 256 | # match after the downstream is done waiting for all backfill tasks |
248 | (down_client, down_server) = self.start_server(upstream=self.server.address) | 257 | down_server = self.start_server(upstream=self.server_address) |
249 | (side_client, side_server) = self.start_server(dbpath=down_server.dbpath) | 258 | down_client = self.start_client(down_server.address) |
259 | side_server = self.start_server(dbpath=down_server.dbpath) | ||
260 | side_client = self.start_client(side_server.address) | ||
250 | 261 | ||
251 | def check_hash(taskhash, unihash, old_sidehash): | 262 | def check_hash(taskhash, unihash, old_sidehash): |
252 | nonlocal down_client | 263 | nonlocal down_client |
@@ -351,14 +362,18 @@ class HashEquivalenceCommonTests(object): | |||
351 | self.assertEqual(result['method'], self.METHOD) | 362 | self.assertEqual(result['method'], self.METHOD) |
352 | 363 | ||
353 | def test_ro_server(self): | 364 | def test_ro_server(self): |
354 | (ro_client, ro_server) = self.start_server(dbpath=self.server.dbpath, read_only=True) | 365 | rw_server = self.start_server() |
366 | rw_client = self.start_client(rw_server.address) | ||
367 | |||
368 | ro_server = self.start_server(dbpath=rw_server.dbpath, read_only=True) | ||
369 | ro_client = self.start_client(ro_server.address) | ||
355 | 370 | ||
356 | # Report a hash via the read-write server | 371 | # Report a hash via the read-write server |
357 | taskhash = '35788efcb8dfb0a02659d81cf2bfd695fb30faf9' | 372 | taskhash = '35788efcb8dfb0a02659d81cf2bfd695fb30faf9' |
358 | outhash = '2765d4a5884be49b28601445c2760c5f21e7e5c0ee2b7e3fce98fd7e5970796f' | 373 | outhash = '2765d4a5884be49b28601445c2760c5f21e7e5c0ee2b7e3fce98fd7e5970796f' |
359 | unihash = 'f46d3fbb439bd9b921095da657a4de906510d2cd' | 374 | unihash = 'f46d3fbb439bd9b921095da657a4de906510d2cd' |
360 | 375 | ||
361 | result = self.client.report_unihash(taskhash, self.METHOD, outhash, unihash) | 376 | result = rw_client.report_unihash(taskhash, self.METHOD, outhash, unihash) |
362 | self.assertEqual(result['unihash'], unihash, 'Server returned bad unihash') | 377 | self.assertEqual(result['unihash'], unihash, 'Server returned bad unihash') |
363 | 378 | ||
364 | # Check the hash via the read-only server | 379 | # Check the hash via the read-only server |
@@ -373,7 +388,7 @@ class HashEquivalenceCommonTests(object): | |||
373 | ro_client.report_unihash(taskhash2, self.METHOD, outhash2, unihash2) | 388 | ro_client.report_unihash(taskhash2, self.METHOD, outhash2, unihash2) |
374 | 389 | ||
375 | # Ensure that the database was not modified | 390 | # Ensure that the database was not modified |
376 | self.assertClientGetHash(self.client, taskhash2, None) | 391 | self.assertClientGetHash(rw_client, taskhash2, None) |
377 | 392 | ||
378 | 393 | ||
379 | def test_slow_server_start(self): | 394 | def test_slow_server_start(self): |
@@ -393,7 +408,7 @@ class HashEquivalenceCommonTests(object): | |||
393 | old_signal = signal.signal(signal.SIGTERM, do_nothing) | 408 | old_signal = signal.signal(signal.SIGTERM, do_nothing) |
394 | self.addCleanup(signal.signal, signal.SIGTERM, old_signal) | 409 | self.addCleanup(signal.signal, signal.SIGTERM, old_signal) |
395 | 410 | ||
396 | _, server = self.start_server(prefunc=prefunc) | 411 | server = self.start_server(prefunc=prefunc) |
397 | server.process.terminate() | 412 | server.process.terminate() |
398 | time.sleep(30) | 413 | time.sleep(30) |
399 | event.set() | 414 | event.set() |
@@ -500,3 +515,22 @@ class TestHashEquivalenceWebsocketServer(HashEquivalenceTestSetup, HashEquivalen | |||
500 | # case it is more reliable to resolve the IP address explicitly. | 515 | # case it is more reliable to resolve the IP address explicitly. |
501 | host = socket.gethostbyname("localhost") | 516 | host = socket.gethostbyname("localhost") |
502 | return "ws://%s:0" % host | 517 | return "ws://%s:0" % host |
518 | |||
519 | |||
520 | class TestHashEquivalenceExternalServer(HashEquivalenceTestSetup, HashEquivalenceCommonTests, unittest.TestCase): | ||
521 | def start_test_server(self): | ||
522 | if 'BB_TEST_HASHSERV' not in os.environ: | ||
523 | self.skipTest('BB_TEST_HASHSERV not defined to test an external server') | ||
524 | |||
525 | return os.environ['BB_TEST_HASHSERV'] | ||
526 | |||
527 | def start_server(self, *args, **kwargs): | ||
528 | self.skipTest('Cannot start local server when testing external servers') | ||
529 | |||
530 | def setUp(self): | ||
531 | super().setUp() | ||
532 | self.client.remove({"method": self.METHOD}) | ||
533 | |||
534 | def tearDown(self): | ||
535 | self.client.remove({"method": self.METHOD}) | ||
536 | super().tearDown() | ||