1 | #!perl |
1 | #!perl |
|
|
2 | |
2 | use strict; |
3 | use strict; |
|
|
4 | |
|
|
5 | use AnyEvent::Impl::Perl; |
3 | use AnyEvent::Handle; |
6 | use AnyEvent::Handle; |
4 | use Test::More tests => 2; |
|
|
5 | use Socket; |
7 | use Socket; |
|
|
8 | |
|
|
9 | print "1..7\n"; |
6 | |
10 | |
7 | my $cv = AnyEvent->condvar; |
11 | my $cv = AnyEvent->condvar; |
8 | |
12 | |
9 | socketpair my $rd, my $wr, AF_UNIX, SOCK_STREAM, PF_UNSPEC; |
13 | socketpair my $rd, my $wr, AF_UNIX, SOCK_STREAM, PF_UNSPEC; |
10 | |
14 | |
11 | my $rd_ae = AnyEvent::Handle->new (fh => $rd); |
15 | my $rd_ae = |
|
|
16 | AnyEvent::Handle->new ( |
|
|
17 | fh => $rd, |
|
|
18 | on_eof => sub { |
|
|
19 | warn "reader got EOF"; |
|
|
20 | $cv->broadcast |
|
|
21 | } |
|
|
22 | ); |
|
|
23 | |
|
|
24 | my $wr_ae = |
|
|
25 | AnyEvent::Handle->new ( |
|
|
26 | fh => $wr, |
|
|
27 | on_eof => sub { |
|
|
28 | warn "writer got EOF\n"; |
|
|
29 | $cv->broadcast |
|
|
30 | } |
|
|
31 | ); |
12 | |
32 | |
13 | my $dat = ''; |
33 | my $dat = ''; |
14 | my $write_cb_called = 0; |
|
|
15 | |
34 | |
16 | $rd_ae->read (5132, sub { |
35 | $rd_ae->push_read (chunk => 5132, sub { |
17 | my ($rd_ae, $data) = @_; |
36 | my ($rd_ae, $data) = @_; |
18 | $dat = substr $data, 0, 2; |
37 | $dat = substr $data, 0, 2; |
19 | $dat .= substr $data, -5; |
38 | $dat .= substr $data, -5; |
20 | $rd_ae->read (1, sub { $cv->broadcast }); |
39 | |
|
|
40 | print "ok 4 - first read chunk\n"; |
|
|
41 | my $n = 5; |
|
|
42 | $wr_ae->push_write ("A" x 5000); |
|
|
43 | $wr_ae->on_drain (sub { |
|
|
44 | my ($wr_ae) = @_; |
|
|
45 | $wr_ae->on_drain; |
|
|
46 | print "ok " . $n++ . " - fourth write\n"; |
|
|
47 | |
|
|
48 | }); |
|
|
49 | |
|
|
50 | $rd_ae->push_read (chunk => 1, sub { |
|
|
51 | print "ok " . $n++ . " - second read chunk\n"; |
|
|
52 | $cv->broadcast |
|
|
53 | }); |
21 | }); |
54 | }); |
22 | |
55 | |
23 | my $wr_ae = AnyEvent::Handle->new (fh => $wr); |
56 | $wr_ae->push_write ("A" x 5000); |
|
|
57 | $wr_ae->push_write ("X" x 130); |
24 | |
58 | |
25 | $wr_ae->write ("A" x 5000); |
59 | # and now some extreme CPS action: |
26 | $wr_ae->write (("X" x 130), sub { $write_cb_called++; }); |
60 | $wr_ae->on_drain (sub { |
27 | $wr_ae->write ("Y", sub { $write_cb_called++; }); |
61 | my ($wr_ae) = @_; |
|
|
62 | $wr_ae->on_drain; |
|
|
63 | print "ok 1 - first write\n"; |
|
|
64 | |
28 | $wr_ae->write ("Z"); |
65 | $wr_ae->push_write ("Y"); |
29 | $wr_ae->write (sub { $write_cb_called++; }); |
66 | $wr_ae->on_drain (sub { |
30 | $wr_ae->write ("A" x 5000); |
67 | my ($wr_ae) = @_; |
31 | $wr_ae->write (sub { $write_cb_called++ }); |
68 | $wr_ae->on_drain; |
|
|
69 | print "ok 2 - second write\n"; |
|
|
70 | |
|
|
71 | $wr_ae->push_write ("Z"); |
|
|
72 | $wr_ae->on_drain (sub { |
|
|
73 | my ($wr_ae) = @_; |
|
|
74 | $wr_ae->on_drain; |
|
|
75 | print "ok 3 - third write\n"; |
|
|
76 | }); |
|
|
77 | }); |
|
|
78 | }); |
32 | |
79 | |
33 | $cv->wait; |
80 | $cv->wait; |
34 | |
81 | |
35 | is ($dat, "AAXXXYZ", 'lines were read and written correctly'); |
82 | if ($dat eq "AAXXXYZ") { |
36 | is ($write_cb_called, 4, 'write callbacks called correctly'); |
83 | print "ok 7 - received data\n"; |
|
|
84 | } else { |
|
|
85 | warn "dat was '$dat'\n"; |
|
|
86 | print "not ok 7 - received data\n"; |
|
|
87 | } |