| 
									
										
										
										
											2010-06-17 00:40:25 +01:00
										 |  |  | :- module(test_process, | 
					
						
							|  |  |  | 	  [ test_process/0 | 
					
						
							|  |  |  | 	  ]). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :- asserta(user:file_search_path(foreign, '.')). | 
					
						
							|  |  |  | :- asserta(user:file_search_path(library, '.')). | 
					
						
							|  |  |  | :- asserta(user:file_search_path(library, '../plunit')). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :- use_module(library(plunit)). | 
					
						
							|  |  |  | :- use_module(library(readutil)). | 
					
						
							|  |  |  | :- use_module(process). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test_process :- | 
					
						
							|  |  |  | 	run_tests([ process_create, | 
					
						
							|  |  |  | 		    process_wait | 
					
						
							|  |  |  | 		  ]). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | read_process(In, Text) :- | 
					
						
							|  |  |  | 	read_stream_to_codes(In, Codes), | 
					
						
							|  |  |  | 	close(In), | 
					
						
							|  |  |  | 	atom_codes(Text, Codes). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :- begin_tests(process_create, [sto(rational_trees)]). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test(echo, true) :- | 
					
						
							|  |  |  | 	process_create(path(true), [], []). | 
					
						
							|  |  |  | test(null_input, Codes == []) :- | 
					
						
							|  |  |  | 	process_create(path(cat), [], [stdin(null), stdout(pipe(Out))]), | 
					
						
							|  |  |  | 	read_stream_to_codes(Out, Codes), | 
					
						
							|  |  |  | 	close(Out). | 
					
						
							|  |  |  | test(null_output, true) :- | 
					
						
							|  |  |  | 	process_create(path(sh), | 
					
						
							|  |  |  | 		       ['-c', 'echo THIS IS AN ERROR'], | 
					
						
							|  |  |  | 		       [stdout(null)]). | 
					
						
							|  |  |  | test(null_error, true) :- | 
					
						
							|  |  |  | 	process_create(path(sh), | 
					
						
							|  |  |  | 		       ['-c', 'echo "THIS IS AN ERROR" 1>&2'], | 
					
						
							|  |  |  | 		       [stderr(null)]). | 
					
						
							|  |  |  | test(read_error, X == 'error\n') :- | 
					
						
							|  |  |  | 	process_create(path(sh), | 
					
						
							|  |  |  | 		       ['-c', 'echo "error" 1>&2'], | 
					
						
							|  |  |  | 		       [stderr(pipe(Out))]), | 
					
						
							|  |  |  | 	read_process(Out, X). | 
					
						
							|  |  |  | test(echo, X == 'hello\n') :- | 
					
						
							|  |  |  | 	process_create(path(sh), | 
					
						
							|  |  |  | 		       ['-c', 'echo hello'], | 
					
						
							|  |  |  | 		       [ stdout(pipe(Out)) | 
					
						
							|  |  |  | 		       ]), | 
					
						
							|  |  |  | 	read_process(Out, X). | 
					
						
							|  |  |  | test(lwr, X == 'HELLO') :- | 
					
						
							|  |  |  | 	process_create(path(tr), ['a-z', 'A-Z'], | 
					
						
							|  |  |  | 		       [ stdin(pipe(In)), | 
					
						
							|  |  |  | 			 stdout(pipe(Out)) | 
					
						
							|  |  |  | 		       ]), | 
					
						
							|  |  |  | 	format(In, hello, []), | 
					
						
							|  |  |  | 	close(In), | 
					
						
							|  |  |  | 	read_process(Out, X). | 
					
						
							|  |  |  | test(cwd, [true, condition(\+current_prolog_flag(windows, true))]) :- | 
					
						
							|  |  |  | 	tmp_dir(Tmp), | 
					
						
							|  |  |  | 	process_create(path(pwd), [], | 
					
						
							|  |  |  | 		       [ stdout(pipe(Out)), | 
					
						
							|  |  |  | 			 cwd(Tmp) | 
					
						
							|  |  |  | 		       ]), | 
					
						
							|  |  |  | 	read_process(Out, CWD0), | 
					
						
							| 
									
										
										
										
											2010-08-04 02:44:41 +01:00
										 |  |  | 	system:normalize_space(atom(CWD), CWD0), | 
					
						
							|  |  |  | 	system:swi_same_file(CWD, Tmp). | 
					
						
							| 
									
										
										
										
											2010-06-17 00:40:25 +01:00
										 |  |  | test(cwd, [true, condition(current_prolog_flag(windows, true))]) :- | 
					
						
							|  |  |  | 	tmp_dir(Tmp), | 
					
						
							|  |  |  | 	getenv('COMSPEC', Shell), | 
					
						
							|  |  |  | 	process_create(Shell, ['/c', cd], | 
					
						
							|  |  |  | 		       [ stdout(pipe(Out)), | 
					
						
							|  |  |  | 			 cwd(Tmp) | 
					
						
							|  |  |  | 		       ]), | 
					
						
							|  |  |  | 	read_process(Out, CWD0), | 
					
						
							| 
									
										
										
										
											2010-08-04 02:44:41 +01:00
										 |  |  | 	system:normalize_space(atom(CWD), CWD0), | 
					
						
							|  |  |  | 	system:swi_same_file(CWD, Tmp). | 
					
						
							| 
									
										
										
										
											2010-06-17 00:40:25 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | tmp_dir(Dir) :- | 
					
						
							|  |  |  | 	getenv('TEMP', Dir), !. | 
					
						
							|  |  |  | tmp_dir('/tmp'). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :- end_tests(process_create). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :- begin_tests(process_wait, [sto(rational_trees)]). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test(wait_ok, X == exit(0)) :- | 
					
						
							|  |  |  | 	process_create(path(sh), ['-c', 'exit 0'], [process(PID)]), | 
					
						
							|  |  |  | 	process_wait(PID, X). | 
					
						
							|  |  |  | test(wait_ok, X == exit(42)) :- | 
					
						
							|  |  |  | 	process_create(path(sh), ['-c', 'exit 42'], [process(PID)]), | 
					
						
							|  |  |  | 	process_wait(PID, X). | 
					
						
							|  |  |  | test(kill_ok, [ X == killed(9), | 
					
						
							|  |  |  | 		condition(\+current_prolog_flag(windows, true))]) :- | 
					
						
							|  |  |  | 	process_create(path(sleep), [2], [process(PID)]), | 
					
						
							|  |  |  | 	process_kill(PID, 9), | 
					
						
							|  |  |  | 	process_wait(PID, X). | 
					
						
							|  |  |  | test(kill_ok, [ X = exit(_), | 
					
						
							|  |  |  | 		condition(current_prolog_flag(windows, true))]) :- | 
					
						
							|  |  |  | 	process_create(path(sleep), [2], [process(PID)]), | 
					
						
							|  |  |  | 	process_kill(PID, 9), | 
					
						
							|  |  |  | 	process_wait(PID, X). | 
					
						
							|  |  |  | test(wait_timeout, [ X = timeout ]) :- | 
					
						
							|  |  |  | 	process_create(path(sleep), [2], [process(PID)]), | 
					
						
							|  |  |  | 	(   current_prolog_flag(windows, true) | 
					
						
							|  |  |  | 	->  TMO = 0.1 | 
					
						
							|  |  |  | 	;   TMO = 0 | 
					
						
							|  |  |  | 	), | 
					
						
							|  |  |  | 	process_wait(PID, X, [timeout(TMO)]), | 
					
						
							|  |  |  | 	process_kill(PID, 9), | 
					
						
							|  |  |  | 	process_wait(PID, _). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :- end_tests(process_wait). |