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  }