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