github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/storage/stores/tsdb/querier_test.go (about)

     1  package tsdb
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/prometheus/common/model"
     9  	"github.com/prometheus/prometheus/model/labels"
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/grafana/loki/pkg/logql/syntax"
    13  	"github.com/grafana/loki/pkg/storage/stores/tsdb/index"
    14  )
    15  
    16  func mustParseLabels(s string) labels.Labels {
    17  	ls, err := syntax.ParseLabels(s)
    18  	if err != nil {
    19  		panic(err)
    20  	}
    21  	return ls
    22  }
    23  
    24  func TestQueryIndex(t *testing.T) {
    25  	dir := t.TempDir()
    26  	b := NewBuilder()
    27  	cases := []struct {
    28  		labels labels.Labels
    29  		chunks []index.ChunkMeta
    30  	}{
    31  		{
    32  			labels: mustParseLabels(`{foo="bar"}`),
    33  			chunks: []index.ChunkMeta{
    34  				{
    35  					Checksum: 1,
    36  					MinTime:  1,
    37  					MaxTime:  10,
    38  					KB:       10,
    39  					Entries:  10,
    40  				},
    41  				{
    42  					Checksum: 2,
    43  					MinTime:  5,
    44  					MaxTime:  15,
    45  					KB:       10,
    46  					Entries:  10,
    47  				},
    48  			},
    49  		},
    50  		{
    51  			labels: mustParseLabels(`{foo="bar", bazz="buzz"}`),
    52  			chunks: []index.ChunkMeta{
    53  				{
    54  					Checksum: 3,
    55  					MinTime:  20,
    56  					MaxTime:  30,
    57  					KB:       10,
    58  					Entries:  10,
    59  				},
    60  				{
    61  					Checksum: 4,
    62  					MinTime:  40,
    63  					MaxTime:  50,
    64  					KB:       10,
    65  					Entries:  10,
    66  				},
    67  			},
    68  		},
    69  		{
    70  			labels: mustParseLabels(`{unrelated="true"}`),
    71  			chunks: []index.ChunkMeta{
    72  				{
    73  					Checksum: 1,
    74  					MinTime:  1,
    75  					MaxTime:  10,
    76  					KB:       10,
    77  					Entries:  10,
    78  				},
    79  				{
    80  					Checksum: 2,
    81  					MinTime:  5,
    82  					MaxTime:  15,
    83  					KB:       10,
    84  					Entries:  10,
    85  				},
    86  			},
    87  		},
    88  	}
    89  	for _, s := range cases {
    90  		b.AddSeries(s.labels, model.Fingerprint(s.labels.Hash()), s.chunks)
    91  	}
    92  
    93  	dst, err := b.Build(context.Background(), dir, func(from, through model.Time, checksum uint32) Identifier {
    94  		id := SingleTenantTSDBIdentifier{
    95  			TS:       time.Now(),
    96  			From:     from,
    97  			Through:  through,
    98  			Checksum: checksum,
    99  		}
   100  		return newPrefixedIdentifier(id, dir, dir)
   101  	})
   102  	require.Nil(t, err)
   103  
   104  	reader, err := index.NewFileReader(dst.Path())
   105  	require.Nil(t, err)
   106  
   107  	p, err := PostingsForMatchers(reader, nil, labels.MustNewMatcher(labels.MatchEqual, "foo", "bar"))
   108  	require.Nil(t, err)
   109  
   110  	var (
   111  		chks []index.ChunkMeta
   112  		ls   labels.Labels
   113  	)
   114  
   115  	require.True(t, p.Next())
   116  	_, err = reader.Series(p.At(), &ls, &chks)
   117  	require.Nil(t, err)
   118  	require.Equal(t, cases[0].labels.String(), ls.String())
   119  	require.Equal(t, cases[0].chunks, chks)
   120  	require.True(t, p.Next())
   121  	_, err = reader.Series(p.At(), &ls, &chks)
   122  	require.Nil(t, err)
   123  	require.Equal(t, cases[1].labels.String(), ls.String())
   124  	require.Equal(t, cases[1].chunks, chks)
   125  	require.False(t, p.Next())
   126  
   127  	mint, maxt := reader.Bounds()
   128  	require.Equal(t, int64(1), mint)
   129  	require.Equal(t, int64(50), maxt)
   130  }