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/tests.py | |
| 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/tests.py')
| -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() | ||
