1 |
#!/usr/bin/perl |
2 |
|
3 |
BEGIN { eval "use Net::SSLeay 1.33 (); 1" or ((print "1..0 # SKIP no usable Net::SSLeay\n"), exit 0) } |
4 |
|
5 |
use Test::More tests => 415; |
6 |
|
7 |
no warnings; |
8 |
use strict qw(vars subs); |
9 |
|
10 |
use AnyEvent::Socket; |
11 |
use AnyEvent::Handle; |
12 |
use AnyEvent::TLS; |
13 |
|
14 |
my $ctx = new AnyEvent::TLS cert_file => $0; |
15 |
|
16 |
for my $mode (1..5) { |
17 |
ok (1, "mode $mode"); |
18 |
|
19 |
my $server_done = AnyEvent->condvar; |
20 |
my $client_done = AnyEvent->condvar; |
21 |
|
22 |
my $server_port = AnyEvent->condvar; |
23 |
|
24 |
tcp_server "127.0.0.1", undef, sub { |
25 |
my ($fh, $host, $port) = @_; |
26 |
|
27 |
die unless $host eq "127.0.0.1"; |
28 |
|
29 |
ok (1, "server_connect $mode"); |
30 |
|
31 |
my $hd; $hd = new AnyEvent::Handle |
32 |
tls => "accept", |
33 |
tls_ctx => $ctx, |
34 |
fh => $fh, |
35 |
timeout => 8, |
36 |
on_error => sub { |
37 |
ok (0, "server_error <$_[2]>"); |
38 |
$server_done->send; undef $hd; |
39 |
}, |
40 |
on_eof => sub { |
41 |
ok (1, "server_eof"); |
42 |
$server_done->send; undef $hd; |
43 |
}; |
44 |
|
45 |
if ($mode == 1) { |
46 |
$hd->push_read (line => sub { |
47 |
ok ($_[1] eq "1", "line 1 <$_[1]>"); |
48 |
}); |
49 |
} elsif ($mode == 2) { |
50 |
$hd->push_write ("2\n"); |
51 |
$hd->on_drain (sub { |
52 |
ok (1, "server_drain"); |
53 |
$server_done->send; undef $hd; |
54 |
}); |
55 |
} elsif ($mode == 3) { |
56 |
$hd->push_read (line => sub { |
57 |
ok ($_[1] eq "3", "line 3 <$_[1]>"); |
58 |
$hd->push_write ("4\n"); |
59 |
$hd->on_drain (sub { |
60 |
ok (1, "server_drain"); |
61 |
$server_done->send; undef $hd; |
62 |
}); |
63 |
}); |
64 |
} elsif ($mode == 4) { |
65 |
$hd->push_write ("5\n"); |
66 |
$hd->push_read (line => sub { |
67 |
ok ($_[1] eq "6", "line 6 <$_[1]>"); |
68 |
}); |
69 |
} elsif ($mode == 5) { |
70 |
$hd->on_read (sub { |
71 |
ok (1, "on_read"); |
72 |
$hd->push_read (line => sub { |
73 |
my $len = $_[1]; |
74 |
ok (1, "push_read $len"); |
75 |
$hd->push_read (packstring => "N", sub { |
76 |
ok ($len == length $_[1], "block server $len"); |
77 |
$hd->push_write ("$len\n"); |
78 |
$hd->push_write (packstring => "N", $_[1]); |
79 |
}); |
80 |
}); |
81 |
}); |
82 |
} |
83 |
|
84 |
}, sub { |
85 |
$server_port->send ($_[2]); |
86 |
}; |
87 |
|
88 |
my $hd; $hd = new AnyEvent::Handle |
89 |
connect => ["127.0.0.1", $server_port->recv], |
90 |
tls => "connect", |
91 |
tls_ctx => $ctx, |
92 |
timeout => 8, |
93 |
on_connect => sub { |
94 |
ok (1, "client_connect $mode"); |
95 |
}, |
96 |
on_error => sub { |
97 |
ok (0, "client_error <$_[2]>"); |
98 |
$client_done->send; undef $hd; |
99 |
}, |
100 |
on_eof => sub { |
101 |
ok (1, "client_eof"); |
102 |
$client_done->send; undef $hd; |
103 |
}; |
104 |
|
105 |
if ($mode == 1) { |
106 |
$hd->push_write ("1\n"); |
107 |
$hd->on_drain (sub { |
108 |
ok (1, "client_drain"); |
109 |
$client_done->send; undef $hd; |
110 |
}); |
111 |
} elsif ($mode == 2) { |
112 |
$hd->push_read (line => sub { |
113 |
ok ($_[1] eq "2", "line 2 <$_[1]>"); |
114 |
}); |
115 |
} elsif ($mode == 3) { |
116 |
$hd->push_write ("3\n"); |
117 |
$hd->push_read (line => sub { |
118 |
ok ($_[1] eq "4", "line 4 <$_[1]>"); |
119 |
}); |
120 |
} elsif ($mode == 4) { |
121 |
$hd->push_read (line => sub { |
122 |
ok ($_[1] eq "5", "line 5 <$_[1]>"); |
123 |
$hd->push_write ("6\n"); |
124 |
$hd->on_drain (sub { |
125 |
ok (1, "client_drain"); |
126 |
$client_done->send; undef $hd; |
127 |
}); |
128 |
}); |
129 |
} elsif ($mode == 5) { |
130 |
# some randomly-sized blocks |
131 |
srand 0; |
132 |
my $cnt = 64; |
133 |
my $block; $block = sub { |
134 |
my $len = (16 << int rand 14) - 16 + int rand 32; |
135 |
ok (1, "write $len"); |
136 |
$hd->push_write ("$len\n"); |
137 |
$hd->push_write (packstring => "N", "\x00" x $len); |
138 |
}; |
139 |
|
140 |
for my $i (1..$cnt) { |
141 |
$hd->push_read (line => sub { |
142 |
my ($i, $cnt, $block) = ($i, $cnt, $block); # 5.8.9. bug workaround |
143 |
my $len = $_[1]; |
144 |
ok (1, "client block $len/1"); |
145 |
$hd->unshift_read (packstring => "N", sub { |
146 |
ok ($len == length $_[1], "client block $len/2"); |
147 |
|
148 |
if ($i != $cnt) { |
149 |
$block->(); |
150 |
} else { |
151 |
ok (1, "client_drain 5"); |
152 |
$client_done->send; undef $hd; |
153 |
} |
154 |
}); |
155 |
}); |
156 |
} |
157 |
|
158 |
$block->(); |
159 |
} |
160 |
|
161 |
$server_done->recv; |
162 |
$client_done->recv; |
163 |
} |
164 |
|
165 |
__END__ |
166 |
-----BEGIN RSA PRIVATE KEY----- |
167 |
MIIEpAIBAAKCAQEA02VwAqlQzCrPenkxUjawHcXzJreJ9LDhX7Bkg3E/RB6Ilm4D |
168 |
LBeilCmzkY7avp57+WCiVw2qkg+kH4Ef2sd+r10UCGPh/1diLehRAzp3Ho1bixyg |
169 |
w+zkDm79OnN3uHxuKigkAxx3GGz9HhQA83U+RUns+39/OnFh0RY6/f5rV2ziA9jD |
170 |
6HK3Mnsuxocd46YbVdiqlQK430CgiGj8dV44JG6+R6x3r5qXDbbRtGubC29kQOUq |
171 |
kYslbpTo7ml8ShyqAP6qa8BpeSIaNG1CQQ/7JkAdxSWyFHqMQ0HR3BUiaEfUElZt |
172 |
DFgXcCkKB5F8jx+wYoLzlPHHZaUvfP2nueYjcwIDAQABAoIBAQCtRDMuu0ByV5R/ |
173 |
Od5nGFP500mcrkrwuBnBqH56DdRhLPWe9sS62xRyhEuePoykOJo8qCvnVlg8J33K |
174 |
JLfLRkBb09qbleKiuyjJn+Tm1IDWFd62gtxyOjQicG41/nZeS/6vpv79XdNvvcUp |
175 |
ZhPxeGN1v0XyTWomqNAX5DSuAl5Q5HxkaRYNeuLZaPYkqmEVTgYqNSes/wRLKUb6 |
176 |
MaVrZ9AA/oHJMmmV4evf06s7l7ICjxAWeas7CI6UGkEz8ZFoVRJsLk5xtTsnZLgf |
177 |
f24/pqHz1vApPs7CsJhK2HsLZcxMPD+hmTNI/Njl51WoH8zGhkv+p88vDzybpNSF |
178 |
Hpkl+ZlBAoGBAOyfjVLD0OznJKSFksoCZKS4dlPHgXUb47Qb/XchIySQ/DNO6ff9 |
179 |
AA6r6doDFp51A8N1GRtGQN4LKujFPOdZ5ah7zbc2PfuOJGHku0Oby+ydgHJ19eW4 |
180 |
s3CIM20TuzLndFPrEGFgOrt+i5qKisti2OOZhjsDwfd48vsBm9U20lUpAoGBAOS1 |
181 |
Chm+vA7JevPzl+acbDSiyELaNRAXZ73CX4NIxJURjsgDeOurnBtLQEQyagZbNHcx |
182 |
W4pc59Ql5KDLzu/Sne8oC3pxhaWeIPhc2d3cd/8UyGtQLtN2QnilwkjHgi3x1JGb |
183 |
RPRsgAV6nwn10qUrze1XLkHsTCRI4QYD/k0uXcs7AoGBAMStJaFag2i2Ax4ArG7e |
184 |
KFtFu4yNckwtv0kwTrBbScOWAxp+iDiJASgwunJsSLuylUs8JH8oGLi23ZaWgrXl |
185 |
Yd918BpNqp1Rm2oG3aQndguZKm95Hscvi26Itv39/YYlHeq2omndu1OmrlDowM6m |
186 |
vZIIRKr+x5Vz4brCro09QPxpAoGARJAdghBTEl/Gc2HgdOsJ6VGvlZMS+0r498NQ |
187 |
nOvwuvuzgTTBSG1+9BPAJXGzpUosVVs/pSArA8eEXcwbsnvCixLHNiLYPQlFuw8i |
188 |
5UcV1iul1b4I+63lSYPv1Z+x4BIydqBEsL3iN0JGcVb3mjqilndfT7YGMY6DnykN |
189 |
UJgI2EcCgYAMfZHnD06XFM8ny+NsFILItpGqjCmAhkEPGwl1Zhy5Hx16CFDPDwGt |
190 |
CmIbxNSLsDyiiK+i5tuSUFhV2Bw/iT539979INTIdNL1ughfhATR8MVNiOKCvZBa |
191 |
uoEeE19szmG7Mj2eV2IDH0e8iaikjRFcfN89s39tNn1AjBNmEccUJA== |
192 |
-----END RSA PRIVATE KEY----- |
193 |
----- |
194 |
-----BEGIN CERTIFICATE----- |
195 |
MIIDHTCCAgWgAwIBAgIJAPASTbY2HCx0MA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV |
196 |
BAMTCEFueUV2ZW50MB4XDTEyMDQwNTA1NTk1MFoXDTM3MDQwNTA1NTk1MFowEzER |
197 |
MA8GA1UEAxMIQW55RXZlbnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB |
198 |
AQDTZXACqVDMKs96eTFSNrAdxfMmt4n0sOFfsGSDcT9EHoiWbgMsF6KUKbORjtq+ |
199 |
nnv5YKJXDaqSD6QfgR/ax36vXRQIY+H/V2It6FEDOncejVuLHKDD7OQObv06c3e4 |
200 |
fG4qKCQDHHcYbP0eFADzdT5FSez7f386cWHRFjr9/mtXbOID2MPocrcyey7Ghx3j |
201 |
phtV2KqVArjfQKCIaPx1Xjgkbr5HrHevmpcNttG0a5sLb2RA5SqRiyVulOjuaXxK |
202 |
HKoA/qprwGl5Iho0bUJBD/smQB3FJbIUeoxDQdHcFSJoR9QSVm0MWBdwKQoHkXyP |
203 |
H7BigvOU8cdlpS98/ae55iNzAgMBAAGjdDByMB0GA1UdDgQWBBTHphJ9Il0PtIWD |
204 |
DI9aueToXo9DYzBDBgNVHSMEPDA6gBTHphJ9Il0PtIWDDI9aueToXo9DY6EXpBUw |
205 |
EzERMA8GA1UEAxMIQW55RXZlbnSCCQDwEk22NhwsdDAMBgNVHRMEBTADAQH/MA0G |
206 |
CSqGSIb3DQEBBQUAA4IBAQA/vY+qg2xjNeOuDySW/VOsStEwcaiAm/t24z3TYoZG |
207 |
2ZzyKuvFXolhXsalCahNPcyUxZqDAekODPRaq+geFaZrOn41cq/LABTKv5Theukv |
208 |
H7IruIFARBo1pTPFCKMnDqESBdHvV1xTOcKGxGH5I9iMgiUrd/NnlAaloT/cCNFI |
209 |
OwhEPsF9kBsZwJBGWrjjVttU2lzMzizS7vaSIWLBuEDObWbSXiU+IdG+nODOe2Dv |
210 |
W7PL43yd4fz4HQvN4IaZrtwkd7XiKodRR1gWjLjW/3y5kuXL+DA/jkTjrRgiH8K7 |
211 |
lVjm7gvkULRV2POQqtc2DUVXLubQmmGSjmQmxSwFX65t |
212 |
-----END CERTIFICATE----- |