122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
// Copyright 2021 The Prometheus Authors
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
// you may not use this file except in compliance with the License.
 | 
						|
// You may obtain a copy of the License at
 | 
						|
//
 | 
						|
// http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
 | 
						|
package storage
 | 
						|
 | 
						|
import (
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/stretchr/testify/require"
 | 
						|
 | 
						|
	"github.com/prometheus/prometheus/model/labels"
 | 
						|
	"github.com/prometheus/prometheus/tsdb/chunkenc"
 | 
						|
	"github.com/prometheus/prometheus/tsdb/tsdbutil"
 | 
						|
)
 | 
						|
 | 
						|
func TestListSeriesIterator(t *testing.T) {
 | 
						|
	it := NewListSeriesIterator(samples{
 | 
						|
		sample{0, 0, nil, nil},
 | 
						|
		sample{1, 1, nil, nil},
 | 
						|
		sample{1, 1.5, nil, nil},
 | 
						|
		sample{2, 2, nil, nil},
 | 
						|
		sample{3, 3, nil, nil},
 | 
						|
	})
 | 
						|
 | 
						|
	// Seek to the first sample with ts=1.
 | 
						|
	require.Equal(t, chunkenc.ValFloat, it.Seek(1))
 | 
						|
	ts, v := it.At()
 | 
						|
	require.Equal(t, int64(1), ts)
 | 
						|
	require.Equal(t, 1., v)
 | 
						|
 | 
						|
	// Seek one further, next sample still has ts=1.
 | 
						|
	require.Equal(t, chunkenc.ValFloat, it.Next())
 | 
						|
	ts, v = it.At()
 | 
						|
	require.Equal(t, int64(1), ts)
 | 
						|
	require.Equal(t, 1.5, v)
 | 
						|
 | 
						|
	// Seek again to 1 and make sure we stay where we are.
 | 
						|
	require.Equal(t, chunkenc.ValFloat, it.Seek(1))
 | 
						|
	ts, v = it.At()
 | 
						|
	require.Equal(t, int64(1), ts)
 | 
						|
	require.Equal(t, 1.5, v)
 | 
						|
 | 
						|
	// Another seek.
 | 
						|
	require.Equal(t, chunkenc.ValFloat, it.Seek(3))
 | 
						|
	ts, v = it.At()
 | 
						|
	require.Equal(t, int64(3), ts)
 | 
						|
	require.Equal(t, 3., v)
 | 
						|
 | 
						|
	// And we don't go back.
 | 
						|
	require.Equal(t, chunkenc.ValFloat, it.Seek(2))
 | 
						|
	ts, v = it.At()
 | 
						|
	require.Equal(t, int64(3), ts)
 | 
						|
	require.Equal(t, 3., v)
 | 
						|
 | 
						|
	// Seek beyond the end.
 | 
						|
	require.Equal(t, chunkenc.ValNone, it.Seek(5))
 | 
						|
	// And we don't go back. (This exposes issue #10027.)
 | 
						|
	require.Equal(t, chunkenc.ValNone, it.Seek(2))
 | 
						|
}
 | 
						|
 | 
						|
// TestSeriesSetToChunkSet test the property of SeriesSet that says
 | 
						|
// returned series should be iterable even after Next is called.
 | 
						|
func TestChunkSeriesSetToSeriesSet(t *testing.T) {
 | 
						|
	series := []struct {
 | 
						|
		lbs     labels.Labels
 | 
						|
		samples []tsdbutil.Sample
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			lbs: labels.FromStrings("__name__", "up", "instance", "localhost:8080"),
 | 
						|
			samples: []tsdbutil.Sample{
 | 
						|
				sample{t: 1, v: 1},
 | 
						|
				sample{t: 2, v: 2},
 | 
						|
				sample{t: 3, v: 3},
 | 
						|
				sample{t: 4, v: 4},
 | 
						|
			},
 | 
						|
		}, {
 | 
						|
			lbs: labels.FromStrings("__name__", "up", "instance", "localhost:8081"),
 | 
						|
			samples: []tsdbutil.Sample{
 | 
						|
				sample{t: 1, v: 2},
 | 
						|
				sample{t: 2, v: 3},
 | 
						|
				sample{t: 3, v: 4},
 | 
						|
				sample{t: 4, v: 5},
 | 
						|
				sample{t: 5, v: 6},
 | 
						|
				sample{t: 6, v: 7},
 | 
						|
			},
 | 
						|
		},
 | 
						|
	}
 | 
						|
	var chunkSeries []ChunkSeries
 | 
						|
	for _, s := range series {
 | 
						|
		chunkSeries = append(chunkSeries, NewListChunkSeriesFromSamples(s.lbs, s.samples))
 | 
						|
	}
 | 
						|
	css := NewMockChunkSeriesSet(chunkSeries...)
 | 
						|
 | 
						|
	ss := NewSeriesSetFromChunkSeriesSet(css)
 | 
						|
	var ssSlice []Series
 | 
						|
	for ss.Next() {
 | 
						|
		ssSlice = append(ssSlice, ss.At())
 | 
						|
	}
 | 
						|
	require.Len(t, ssSlice, 2)
 | 
						|
	var iter chunkenc.Iterator
 | 
						|
	for i, s := range ssSlice {
 | 
						|
		require.EqualValues(t, series[i].lbs, s.Labels())
 | 
						|
		iter = s.Iterator(iter)
 | 
						|
		j := 0
 | 
						|
		for iter.Next() == chunkenc.ValFloat {
 | 
						|
			ts, v := iter.At()
 | 
						|
			require.EqualValues(t, series[i].samples[j], sample{t: ts, v: v})
 | 
						|
			j++
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |