// SPDX-License-Identifier: Apache-2.0 // Copyright Authors of K9s package view import ( "fmt" "testing" "github.com/derailed/k9s/internal/client" "github.com/derailed/k9s/internal/dao" "github.com/derailed/k9s/internal/ui" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestLogAutoScroll(t *testing.T) { opts := dao.LogOptions{ Path: "fred/p1", Container: "blee", SingleContainer: true, } v := NewLog(client.PodGVR, &opts) require.NoError(t, v.Init(makeContext(t))) ii := dao.NewLogItems() ii.Add(dao.NewLogItemFromString("blee"), dao.NewLogItemFromString("bozo")) v.GetModel().Set(ii) v.GetModel().Notify() assert.Len(t, v.Hints(), 17) v.toggleAutoScrollCmd(nil) assert.Equal(t, "Autoscroll:Off ColumnLock:Off FullScreen:Off Timestamps:Off Wrap:Off", v.Indicator().GetText(true)) } func TestLogColumnLock(t *testing.T) { opts := dao.LogOptions{ Path: "fred/p1", Container: "blee", } v := NewLog(client.PodGVR, &opts) require.NoError(t, v.Init(makeContext(t))) buff := dao.NewLogItems() for i := range 100 { buff.Add(dao.NewLogItemFromString(fmt.Sprintf("line-%d\n", i))) } v.GetModel().Set(buff) v.toggleColumnLockCmd(nil) const column = 2 v.Logs().ScrollTo(-1, column) v.toggleAutoScrollCmd(nil) r, c := v.Logs().GetScrollOffset() assert.Equal(t, -1, r) assert.Equal(t, column, c) } func TestLogViewNav(t *testing.T) { opts := dao.LogOptions{ Path: "fred/p1", Container: "blee", } v := NewLog(client.PodGVR, &opts) require.NoError(t, v.Init(makeContext(t))) buff := dao.NewLogItems() for i := range 100 { buff.Add(dao.NewLogItemFromString(fmt.Sprintf("line-%d\n", i))) } v.GetModel().Set(buff) v.toggleAutoScrollCmd(nil) r, _ := v.Logs().GetScrollOffset() assert.Equal(t, -1, r) } func TestLogViewClear(t *testing.T) { opts := dao.LogOptions{ Path: "fred/p1", Container: "blee", } v := NewLog(client.PodGVR, &opts) require.NoError(t, v.Init(makeContext(t))) v.toggleAutoScrollCmd(nil) v.Logs().SetText("blee\nblah") v.Logs().Clear() assert.Empty(t, v.Logs().GetText(true)) } func TestLogTimestamp(t *testing.T) { opts := dao.LogOptions{ Path: "fred/blee", Container: "c1", } l := NewLog(client.NewGVR("test"), &opts) require.NoError(t, l.Init(makeContext(t))) ii := dao.NewLogItems() ii.Add( &dao.LogItem{ Pod: "fred/blee", Container: "c1", Bytes: []byte("ttt Testing 1, 2, 3\n"), }, ) var list logList l.GetModel().AddListener(&list) l.GetModel().Set(ii) l.SendKeys(ui.KeyT) l.Logs().Clear() ll := make([][]byte, ii.Len()) ii.Lines(0, true, ll) l.Flush(ll) assert.Equal(t, fmt.Sprintf("%-30s %s", "ttt", "fred/blee c1 Testing 1, 2, 3\n"), l.Logs().GetText(true)) assert.Equal(t, 2, list.change) assert.Equal(t, 2, list.clear) assert.Equal(t, 0, list.fail) } func TestLogFilter(t *testing.T) { opts := dao.LogOptions{ Path: "fred/blee", Container: "c1", } l := NewLog(client.NewGVR("test"), &opts) require.NoError(t, l.Init(makeContext(t))) buff := dao.NewLogItems() buff.Add( dao.NewLogItemFromString("duh"), dao.NewLogItemFromString("zorg"), ) var list logList l.GetModel().AddListener(&list) l.GetModel().Set(buff) l.SendKeys(ui.KeySlash) l.SendStrokes("zorg") assert.Equal(t, "duhzorg", list.lines) assert.Equal(t, 1, list.change) assert.Equal(t, 1, list.clear) assert.Equal(t, 0, list.fail) } // ---------------------------------------------------------------------------- // Helpers... type logList struct { change, clear, fail int lines string } func (l *logList) LogChanged(ll [][]byte) { l.change++ l.lines = "" for _, line := range ll { l.lines += string(line) } } func (*logList) LogCanceled() {} func (*logList) LogStop() {} func (*logList) LogResume() {} func (l *logList) LogCleared() { l.clear++ } func (l *logList) LogFailed(error) { l.fail++ }