2014-06-06 09:55:53 +00:00
|
|
|
package storage_ng
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
clientmodel "github.com/prometheus/client_golang/model"
|
|
|
|
|
|
|
|
"github.com/prometheus/prometheus/storage/metric"
|
2014-08-13 15:13:28 +00:00
|
|
|
"github.com/prometheus/prometheus/utility/test"
|
2014-06-06 09:55:53 +00:00
|
|
|
)
|
|
|
|
|
2014-08-13 15:13:28 +00:00
|
|
|
func newTestPersistence(t *testing.T) (Persistence, test.Closer) {
|
|
|
|
dir := test.NewTemporaryDirectory("test_persistence", t)
|
|
|
|
p, err := NewDiskPersistence(dir.Path(), 1024)
|
2014-06-06 09:55:53 +00:00
|
|
|
if err != nil {
|
2014-08-13 15:13:28 +00:00
|
|
|
dir.Close()
|
2014-06-06 09:55:53 +00:00
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2014-08-21 20:06:11 +00:00
|
|
|
return p, test.NewCallbackCloser(func() {
|
|
|
|
p.Close()
|
|
|
|
dir.Close()
|
|
|
|
})
|
2014-08-12 15:46:46 +00:00
|
|
|
}
|
2014-08-13 15:13:28 +00:00
|
|
|
|
|
|
|
func buildTestChunks() map[clientmodel.Fingerprint]chunks {
|
|
|
|
fps := clientmodel.Fingerprints{
|
|
|
|
clientmodel.Metric{
|
|
|
|
"label": "value1",
|
|
|
|
}.Fingerprint(),
|
|
|
|
clientmodel.Metric{
|
|
|
|
"label": "value2",
|
|
|
|
}.Fingerprint(),
|
|
|
|
clientmodel.Metric{
|
|
|
|
"label": "value3",
|
|
|
|
}.Fingerprint(),
|
|
|
|
}
|
|
|
|
fpToChunks := map[clientmodel.Fingerprint]chunks{}
|
|
|
|
|
|
|
|
for _, fp := range fps {
|
|
|
|
fpToChunks[fp] = make(chunks, 0, 10)
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
fpToChunks[fp] = append(fpToChunks[fp], newDeltaEncodedChunk(d1, d1, true).add(&metric.SamplePair{
|
|
|
|
Timestamp: clientmodel.Timestamp(i),
|
|
|
|
Value: clientmodel.SampleValue(fp),
|
|
|
|
})[0])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return fpToChunks
|
|
|
|
}
|
|
|
|
|
|
|
|
func chunksEqual(c1, c2 chunk) bool {
|
|
|
|
values2 := c2.values()
|
|
|
|
for v1 := range c1.values() {
|
|
|
|
v2 := <-values2
|
|
|
|
if !v1.Equal(v2) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPersistChunk(t *testing.T) {
|
|
|
|
p, closer := newTestPersistence(t)
|
|
|
|
defer closer.Close()
|
|
|
|
|
|
|
|
fpToChunks := buildTestChunks()
|
|
|
|
|
|
|
|
for fp, chunks := range fpToChunks {
|
|
|
|
for _, c := range chunks {
|
|
|
|
if err := p.PersistChunk(fp, c); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for fp, expectedChunks := range fpToChunks {
|
|
|
|
indexes := make([]int, 0, len(expectedChunks))
|
2014-08-19 16:14:44 +00:00
|
|
|
for i := range expectedChunks {
|
2014-08-13 15:13:28 +00:00
|
|
|
indexes = append(indexes, i)
|
|
|
|
}
|
|
|
|
actualChunks, err := p.LoadChunks(fp, indexes)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
for _, i := range indexes {
|
|
|
|
if !chunksEqual(expectedChunks[i], actualChunks[i]) {
|
|
|
|
t.Fatalf("%d. Chunks not equal.", i)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|