1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
##################################
# Cross Plaform tests for spawn. #
##################################
# Assumes the following are available in the
# - GNU coreutils (or equivalent)
# - perl
#TODO:
# - Windows:
# - Add a test whether coreutils are available and skip tests if not
yes = `perl -le 'while (1) {print STDOUT "y"}'`
#### Examples used in the manual ####
@test readall(`echo hello | sort`) == "hello | sort\n"
@test readall(`echo hello` |> `sort`) == "hello\n"
@test length(spawn(`echo hello` |> `sort`).processes) == 2
out = readall(`echo hello` & `echo world`)
@test search(out,"world") != (0,0)
@test search(out,"hello") != (0,0)
@test readall((`echo hello` & `echo world`) |> `sort`)=="hello\nworld\n"
@test (run(`printf " \033[34m[stdio passthrough ok]\033[0m\n"`); true)
# Test for SIGPIPE being treated as normal termination (throws an error if broken)
@unix_only @test (run(yes|>`head`|>DevNull); true)
begin
a = Base.Condition()
@schedule begin
p = spawn(yes|>DevNull)
Base.notify(a,p)
@test !success(p)
end
p = wait(a)
kill(p)
end
@test_throws Base.UVError run(`foo_is_not_a_valid_command`)
if false
prefixer(prefix, sleep) = `perl -nle '$|=1; print "'$prefix' ", $_; sleep '$sleep';'`
@test success(`perl -le '$|=1; for(0..2){ print; sleep 1 }'` |>
prefixer("A",2) & prefixer("B",2))
@test success(`perl -le '$|=1; for(0..2){ print; sleep 1 }'` |>
prefixer("X",3) & prefixer("Y",3) & prefixer("Z",3) |>
prefixer("A",2) & prefixer("B",2))
end
@test success(`true`)
@test !success(`false`)
@test success(`true` |> `true`)
if false
@test success(ignorestatus(`false`))
@test success(ignorestatus(`false`) |> `true`)
@test !success(ignorestatus(`false`) |> `false`)
@test !success(ignorestatus(`false`) & `false`)
@test success(ignorestatus(`false` |> `false`))
@test success(ignorestatus(`false` & `false`))
end
# STDIN Redirection
file = tempname()
run(`echo hello world` |> file)
@test readall(file |> `cat`) == "hello world\n"
@test open(readall, file |> `cat`, "r") == "hello world\n"
rm(file)
# Stream Redirection
@unix_only begin
@async begin
server = listen(2326)
client = accept(server)
@test readall(client |> `cat`) == "hello world\n"
close(server)
end
@async begin
sock = connect(2326)
run(`echo hello world` |> sock)
close(sock)
end
end
readall(setenv(`sh -c "echo \$TEST"`,["TEST=Hello World"])) == "Hello World\n"
readall(setenv(`sh -c "echo \$TEST"`,["TEST"=>"Hello World"])) == "Hello World\n"
readall(setenv(`sh -c "pwd"`;dir="/")) == readall(setenv(`sh -c "cd / && pwd"`))
# Here we test that if we close a stream with pending writes, we don't lose the writes.
str = ""
for i=1:1000
str = "$str\n $(randstring(10))"
end
stdout, stdin, proc = readandwrite(`cat -`)
write(stdin, str)
close(stdin)
str2 = readall(stdout)
@test str2 == str
# This test hangs if the end of run walk across uv streams calls shutdown on a stream that is shutting down.
file = tempname()
open(`cat -` |> file, "w") do io
write(io, str)
end
rm(file)
# issue #3373
# fixing up Conditions after interruptions
r = RemoteRef()
t = @async begin
try
wait(r)
end
p = spawn(`sleep 1`); wait(p)
@test p.exitcode == 0
end
yield()
schedule(t, InterruptException(), error=true)
yield()
put!(r,11)
yield()
# Test marking of AsyncStream
@async begin
server = listen(2327)
client = accept(server)
write(client, "Hello, world!\n")
write(client, "Goodbye, world...\n")
close(server)
end
sleep(0.1)
sock = connect(2327)
mark(sock)
@test ismarked(sock)
@test readline(sock) == "Hello, world!\n"
@test readline(sock) == "Goodbye, world...\n"
@test reset(sock) == 0
@test !ismarked(sock)
mark(sock)
@test ismarked(sock)
@test readline(sock) == "Hello, world!\n"
unmark(sock)
@test !ismarked(sock)
@test_throws ErrorException reset(sock)
@test !unmark(sock)
@test readline(sock) == "Goodbye, world...\n"
#@test eof(sock) ## doesn't work...
close(sock)
# issue #4535
exename=joinpath(JULIA_HOME,(ccall(:jl_is_debugbuild,Cint,())==0?"julia":"julia-debug"))
@test readall(`$exename -f -e 'println(STDERR,"Hello World")'` .> `cat`) == "Hello World\n"
# issue #6310
@test readall(`echo "2+2"` |> `$exename -f`) == "4\n"
# issue #5904
@test run(ignorestatus(`false`) |> `true`) === nothing
# issue #6010
# TODO: should create separate set of task tests
ducer = @async for i=1:100; produce(i); end
yield()
@test consume(ducer) == 1
@test consume(ducer) == 2
# redirect_*
OLD_STDOUT = STDOUT
fname = tempname()
f = open(fname,"w")
redirect_stdout(f)
println("Hello World")
redirect_stdout(OLD_STDOUT)
close(f)
@test "Hello World\n" == readall(fname)
@test is(OLD_STDOUT,STDOUT)
|