OSDN Git Service

Fixed chkconfig option
[ultramonkey-l7/ultramonkey-l7-v2.git] / l7directord / t / 21_ldap.t
1 use strict;
2 use warnings;
3 no warnings qw(redefine once);
4 use lib qw(t/lib lib);
5 use subs qw(print);
6 use Cwd;
7 use L7lib;
8 use Test::More tests => 7;
9 use IO::Socket::INET;
10 use IO::Handle;
11
12 L7lib::chdir();
13 L7lib::comment_out();
14 require './l7directord';
15 override();
16
17 our $module_error = 0;
18 eval { require Net::LDAP; };
19 if ($@) {
20     $module_error = 1;
21 }
22
23 #...............................................
24 # test start
25 #   - check_ldap
26 SKIP: {
27     skip q{Can't locate Net/LDAP.pm in @INC}, 1 if $module_error;
28     my $port = 63334;
29     my $sock = create_sock($port);
30     skip 'cannot create socket', 1 if !$sock;
31     # 30 0C 02 01 01 61 07 0A 01 00 04 00 04 00 __ __ 0....a........
32     my $normal_response = pack 'H*', '300C02010161070A010004000400';
33     my $pid = prepare_child($sock, [$normal_response]);
34     set_default();
35     my $v = { negotiatetimeout => 3, };
36     my $r = { server => {ip => '127.0.0.1', port => $port }, fail_counts => 0 };
37     my $got = check_ldap($v, $r);
38     is $got, $main::SERVICE_UP, 'check_ldap - connect ok';
39     close_child($pid);
40     close $sock;
41 }
42 SKIP: {
43     skip q{Can't locate Net/LDAP.pm in @INC}, 1 if $module_error;
44     my $port = 63334;
45     my $sock = create_sock($port);
46     skip 'cannot create socket', 1 if !$sock;
47     # 30 0C 02 01 01 61 07 0A 01 00 04 00 04 00 __ __ 0....a........
48     my $normal_response = pack 'H*', '300C02010161070A010004000400';
49     my $pid = prepare_child($sock, [$normal_response]);
50     set_default();
51     my $v = { negotiatetimeout => 3, checkport => $port };
52     my $r = { server => {ip => '127.0.0.1', port => 10000 }, fail_counts => 0 };
53     my $got = check_ldap($v, $r);
54     is $got, $main::SERVICE_UP, 'check_ldap - checkport connect ok';
55     close_child($pid);
56     close $sock;
57 }
58 SKIP: {
59     skip q{Can't locate Net/LDAP.pm in @INC}, 1 if $module_error;
60     my $port = 63334;
61     my $sock = create_sock($port);
62     skip 'cannot create socket', 1 if !$sock;
63     # 30 0C 02 01 01 61 07 0A 01 00 04 00 04 00 __ __ 0....a........
64     my $normal_response = pack 'H*', '300C02010161070A010004000400';
65     # 30 64 02 01 02 64 5F 04 11 64 63 3D 65 78 61 6D 0d...d_..dc=exam    
66     # 70 6C 65 2C 64 63 3D 63 6F 6D 30 4A 30 27 04 0B ple,dc=com0J0'..    
67     # 6F 62 6A 65 63 74 43 6C 61 73 73 31 18 04 08 64 objectClass1...d    
68     # 63 4F 62 6A 65 63 74 04 0C 6F 72 67 61 6E 69 7A cObject..organiz    
69     # 61 74 69 6F 6E 30 0F 04 02 64 63 31 09 04 07 65 ation0...dc1...e    
70     # 78 61 6D 70 6C 65 30 0E 04 01 6F 31 09 04 07 65 xample0...o1...e    
71     # 78 61 6D 70 6C 65 __ __ __ __ __ __ __ __ __ __ xample              
72     my $search_response = pack 'H*',
73         '3064020102645F041164633D6578616D706C652C64633D636F6D304A3027040B' .
74         '6F626A656374436C6173733118040864634F626A656374040C6F7267616E697A' .
75         '6174696F6E300F04026463310904076578616D706C65300E04016F3109040765' .
76         '78616D706C65';
77     my $pid = prepare_child($sock, [$normal_response, $search_response]);
78     set_default();
79     my $v = {negotiatetimeout => 3, };
80     my $r = { server => {ip => '127.0.0.1', port => $port}, request => 'dc=example,dc=com' , fail_counts => 0 };
81     my $got = check_ldap($v, $r);
82     is $got, $main::SERVICE_UP, 'check_ldap - search ok';
83     close_child($pid);
84     close $sock;
85 }
86 SKIP: {
87     skip q{Can't locate Net/LDAP.pm in @INC}, 1 if $module_error;
88     my $port = 63334;
89     my $sock = create_sock($port);
90     skip 'cannot create socket', 1 if !$sock;
91     # 30 0C 02 01 01 61 07 0A 01 00 04 00 04 00 __ __ 0....a........
92     my $normal_response = pack 'H*', '300C02010161070A010004000400';
93     # 30 64 02 01 02 64 5F 04 11 64 63 3D 65 78 61 6D 0d...d_..dc=exam    
94     # 70 6C 65 2C 64 63 3D 63 6F 6D 30 4A 30 27 04 0B ple,dc=com0J0'..    
95     # 6F 62 6A 65 63 74 43 6C 61 73 73 31 18 04 08 64 objectClass1...d    
96     # 63 4F 62 6A 65 63 74 04 0C 6F 72 67 61 6E 69 7A cObject..organiz    
97     # 61 74 69 6F 6E 30 0F 04 02 64 63 31 09 04 07 65 ation0...dc1...e    
98     # 78 61 6D 70 6C 65 30 0E 04 01 6F 31 09 04 07 65 xample0...o1...e    
99     # 78 61 6D 70 6C 65 __ __ __ __ __ __ __ __ __ __ xample              
100     my $search_response = pack 'H*',
101         '3064020102645F041164633D6578616D706C652C64633D636F6D304A3027040B' .
102         '6F626A656374436C6173733118040864634F626A656374040C6F7267616E697A' .
103         '6174696F6E300F04026463310904076578616D706C65300E04016F3109040765' .
104         '78616D706C65';
105     my $pid = prepare_child($sock, [$normal_response, $search_response]);
106     set_default();
107     my $v = {negotiatetimeout => 3};
108     my $r = { server => {ip => '127.0.0.1', port => $port}, request => 'dc=example,dc=com', receive => 'example' , fail_counts => 0 };
109     my $got = check_ldap($v, $r);
110     is $got, $main::SERVICE_UP, 'check_ldap - response check ok';
111     close_child($pid);
112     close $sock;
113 }
114 SKIP: {
115     skip q{Can't locate Net/LDAP.pm in @INC}, 1 if $module_error;
116     my $port = 63334;
117     my $sock = create_sock($port);
118     skip 'cannot create socket', 1 if !$sock;
119     # 30 0C 02 01 01 61 07 0A 01 00 04 00 04 00 __ __ 0....a........
120     my $normal_response = pack 'H*', '300C02010161070A010004000400';
121     my $pid = prepare_child($sock, [$normal_response], 2);
122     set_default();
123     my $v = {negotiatetimeout => 1};
124     my $r = { server => {ip => '127.0.0.1', port => $port}, request => 'dc=example,dc=com', receive => 'example' , fail_counts => 0 };
125     my $got = check_ldap($v, $r);
126     is $got, $main::SERVICE_DOWN, 'check_ldap - timeout';
127     close_child($pid);
128     close $sock;
129 }
130 SKIP: {
131     skip q{Can't locate Net/LDAP.pm in @INC}, 1 if $module_error;
132     my $port = 63334;
133     my $sock = create_sock($port);
134     skip 'cannot create socket', 1 if !$sock;
135     # 30 0C 02 01 01 61 07 0A 01 00 04 00 04 00 __ __ 0....a........
136     my $normal_response = pack 'H*', '300C02010161070A010004000400';
137     # 30 64 02 01 02 64 5F 04 11 64 63 3D 65 78 61 6D 0d...d_..dc=exam    
138     # 70 6C 65 2C 64 63 3D 63 6F 6D 30 4A 30 27 04 0B ple,dc=com0J0'..    
139     # 6F 62 6A 65 63 74 43 6C 61 73 73 31 18 04 08 64 objectClass1...d    
140     # 63 4F 62 6A 65 63 74 04 0C 6F 72 67 61 6E 69 7A cObject..organiz    
141     # 61 74 69 6F 6E 30 0F 04 02 64 63 31 09 04 07 65 ation0...dc1...e    
142     # 78 61 6D 70 6C 65 30 0E 04 01 6F 31 09 04 07 65 xample0...o1...e    
143     # 78 61 6D 70 6C 65 __ __ __ __ __ __ __ __ __ __ xample              
144     my $search_response = pack 'H*',
145         '3064020102645F041164633D6578616D706C652C64633D636F6D304A3027040B' .
146         '6F626A656374436C6173733118040864634F626A656374040C6F7267616E697A' .
147         '6174696F6E300F04026463310904076578616D706C65300E04016F3109040765' .
148         '78616D706C65';
149     my $pid = prepare_child($sock, [$normal_response, $search_response]);
150     set_default();
151     my $v = {negotiatetimeout => 3};
152     my $r = { server => {ip => '127.0.0.1', port => $port}, request => 'dc=example,dc=com', receive => 'foo' , fail_counts => 0 };
153     my $got = check_ldap($v, $r);
154     is $got, $main::SERVICE_DOWN, 'check_ldap - response error';
155     close_child($pid);
156     close $sock;
157 }
158 SKIP: {
159     skip q{Can't locate Net/LDAP.pm in @INC}, 1 if $module_error;
160     my $port = 63334;
161     set_default();
162     my $v = {negotiatetimeout => 1, checkport => $port };
163     my $r = { server => {ip => '127.0.0.1', port => 10000 }, fail_counts => 0 };
164     my $got = check_ldap($v, $r);
165     is $got, $main::SERVICE_DOWN, 'check_ldap - connect error';
166 }
167 # test end
168 #...............................................
169
170 L7lib::comment_in();
171
172 sub create_sock {
173     my $port = shift;
174     my $sock = IO::Socket::INET->new(
175         Listen => 5,
176         LocalAddr => 'localhost',
177         LocalPort => $port,
178         ReuseAddr => 1,
179         Proto => 'tcp');
180     return $sock;
181 }
182 sub prepare_child {
183     my $sock = shift;
184     my $res = shift;
185     my $sleep = shift;
186     my $pid = fork();
187     if ($pid == 0) {
188         my $s = $sock->accept;
189         $s->autoflush(1);
190         if ($sleep) { sleep $sleep; }
191         for my $response (@$res) {
192             my $length;
193             read $s, $length, 1;
194             read $s, $length, 1;
195             $length = unpack('C', $length);
196             #print "read length: $length\n";
197             my $req;
198             read $s, $req, $length;
199             #print "read: ", unpack('H*', $req), "\n";
200             my $num = substr $req, 2, 1;
201             $response =~ s/^(....)./$1$num/;
202             print $s $response;
203         }
204         close $s;
205         exit;
206     }
207     return $pid;
208 }
209 sub close_child {
210     my $pid = shift;
211     kill 15, $pid;
212     waitpid $pid, 0;
213 }
214 sub set_default {
215 }
216 sub override {
217     *ld_log = \&__ld_log;
218     *get_status = \&__get_status;
219 }
220 sub __get_status {
221     return $main::SERVICE_UP;
222 }
223 sub __ld_log {
224 }