summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/hashserv
diff options
context:
space:
mode:
authorJoshua Watt <JPEWhacker@gmail.com>2023-11-03 08:26:22 -0600
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-11-09 17:33:02 +0000
commit8ae00cf20d510995263cfc948e73b0556ffdbf32 (patch)
treea06d4136add1093a158c1219ce9844dc419a6b91 /bitbake/lib/hashserv
parent732ff20cf9d438537129612124a82b7789881c97 (diff)
downloadpoky-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.py54
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
520class 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()