suite.go 1.31 KB
Newer Older
Steven Allen's avatar
Steven Allen committed
1 2 3 4 5 6 7 8
package dstest

import (
	"reflect"
	"runtime"
	"testing"

	dstore "github.com/ipfs/go-datastore"
9
	query "github.com/ipfs/go-datastore/query"
Steven Allen's avatar
Steven Allen committed
10 11 12 13 14 15 16 17 18 19 20 21 22
)

// BasicSubtests is a list of all basic tests.
var BasicSubtests = []func(t *testing.T, ds dstore.Datastore){
	SubtestBasicPutGet,
	SubtestNotFounds,
	SubtestManyKeysAndQuery,
}

// BatchSubtests is a list of all basic batching datastore tests.
var BatchSubtests = []func(t *testing.T, ds dstore.Batching){
	RunBatchTest,
	RunBatchDeleteTest,
23
	RunBatchPutAndDeleteTest,
Steven Allen's avatar
Steven Allen committed
24 25 26 27 28 29
}

func getFunctionName(i interface{}) string {
	return runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name()
}

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
func clearDs(t *testing.T, ds dstore.Datastore) {
	q, err := ds.Query(query.Query{KeysOnly: true})
	if err != nil {
		t.Fatal(err)
	}
	res, err := q.Rest()
	if err != nil {
		t.Fatal(err)
	}
	for _, r := range res {
		if err := ds.Delete(dstore.RawKey(r.Key)); err != nil {
			t.Fatal(err)
		}
	}
}

Steven Allen's avatar
Steven Allen committed
46 47 48 49 50
// SubtestAll tests the given datastore against all the subtests.
func SubtestAll(t *testing.T, ds dstore.Datastore) {
	for _, f := range BasicSubtests {
		t.Run(getFunctionName(f), func(t *testing.T) {
			f(t, ds)
51
			clearDs(t, ds)
Steven Allen's avatar
Steven Allen committed
52 53
		})
	}
Steven Allen's avatar
Steven Allen committed
54 55
	if ds, ok := ds.(dstore.Batching); ok {
		for _, f := range BatchSubtests {
Steven Allen's avatar
Steven Allen committed
56 57
			t.Run(getFunctionName(f), func(t *testing.T) {
				f(t, ds)
58
				clearDs(t, ds)
Steven Allen's avatar
Steven Allen committed
59 60 61 62
			})
		}
	}
}