summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoshua Watt <JPEWhacker@gmail.com>2023-11-03 08:26:38 -0600
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-11-09 17:33:03 +0000
commit1699870a0cf7b5ec3aadd9155cdca5dcf53ae273 (patch)
tree2a1f9b6e9c09e6192f2f6720b2e9e77cd8d386b0
parent407afec92a959ded5339bbb217f185bc0b480de8 (diff)
downloadpoky-1699870a0cf7b5ec3aadd9155cdca5dcf53ae273.tar.gz
bitbake: hashserv: tests: Allow authentication for external server tests
If BB_TEST_HASHSERV_USERNAME and BB_TEST_HASHSERV_PASSWORD are provided for a server admin user, the authentication tests for the external hashserver will run. In addition, any users that get created will now be deleted when the test finishes. (Bitbake rev: 0e945d3dec02479df1157f48fd44223c2bfb34a3) Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--bitbake/lib/hashserv/tests.py109
1 files changed, 74 insertions, 35 deletions
diff --git a/bitbake/lib/hashserv/tests.py b/bitbake/lib/hashserv/tests.py
index 2d78f9e976..5d209ffb87 100644
--- a/bitbake/lib/hashserv/tests.py
+++ b/bitbake/lib/hashserv/tests.py
@@ -84,17 +84,13 @@ class HashEquivalenceTestSetup(object):
84 return self.server.address 84 return self.server.address
85 85
86 def start_auth_server(self): 86 def start_auth_server(self):
87 self.auth_server = self.start_server(self.server.dbpath, anon_perms=[], admin_username="admin", admin_password="password") 87 auth_server = self.start_server(self.server.dbpath, anon_perms=[], admin_username="admin", admin_password="password")
88 self.admin_client = self.start_client(self.auth_server.address, username="admin", password="password") 88 self.auth_server_address = auth_server.address
89 self.admin_client = self.start_client(auth_server.address, username="admin", password="password")
89 return self.admin_client 90 return self.admin_client
90 91
91 def auth_client(self, user): 92 def auth_client(self, user):
92 return self.start_client(self.auth_server.address, user["username"], user["token"]) 93 return self.start_client(self.auth_server_address, user["username"], user["token"])
93
94 def auth_perms(self, *permissions):
95 self.client_index += 1
96 user = self.admin_client.new_user(f"user-{self.client_index}", permissions)
97 return self.auth_client(user)
98 94
99 def setUp(self): 95 def setUp(self):
100 if sys.version_info < (3, 5, 0): 96 if sys.version_info < (3, 5, 0):
@@ -120,11 +116,11 @@ class HashEquivalenceTestSetup(object):
120 }) 116 })
121 117
122 def assertUserCanAuth(self, user): 118 def assertUserCanAuth(self, user):
123 with self.start_client(self.auth_server.address) as client: 119 with self.start_client(self.auth_server_address) as client:
124 client.auth(user["username"], user["token"]) 120 client.auth(user["username"], user["token"])
125 121
126 def assertUserCannotAuth(self, user): 122 def assertUserCannotAuth(self, user):
127 with self.start_client(self.auth_server.address) as client, self.assertRaises(InvokeError): 123 with self.start_client(self.auth_server_address) as client, self.assertRaises(InvokeError):
128 client.auth(user["username"], user["token"]) 124 client.auth(user["username"], user["token"])
129 125
130 def create_test_hash(self, client): 126 def create_test_hash(self, client):
@@ -157,6 +153,26 @@ class HashEquivalenceTestSetup(object):
157 153
158 154
159class HashEquivalenceCommonTests(object): 155class HashEquivalenceCommonTests(object):
156 def auth_perms(self, *permissions):
157 self.client_index += 1
158 user = self.create_user(f"user-{self.client_index}", permissions)
159 return self.auth_client(user)
160
161 def create_user(self, username, permissions, *, client=None):
162 def remove_user(username):
163 try:
164 self.admin_client.delete_user(username)
165 except bb.asyncrpc.InvokeError:
166 pass
167
168 if client is None:
169 client = self.admin_client
170
171 user = client.new_user(username, permissions)
172 self.addCleanup(remove_user, username)
173
174 return user
175
160 def test_create_hash(self): 176 def test_create_hash(self):
161 return self.create_test_hash(self.client) 177 return self.create_test_hash(self.client)
162 178
@@ -571,14 +587,14 @@ class HashEquivalenceCommonTests(object):
571 def test_auth_no_token_refresh_from_anon_user(self): 587 def test_auth_no_token_refresh_from_anon_user(self):
572 self.start_auth_server() 588 self.start_auth_server()
573 589
574 with self.start_client(self.auth_server.address) as client, self.assertRaises(InvokeError): 590 with self.start_client(self.auth_server_address) as client, self.assertRaises(InvokeError):
575 client.refresh_token() 591 client.refresh_token()
576 592
577 def test_auth_self_token_refresh(self): 593 def test_auth_self_token_refresh(self):
578 admin_client = self.start_auth_server() 594 admin_client = self.start_auth_server()
579 595
580 # Create a new user with no permissions 596 # Create a new user with no permissions
581 user = admin_client.new_user("test-user", []) 597 user = self.create_user("test-user", [])
582 598
583 with self.auth_client(user) as client: 599 with self.auth_client(user) as client:
584 new_user = client.refresh_token() 600 new_user = client.refresh_token()
@@ -601,7 +617,7 @@ class HashEquivalenceCommonTests(object):
601 def test_auth_token_refresh(self): 617 def test_auth_token_refresh(self):
602 admin_client = self.start_auth_server() 618 admin_client = self.start_auth_server()
603 619
604 user = admin_client.new_user("test-user", []) 620 user = self.create_user("test-user", [])
605 621
606 with self.auth_perms() as client, self.assertRaises(InvokeError): 622 with self.auth_perms() as client, self.assertRaises(InvokeError):
607 client.refresh_token(user["username"]) 623 client.refresh_token(user["username"])
@@ -617,7 +633,7 @@ class HashEquivalenceCommonTests(object):
617 def test_auth_self_get_user(self): 633 def test_auth_self_get_user(self):
618 admin_client = self.start_auth_server() 634 admin_client = self.start_auth_server()
619 635
620 user = admin_client.new_user("test-user", []) 636 user = self.create_user("test-user", [])
621 user_info = user.copy() 637 user_info = user.copy()
622 del user_info["token"] 638 del user_info["token"]
623 639
@@ -632,7 +648,7 @@ class HashEquivalenceCommonTests(object):
632 def test_auth_get_user(self): 648 def test_auth_get_user(self):
633 admin_client = self.start_auth_server() 649 admin_client = self.start_auth_server()
634 650
635 user = admin_client.new_user("test-user", []) 651 user = self.create_user("test-user", [])
636 user_info = user.copy() 652 user_info = user.copy()
637 del user_info["token"] 653 del user_info["token"]
638 654
@@ -649,7 +665,7 @@ class HashEquivalenceCommonTests(object):
649 def test_auth_reconnect(self): 665 def test_auth_reconnect(self):
650 admin_client = self.start_auth_server() 666 admin_client = self.start_auth_server()
651 667
652 user = admin_client.new_user("test-user", []) 668 user = self.create_user("test-user", [])
653 user_info = user.copy() 669 user_info = user.copy()
654 del user_info["token"] 670 del user_info["token"]
655 671
@@ -665,7 +681,7 @@ class HashEquivalenceCommonTests(object):
665 def test_auth_delete_user(self): 681 def test_auth_delete_user(self):
666 admin_client = self.start_auth_server() 682 admin_client = self.start_auth_server()
667 683
668 user = admin_client.new_user("test-user", []) 684 user = self.create_user("test-user", [])
669 685
670 # No self service 686 # No self service
671 with self.auth_client(user) as client, self.assertRaises(InvokeError): 687 with self.auth_client(user) as client, self.assertRaises(InvokeError):
@@ -685,7 +701,7 @@ class HashEquivalenceCommonTests(object):
685 def test_auth_set_user_perms(self): 701 def test_auth_set_user_perms(self):
686 admin_client = self.start_auth_server() 702 admin_client = self.start_auth_server()
687 703
688 user = admin_client.new_user("test-user", []) 704 user = self.create_user("test-user", [])
689 705
690 self.assertUserPerms(user, []) 706 self.assertUserPerms(user, [])
691 707
@@ -710,7 +726,7 @@ class HashEquivalenceCommonTests(object):
710 def test_auth_get_all_users(self): 726 def test_auth_get_all_users(self):
711 admin_client = self.start_auth_server() 727 admin_client = self.start_auth_server()
712 728
713 user = admin_client.new_user("test-user", []) 729 user = self.create_user("test-user", [])
714 730
715 with self.auth_client(user) as client, self.assertRaises(InvokeError): 731 with self.auth_client(user) as client, self.assertRaises(InvokeError):
716 client.get_all_users() 732 client.get_all_users()
@@ -744,10 +760,10 @@ class HashEquivalenceCommonTests(object):
744 permissions.sort() 760 permissions.sort()
745 761
746 with self.auth_perms() as client, self.assertRaises(InvokeError): 762 with self.auth_perms() as client, self.assertRaises(InvokeError):
747 client.new_user("test-user", permissions) 763 self.create_user("test-user", permissions, client=client)
748 764
749 with self.auth_perms("@user-admin") as client: 765 with self.auth_perms("@user-admin") as client:
750 user = client.new_user("test-user", permissions) 766 user = self.create_user("test-user", permissions, client=client)
751 self.assertIn("token", user) 767 self.assertIn("token", user)
752 self.assertEqual(user["username"], "test-user") 768 self.assertEqual(user["username"], "test-user")
753 self.assertEqual(user["permissions"], permissions) 769 self.assertEqual(user["permissions"], permissions)
@@ -755,7 +771,7 @@ class HashEquivalenceCommonTests(object):
755 def test_auth_become_user(self): 771 def test_auth_become_user(self):
756 admin_client = self.start_auth_server() 772 admin_client = self.start_auth_server()
757 773
758 user = admin_client.new_user("test-user", ["@read", "@report"]) 774 user = self.create_user("test-user", ["@read", "@report"])
759 user_info = user.copy() 775 user_info = user.copy()
760 del user_info["token"] 776 del user_info["token"]
761 777
@@ -898,7 +914,7 @@ class TestHashEquivalenceClient(HashEquivalenceTestSetup, unittest.TestCase):
898 user = admin_client.new_user("test-user", ["@read", "@report"]) 914 user = admin_client.new_user("test-user", ["@read", "@report"])
899 915
900 p = self.run_hashclient([ 916 p = self.run_hashclient([
901 "--address", self.auth_server.address, 917 "--address", self.auth_server_address,
902 "--login", user["username"], 918 "--login", user["username"],
903 "--password", user["token"], 919 "--password", user["token"],
904 "refresh-token" 920 "refresh-token"
@@ -916,7 +932,7 @@ class TestHashEquivalenceClient(HashEquivalenceTestSetup, unittest.TestCase):
916 print("New token is %r" % new_token) 932 print("New token is %r" % new_token)
917 933
918 self.run_hashclient([ 934 self.run_hashclient([
919 "--address", self.auth_server.address, 935 "--address", self.auth_server_address,
920 "--login", user["username"], 936 "--login", user["username"],
921 "--password", new_token, 937 "--password", new_token,
922 "get-user" 938 "get-user"
@@ -928,7 +944,7 @@ class TestHashEquivalenceClient(HashEquivalenceTestSetup, unittest.TestCase):
928 user = admin_client.new_user("test-user", ["@read"]) 944 user = admin_client.new_user("test-user", ["@read"])
929 945
930 self.run_hashclient([ 946 self.run_hashclient([
931 "--address", self.auth_server.address, 947 "--address", self.auth_server_address,
932 "--login", admin_client.username, 948 "--login", admin_client.username,
933 "--password", admin_client.password, 949 "--password", admin_client.password,
934 "set-user-perms", 950 "set-user-perms",
@@ -946,7 +962,7 @@ class TestHashEquivalenceClient(HashEquivalenceTestSetup, unittest.TestCase):
946 user = admin_client.new_user("test-user", ["@read"]) 962 user = admin_client.new_user("test-user", ["@read"])
947 963
948 p = self.run_hashclient([ 964 p = self.run_hashclient([
949 "--address", self.auth_server.address, 965 "--address", self.auth_server_address,
950 "--login", admin_client.username, 966 "--login", admin_client.username,
951 "--password", admin_client.password, 967 "--password", admin_client.password,
952 "get-user", 968 "get-user",
@@ -957,7 +973,7 @@ class TestHashEquivalenceClient(HashEquivalenceTestSetup, unittest.TestCase):
957 self.assertIn("Permissions:", p.stdout) 973 self.assertIn("Permissions:", p.stdout)
958 974
959 p = self.run_hashclient([ 975 p = self.run_hashclient([
960 "--address", self.auth_server.address, 976 "--address", self.auth_server_address,
961 "--login", user["username"], 977 "--login", user["username"],
962 "--password", user["token"], 978 "--password", user["token"],
963 "get-user", 979 "get-user",
@@ -973,7 +989,7 @@ class TestHashEquivalenceClient(HashEquivalenceTestSetup, unittest.TestCase):
973 admin_client.new_user("test-user2", ["@read"]) 989 admin_client.new_user("test-user2", ["@read"])
974 990
975 p = self.run_hashclient([ 991 p = self.run_hashclient([
976 "--address", self.auth_server.address, 992 "--address", self.auth_server_address,
977 "--login", admin_client.username, 993 "--login", admin_client.username,
978 "--password", admin_client.password, 994 "--password", admin_client.password,
979 "get-all-users", 995 "get-all-users",
@@ -987,7 +1003,7 @@ class TestHashEquivalenceClient(HashEquivalenceTestSetup, unittest.TestCase):
987 admin_client = self.start_auth_server() 1003 admin_client = self.start_auth_server()
988 1004
989 p = self.run_hashclient([ 1005 p = self.run_hashclient([
990 "--address", self.auth_server.address, 1006 "--address", self.auth_server_address,
991 "--login", admin_client.username, 1007 "--login", admin_client.username,
992 "--password", admin_client.password, 1008 "--password", admin_client.password,
993 "new-user", 1009 "new-user",
@@ -1017,14 +1033,13 @@ class TestHashEquivalenceClient(HashEquivalenceTestSetup, unittest.TestCase):
1017 user = admin_client.new_user("test-user", ["@read"]) 1033 user = admin_client.new_user("test-user", ["@read"])
1018 1034
1019 p = self.run_hashclient([ 1035 p = self.run_hashclient([
1020 "--address", self.auth_server.address, 1036 "--address", self.auth_server_address,
1021 "--login", admin_client.username, 1037 "--login", admin_client.username,
1022 "--password", admin_client.password, 1038 "--password", admin_client.password,
1023 "delete-user", 1039 "delete-user",
1024 "-u", user["username"], 1040 "-u", user["username"],
1025 ], check=True) 1041 ], check=True)
1026 1042
1027
1028 self.assertIsNone(admin_client.get_user(user["username"])) 1043 self.assertIsNone(admin_client.get_user(user["username"]))
1029 1044
1030 def test_get_db_usage(self): 1045 def test_get_db_usage(self):
@@ -1104,19 +1119,43 @@ class TestHashEquivalenceWebsocketsSQLAlchemyServer(TestHashEquivalenceWebsocket
1104 1119
1105 1120
1106class TestHashEquivalenceExternalServer(HashEquivalenceTestSetup, HashEquivalenceCommonTests, unittest.TestCase): 1121class TestHashEquivalenceExternalServer(HashEquivalenceTestSetup, HashEquivalenceCommonTests, unittest.TestCase):
1107 def start_test_server(self): 1122 def get_env(self, name):
1108 if 'BB_TEST_HASHSERV' not in os.environ: 1123 v = os.environ.get(name)
1109 self.skipTest('BB_TEST_HASHSERV not defined to test an external server') 1124 if not v:
1125 self.skipTest(f'{name} not defined to test an external server')
1126 return v
1110 1127
1111 return os.environ['BB_TEST_HASHSERV'] 1128 def start_test_server(self):
1129 return self.get_env('BB_TEST_HASHSERV')
1112 1130
1113 def start_server(self, *args, **kwargs): 1131 def start_server(self, *args, **kwargs):
1114 self.skipTest('Cannot start local server when testing external servers') 1132 self.skipTest('Cannot start local server when testing external servers')
1115 1133
1134 def start_auth_server(self):
1135
1136 self.auth_server_address = self.server_address
1137 self.admin_client = self.start_client(
1138 self.server_address,
1139 username=self.get_env('BB_TEST_HASHSERV_USERNAME'),
1140 password=self.get_env('BB_TEST_HASHSERV_PASSWORD'),
1141 )
1142 return self.admin_client
1143
1116 def setUp(self): 1144 def setUp(self):
1117 super().setUp() 1145 super().setUp()
1146 if "BB_TEST_HASHSERV_USERNAME" in os.environ:
1147 self.client = self.start_client(
1148 self.server_address,
1149 username=os.environ["BB_TEST_HASHSERV_USERNAME"],
1150 password=os.environ["BB_TEST_HASHSERV_PASSWORD"],
1151 )
1118 self.client.remove({"method": self.METHOD}) 1152 self.client.remove({"method": self.METHOD})
1119 1153
1120 def tearDown(self): 1154 def tearDown(self):
1121 self.client.remove({"method": self.METHOD}) 1155 self.client.remove({"method": self.METHOD})
1122 super().tearDown() 1156 super().tearDown()
1157
1158
1159 def test_auth_get_all_users(self):
1160 self.skipTest("Cannot test all users with external server")
1161