#!/bin/bash
# written 2018-11-09 by Rainer Gerhards
# this test checks that 2GiB (31 bit) file size region is handled correctly
# it first generates a file that is 2GiB-64 bytes, processes it, and then
# adds a couple of messages to get it over 2GiB.
# This is part of the rsyslog testbench, licensed under ASL 2.0
. ${srcdir:=.}/diag.sh init
export TB_TEST_MAX_RUNTIME=3600 # test is very slow as it works on large files
generate_conf
add_conf '
module(load="../plugins/imfile/.libs/imfile")
input(type="imfile" File="./'$RSYSLOG_DYNNAME'.input" Tag="file:" reopenOnTruncate="on")

$template outfmt,"%msg:F,58:2%\n"
:msg, contains, "msgnum:" action(type="omfile" file="'$RSYSLOG_OUT_LOG'" template="outfmt")
'
touch $RSYSLOG_DYNNAME.input
startup

# initial file: 2GiB - 1 message (54 byte)
./inputfilegen -s 2147483584 -d47 -M $RSYSLOG_DYNNAME.msgcnt > $RSYSLOG_DYNNAME.input
ls -lh $RSYSLOG_DYNNAME.input
export NUMMESSAGES="$(cat $RSYSLOG_DYNNAME.msgcnt)"

wait_file_lines --delay 2500 --abort-on-oversize "$RSYSLOG_OUT_LOG" $NUMMESSAGES 3000

# add one message --> exactly 2GB
./inputfilegen -m1 -d47 -i$NUMMESSAGES>> $RSYSLOG_DYNNAME.input
ls -lh $RSYSLOG_DYNNAME.input
(( NUMMESSAGES++ ))
wait_file_lines --abort-on-oversize "$RSYSLOG_OUT_LOG" $NUMMESSAGES

# add one more message --> now we go over 2GB
./inputfilegen -m1 -d47 -i$NUMMESSAGES>> $RSYSLOG_DYNNAME.input
ls -lh $RSYSLOG_DYNNAME.input
(( NUMMESSAGES++ ))
wait_file_lines --abort-on-oversize "$RSYSLOG_OUT_LOG" $NUMMESSAGES

# add even more messages
./inputfilegen -m10000 -d47 -i$NUMMESSAGES>> $RSYSLOG_DYNNAME.input
ls -lh $RSYSLOG_DYNNAME.input
NUMMESSAGES=$(( NUMMESSAGES + 10000 ))
wait_file_lines --abort-on-oversize "$RSYSLOG_OUT_LOG" $NUMMESSAGES

shutdown_when_empty
wait_shutdown
seq_check 0 $(( NUMMESSAGES - 1))
exit_test
