@@ -18,6 +18,7 @@ import (
1818 "golang.org/x/text/transform"
1919
2020 "github.com/aws/amazon-cloudwatch-agent/internal/state"
21+ "github.com/aws/amazon-cloudwatch-agent/internal/state/statetest"
2122 "github.com/aws/amazon-cloudwatch-agent/logs"
2223)
2324
@@ -571,7 +572,7 @@ func TestLogsMultilineTimeout(t *testing.T) {
571572func TestLogsFileTruncate (t * testing.T ) {
572573 multilineWaitPeriod = 10 * time .Millisecond
573574 lineBeforeFileTruncate := "lineBeforeFileTruncate"
574- lineAfterFileTruncate := "lineAfterFileTruncate "
575+ lineAfterFileTruncate := "afterTruncate "
575576
576577 tmpfile , err := createTempFile ("" , "" )
577578 defer os .Remove (tmpfile .Name ())
@@ -589,9 +590,17 @@ func TestLogsFileTruncate(t *testing.T) {
589590 }
590591
591592 lsrc := lsrcs [0 ]
593+ ts , ok := lsrc .(* tailerSrc )
594+ assert .True (t , ok )
595+ sink := statetest .NewFileManagerSink (ts .stateManager )
596+ ts .stateManager = sink
597+
592598 evts := make (chan logs.LogEvent )
593599 lsrc .SetOutput (func (e logs.LogEvent ) {
594- evts <- e
600+ if e != nil {
601+ e .Done ()
602+ evts <- e
603+ }
595604 })
596605
597606 go func () {
@@ -620,6 +629,73 @@ func TestLogsFileTruncate(t *testing.T) {
620629
621630 lsrc .Stop ()
622631 tt .Stop ()
632+
633+ got := sink .GetSink ()
634+ assert .Len (t , got , 2 )
635+ assert .EqualValues (t , 0 , got [0 ].SequenceNumber ())
636+ assert .EqualValues (t , 1 , got .Last ().SequenceNumber ())
637+ }
638+
639+ func TestLogsFileTruncateRestart (t * testing.T ) {
640+ logEntryString := "postTruncateRestart"
641+ multilineWaitPeriod = 10 * time .Millisecond
642+
643+ tmpfile , err := createTempFile ("" , "" )
644+ defer os .Remove (tmpfile .Name ())
645+ require .NoError (t , err )
646+
647+ stateDir , err := os .MkdirTemp ("" , "state" )
648+ require .NoError (t , err )
649+ defer os .Remove (stateDir )
650+
651+ stateFileName := state .FilePath (stateDir , tmpfile .Name ())
652+ stateFile , err := os .OpenFile (stateFileName , os .O_RDWR | os .O_CREATE | os .O_EXCL , 0600 )
653+ require .NoError (t , err )
654+ defer os .Remove (stateFileName )
655+
656+ _ , err = stateFile .WriteString ("1000" )
657+ require .NoError (t , err )
658+
659+ _ , err = tmpfile .WriteString (logEntryString + "\n " )
660+ require .NoError (t , err )
661+
662+ tt := NewLogFile ()
663+ tt .FileStateFolder = stateDir
664+ tt .Log = TestLogger {t }
665+ tt .FileConfig = []FileConfig {{FilePath : tmpfile .Name (), FromBeginning : true }}
666+ tt .FileConfig [0 ].init ()
667+ tt .started = true
668+
669+ lsrcs := tt .FindLogSrc ()
670+ if len (lsrcs ) != 1 {
671+ t .Fatalf ("%v log src was returned when 1 should be available" , len (lsrcs ))
672+ }
673+
674+ lsrc := lsrcs [0 ]
675+ ts , ok := lsrc .(* tailerSrc )
676+ assert .True (t , ok )
677+ sink := statetest .NewFileManagerSink (ts .stateManager )
678+ ts .stateManager = sink
679+
680+ evts := make (chan logs.LogEvent )
681+ lsrc .SetOutput (func (e logs.LogEvent ) {
682+ if e != nil {
683+ e .Done ()
684+ evts <- e
685+ }
686+ })
687+
688+ e := <- evts
689+ if e .Message () != logEntryString {
690+ t .Errorf ("Wrong log found after offset: \n %v\n Expecting:\n %v\n " , e .Message (), logEntryString )
691+ }
692+
693+ lsrc .Stop ()
694+ tt .Stop ()
695+
696+ got := sink .GetSink ()
697+ assert .Len (t , got , 1 )
698+ assert .EqualValues (t , 1 , got .Last ().SequenceNumber ())
623699}
624700
625701func TestLogsFileWithOffset (t * testing.T ) {
0 commit comments