@@ -696,6 +696,73 @@ class TestProcess : XCTestCase {
696
696
}
697
697
}
698
698
699
+ func test_pipeCloseBeforeLaunch( ) {
700
+ let process = Process ( )
701
+ let stdInput = Pipe ( )
702
+ let stdOutput = Pipe ( )
703
+
704
+ process. executableURL = xdgTestHelperURL ( )
705
+ process. arguments = [ " --cat " ]
706
+ process. standardInput = stdInput
707
+ process. standardOutput = stdOutput
708
+
709
+ let string = " Hello, World "
710
+ let stdInputPipe = stdInput. fileHandleForWriting
711
+ XCTAssertNoThrow ( try stdInputPipe. write ( XCTUnwrap ( string. data ( using: . utf8) ) ) )
712
+ stdInputPipe. closeFile ( )
713
+
714
+ XCTAssertNoThrow ( try process. run ( ) )
715
+ process. waitUntilExit ( )
716
+
717
+ let stdOutputPipe = stdOutput. fileHandleForReading
718
+ do {
719
+ let readData = try XCTUnwrap ( stdOutputPipe. readToEnd ( ) )
720
+ let readString = String ( data: readData, encoding: . utf8)
721
+ XCTAssertEqual ( string, readString)
722
+ } catch {
723
+ XCTFail ( " \( error) " )
724
+ }
725
+ }
726
+
727
+ func test_multiProcesses( ) {
728
+ let source = Process ( )
729
+ source. executableURL = xdgTestHelperURL ( )
730
+ source. arguments = [ " --getcwd " ]
731
+
732
+ let cat1 = Process ( )
733
+ cat1. executableURL = xdgTestHelperURL ( )
734
+ cat1. arguments = [ " --cat " ]
735
+
736
+ let cat2 = Process ( )
737
+ cat2. executableURL = xdgTestHelperURL ( )
738
+ cat2. arguments = [ " --cat " ]
739
+
740
+ let pipe1 = Pipe ( )
741
+ source. standardOutput = pipe1
742
+ cat1. standardInput = pipe1
743
+
744
+ let pipe2 = Pipe ( )
745
+ cat1. standardOutput = pipe2
746
+ cat2. standardInput = pipe2
747
+
748
+ let pipe3 = Pipe ( )
749
+ cat2. standardOutput = pipe3
750
+
751
+ XCTAssertNoThrow ( try source. run ( ) )
752
+ XCTAssertNoThrow ( try cat1. run ( ) )
753
+ XCTAssertNoThrow ( try cat2. run ( ) )
754
+ cat2. waitUntilExit ( )
755
+ cat1. waitUntilExit ( )
756
+ source. waitUntilExit ( )
757
+
758
+ do {
759
+ let data = try XCTUnwrap ( pipe3. fileHandleForReading. readToEnd ( ) )
760
+ let pwd = String . init ( decoding: data, as: UTF8 . self) . trimmingCharacters ( in: CharacterSet ( [ " \n " , " \r " ] ) )
761
+ XCTAssertEqual ( pwd, FileManager . default. currentDirectoryPath. standardizePath ( ) )
762
+ } catch {
763
+ XCTFail ( " \( error) " )
764
+ }
765
+ }
699
766
700
767
static var allTests : [ ( String , ( TestProcess ) -> ( ) throws -> Void ) ] {
701
768
var tests = [
@@ -724,6 +791,8 @@ class TestProcess : XCTestCase {
724
791
( " test_redirect_all_using_nil " , test_redirect_all_using_nil) ,
725
792
( " test_plutil " , test_plutil) ,
726
793
( " test_currentDirectory " , test_currentDirectory) ,
794
+ ( " test_pipeCloseBeforeLaunch " , test_pipeCloseBeforeLaunch) ,
795
+ ( " test_multiProcesses " , test_multiProcesses) ,
727
796
]
728
797
729
798
#if !os(Windows)
0 commit comments