1# test delay before server read, unsplice during client write 2 3use strict; 4use warnings; 5use POSIX; 6 7our %args = ( 8 client => { 9 func => sub { errignore(@_); write_stream(@_); }, 10 len => 2**17, 11 sndbuf => 2**15, 12 }, 13 relay => { 14 func => sub { 15 my $self = shift; 16 defined(my $pid = fork()) 17 or die "relay func: fork failed: $!"; 18 if ($pid == 0) { 19 sleep 2; 20 setsplice(\*STDIN) 21 or die ref($self), " unsplice stdin failed: $!"; 22 POSIX::_exit(0); 23 } 24 sleep 1; 25 eval { relay($self, @_) }; 26 if ($self->{forward} =~ /splice/) { 27 $@ =~ /^Relay sysread stdin has data:/ 28 or die ref($self), " no data after unsplice: $@"; 29 } 30 sleep 2; 31 kill 9, $pid; 32 (my $kid = waitpid($pid, 0)) > 0 33 or die ref($self), " wait unsplice child failed: $!"; 34 my $status = $?; 35 my $code; 36 $code = "exit: ". WEXITSTATUS($?) if WIFEXITED($?); 37 $code = "signal: ". WTERMSIG($?) if WIFSIGNALED($?); 38 $code = "stop: ". WSTOPSIG($?) if WIFSTOPPED($?); 39 $status == 0 40 or die ref($self), " unsplice child status: $status $code"; 41 }, 42 rcvbuf => 2**10, 43 sndbuf => 2**10, 44 }, 45 server => { 46 func => sub { sleep 3; read_stream(@_); }, 47 rcvbuf => 2**15, 48 }, 49 noecho => 1, 50 nocheck => 1, 51 len => 131072, 52 md5 => "31e5ad3d0d2aeb1ad8aaa847dfa665c2", 53); 54