@@ -455,7 +455,7 @@ extension SubprocessWindowsTests {
455
455
extension SubprocessWindowsTests {
456
456
@Test ( . enabled( if: SubprocessWindowsTests . hasAdminPrivileges ( ) ) )
457
457
func testPlatformOptionsRunAsUser( ) async throws {
458
- try await self . withTemporaryUser { username, password in
458
+ try await self . withTemporaryUser { username, password, succeed in
459
459
// Use public directory as working directory so the newly created user
460
460
// has access to it
461
461
let workingDirectory = FilePath ( " C: \\ Users \\ Public " )
@@ -498,6 +498,12 @@ extension SubprocessWindowsTests {
498
498
}
499
499
return String ( decodingCString: pointer, as: UTF16 . self)
500
500
}
501
+ // On CI, we might failed to create user due to privilege issues
502
+ // There's nothing much we can do in this case
503
+ guard succeed else {
504
+ // If we fail to create the user, skip this test
505
+ return true
506
+ }
501
507
// CreateProcessWithLogonW doesn't appear to work when running in a container
502
508
return whoamiResult. terminationStatus == . unhandledException( STATUS_DLL_INIT_FAILED) && userName ( ) == " ContainerAdministrator "
503
509
}
@@ -693,16 +699,16 @@ extension SubprocessWindowsTests {
693
699
// MARK: - User Utils
694
700
extension SubprocessWindowsTests {
695
701
private func withTemporaryUser(
696
- _ work: ( String , String ) async throws -> Void
702
+ _ work: ( String , String , Bool ) async throws -> Void
697
703
) async throws {
698
704
let username : String = " TestUser \( randomString ( length: 5 , lettersOnly: true ) ) "
699
705
let password : String = " Password \( randomString ( length: 10 ) ) "
700
706
701
- func createUser( withUsername username: String , password: String ) {
702
- username. withCString (
707
+ func createUser( withUsername username: String , password: String ) -> Bool {
708
+ return username. withCString (
703
709
encodedAs: UTF16 . self
704
710
) { usernameW in
705
- password. withCString (
711
+ return password. withCString (
706
712
encodedAs: UTF16 . self
707
713
) { passwordW in
708
714
var userInfo : USER_INFO_1 = USER_INFO_1 ( )
@@ -723,27 +729,30 @@ extension SubprocessWindowsTests {
723
729
& error
724
730
)
725
731
guard status == NERR_Success else {
726
- Issue . record ( " Failed to create user with error: \( error) " )
727
- return
732
+ return false
728
733
}
734
+ return true
729
735
}
730
736
}
731
737
}
732
738
733
- createUser ( withUsername: username, password: password)
739
+ let succeed = createUser ( withUsername: username, password: password)
740
+
734
741
defer {
735
- // Now delete the user
736
- let status = username. withCString (
737
- encodedAs: UTF16 . self
738
- ) { usernameW in
739
- return NetUserDel ( nil , usernameW)
740
- }
741
- if status != NERR_Success {
742
- Issue . record ( " Failed to delete user with error: \( status) " )
742
+ if succeed {
743
+ // Now delete the user
744
+ let status = username. withCString (
745
+ encodedAs: UTF16 . self
746
+ ) { usernameW in
747
+ return NetUserDel ( nil , usernameW)
748
+ }
749
+ if status != NERR_Success {
750
+ Issue . record ( " Failed to delete user with error: \( status) " )
751
+ }
743
752
}
744
753
}
745
754
// Run work
746
- try await work ( username, password)
755
+ try await work ( username, password, succeed )
747
756
}
748
757
749
758
private static func hasAdminPrivileges( ) -> Bool {
0 commit comments