OSDN Git Service

Initial commit from 2.1.2-1
[ultramonkey-l7/ultramonkey-l7-v2.git] / l7directord / t / 04_pid.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 => 33;
9
10 L7lib::chdir();
11 L7lib::comment_out();
12 require './l7directord';
13 override();
14
15 our $filename = undef;
16 our @message_only_args = ();
17 our @message_args = ();
18 our $init_error_arg = undef;
19 our $ld_rm_file_arg = undef;
20 our $ld_log_arg = undef;
21
22 #...............................................
23 # test start
24 #   - read_pid
25 {
26     default_value();
27     create_pidfile($$);
28     local $0 = 'l7directord';
29     my ($oldpid, $filepid) = read_pid();
30     is $oldpid,  $$, 'read_pid - from /proc/pid';
31     is $filepid, $$, 'read_pid - from pid file';
32     remove_pidfile();
33
34 {
35     default_value();
36     create_pidfile($$);
37     local $0 = 'l7directord';
38     my $oldpid = read_pid();
39     is $oldpid,  $$, 'read_pid - get /proc/pid only';
40     remove_pidfile();
41
42 {
43     default_value();
44     create_pidfile($$);
45     local $0 = 'foobar';
46     my ($oldpid, $filepid) = read_pid();
47     is $oldpid,  undef, 'read_pid - from /proc/pid, but process name mismatch';
48     is $filepid, $$,    'read_pid - from pid file';
49     remove_pidfile();
50
51 {
52     default_value();
53     create_pidfile($$);
54     local $0 = 'foobar';
55     my $oldpid = read_pid();
56     is $oldpid,  undef, 'read_pid - get /proc/pid only, but process name mismatch';
57     remove_pidfile();
58
59 {
60     default_value();
61     create_pidfile(99999);
62     local $0 = 'l7directord';
63     my ($oldpid, $filepid) = read_pid();
64     is $oldpid,  undef, 'read_pid - from /proc/pid, but no such proc file.';
65     is $filepid, 99999, 'read_pid - from pid file';
66     remove_pidfile();
67
68 {
69     default_value();
70     local $0 = 'l7directord';
71     my ($oldpid, $filepid) = read_pid();
72     is $oldpid,  undef, 'read_pid - from /proc/pid';
73     is $filepid, undef, 'read_pid - from pid file, but no such pid file.';
74     remove_pidfile();
75
76 #   - write_pid
77 {
78     default_value();
79     remove_pidfile();
80     local @message_only_args = ();
81     local $init_error_arg    = undef;
82     write_pid(1);
83     my $written = read_pidfile();
84     is $written, "1\n", 'write_pid - pid 1 specified';
85     remove_pidfile();
86 }
87 {
88     default_value();
89     remove_pidfile();
90     local @message_only_args = ();
91     local $init_error_arg    = undef;
92     write_pid(0);
93     is_deeply \@message_only_args, ['ERR0412', 0], 'write_pid - pid 0 specified, error message';
94     is $init_error_arg, "message_only", 'write_pid - pid 0 specified, init_error';
95     remove_pidfile();
96 }
97 {
98     default_value();
99     remove_pidfile();
100     local @message_only_args = ();
101     local $init_error_arg    = undef;
102     write_pid();
103     is_deeply \@message_only_args, ['ERR0412', 'undef'], 'write_pid - pid not specified, error message';
104     is $init_error_arg, "message_only", 'write_pid - pid not specified, init_error';
105     remove_pidfile();
106 }
107 {
108     default_value();
109     remove_pidfile();
110     local @message_only_args = ();
111     local $init_error_arg    = undef;
112     write_pid('foobar');
113     is_deeply \@message_only_args, ['ERR0412', 'foobar'], 'write_pid - pid some word specified, error message';
114     is $init_error_arg, "message_only", 'write_pid - pid some word specified, init_error';
115     remove_pidfile();
116 }
117 {
118     default_value();
119     remove_pidfile();
120     local @message_only_args = ();
121     local $init_error_arg    = undef;
122     local *close = \&__close;
123     write_pid(1);
124     is_deeply \@message_only_args, ['ERR0409', $filename, "close_error\n"], 'write_pid - close error';
125     is $init_error_arg, "message_only", 'write_pid - close error, init_error';
126     remove_pidfile();
127 }
128 #   - remove_pid
129 {
130     default_value();
131     local *ld_rm_file = \&__ld_rm_file;
132     remove_pid();
133     is $ld_rm_file_arg, $filename, 'remove_pid';
134 }
135 #   - ld_rm_file
136 {
137     default_value();
138     create_pidfile(1);
139     my $got = ld_rm_file($filename);
140     is $got, 0, 'ld_rm_file - success';
141 }
142 {
143     default_value();
144     my $got = ld_rm_file();
145     is $got, -1, 'ld_rm_file - error no delete file';
146     is_deeply \@message_args, ['ERR0411'], 'ld_rm_file - error message(1)';
147     is $ld_log_arg, 'message', 'ld_rm_file - error log(1)';
148 }
149 SKIP: {
150     default_value();
151     skip '/tmp not found!', 3 if (!-d '/tmp');
152     my $got = ld_rm_file('/tmp');
153     is $got, -1, 'ld_rm_file - error directory';
154     is_deeply \@message_args, ['ERR0401', '/tmp'], 'ld_rm_file - error message(2)';
155     is $ld_log_arg, 'message', 'ld_rm_file - error log(2)';
156 }
157 SKIP: {
158     default_value();
159     skip 'file /asdfasdf exist', 3 if (-e '/asdfasdf');
160     my $got = ld_rm_file('/asdfasdf');
161     is $got, -1, 'ld_rm_file - error file not found';
162     is_deeply \@message_args, ['ERR0402', '/asdfasdf'], 'ld_rm_file - error message(3)';
163     is $ld_log_arg, 'message', 'ld_rm_file - error log(3)';
164 }
165 SKIP: {
166     default_value();
167     skip 'file /proc/version not exist', 3 if (!-f '/proc/version');
168     my $got = ld_rm_file('/proc/version');
169     is $got, -1, 'ld_rm_file - error cannot remove';
170     is_deeply \@message_args, ['ERR0403', '/proc/version', $!], 'ld_rm_file - error message(4)';
171     is $ld_log_arg, 'message', 'ld_rm_file - error log(4)';
172 }
173 # test end
174 #...............................................
175
176 L7lib::comment_in();
177
178 sub default_value {
179     $main::PROC_ENV{pid_prefix}  = cwd;
180     $main::CONFIG_FILE{filename} = time;
181 }
182 sub override {
183     *_message_only = \&__message_only;
184     *_message      = \&__message;
185     *ld_log        = \&__ld_log;
186     *init_error    = \&__init_error;
187 }
188 sub create_pidfile {
189     my $pid = shift;
190     $filename = $main::PROC_ENV{pid_prefix} . q{.} . $main::CONFIG_FILE{filename} . '.pid';
191     if (open my $f, ">", $filename) {
192         print $f $pid . "\n";
193         close $f;
194         return 1;
195     }
196     return 0;
197 }
198 sub read_pidfile {
199     $filename = $main::PROC_ENV{pid_prefix} . q{.} . $main::CONFIG_FILE{filename} . '.pid';
200     my $pidinfo = undef;
201     if (open my $f, "<", $filename) {
202         local $\ = undef;
203         $pidinfo = <$f>;
204         close $f;
205     }
206     return $pidinfo;
207 }
208 sub remove_pidfile {
209     $filename = $main::PROC_ENV{pid_prefix} . q{.} . $main::CONFIG_FILE{filename} . '.pid';
210     if (-f $filename) {
211         unlink $filename;
212     }
213 }
214 sub __message_only {
215     @message_only_args = @_;
216     return 'message_only';
217 }
218 sub __init_error {
219     $init_error_arg = shift;
220 }
221 sub __close {
222     die "close_error\n";
223 }
224 sub __ld_rm_file {
225     $ld_rm_file_arg = shift;
226 }
227 sub __ld_log {
228     $ld_log_arg = shift;
229 }
230 sub __message {
231     @message_args = @_;
232     return 'message';
233 }