Like Prometheus, but for logs.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
loki/pkg/dataobj/sections/logs/iter_test.go

131 lines
2.8 KiB

package logs
import (
"testing"
"time"
"github.com/prometheus/prometheus/model/labels"
"github.com/stretchr/testify/require"
"github.com/grafana/loki/v3/pkg/dataobj/internal/dataset"
)
func TestDecode(t *testing.T) {
tests := []struct {
name string
columns []*Column
row dataset.Row
expected Record
wantErr bool
}{
{
name: "all fields present",
columns: []*Column{
{Type: ColumnTypeStreamID},
{Type: ColumnTypeTimestamp},
{Type: ColumnTypeMetadata, Name: "app"},
{Type: ColumnTypeMetadata, Name: "env"},
{Type: ColumnTypeMessage},
},
row: dataset.Row{
Values: []dataset.Value{
dataset.Int64Value(123),
dataset.Int64Value(1234567890000000000),
dataset.BinaryValue([]byte("test-app")),
dataset.BinaryValue([]byte("prod")),
dataset.BinaryValue([]byte("test message")),
},
},
expected: Record{
StreamID: 123,
Timestamp: time.Unix(0, 1234567890000000000),
Metadata: labels.New(labels.Label{Name: "app", Value: "test-app"}, labels.Label{Name: "env", Value: "prod"}),
Line: []byte("test message"),
},
},
{
name: "nil values are skipped",
columns: []*Column{
{Type: ColumnTypeStreamID},
{Type: ColumnTypeTimestamp},
{Type: ColumnTypeMetadata, Name: "app"},
{Type: ColumnTypeMessage},
},
row: dataset.Row{
Values: []dataset.Value{
dataset.Int64Value(123),
dataset.Int64Value(1234567890000000000),
{},
dataset.BinaryValue([]byte("test message")),
},
},
expected: Record{
StreamID: 123,
Timestamp: time.Unix(0, 1234567890000000000),
Metadata: labels.EmptyLabels(),
Line: []byte("test message"),
},
},
{
name: "invalid stream_id type",
columns: []*Column{
{Type: ColumnTypeStreamID},
},
row: dataset.Row{
Values: []dataset.Value{
dataset.BinaryValue([]byte("invalid")),
},
},
wantErr: true,
},
{
name: "invalid timestamp type",
columns: []*Column{
{Type: ColumnTypeTimestamp},
},
row: dataset.Row{
Values: []dataset.Value{
dataset.BinaryValue([]byte("invalid")),
},
},
wantErr: true,
},
{
name: "invalid metadata type",
columns: []*Column{
{Type: ColumnTypeMetadata, Name: "app"},
},
row: dataset.Row{
Values: []dataset.Value{
dataset.Int64Value(123),
},
},
wantErr: true,
},
{
name: "invalid message type",
columns: []*Column{
{Type: ColumnTypeMessage},
},
row: dataset.Row{
Values: []dataset.Value{
dataset.Int64Value(123),
},
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
record := Record{}
err := DecodeRow(tt.columns, tt.row, &record, nil)
if tt.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
require.Equal(t, tt.expected, record)
})
}
}