influxdb/v1/services/storage/store_test.go

191 lines
4.2 KiB
Go

package storage
import (
"testing"
"time"
"github.com/influxdata/influxdb/v2/internal"
"github.com/influxdata/influxdb/v2/models"
"github.com/influxdata/influxdb/v2/v1/services/meta"
"github.com/stretchr/testify/require"
)
func TestValidateArgs(t *testing.T) {
type inputParams struct {
orgID uint64
bucketID uint64
start int64
end int64
}
type outputParams struct {
database string
rp string
start int64
end int64
err error
}
testCases := []struct {
desc string
store *Store
input inputParams
expected outputParams
}{
{
desc: "start not < models.MinNanoTime and end not > models.MaxNanoTime",
store: NewStore(nil, &internal.MetaClientMock{
DatabaseFn: func(name string) *meta.DatabaseInfo {
return &meta.DatabaseInfo{
Name: name,
RetentionPolicies: []meta.RetentionPolicyInfo{
{
Name: meta.DefaultRetentionPolicyName,
},
},
}
},
}),
input: inputParams{
orgID: 1,
bucketID: 2,
start: models.MinNanoTime - 1,
end: models.MaxNanoTime + 1,
},
expected: outputParams{
database: "0000000000000002",
rp: meta.DefaultRetentionPolicyName,
start: models.MinNanoTime,
end: models.MaxNanoTime,
},
},
}
for _, tC := range testCases {
t.Run(tC.desc, func(t *testing.T) {
database, rp, start, end, err := tC.store.validateArgs(tC.input.orgID, tC.input.bucketID, tC.input.start, tC.input.end)
require.Equal(t, tC.expected.database, database)
require.Equal(t, tC.expected.rp, rp)
require.Equal(t, tC.expected.start, start)
require.Equal(t, tC.expected.end, end)
require.Equal(t, tC.expected.err, err)
})
}
}
func TestGroupShardsByTime(t *testing.T) {
tests := []struct {
name string
shardGroups []meta.ShardGroupInfo
start, end int64
wantInRange, wantNotInRange []uint64
}{
{
name: "all are within the time range",
shardGroups: []meta.ShardGroupInfo{
{
ID: 1,
StartTime: time.Unix(0, 10),
EndTime: time.Unix(0, 12),
Shards: []meta.ShardInfo{
{ID: 1},
},
},
{
ID: 2,
StartTime: time.Unix(0, 11),
EndTime: time.Unix(0, 13),
Shards: []meta.ShardInfo{
{ID: 2},
},
},
},
start: 0,
end: 15,
wantInRange: []uint64{1, 2},
wantNotInRange: []uint64{},
},
{
name: "none are within the time range",
shardGroups: []meta.ShardGroupInfo{
{
ID: 1,
StartTime: time.Unix(0, 10),
EndTime: time.Unix(0, 12),
Shards: []meta.ShardInfo{
{ID: 1},
},
},
{
ID: 2,
StartTime: time.Unix(0, 11),
EndTime: time.Unix(0, 13),
Shards: []meta.ShardInfo{
{ID: 2},
},
},
},
start: 20,
end: 25,
wantInRange: []uint64{},
wantNotInRange: []uint64{1, 2},
},
{
name: "some are in the time range; some are not",
shardGroups: []meta.ShardGroupInfo{
{
ID: 1,
StartTime: time.Unix(0, 10),
EndTime: time.Unix(0, 12),
Shards: []meta.ShardInfo{
{ID: 1},
},
},
{
ID: 2,
StartTime: time.Unix(0, 12),
EndTime: time.Unix(0, 14),
Shards: []meta.ShardInfo{
{ID: 2},
},
},
},
start: 11,
end: 15,
wantInRange: []uint64{2},
wantNotInRange: []uint64{1},
},
{
name: "time ranges are inclusive",
shardGroups: []meta.ShardGroupInfo{
{
ID: 1,
StartTime: time.Unix(0, 10),
EndTime: time.Unix(0, 12),
Shards: []meta.ShardInfo{
{ID: 1},
},
},
{
ID: 2,
StartTime: time.Unix(0, 12),
EndTime: time.Unix(0, 14),
Shards: []meta.ShardInfo{
{ID: 2},
},
},
},
start: 10,
end: 14,
wantInRange: []uint64{1, 2},
wantNotInRange: []uint64{},
},
}
for _, tt := range tests {
gotInRange, gotNotInRange := groupShardsByTime(tt.shardGroups, tt.start, tt.end)
require.Equal(t, tt.wantInRange, gotInRange)
require.Equal(t, tt.wantNotInRange, gotNotInRange)
}
}