169 lines
4.5 KiB
Go
169 lines
4.5 KiB
Go
// Copyright (C) 2019 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package accounting_test
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"storj.io/storj/internal/testcontext"
|
|
"storj.io/storj/internal/testrand"
|
|
"storj.io/storj/pkg/accounting"
|
|
"storj.io/storj/satellite"
|
|
"storj.io/storj/satellite/satellitedb/satellitedbtest"
|
|
)
|
|
|
|
func TestBucketUsage(t *testing.T) {
|
|
satellitedbtest.Run(t, func(t *testing.T, db satellite.DB) {
|
|
count := 50
|
|
now := time.Now()
|
|
ctx := testcontext.New(t)
|
|
|
|
usageDB := db.Console().BucketUsage()
|
|
if usageDB == nil {
|
|
t.Fail()
|
|
}
|
|
|
|
bucketID := testrand.UUID()
|
|
|
|
compareRollups := func(t *testing.T, expected *accounting.BucketRollup, actual *accounting.BucketRollup) {
|
|
assert.Equal(t, expected.BucketID, actual.BucketID)
|
|
assert.Equal(t, expected.RollupEndTime.Unix(), actual.RollupEndTime.Unix())
|
|
assert.Equal(t, expected.RemoteStoredData, actual.RemoteStoredData)
|
|
assert.Equal(t, expected.InlineStoredData, actual.InlineStoredData)
|
|
assert.Equal(t, expected.RemoteSegments, actual.RemoteSegments)
|
|
assert.Equal(t, expected.InlineSegments, actual.InlineSegments)
|
|
assert.Equal(t, expected.Objects, actual.Objects)
|
|
assert.Equal(t, expected.MetadataSize, actual.MetadataSize)
|
|
assert.Equal(t, expected.RepairEgress, actual.RepairEgress)
|
|
assert.Equal(t, expected.GetEgress, actual.GetEgress)
|
|
assert.Equal(t, expected.AuditEgress, actual.AuditEgress)
|
|
}
|
|
|
|
var rollup *accounting.BucketRollup
|
|
t.Run("add rollup", func(t *testing.T) {
|
|
var err error
|
|
data := accounting.BucketRollup{
|
|
BucketID: bucketID,
|
|
RollupEndTime: now,
|
|
RemoteStoredData: 5,
|
|
InlineStoredData: 6,
|
|
RemoteSegments: 7,
|
|
InlineSegments: 8,
|
|
Objects: 9,
|
|
MetadataSize: 10,
|
|
RepairEgress: 11,
|
|
GetEgress: 12,
|
|
AuditEgress: 13,
|
|
}
|
|
|
|
rollup, err = usageDB.Create(ctx, data)
|
|
assert.NotNil(t, rollup)
|
|
assert.NoError(t, err)
|
|
compareRollups(t, &data, rollup)
|
|
})
|
|
|
|
t.Run("get rollup", func(t *testing.T) {
|
|
result, err := usageDB.Get(ctx, rollup.ID)
|
|
assert.NoError(t, err)
|
|
compareRollups(t, rollup, result)
|
|
})
|
|
|
|
t.Run("delete rollup", func(t *testing.T) {
|
|
err := usageDB.Delete(ctx, rollup.ID)
|
|
assert.NoError(t, err)
|
|
})
|
|
|
|
var addedRollups []accounting.BucketRollup
|
|
t.Run("add rollups", func(t *testing.T) {
|
|
for i := 0; i < count; i++ {
|
|
data := accounting.BucketRollup{
|
|
BucketID: bucketID,
|
|
RollupEndTime: now.Add(time.Hour * time.Duration(i+1)),
|
|
RemoteStoredData: uint64(i),
|
|
InlineStoredData: uint64(i + 1),
|
|
RemoteSegments: 7,
|
|
InlineSegments: 8,
|
|
Objects: 9,
|
|
MetadataSize: 10,
|
|
RepairEgress: 11,
|
|
GetEgress: 12,
|
|
AuditEgress: 13,
|
|
}
|
|
|
|
rollup, err := usageDB.Create(ctx, data)
|
|
assert.NotNil(t, rollup)
|
|
assert.NoError(t, err)
|
|
|
|
addedRollups = append(addedRollups, *rollup)
|
|
}
|
|
})
|
|
|
|
t.Run("retrieve rollup", func(t *testing.T) {
|
|
t.Run("first 30 backward", func(t *testing.T) {
|
|
cursor := &accounting.BucketRollupCursor{
|
|
BucketID: bucketID,
|
|
Before: now.Add(time.Hour * 30),
|
|
Order: accounting.Desc,
|
|
PageSize: 10,
|
|
}
|
|
|
|
var pagedRollups []accounting.BucketRollup
|
|
for {
|
|
rollups, err := usageDB.GetPaged(ctx, cursor)
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, rollups)
|
|
assert.True(t, len(rollups) <= 10)
|
|
|
|
pagedRollups = append(pagedRollups, rollups...)
|
|
|
|
if cursor.Next == nil {
|
|
break
|
|
}
|
|
cursor = cursor.Next
|
|
}
|
|
|
|
testSlice := addedRollups[:30]
|
|
for i := range pagedRollups {
|
|
assert.Equal(t, testSlice[i].ID, pagedRollups[29-i].ID)
|
|
compareRollups(t, &testSlice[i], &pagedRollups[29-i])
|
|
}
|
|
})
|
|
|
|
t.Run("last 30 forward", func(t *testing.T) {
|
|
cursor := &accounting.BucketRollupCursor{
|
|
BucketID: bucketID,
|
|
After: now.Add(time.Hour * 20),
|
|
Before: now.Add(time.Hour * time.Duration(count+1)),
|
|
Order: accounting.Asc,
|
|
PageSize: 10,
|
|
}
|
|
|
|
var pagedRollups []accounting.BucketRollup
|
|
for {
|
|
rollups, err := usageDB.GetPaged(ctx, cursor)
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, rollups)
|
|
assert.True(t, len(rollups) <= 10)
|
|
|
|
pagedRollups = append(pagedRollups, rollups...)
|
|
|
|
if cursor.Next == nil {
|
|
break
|
|
}
|
|
cursor = cursor.Next
|
|
}
|
|
|
|
testSlice := addedRollups[20:]
|
|
for i := range pagedRollups {
|
|
assert.Equal(t, testSlice[i].ID, pagedRollups[i].ID)
|
|
compareRollups(t, &testSlice[i], &pagedRollups[i])
|
|
}
|
|
})
|
|
})
|
|
})
|
|
}
|