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.
8RFC5424_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.
12RFC3164_FMT='^[A-Z][a-z]{2} [ 0-9][0-9] [0-9]{2}:[0-9]{2}:[0-9]{2}'
13
14COUNT=0
15TMPDIR=$(pwd)/work
16if [ $? -ne 0 ]; then
17	echo "$0: Can't create temp dir, exiting..."
18	exit 1
19fi
20
21# Begin an individual test
22begin()
23{
24	COUNT=`expr $COUNT + 1`
25	OK=1
26	NAME="$1"
27}
28
29# End an individual test
30end()
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
51mkf()
52{
53	CN=`basename $1`
54	echo "$CN-$CN" >$1
55}
56
57# Verify that the file specified is correct
58ckf()
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
69ckfe()
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)
81cknt()
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.
94ckntfe()
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.
111ckrfc5424()
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.
125ckrfc3164()
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
139ok()
140{
141	:
142}
143
144# A part of a test fails
145notok()
146{
147	OK=0
148}
149
150# Verify that the exit code passed is for unsuccessful termination
151ckfail()
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
162ckok()
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
173chkfcnt()
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
185ckstr()
186{
187	if [ "$1" = "$2" ]
188	then
189		ok
190	else
191		notok
192	fi
193}
194
195tmpdir_create()
196{
197	mkdir -p ${TMPDIR}/log ${TMPDIR}/alog
198	cd ${TMPDIR}/log
199}
200
201tmpdir_clean()
202{
203	cd ${TMPDIR}
204	rm -rf "${TMPDIR}/log" "${TMPDIR}/alog" newsyslog.conf
205}
206
207run_newsyslog()
208{
209
210	newsyslog -f ../newsyslog.conf -F -r "$@"
211}
212
213tests_normal_rotate() {
214	ext="$1"
215	dir="$2"
216
217	if [ -n "$dir" ]; then
218		newsyslog_args=" -a ${dir}"
219		name_postfix="${ext} archive dir"
220	else
221		newsyslog_args=""
222		name_postfix="${ext}"
223	fi
224
225	tmpdir_create
226
227	begin "create file ${name_postfix}" -newdir
228	run_newsyslog -C
229	ckfe $LOGFNAME
230	cknt ${dir}${LOGFNAME}.0${ext}
231	end
232
233	begin "rotate normal 1 ${name_postfix}"
234	run_newsyslog $newsyslog_args
235	ckfe ${LOGFNAME}
236	ckfe ${dir}${LOGFNAME}.0${ext}
237	cknt ${dir}${LOGFNAME}.1${ext}
238	end
239
240	begin "rotate normal 2 ${name_postfix}"
241	run_newsyslog $newsyslog_args
242	ckfe ${LOGFNAME}
243	ckfe ${dir}${LOGFNAME}.0${ext}
244	ckfe ${dir}${LOGFNAME}.1${ext}
245	cknt ${dir}${LOGFNAME}.2${ext}
246	end
247
248	begin "rotate normal 3 ${name_postfix}"
249	run_newsyslog $newsyslog_args
250	ckfe ${LOGFNAME}
251	ckfe ${dir}${LOGFNAME}.0${ext}
252	ckfe ${dir}${LOGFNAME}.1${ext}
253	ckfe ${dir}${LOGFNAME}.2${ext}
254	cknt ${dir}${LOGFNAME}.3${ext}
255	end
256
257	begin "rotate normal 4 ${name_postfix}"
258	run_newsyslog $newsyslog_args
259	ckfe ${LOGFNAME}
260	ckfe ${dir}${LOGFNAME}.0${ext}
261	ckfe ${dir}${LOGFNAME}.1${ext}
262	ckfe ${dir}${LOGFNAME}.2${ext}
263	cknt ${dir}${LOGFNAME}.4${ext}
264	end
265
266	begin "rotate normal 5 ${name_postfix}"
267	run_newsyslog $newsyslog_args
268	ckfe ${LOGFNAME}
269	ckfe ${dir}${LOGFNAME}.0${ext}
270	ckfe ${dir}${LOGFNAME}.1${ext}
271	ckfe ${dir}${LOGFNAME}.2${ext}
272	cknt ${dir}${LOGFNAME}.4${ext}
273	end
274
275	# Wait a bit so we can see if the noaction test rotates files
276	sleep 1.1
277
278	begin "noaction ${name_postfix}"
279	ofiles=`ls -Tl ${dir}${LOGFNAME}.*${ext} | tr -d '\n'`
280	run_newsyslog ${newsyslog_args} -n >/dev/null
281	ckfe ${LOGFNAME}
282	ckstr "$ofiles" "`ls -lT ${dir}${LOGFNAME}.*${ext} | tr -d '\n'`"
283	end
284
285	tmpdir_clean
286}
287
288tests_normal_rotate_keepn() {
289	cnt="$1"
290	ext="$2"
291	dir="$3"
292
293	if [ -n "$dir" ]; then
294		newsyslog_args=" -a ${dir}"
295		name_postfix="${ext} archive dir"
296	else
297		newsyslog_args=""
298		name_postfix="${ext}"
299	fi
300
301	tmpdir_create
302
303	begin "create file ${name_postfix}" -newdir
304	run_newsyslog -C
305	ckfe $LOGFNAME
306	cknt ${dir}${LOGFNAME}.0${ext}
307	end
308
309	begin "rotate normal 1 cnt=$cnt ${name_postfix}"
310	run_newsyslog $newsyslog_args
311	ckfe ${LOGFNAME}
312	ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext}
313	cknt ${dir}${LOGFNAME}.1${ext}
314	end
315
316	begin "rotate normal 2 cnt=$cnt ${name_postfix}"
317	run_newsyslog $newsyslog_args
318	ckfe ${LOGFNAME}
319	ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext}
320	ckntfe 2 $cnt ${dir}${LOGFNAME}.1${ext}
321	cknt ${dir}${LOGFNAME}.2${ext}
322	end
323
324	begin "rotate normal 3 cnt=$cnt ${name_postfix}"
325	run_newsyslog $newsyslog_args
326	ckfe ${LOGFNAME}
327	ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext}
328	ckntfe 2 $cnt ${dir}${LOGFNAME}.1${ext}
329	ckntfe 3 $cnt ${dir}${LOGFNAME}.2${ext}
330	cknt ${dir}${LOGFNAME}.3${ext}
331	end
332
333	begin "rotate normal 3 cnt=$cnt ${name_postfix}"
334	run_newsyslog $newsyslog_args
335	ckfe ${LOGFNAME}
336	ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext}
337	ckntfe 2 $cnt ${dir}${LOGFNAME}.1${ext}
338	ckntfe 3 $cnt ${dir}${LOGFNAME}.2${ext}
339	ckntfe 4 $cnt ${dir}${LOGFNAME}.3${ext}
340	cknt ${dir}${LOGFNAME}.4${ext}
341	end
342
343	# Wait a bit so we can see if the noaction test rotates files
344	sleep 1.1
345
346	begin "noaction ${name_postfix}"
347	osum=`md5 ${dir}${LOGFNAME} | tr -d '\n'`
348	run_newsyslog ${newsyslog_args} -n >/dev/null
349	ckfe ${LOGFNAME}
350	ckstr "$osum" "`md5 ${dir}${LOGFNAME} | tr -d '\n'`"
351	end
352
353	tmpdir_clean
354}
355
356tests_time_rotate() {
357	ext="$1"
358	dir="$2"
359
360	if [ -n "$dir" ]; then
361		newsyslog_args="-t DEFAULT -a ${dir}"
362		name_postfix="${ext} archive dir"
363	else
364		newsyslog_args="-t DEFAULT"
365		name_postfix="${ext}"
366	fi
367
368	tmpdir_create
369
370	begin "create file ${name_postfix}" -newdir
371	run_newsyslog -C ${newsyslog_args}
372	ckfe ${LOGFNAME}
373	end
374
375	begin "rotate time 1 ${name_postfix}"
376	run_newsyslog ${newsyslog_args}
377	ckfe ${LOGFNAME}
378	chkfcnt 1 ${dir}${LOGFNAME}.*${ext}
379	end
380
381	sleep 1.1
382
383	begin "rotate time 2 ${name_postfix}"
384	run_newsyslog ${newsyslog_args}
385	ckfe ${LOGFNAME}
386	chkfcnt 2 ${dir}${LOGFNAME}.*${ext}
387	end
388
389	sleep 1.1
390
391	begin "rotate time 3 ${name_postfix}"
392	run_newsyslog ${newsyslog_args}
393	ckfe ${LOGFNAME}
394	chkfcnt 3 ${dir}${LOGFNAME}.*${ext}
395	end
396
397	sleep 1.1
398
399	begin "rotate time 4 ${name_postfix}"
400	run_newsyslog ${newsyslog_args}
401	ckfe ${LOGFNAME}
402	chkfcnt 3 ${dir}${LOGFNAME}.*${ext}
403	end
404
405	begin "noaction ${name_postfix}"
406	ofiles=`ls -1 ${dir}${LOGFNAME}.*${ext} | tr -d '\n'`
407	run_newsyslog ${newsyslog_args} -n >/dev/null
408	ckfe ${LOGFNAME}
409	ckstr "$ofiles" "`ls -1 ${dir}${LOGFNAME}.*${ext} | tr -d '\n'`"
410	end
411
412	tmpdir_clean
413}
414
415tests_rfc5424() {
416	ext="$1"
417	dir="$2"
418
419	if [ -n "$dir" ]; then
420		newsyslog_args=" -a ${dir}"
421		name_postfix="${ext} archive dir"
422	else
423		newsyslog_args=""
424		name_postfix="${ext}"
425	fi
426
427	tmpdir_create
428
429	begin "RFC-5424 - create file ${name_postfix}" -newdir
430	run_newsyslog -C
431	ckfe $LOGFNAME
432	cknt ${dir}${LOGFNAME}.0${ext}
433	ckfe $LOGFNAME5424
434	cknt ${dir}${LOGFNAME5424}.0${ext}
435	ckrfc3164 ${LOGFNAME}
436	ckrfc5424 ${LOGFNAME5424}
437	end
438
439	begin "RFC-5424 - rotate normal 1 ${name_postfix}"
440	run_newsyslog $newsyslog_args
441	ckfe ${LOGFNAME}
442	ckfe ${dir}${LOGFNAME}.0${ext}
443	ckfe $LOGFNAME5424
444	ckfe ${dir}${LOGFNAME5424}.0${ext}
445	ckrfc3164 ${LOGFNAME}
446	ckrfc3164 ${dir}${LOGFNAME}.0${ext}
447	ckrfc5424 ${LOGFNAME5424}
448	ckrfc5424 ${dir}${LOGFNAME5424}.0${ext}
449	end
450
451	tmpdir_clean
452}
453
454echo 1..180
455mkdir -p ${TMPDIR}
456cd ${TMPDIR}
457
458LOGFNAME=foo.log
459LOGFPATH=${TMPDIR}/log/${LOGFNAME}
460
461# Log file for RFC-5424 testing
462LOGFNAME5424=foo5424.log
463LOGFPATH5424=${TMPDIR}/log/${LOGFNAME5424}
464
465# Normal, no archive dir, keep X files
466echo "$LOGFPATH	640  0	   *	@T00  NC" > newsyslog.conf
467tests_normal_rotate_keepn 0
468
469echo "$LOGFPATH	640  1	   *	@T00  NC" > newsyslog.conf
470tests_normal_rotate_keepn 1
471
472echo "$LOGFPATH	640  2	   *	@T00  NC" > newsyslog.conf
473tests_normal_rotate_keepn 2
474
475echo "$LOGFPATH	640  3	   *	@T00  NC" > newsyslog.conf
476tests_normal_rotate_keepn 3
477
478# Normal, no archive dir, keep X files, gz
479echo "$LOGFPATH	640  0	   *	@T00  NCZ" > newsyslog.conf
480tests_normal_rotate_keepn 0 ".gz"
481
482echo "$LOGFPATH	640  1	   *	@T00  NCZ" > newsyslog.conf
483tests_normal_rotate_keepn 1 ".gz"
484
485echo "$LOGFPATH	640  2	   *	@T00  NCZ" > newsyslog.conf
486tests_normal_rotate_keepn 2 ".gz"
487
488echo "$LOGFPATH	640  3	   *	@T00  NCZ" > newsyslog.conf
489tests_normal_rotate_keepn 3 ".gz"
490
491# Normal, no archive dir
492echo "$LOGFPATH	640  3	   *	@T00  NC" > newsyslog.conf
493tests_normal_rotate
494
495echo "$LOGFPATH	640  3	   *	@T00  NCZ" > newsyslog.conf
496tests_normal_rotate ".gz"
497
498echo "$LOGFPATH	640  3	   *	@T00  NCJ" > newsyslog.conf
499tests_normal_rotate ".bz2"
500
501echo "$LOGFPATH	640  3	   *	@T00  NCX" > newsyslog.conf
502tests_normal_rotate ".xz"
503
504echo "$LOGFPATH	640  3	   *	@T00  NCY" > newsyslog.conf
505tests_normal_rotate ".zst"
506
507# Normal, archive dir
508echo "$LOGFPATH	640  3	   *	@T00  NC" > newsyslog.conf
509tests_normal_rotate "" "${TMPDIR}/alog/"
510
511echo "$LOGFPATH	640  3	   *	@T00  NCZ" > newsyslog.conf
512tests_normal_rotate ".gz" "${TMPDIR}/alog/"
513
514echo "$LOGFPATH	640  3	   *	@T00  NCJ" > newsyslog.conf
515tests_normal_rotate ".bz2" "${TMPDIR}/alog/"
516
517echo "$LOGFPATH	640  3	   *	@T00  NCX" > newsyslog.conf
518tests_normal_rotate ".xz" "${TMPDIR}/alog/"
519
520echo "$LOGFPATH	640  3	   *	@T00  NCY" > newsyslog.conf
521tests_normal_rotate ".zst" "${TMPDIR}/alog/"
522
523# Time based, no archive dir
524echo "$LOGFPATH	640  3	   *	@T00  NC" > newsyslog.conf
525tests_time_rotate
526
527echo "$LOGFPATH	640  3	   *	@T00  NCZ" > newsyslog.conf
528tests_time_rotate "gz" ""
529
530echo "$LOGFPATH	640  3	   *	@T00  NCJ" > newsyslog.conf
531tests_time_rotate "bz2" ""
532
533echo "$LOGFPATH	640  3	   *	@T00  NCX" > newsyslog.conf
534tests_time_rotate "xz" ""
535
536echo "$LOGFPATH	640  3	   *	@T00  NCY" > newsyslog.conf
537tests_time_rotate "zst" ""
538
539# Time based, archive dir
540echo "$LOGFPATH	640  3	   *	@T00  NC" > newsyslog.conf
541tests_time_rotate "" "${TMPDIR}/alog/"
542
543echo "$LOGFPATH	640  3	   *	@T00  NCZ" > newsyslog.conf
544tests_time_rotate "gz" "${TMPDIR}/alog/"
545
546echo "$LOGFPATH	640  3	   *	@T00  NCJ" > newsyslog.conf
547tests_time_rotate "bz2" "${TMPDIR}/alog/"
548
549echo "$LOGFPATH	640  3	   *	@T00  NCX" > newsyslog.conf
550tests_time_rotate "xz" "${TMPDIR}/alog/"
551
552echo "$LOGFPATH	640  3	   *	@T00  NCY" > newsyslog.conf
553tests_time_rotate "zst" "${TMPDIR}/alog/"
554
555# RFC-5424; Normal, no archive dir
556echo "$LOGFPATH5424	640  3	   *	@T00  NCT" > newsyslog.conf
557echo "$LOGFPATH	640  3	   *	@T00  NC" >> newsyslog.conf
558tests_rfc5424
559
560rm -rf "${TMPDIR}"
561