package objtesting
import (
"github.com/thanos-io/objstore/providers/obs"
"os"
"strings"
"testing"
"github.com/efficientgo/core/testutil"
"github.com/thanos-io/objstore"
"github.com/thanos-io/objstore/client"
"github.com/thanos-io/objstore/providers/azure"
"github.com/thanos-io/objstore/providers/bos"
"github.com/thanos-io/objstore/providers/cos"
"github.com/thanos-io/objstore/providers/filesystem"
"github.com/thanos-io/objstore/providers/gcs"
"github.com/thanos-io/objstore/providers/oci"
"github.com/thanos-io/objstore/providers/oss"
"github.com/thanos-io/objstore/providers/s3"
"github.com/thanos-io/objstore/providers/swift"
)
func IsObjStoreSkipped(t *testing.T, provider client.ObjProvider) bool {
if e, ok := os.LookupEnv("THANOS_TEST_OBJSTORE_SKIP"); ok {
obstores := strings.Split(e, ",")
for _, objstore := range obstores {
if objstore == string(provider) {
t.Logf("%s found in THANOS_TEST_OBJSTORE_SKIP array. Skipping.", provider)
return true
}
}
}
return false
}
func ForeachStore(t *testing.T, testFn func(t *testing.T, bkt objstore.Bucket)) {
t.Parallel()
if ok := t.Run("inmem", func(t *testing.T) {
testFn(t, objstore.NewInMemBucket())
}); !ok {
return
}
t.Run("filesystem", func(t *testing.T) {
t.Parallel()
dir, err := os.MkdirTemp("", "filesystem-foreach-store-test")
testutil.Ok(t, err)
defer testutil.Ok(t, os.RemoveAll(dir))
b, err := filesystem.NewBucket(dir)
testutil.Ok(t, err)
testFn(t, b)
testFn(t, objstore.NewPrefixedBucket(b, "some_prefix"))
})
if !IsObjStoreSkipped(t, client.GCS) {
t.Run("gcs", func(t *testing.T) {
bkt, closeFn, err := gcs.NewTestBucket(t, os.Getenv("GCP_PROJECT"))
testutil.Ok(t, err)
t.Parallel()
defer closeFn()
testFn(t, bkt)
testFn(t, objstore.NewPrefixedBucket(bkt, "some_prefix"))
})
}
if !IsObjStoreSkipped(t, client.S3) {
t.Run("aws s3", func(t *testing.T) {
bkt, closeFn, err := s3.NewTestBucket(t, "us-west-2")
testutil.Ok(t, err)
t.Parallel()
defer closeFn()
testFn(t, bkt)
testFn(t, objstore.NewPrefixedBucket(bkt, "some_prefix"))
})
}
if !IsObjStoreSkipped(t, client.AZURE) {
t.Run("azure", func(t *testing.T) {
bkt, closeFn, err := azure.NewTestBucket(t, "e2e-tests")
testutil.Ok(t, err)
t.Parallel()
defer closeFn()
testFn(t, bkt)
testFn(t, objstore.NewPrefixedBucket(bkt, "some_prefix"))
})
}
if !IsObjStoreSkipped(t, client.SWIFT) {
t.Run("swift", func(t *testing.T) {
container, closeFn, err := swift.NewTestContainer(t)
testutil.Ok(t, err)
t.Parallel()
defer closeFn()
testFn(t, container)
testFn(t, objstore.NewPrefixedBucket(container, "some_prefix"))
})
}
if !IsObjStoreSkipped(t, client.COS) {
t.Run("Tencent cos", func(t *testing.T) {
bkt, closeFn, err := cos.NewTestBucket(t)
testutil.Ok(t, err)
t.Parallel()
defer closeFn()
testFn(t, bkt)
testFn(t, objstore.NewPrefixedBucket(bkt, "some_prefix"))
})
}
if !IsObjStoreSkipped(t, client.ALIYUNOSS) {
t.Run("AliYun oss", func(t *testing.T) {
bkt, closeFn, err := oss.NewTestBucket(t)
testutil.Ok(t, err)
t.Parallel()
defer closeFn()
testFn(t, bkt)
testFn(t, objstore.NewPrefixedBucket(bkt, "some_prefix"))
})
}
if !IsObjStoreSkipped(t, client.BOS) {
t.Run("Baidu BOS", func(t *testing.T) {
bkt, closeFn, err := bos.NewTestBucket(t)
testutil.Ok(t, err)
t.Parallel()
defer closeFn()
testFn(t, bkt)
testFn(t, objstore.NewPrefixedBucket(bkt, "some_prefix"))
})
}
if !IsObjStoreSkipped(t, client.OCI) {
t.Run("oci", func(t *testing.T) {
bkt, closeFn, err := oci.NewTestBucket(t)
testutil.Ok(t, err)
t.Parallel()
defer closeFn()
testFn(t, bkt)
})
}
if !IsObjStoreSkipped(t, client.OBS) {
t.Run("obs", func(t *testing.T) {
bkt, closeFn, err := obs.NewTestBucket(t, "cn-south-1")
testutil.Ok(t, err)
t.Parallel()
defer closeFn()
testFn(t, bkt)
testFn(t, objstore.NewPrefixedBucket(bkt, "some_prefix"))
})
}
}