]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/newsyslog/tests/legacy_test.sh
crunchgen: fix NULL-deref bug introduced in r364647
[FreeBSD/FreeBSD.git] / usr.sbin / newsyslog / tests / legacy_test.sh
1 #!/bin/sh
2
3 # $FreeBSD$
4
5 # A regular expression matching the format of an RFC-5424 log line header,
6 # including the timestamp up through the seconds indicator; it does not include
7 # the (optional) timezone offset.
8 RFC5424_FMT='^<[0-9][0-9]*>1 [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}'
9
10 # A regular expression matching the format of an RFC-3164 (traditional syslog)
11 # log line header, including the timestamp.
12 RFC3164_FMT='^[A-Z][a-z]{2} [ 0-9][0-9] [0-9]{2}:[0-9]{2}:[0-9]{2}'
13
14 COUNT=0
15 TMPDIR=$(pwd)/work
16 if [ $? -ne 0 ]; then
17         echo "$0: Can't create temp dir, exiting..."
18         exit 1
19 fi
20
21 # Begin an individual test
22 begin()
23 {
24         COUNT=`expr $COUNT + 1`
25         OK=1
26         NAME="$1"
27 }
28
29 # End an individual test
30 end()
31 {
32         local message
33
34         if [ $OK = 1 ]
35         then
36                 message='ok '
37         else
38                 message='not ok '
39         fi
40
41         message="$message $COUNT - $NAME"
42         if [ -n "$TODO" ]
43         then
44                 message="$message # TODO $TODO"
45         fi
46
47         echo "$message"
48 }
49
50 # Make a file that can later be verified
51 mkf()
52 {
53         CN=`basename $1`
54         echo "$CN-$CN" >$1
55 }
56
57 # Verify that the file specified is correct
58 ckf()
59 {
60         if [ -f $2 ] && echo "$1-$1" | diff - $2 >/dev/null
61         then
62                 ok
63         else
64                 notok
65         fi
66 }
67
68 # Check that a file exists
69 ckfe()
70 {
71         if [ -f $1 ]
72         then
73                 ok
74         else
75                 notok
76         fi
77 }
78
79 # Verify that the specified file does not exist
80 # (is not there)
81 cknt()
82 {
83         if [ -r $1 ]
84         then
85                 notok
86         else
87                 ok
88         fi
89 }
90
91 # Check if a file is there, depending of if it's supposed to or not -
92 # basically how many log files we are supposed to keep vs. how many we
93 # actually keep.
94 ckntfe()
95 {
96         curcnt=$1
97         keepcnt=$2
98         f=$3
99
100         if [ $curcnt -le $keepcnt ]
101         then
102                 #echo Assuming file there
103                 ckfe $f
104         else
105                 #echo Assuming file NOT there
106                 cknt $f
107         fi
108 }
109
110 # Verify that the specified file has RFC-5424 rotation messages.
111 ckrfc5424()
112 {
113         local lc=$(wc -l $1 | cut -w -f2)
114         local rc=$(grep -cE "${RFC5424_FMT}" $1)
115         if [ "$lc" -eq 0 -o "$rc" -eq 0 -o "$lc" -ne "$rc" ]
116         then
117                 notok
118         else
119                 ok
120         fi
121 }
122
123
124 # Verify that the specified file has RFC-3164 rotation messages.
125 ckrfc3164()
126 {
127         local lc=$(wc -l $1 | cut -w -f2)
128         local rc=$(grep -cE "${RFC3164_FMT}" $1)
129         if [ "$lc" -eq 0 -o "$rc" -eq 0 -o "$lc" -ne "$rc" ]
130         then
131                 notok
132         else
133                 ok
134         fi
135 }
136
137
138 # A part of a test succeeds
139 ok()
140 {
141         :
142 }
143
144 # A part of a test fails
145 notok()
146 {
147         OK=0
148 }
149
150 # Verify that the exit code passed is for unsuccessful termination
151 ckfail()
152 {
153         if [ $1 -gt 0 ]
154         then
155                 ok
156         else
157                 notok
158         fi
159 }
160
161 # Verify that the exit code passed is for successful termination
162 ckok()
163 {
164         if [ $1 -eq 0 ]
165         then
166                 ok
167         else
168                 notok
169         fi
170 }
171
172 # Check that there are X files which match expr
173 chkfcnt()
174 {
175         cnt=$1; shift
176         if [ $cnt -eq `echo "$@" | wc -w` ]
177         then
178                 ok
179         else
180                 notok
181         fi
182 }
183
184 # Check that two strings are alike
185 ckstr()
186 {
187         if [ "$1" = "$2" ]
188         then
189                 ok
190         else
191                 notok
192         fi
193 }
194
195 tmpdir_create()
196 {
197         rm -rf ${TMPDIR}/log ${TMPDIR}/alog
198         mkdir ${TMPDIR}/log ${TMPDIR}/alog
199         cd ${TMPDIR}/log
200 }
201
202 tmpdir_clean()
203 {
204         cd ${TMPDIR}
205         rm -rf "${TMPDIR}/log" "${TMPDIR}/alog" newsyslog.conf
206 }
207
208 run_newsyslog()
209 {
210
211         newsyslog -f ../newsyslog.conf -F -r "$@"
212 }
213
214 tests_normal_rotate() {
215         local dir ext name_postfix newsyslog_args
216
217         ext="$1"
218         dir="$2"
219
220         if [ -n "$dir" ]; then
221                 newsyslog_args=" -a ${dir}"
222                 name_postfix="${ext} archive dir"
223         else
224                 newsyslog_args=""
225                 name_postfix="${ext}"
226         fi
227
228         tmpdir_create
229
230         begin "create file ${name_postfix}" -newdir
231         run_newsyslog -C
232         ckfe $LOGFNAME
233         cknt ${dir}${LOGFNAME}.0${ext}
234         end
235
236         begin "rotate normal 1 ${name_postfix}"
237         run_newsyslog $newsyslog_args
238         ckfe ${LOGFNAME}
239         ckfe ${dir}${LOGFNAME}.0${ext}
240         cknt ${dir}${LOGFNAME}.1${ext}
241         end
242
243         begin "rotate normal 2 ${name_postfix}"
244         run_newsyslog $newsyslog_args
245         ckfe ${LOGFNAME}
246         ckfe ${dir}${LOGFNAME}.0${ext}
247         ckfe ${dir}${LOGFNAME}.1${ext}
248         cknt ${dir}${LOGFNAME}.2${ext}
249         end
250
251         begin "rotate normal 3 ${name_postfix}"
252         run_newsyslog $newsyslog_args
253         ckfe ${LOGFNAME}
254         ckfe ${dir}${LOGFNAME}.0${ext}
255         ckfe ${dir}${LOGFNAME}.1${ext}
256         ckfe ${dir}${LOGFNAME}.2${ext}
257         cknt ${dir}${LOGFNAME}.3${ext}
258         end
259
260         begin "rotate normal 4 ${name_postfix}"
261         run_newsyslog $newsyslog_args
262         ckfe ${LOGFNAME}
263         ckfe ${dir}${LOGFNAME}.0${ext}
264         ckfe ${dir}${LOGFNAME}.1${ext}
265         ckfe ${dir}${LOGFNAME}.2${ext}
266         cknt ${dir}${LOGFNAME}.4${ext}
267         end
268
269         begin "rotate normal 5 ${name_postfix}"
270         run_newsyslog $newsyslog_args
271         ckfe ${LOGFNAME}
272         ckfe ${dir}${LOGFNAME}.0${ext}
273         ckfe ${dir}${LOGFNAME}.1${ext}
274         ckfe ${dir}${LOGFNAME}.2${ext}
275         cknt ${dir}${LOGFNAME}.4${ext}
276         end
277
278         # Wait a bit so we can see if the noaction test rotates files
279         sleep 1.1
280
281         begin "noaction ${name_postfix}"
282         ofiles=`ls -Tl ${dir}${LOGFNAME}.*${ext} | tr -d '\n'`
283         run_newsyslog ${newsyslog_args} -n >/dev/null
284         ckfe ${LOGFNAME}
285         ckstr "$ofiles" "`ls -lT ${dir}${LOGFNAME}.*${ext} | tr -d '\n'`"
286         end
287
288         tmpdir_clean
289 }
290
291 tests_normal_rotate_keepn() {
292         local cnt dir ext name_postfix newsyslog_args
293
294         cnt="$1"
295         ext="$2"
296         dir="$3"
297
298         if [ -n "$dir" ]; then
299                 newsyslog_args=" -a ${dir}"
300                 name_postfix="${ext} archive dir"
301         else
302                 newsyslog_args=""
303                 name_postfix="${ext}"
304         fi
305
306         tmpdir_create
307
308         begin "create file ${name_postfix}" -newdir
309         run_newsyslog -C
310         ckfe $LOGFNAME
311         cknt ${dir}${LOGFNAME}.0${ext}
312         end
313
314         begin "rotate normal 1 cnt=$cnt ${name_postfix}"
315         run_newsyslog $newsyslog_args
316         ckfe ${LOGFNAME}
317         ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext}
318         cknt ${dir}${LOGFNAME}.1${ext}
319         end
320
321         begin "rotate normal 2 cnt=$cnt ${name_postfix}"
322         run_newsyslog $newsyslog_args
323         ckfe ${LOGFNAME}
324         ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext}
325         ckntfe 2 $cnt ${dir}${LOGFNAME}.1${ext}
326         cknt ${dir}${LOGFNAME}.2${ext}
327         end
328
329         begin "rotate normal 3 cnt=$cnt ${name_postfix}"
330         run_newsyslog $newsyslog_args
331         ckfe ${LOGFNAME}
332         ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext}
333         ckntfe 2 $cnt ${dir}${LOGFNAME}.1${ext}
334         ckntfe 3 $cnt ${dir}${LOGFNAME}.2${ext}
335         cknt ${dir}${LOGFNAME}.3${ext}
336         end
337
338         begin "rotate normal 3 cnt=$cnt ${name_postfix}"
339         run_newsyslog $newsyslog_args
340         ckfe ${LOGFNAME}
341         ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext}
342         ckntfe 2 $cnt ${dir}${LOGFNAME}.1${ext}
343         ckntfe 3 $cnt ${dir}${LOGFNAME}.2${ext}
344         ckntfe 4 $cnt ${dir}${LOGFNAME}.3${ext}
345         cknt ${dir}${LOGFNAME}.4${ext}
346         end
347
348         # Wait a bit so we can see if the noaction test rotates files
349         sleep 1.1
350
351         begin "noaction ${name_postfix}"
352         osum=`md5 ${dir}${LOGFNAME} | tr -d '\n'`
353         run_newsyslog ${newsyslog_args} -n >/dev/null
354         ckfe ${LOGFNAME}
355         ckstr "$osum" "`md5 ${dir}${LOGFNAME} | tr -d '\n'`"
356         end
357
358         tmpdir_clean
359 }
360
361 tests_time_rotate() {
362         local dir ext name_postfix newsyslog_args
363
364         ext="$1"
365         dir="$2"
366
367         if [ -n "$dir" ]; then
368                 newsyslog_args="-t DEFAULT -a ${dir}"
369                 name_postfix="${ext} archive dir"
370         else
371                 newsyslog_args="-t DEFAULT"
372                 name_postfix="${ext}"
373         fi
374
375         tmpdir_create
376
377         begin "create file ${name_postfix}" -newdir
378         run_newsyslog -C ${newsyslog_args}
379         ckfe ${LOGFNAME}
380         end
381
382         begin "rotate time 1 ${name_postfix}"
383         run_newsyslog ${newsyslog_args}
384         ckfe ${LOGFNAME}
385         chkfcnt 1 ${dir}${LOGFNAME}.*${ext}
386         end
387
388         sleep 1.1
389
390         begin "rotate time 2 ${name_postfix}"
391         run_newsyslog ${newsyslog_args}
392         ckfe ${LOGFNAME}
393         chkfcnt 2 ${dir}${LOGFNAME}.*${ext}
394         end
395
396         sleep 1.1
397
398         begin "rotate time 3 ${name_postfix}"
399         run_newsyslog ${newsyslog_args}
400         ckfe ${LOGFNAME}
401         chkfcnt 3 ${dir}${LOGFNAME}.*${ext}
402         end
403
404         sleep 1.1
405
406         begin "rotate time 4 ${name_postfix}"
407         run_newsyslog ${newsyslog_args}
408         ckfe ${LOGFNAME}
409         chkfcnt 3 ${dir}${LOGFNAME}.*${ext}
410         end
411
412         begin "noaction ${name_postfix}"
413         ofiles=`ls -1 ${dir}${LOGFNAME}.*${ext} | tr -d '\n'`
414         run_newsyslog ${newsyslog_args} -n >/dev/null
415         ckfe ${LOGFNAME}
416         ckstr "$ofiles" "`ls -1 ${dir}${LOGFNAME}.*${ext} | tr -d '\n'`"
417         end
418
419         tmpdir_clean
420 }
421
422 tests_rfc5424() {
423         local dir ext name_postfix newsyslog_args
424
425         ext="$1"
426         dir="$2"
427
428         if [ -n "$dir" ]; then
429                 newsyslog_args=" -a ${dir}"
430                 name_postfix="${ext} archive dir"
431         else
432                 newsyslog_args=""
433                 name_postfix="${ext}"
434         fi
435
436         tmpdir_create
437
438         begin "RFC-5424 - create file ${name_postfix}" -newdir
439         run_newsyslog -C
440         ckfe $LOGFNAME
441         cknt ${dir}${LOGFNAME}.0${ext}
442         ckfe $LOGFNAME5424
443         cknt ${dir}${LOGFNAME5424}.0${ext}
444         ckrfc3164 ${LOGFNAME}
445         ckrfc5424 ${LOGFNAME5424}
446         end
447
448         begin "RFC-5424 - rotate normal 1 ${name_postfix}"
449         run_newsyslog $newsyslog_args
450         ckfe ${LOGFNAME}
451         ckfe ${dir}${LOGFNAME}.0${ext}
452         ckfe $LOGFNAME5424
453         ckfe ${dir}${LOGFNAME5424}.0${ext}
454         ckrfc3164 ${LOGFNAME}
455         ckrfc3164 ${dir}${LOGFNAME}.0${ext}
456         ckrfc5424 ${LOGFNAME5424}
457         ckrfc5424 ${dir}${LOGFNAME5424}.0${ext}
458         end
459
460         tmpdir_clean
461 }
462
463 tests_p_flag_rotate() {
464         local ext
465
466         ext="$1"
467
468         tmpdir_create
469
470         begin "create file"
471         run_newsyslog -C
472         ckfe $LOGFNAME
473         cknt ${LOGFNAME}.0
474         cknt ${LOGFNAME}.0${ext}
475         end
476
477         begin "rotate p flag 1 ${ext}"
478         run_newsyslog
479         ckfe $LOGFNAME
480         ckfe ${LOGFNAME}.0
481         cknt ${LOGFNAME}.0${ext}
482         run_newsyslog
483         ckfe $LOGFNAME
484         ckfe ${LOGFNAME}.0
485         cknt ${LOGFNAME}.0${ext}
486         ckfe ${LOGFNAME}.1${ext}
487         run_newsyslog
488         ckfe $LOGFNAME
489         ckfe ${LOGFNAME}.0
490         cknt ${LOGFNAME}.0${ext}
491         ckfe ${LOGFNAME}.1${ext}
492         ckfe ${LOGFNAME}.2${ext}
493         end
494
495         tmpdir_clean
496 }
497
498 tests_normal_rotate_recompress() {
499         local ext
500
501         ext=".gz"
502
503         tmpdir_create
504
505         begin "create file recompress"
506         run_newsyslog -C
507         ckfe $LOGFNAME
508         cknt ${LOGFNAME}.0${ext}
509         end
510
511         begin "rotate normal 1"
512         run_newsyslog
513         ckfe $LOGFNAME
514         ckfe ${LOGFNAME}.0${ext}
515         cknt ${LOGFNAME}.1${ext}
516         end
517
518         begin "rotate recompress 1"
519         gunzip ${LOGFNAME}.0${ext}
520         ckfe ${LOGFNAME}.0
521         cknt ${LOGFNAME}.0${ext}
522         run_newsyslog
523         ckfe $LOGFNAME
524         ckfe ${LOGFNAME}.0${ext}
525         ckfe ${LOGFNAME}.1${ext}
526         end
527 }
528
529 echo 1..185
530 mkdir -p ${TMPDIR}
531 cd ${TMPDIR}
532
533 LOGFNAME=foo.log
534 LOGFPATH=${TMPDIR}/log/${LOGFNAME}
535
536 # Log file for RFC-5424 testing
537 LOGFNAME5424=foo5424.log
538 LOGFPATH5424=${TMPDIR}/log/${LOGFNAME5424}
539
540 # Normal, no archive dir, keep X files
541 echo "$LOGFPATH 640  0     *    @T00  NC" > newsyslog.conf
542 tests_normal_rotate_keepn 0
543
544 echo "$LOGFPATH 640  1     *    @T00  NC" > newsyslog.conf
545 tests_normal_rotate_keepn 1
546
547 echo "$LOGFPATH 640  2     *    @T00  NC" > newsyslog.conf
548 tests_normal_rotate_keepn 2
549
550 echo "$LOGFPATH 640  3     *    @T00  NC" > newsyslog.conf
551 tests_normal_rotate_keepn 3
552
553 # Normal, no archive dir, keep X files, gz
554 echo "$LOGFPATH 640  0     *    @T00  NCZ" > newsyslog.conf
555 tests_normal_rotate_keepn 0 ".gz"
556
557 echo "$LOGFPATH 640  1     *    @T00  NCZ" > newsyslog.conf
558 tests_normal_rotate_keepn 1 ".gz"
559
560 echo "$LOGFPATH 640  2     *    @T00  NCZ" > newsyslog.conf
561 tests_normal_rotate_keepn 2 ".gz"
562
563 echo "$LOGFPATH 640  3     *    @T00  NCZ" > newsyslog.conf
564 tests_normal_rotate_keepn 3 ".gz"
565
566 # Normal, no archive dir
567 echo "$LOGFPATH 640  3     *    @T00  NC" > newsyslog.conf
568 tests_normal_rotate
569
570 echo "$LOGFPATH 640  3     *    @T00  NCZ" > newsyslog.conf
571 tests_normal_rotate ".gz"
572
573 echo "$LOGFPATH 640  3     *    @T00  NCJ" > newsyslog.conf
574 tests_normal_rotate ".bz2"
575
576 echo "$LOGFPATH 640  3     *    @T00  NCX" > newsyslog.conf
577 tests_normal_rotate ".xz"
578
579 echo "$LOGFPATH 640  3     *    @T00  NCY" > newsyslog.conf
580 tests_normal_rotate ".zst"
581
582 # Normal, archive dir
583 echo "$LOGFPATH 640  3     *    @T00  NC" > newsyslog.conf
584 tests_normal_rotate "" "${TMPDIR}/alog/"
585
586 echo "$LOGFPATH 640  3     *    @T00  NCZ" > newsyslog.conf
587 tests_normal_rotate ".gz" "${TMPDIR}/alog/"
588
589 echo "$LOGFPATH 640  3     *    @T00  NCJ" > newsyslog.conf
590 tests_normal_rotate ".bz2" "${TMPDIR}/alog/"
591
592 echo "$LOGFPATH 640  3     *    @T00  NCX" > newsyslog.conf
593 tests_normal_rotate ".xz" "${TMPDIR}/alog/"
594
595 echo "$LOGFPATH 640  3     *    @T00  NCY" > newsyslog.conf
596 tests_normal_rotate ".zst" "${TMPDIR}/alog/"
597
598 # Time based, no archive dir
599 echo "$LOGFPATH 640  3     *    @T00  NC" > newsyslog.conf
600 tests_time_rotate
601
602 echo "$LOGFPATH 640  3     *    @T00  NCZ" > newsyslog.conf
603 tests_time_rotate "gz" ""
604
605 echo "$LOGFPATH 640  3     *    @T00  NCJ" > newsyslog.conf
606 tests_time_rotate "bz2" ""
607
608 echo "$LOGFPATH 640  3     *    @T00  NCX" > newsyslog.conf
609 tests_time_rotate "xz" ""
610
611 echo "$LOGFPATH 640  3     *    @T00  NCY" > newsyslog.conf
612 tests_time_rotate "zst" ""
613
614 # Time based, archive dir
615 echo "$LOGFPATH 640  3     *    @T00  NC" > newsyslog.conf
616 tests_time_rotate "" "${TMPDIR}/alog/"
617
618 echo "$LOGFPATH 640  3     *    @T00  NCZ" > newsyslog.conf
619 tests_time_rotate "gz" "${TMPDIR}/alog/"
620
621 echo "$LOGFPATH 640  3     *    @T00  NCJ" > newsyslog.conf
622 tests_time_rotate "bz2" "${TMPDIR}/alog/"
623
624 echo "$LOGFPATH 640  3     *    @T00  NCX" > newsyslog.conf
625 tests_time_rotate "xz" "${TMPDIR}/alog/"
626
627 echo "$LOGFPATH 640  3     *    @T00  NCY" > newsyslog.conf
628 tests_time_rotate "zst" "${TMPDIR}/alog/"
629
630 # RFC-5424; Normal, no archive dir
631 echo "$LOGFPATH5424     640  3     *    @T00  NCT" > newsyslog.conf
632 echo "$LOGFPATH 640  3     *    @T00  NC" >> newsyslog.conf
633 tests_rfc5424
634
635 echo "$LOGFPATH 640  3     *    @T00  NCpZ" > newsyslog.conf
636 tests_p_flag_rotate ".gz"
637
638 echo "$LOGFPATH 640  3     *    @T00  NCZ" > newsyslog.conf
639 tests_normal_rotate_recompress
640
641 rm -rf "${TMPDIR}"