flamenco/internal/worker/log_chunker_test.go
Sybren A. Stüvel 9f5e4cc0cc License: license all code under "GPL-3.0-or-later"
The add-on code was copy-pasted from other addons and used the GPL v2
license, whereas by accident the LICENSE text file had the GNU "Affero" GPL
license v3 (instead of regular GPL v3).

This is now all streamlined, and all code is licensed as "GPL v3 or later".

Furthermore, the code comments just show a SPDX License Identifier
instead of an entire license block.
2022-03-07 15:26:46 +01:00

105 lines
2.7 KiB
Go

package worker
import (
"context"
"testing"
"time"
"github.com/benbjohnson/clock"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/assert"
"git.blender.org/flamenco/internal/worker/mocks"
)
// SPDX-License-Identifier: GPL-3.0-or-later
type LogChunkerMocks struct {
listener *mocks.MockCommandListener
clock *clock.Mock
}
func mockedLogChunker(t *testing.T, mockCtrl *gomock.Controller) (*LogChunker, *LogChunkerMocks) {
mocks := LogChunkerMocks{
clock: mockedClock(t),
listener: mocks.NewMockCommandListener(mockCtrl),
}
lc := NewLogChunker("taskID", mocks.listener, mocks.clock)
return lc, &mocks
}
func TestLogChunkerEmpty(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
lc, _ := mockedLogChunker(t, mockCtrl)
// Note: no call to mockListener is expected.
err := lc.Flush(context.Background())
assert.NoError(t, err)
assert.Equal(t, 0, lc.buffer.Len(), "buffer should be empty")
}
func TestLogChunkerSimple(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
lc, mocks := mockedLogChunker(t, mockCtrl)
ctx := context.Background()
mocks.listener.EXPECT().LogProduced(ctx, "taskID", "just one line\n")
err := lc.Append(ctx, "just one line")
assert.NoError(t, err)
err = lc.Flush(ctx)
assert.NoError(t, err)
assert.Equal(t, 0, lc.buffer.Len(), "buffer should be empty")
}
func TestLogChunkerMuchLogging(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
lc, mocks := mockedLogChunker(t, mockCtrl)
lc.bufferFlushSize = 12
ctx := context.Background()
err := lc.Append(ctx, "één regel") // 9 runes, 11 bytes, 12 with newline, within buffer size.
assert.NoError(t, err)
mocks.listener.EXPECT().LogProduced(ctx, "taskID", "één regel\nsecond line\n")
err = lc.Append(ctx, "second line") // this pushes the buffer over its max size.
assert.NoError(t, err)
assert.Equal(t, 0, lc.buffer.Len(), "buffer should be empty")
}
func TestLogChunkerTimedFlush(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
lc, mocks := mockedLogChunker(t, mockCtrl)
lc.flushAfter = 2 * time.Second
ctx := context.Background()
err := lc.Append(ctx, "één regel") // No flush yet
assert.NoError(t, err)
mocks.clock.Add(2000 * time.Millisecond) // Exactly the threshold
err = lc.Append(ctx, "second line") // No flush yet
assert.NoError(t, err)
mocks.clock.Add(1 * time.Millisecond) // Juuuuust a bit longer than the threshold.
mocks.listener.EXPECT().LogProduced(ctx, "taskID", "één regel\nsecond line\nthird line\n")
err = lc.Append(ctx, "third line") // This should flush due to the long wait.
assert.NoError(t, err)
assert.Equal(t, 0, lc.buffer.Len(), "buffer should be empty")
}