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