@@ -22,6 +22,7 @@ use std::time::{Duration, Instant};
2222use base64:: Engine as _;
2323use openshell_e2e:: harness:: binary:: openshell_cmd;
2424use serde_json:: Value ;
25+ use serial_test:: serial;
2526use tokio:: process:: Command ;
2627use tokio:: sync:: Mutex ;
2728use url:: Url ;
@@ -64,6 +65,7 @@ struct LoginSession {
6465}
6566
6667#[ tokio:: test]
68+ #[ serial( oidc_pkce) ]
6769async fn admin_can_list_sandboxes ( ) {
6870 let session = login_identity ( ADMIN ) . await ;
6971 assert_allowed (
@@ -75,6 +77,7 @@ async fn admin_can_list_sandboxes() {
7577}
7678
7779#[ tokio:: test]
80+ #[ serial( oidc_pkce) ]
7881async fn user_can_report_gateway_validated_identity ( ) {
7982 let session = login_identity ( USER ) . await ;
8083 let output = assert_allowed (
@@ -102,6 +105,7 @@ async fn user_can_report_gateway_validated_identity() {
102105}
103106
104107#[ tokio:: test]
108+ #[ serial( oidc_pkce) ]
105109async fn user_can_list_sandboxes ( ) {
106110 const WORKSPACE : & str = "oidc-user-list-sb" ;
107111 let user = login_identity ( USER ) . await ;
@@ -118,13 +122,15 @@ async fn user_can_list_sandboxes() {
118122}
119123
120124#[ tokio:: test]
125+ #[ serial( oidc_pkce) ]
121126async fn admin_can_create_sandbox ( ) {
122127 let session = login_identity ( ADMIN ) . await ;
123128 let _lifecycle = SANDBOX_LIFECYCLE_LOCK . lock ( ) . await ;
124129 assert_can_create_sandbox ( & session, "default" , "oidc-admin-create" ) . await ;
125130}
126131
127132#[ tokio:: test]
133+ #[ serial( oidc_pkce) ]
128134async fn user_can_create_sandbox ( ) {
129135 const WORKSPACE : & str = "oidc-user-create" ;
130136 let user = login_identity ( USER ) . await ;
@@ -138,6 +144,7 @@ async fn user_can_create_sandbox() {
138144/// Workspace users must be able to create sandboxes with inferred-provider
139145/// commands (e.g. `claude`) without requiring Platform Admin access.
140146#[ tokio:: test]
147+ #[ serial( oidc_pkce) ]
141148async fn user_can_create_sandbox_with_inferred_provider_command ( ) {
142149 const WORKSPACE : & str = "oidc-inferred-cmd" ;
143150 let user = login_identity ( USER ) . await ;
@@ -187,13 +194,15 @@ async fn user_can_create_sandbox_with_inferred_provider_command() {
187194}
188195
189196#[ tokio:: test]
197+ #[ serial( oidc_pkce) ]
190198async fn admin_can_delete_sandbox ( ) {
191199 let session = login_identity ( ADMIN ) . await ;
192200 let _lifecycle = SANDBOX_LIFECYCLE_LOCK . lock ( ) . await ;
193201 assert_can_delete_sandbox ( & session, "default" , "oidc-admin-delete" ) . await ;
194202}
195203
196204#[ tokio:: test]
205+ #[ serial( oidc_pkce) ]
197206async fn user_can_delete_sandbox ( ) {
198207 const WORKSPACE : & str = "oidc-user-delete" ;
199208 let user = login_identity ( USER ) . await ;
@@ -205,6 +214,7 @@ async fn user_can_delete_sandbox() {
205214}
206215
207216#[ tokio:: test]
217+ #[ serial( oidc_pkce) ]
208218async fn admin_can_inspect_gateway ( ) {
209219 let session = login_identity ( ADMIN ) . await ;
210220 let output = assert_allowed ( & session, & [ "gateway" , "info" ] , "inspect gateway info" ) . await ;
@@ -219,6 +229,7 @@ async fn admin_can_inspect_gateway() {
219229}
220230
221231#[ tokio:: test]
232+ #[ serial( oidc_pkce) ]
222233async fn user_cannot_inspect_gateway ( ) {
223234 let session = login_identity ( USER ) . await ;
224235 let output = run_session_cli ( & session, & [ "gateway" , "info" ] ) . await ;
@@ -235,6 +246,7 @@ async fn user_cannot_inspect_gateway() {
235246}
236247
237248#[ tokio:: test]
249+ #[ serial( oidc_pkce) ]
238250async fn admin_can_list_providers ( ) {
239251 let session = login_identity ( ADMIN ) . await ;
240252 assert_allowed (
@@ -246,6 +258,7 @@ async fn admin_can_list_providers() {
246258}
247259
248260#[ tokio:: test]
261+ #[ serial( oidc_pkce) ]
249262async fn user_can_list_providers ( ) {
250263 const WORKSPACE : & str = "oidc-user-list-pr" ;
251264 let user = login_identity ( USER ) . await ;
@@ -262,6 +275,7 @@ async fn user_can_list_providers() {
262275}
263276
264277#[ tokio:: test]
278+ #[ serial( oidc_pkce) ]
265279async fn admin_can_manage_provider ( ) {
266280 const PROVIDER : & str = "oidc-pkce-admin-provider" ;
267281 let session = login_identity ( ADMIN ) . await ;
@@ -298,6 +312,7 @@ async fn admin_can_manage_provider() {
298312}
299313
300314#[ tokio:: test]
315+ #[ serial( oidc_pkce) ]
301316async fn user_cannot_create_provider ( ) {
302317 const WORKSPACE : & str = "oidc-user-no-create" ;
303318 let user = login_identity ( USER ) . await ;
@@ -323,6 +338,7 @@ async fn user_cannot_create_provider() {
323338}
324339
325340#[ tokio:: test]
341+ #[ serial( oidc_pkce) ]
326342async fn user_cannot_delete_provider ( ) {
327343 const PROVIDER : & str = "oidc-pkce-user-delete-target" ;
328344 const WORKSPACE : & str = "oidc-user-no-delete" ;
@@ -360,6 +376,7 @@ async fn user_cannot_delete_provider() {
360376}
361377
362378#[ tokio:: test]
379+ #[ serial( oidc_pkce) ]
363380async fn admin_can_create_workspace ( ) {
364381 const WORKSPACE : & str = "oidc-admin-create" ;
365382 let admin = login_identity ( ADMIN ) . await ;
@@ -381,6 +398,7 @@ async fn admin_can_create_workspace() {
381398}
382399
383400#[ tokio:: test]
401+ #[ serial( oidc_pkce) ]
384402async fn user_cannot_create_workspace ( ) {
385403 let user = login_identity ( USER ) . await ;
386404 let denied = run_session_cli (
@@ -392,6 +410,7 @@ async fn user_cannot_create_workspace() {
392410}
393411
394412#[ tokio:: test]
413+ #[ serial( oidc_pkce) ]
395414async fn admin_can_delete_workspace ( ) {
396415 const WORKSPACE : & str = "oidc-admin-delete" ;
397416 let admin = login_identity ( ADMIN ) . await ;
@@ -406,6 +425,7 @@ async fn admin_can_delete_workspace() {
406425}
407426
408427#[ tokio:: test]
428+ #[ serial( oidc_pkce) ]
409429async fn user_cannot_delete_workspace ( ) {
410430 const WORKSPACE : & str = "oidc-user-del-deny" ;
411431 let admin = login_identity ( ADMIN ) . await ;
@@ -423,6 +443,7 @@ async fn user_cannot_delete_workspace() {
423443}
424444
425445#[ tokio:: test]
446+ #[ serial( oidc_pkce) ]
426447async fn workspace_user_can_read_workspace ( ) {
427448 const WORKSPACE : & str = "oidc-ws-user-read" ;
428449 let user = login_identity ( USER ) . await ;
@@ -454,6 +475,7 @@ async fn workspace_user_can_read_workspace() {
454475}
455476
456477#[ tokio:: test]
478+ #[ serial( oidc_pkce) ]
457479async fn workspace_user_cannot_manage_members ( ) {
458480 const WORKSPACE : & str = "oidc-ws-user-deny" ;
459481 let user = login_identity ( USER ) . await ;
@@ -479,6 +501,7 @@ async fn workspace_user_cannot_manage_members() {
479501}
480502
481503#[ tokio:: test]
504+ #[ serial( oidc_pkce) ]
482505async fn workspace_admin_can_read_workspace ( ) {
483506 const WORKSPACE : & str = "oidc-wsa-read" ;
484507 let user = login_identity ( USER ) . await ;
@@ -496,6 +519,7 @@ async fn workspace_admin_can_read_workspace() {
496519}
497520
498521#[ tokio:: test]
522+ #[ serial( oidc_pkce) ]
499523async fn workspace_admin_can_create_sandbox ( ) {
500524 const WORKSPACE : & str = "oidc-wsa-create-sb" ;
501525 let user = login_identity ( USER ) . await ;
@@ -507,6 +531,7 @@ async fn workspace_admin_can_create_sandbox() {
507531}
508532
509533#[ tokio:: test]
534+ #[ serial( oidc_pkce) ]
510535async fn workspace_admin_can_delete_sandbox ( ) {
511536 const WORKSPACE : & str = "oidc-wsa-delete-sb" ;
512537 let user = login_identity ( USER ) . await ;
@@ -518,6 +543,7 @@ async fn workspace_admin_can_delete_sandbox() {
518543}
519544
520545#[ tokio:: test]
546+ #[ serial( oidc_pkce) ]
521547async fn workspace_admin_can_create_provider ( ) {
522548 const WORKSPACE : & str = "oidc-wsa-create-pr" ;
523549 const PROVIDER : & str = "oidc-wsa-create-provider" ;
@@ -552,6 +578,7 @@ async fn workspace_admin_can_create_provider() {
552578}
553579
554580#[ tokio:: test]
581+ #[ serial( oidc_pkce) ]
555582async fn workspace_admin_can_delete_provider ( ) {
556583 const WORKSPACE : & str = "oidc-wsa-delete-pr" ;
557584 const PROVIDER : & str = "oidc-wsa-delete-provider" ;
@@ -585,6 +612,7 @@ async fn workspace_admin_can_delete_provider() {
585612}
586613
587614#[ tokio:: test]
615+ #[ serial( oidc_pkce) ]
588616async fn workspace_admin_can_add_user_member ( ) {
589617 const WORKSPACE : & str = "oidc-wsa-add-user" ;
590618 let workspace_admin = login_identity ( USER ) . await ;
@@ -619,6 +647,7 @@ async fn workspace_admin_can_add_user_member() {
619647}
620648
621649#[ tokio:: test]
650+ #[ serial( oidc_pkce) ]
622651async fn workspace_admin_can_remove_user_member ( ) {
623652 const WORKSPACE : & str = "oidc-wsa-rm-user" ;
624653 let workspace_admin = login_identity ( USER ) . await ;
@@ -662,6 +691,7 @@ async fn workspace_admin_can_remove_user_member() {
662691}
663692
664693#[ tokio:: test]
694+ #[ serial( oidc_pkce) ]
665695async fn workspace_admin_cannot_grant_admin ( ) {
666696 const WORKSPACE : & str = "oidc-ws-admin-deny" ;
667697 let user = login_identity ( USER ) . await ;
@@ -687,6 +717,7 @@ async fn workspace_admin_cannot_grant_admin() {
687717}
688718
689719#[ tokio:: test]
720+ #[ serial( oidc_pkce) ]
690721async fn workspace_admin_cannot_create_workspace ( ) {
691722 const WORKSPACE : & str = "oidc-wsa-no-create" ;
692723 let user = login_identity ( USER ) . await ;
@@ -700,6 +731,7 @@ async fn workspace_admin_cannot_create_workspace() {
700731}
701732
702733#[ tokio:: test]
734+ #[ serial( oidc_pkce) ]
703735async fn workspace_admin_cannot_delete_workspace ( ) {
704736 const WORKSPACE : & str = "oidc-wsa-no-delete" ;
705737 let user = login_identity ( USER ) . await ;
@@ -712,6 +744,7 @@ async fn workspace_admin_cannot_delete_workspace() {
712744}
713745
714746#[ tokio:: test]
747+ #[ serial( oidc_pkce) ]
715748async fn workspace_admin_cannot_inspect_gateway ( ) {
716749 const WORKSPACE : & str = "oidc-wsa-no-gw-info" ;
717750 let user = login_identity ( USER ) . await ;
@@ -724,6 +757,7 @@ async fn workspace_admin_cannot_inspect_gateway() {
724757}
725758
726759#[ tokio:: test]
760+ #[ serial( oidc_pkce) ]
727761async fn workspace_admin_cannot_read_another_workspace ( ) {
728762 const WORKSPACE_A : & str = "oidc-wsa-xread-a" ;
729763 const WORKSPACE_B : & str = "oidc-wsa-xread-b" ;
@@ -738,6 +772,7 @@ async fn workspace_admin_cannot_read_another_workspace() {
738772}
739773
740774#[ tokio:: test]
775+ #[ serial( oidc_pkce) ]
741776async fn workspace_admin_cannot_manage_another_workspace_members ( ) {
742777 const WORKSPACE_A : & str = "oidc-wsa-xmem-a" ;
743778 const WORKSPACE_B : & str = "oidc-wsa-xmem-b" ;
@@ -769,6 +804,7 @@ async fn workspace_admin_cannot_manage_another_workspace_members() {
769804}
770805
771806#[ tokio:: test]
807+ #[ serial( oidc_pkce) ]
772808async fn workspace_admin_cannot_manage_another_workspace_providers ( ) {
773809 const WORKSPACE_A : & str = "oidc-wsa-xprov-a" ;
774810 const WORKSPACE_B : & str = "oidc-wsa-xprov-b" ;
@@ -800,6 +836,7 @@ async fn workspace_admin_cannot_manage_another_workspace_providers() {
800836}
801837
802838#[ tokio:: test]
839+ #[ serial( oidc_pkce) ]
803840async fn membership_removal_revokes_workspace_access ( ) {
804841 const WORKSPACE : & str = "oidc-ws-revoke" ;
805842 let user = login_identity ( USER ) . await ;
@@ -825,6 +862,7 @@ async fn membership_removal_revokes_workspace_access() {
825862}
826863
827864#[ tokio:: test]
865+ #[ serial( oidc_pkce) ]
828866async fn workspace_user_cannot_read_another_users_workspace ( ) {
829867 const WORKSPACE_A : & str = "oidc-xread-a" ;
830868 const WORKSPACE_B : & str = "oidc-xread-b" ;
@@ -838,6 +876,7 @@ async fn workspace_user_cannot_read_another_users_workspace() {
838876}
839877
840878#[ tokio:: test]
879+ #[ serial( oidc_pkce) ]
841880async fn second_workspace_user_cannot_read_first_users_workspace ( ) {
842881 const WORKSPACE_A : & str = "oidc-xread2-a" ;
843882 const WORKSPACE_B : & str = "oidc-xread2-b" ;
@@ -851,6 +890,7 @@ async fn second_workspace_user_cannot_read_first_users_workspace() {
851890}
852891
853892#[ tokio:: test]
893+ #[ serial( oidc_pkce) ]
854894async fn workspace_list_hides_another_users_workspace ( ) {
855895 const WORKSPACE_A : & str = "oidc-xlist-a" ;
856896 const WORKSPACE_B : & str = "oidc-xlist-b" ;
@@ -877,6 +917,7 @@ async fn workspace_list_hides_another_users_workspace() {
877917}
878918
879919#[ tokio:: test]
920+ #[ serial( oidc_pkce) ]
880921async fn workspace_user_cannot_list_another_workspace_sandboxes ( ) {
881922 const WORKSPACE_A : & str = "oidc-xsbox-a" ;
882923 const WORKSPACE_B : & str = "oidc-xsbox-b" ;
@@ -895,6 +936,7 @@ async fn workspace_user_cannot_list_another_workspace_sandboxes() {
895936}
896937
897938#[ tokio:: test]
939+ #[ serial( oidc_pkce) ]
898940async fn workspace_user_cannot_create_sandbox_in_another_workspace ( ) {
899941 const WORKSPACE_A : & str = "oidc-xcreate-a" ;
900942 const WORKSPACE_B : & str = "oidc-xcreate-b" ;
@@ -922,6 +964,7 @@ async fn workspace_user_cannot_create_sandbox_in_another_workspace() {
922964}
923965
924966#[ tokio:: test]
967+ #[ serial( oidc_pkce) ]
925968async fn workspace_user_cannot_list_another_workspace_providers ( ) {
926969 const WORKSPACE_A : & str = "oidc-xprov-a" ;
927970 const WORKSPACE_B : & str = "oidc-xprov-b" ;
@@ -940,6 +983,7 @@ async fn workspace_user_cannot_list_another_workspace_providers() {
940983}
941984
942985#[ tokio:: test]
986+ #[ serial( oidc_pkce) ]
943987async fn workspace_user_cannot_list_another_workspace_members ( ) {
944988 const WORKSPACE_A : & str = "oidc-xmember-a" ;
945989 const WORKSPACE_B : & str = "oidc-xmember-b" ;
0 commit comments