github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/ingester/chunk_test.go (about) 1 package ingester 2 3 import ( 4 "context" 5 "fmt" 6 "math/rand" 7 "testing" 8 "time" 9 10 "github.com/prometheus/prometheus/model/labels" 11 "github.com/stretchr/testify/require" 12 13 "github.com/grafana/loki/pkg/chunkenc" 14 "github.com/grafana/loki/pkg/iter" 15 "github.com/grafana/loki/pkg/logproto" 16 "github.com/grafana/loki/pkg/logql/log" 17 ) 18 19 func testIteratorForward(t *testing.T, iter iter.EntryIterator, from, through int64) { 20 i := from 21 for iter.Next() { 22 entry := iter.Entry() 23 require.Equal(t, time.Unix(i, 0).Unix(), entry.Timestamp.Unix()) 24 require.Equal(t, fmt.Sprintf("line %d", i), entry.Line) 25 i++ 26 } 27 require.Equal(t, through, i) 28 require.NoError(t, iter.Error()) 29 } 30 31 func testIteratorBackward(t *testing.T, iter iter.EntryIterator, from, through int64) { 32 i := through - 1 33 for iter.Next() { 34 entry := iter.Entry() 35 require.Equal(t, time.Unix(i, 0).Unix(), entry.Timestamp.Unix()) 36 require.Equal(t, fmt.Sprintf("line %d", i), entry.Line) 37 i-- 38 } 39 require.Equal(t, from-1, i) 40 require.NoError(t, iter.Error()) 41 } 42 43 func TestIterator(t *testing.T) { 44 const entries = 100 45 46 for _, chk := range []struct { 47 name string 48 new func() chunkenc.Chunk 49 }{ 50 {"dumbChunk", chunkenc.NewDumbChunk}, 51 {"gzipChunk", func() chunkenc.Chunk { 52 return chunkenc.NewMemChunk(chunkenc.EncGZIP, chunkenc.UnorderedHeadBlockFmt, 256*1024, 0) 53 }}, 54 } { 55 t.Run(chk.name, func(t *testing.T) { 56 chunk := chk.new() 57 for i := int64(0); i < entries; i++ { 58 err := chunk.Append(&logproto.Entry{ 59 Timestamp: time.Unix(i, 0), 60 Line: fmt.Sprintf("line %d", i), 61 }) 62 require.NoError(t, err) 63 } 64 65 for i := 0; i < entries; i++ { 66 from := rand.Intn(entries - 1) 67 len := rand.Intn(entries-from) + 1 68 iter, err := chunk.Iterator(context.TODO(), time.Unix(int64(from), 0), time.Unix(int64(from+len), 0), logproto.FORWARD, log.NewNoopPipeline().ForStream(labels.Labels{})) 69 require.NoError(t, err) 70 testIteratorForward(t, iter, int64(from), int64(from+len)) 71 _ = iter.Close() 72 } 73 74 for i := 0; i < entries; i++ { 75 from := rand.Intn(entries - 1) 76 len := rand.Intn(entries-from) + 1 77 iter, err := chunk.Iterator(context.TODO(), time.Unix(int64(from), 0), time.Unix(int64(from+len), 0), logproto.BACKWARD, log.NewNoopPipeline().ForStream(labels.Labels{})) 78 require.NoError(t, err) 79 testIteratorBackward(t, iter, int64(from), int64(from+len)) 80 _ = iter.Close() 81 } 82 }) 83 } 84 }