test_util.go 2.17 KB
Newer Older
Jeromy's avatar
Jeromy committed
1
package dstest
Jeromy's avatar
Jeromy committed
2 3 4 5

import (
	"bytes"
	"encoding/base32"
6
	"errors"
Jeromy's avatar
Jeromy committed
7
	"math/rand"
Jeromy's avatar
Jeromy committed
8 9
	"testing"

Jakub Sztandera's avatar
Jakub Sztandera committed
10
	dstore "github.com/ipfs/go-datastore"
Jeromy's avatar
Jeromy committed
11 12
)

13 14 15 16
var (
	TestError = errors.New("test error")
)

Jeromy's avatar
Jeromy committed
17
func RunBatchTest(t *testing.T, ds dstore.Batching) {
Jeromy's avatar
Jeromy committed
18 19 20 21
	batch, err := ds.Batch()
	if err != nil {
		t.Fatal(err)
	}
Jeromy's avatar
Jeromy committed
22 23

	var blocks [][]byte
Jeromy's avatar
Jeromy committed
24
	var keys []dstore.Key
Jeromy's avatar
Jeromy committed
25 26
	for i := 0; i < 20; i++ {
		blk := make([]byte, 256*1024)
Jeromy's avatar
Jeromy committed
27
		rand.Read(blk)
Jeromy's avatar
Jeromy committed
28 29
		blocks = append(blocks, blk)

Jeromy's avatar
Jeromy committed
30
		key := dstore.NewKey(base32.StdEncoding.EncodeToString(blk[:8]))
Jeromy's avatar
Jeromy committed
31 32 33 34 35 36 37
		keys = append(keys, key)

		err := batch.Put(key, blk)
		if err != nil {
			t.Fatal(err)
		}
	}
Jeromy's avatar
Jeromy committed
38 39 40 41 42 43 44 45 46 47 48

	// Ensure they are not in the datastore before comitting
	for _, k := range keys {
		_, err := ds.Get(k)
		if err == nil {
			t.Fatal("should not have found this block")
		}
	}

	// commit, write them to the datastore
	err = batch.Commit()
Jeromy's avatar
Jeromy committed
49 50 51 52 53 54 55 56 57 58
	if err != nil {
		t.Fatal(err)
	}

	for i, k := range keys {
		blk, err := ds.Get(k)
		if err != nil {
			t.Fatal(err)
		}

59
		if !bytes.Equal(blk, blocks[i]) {
Jeromy's avatar
Jeromy committed
60 61 62 63 64
			t.Fatal("blocks not correct!")
		}
	}
}

Jeromy's avatar
Jeromy committed
65
func RunBatchDeleteTest(t *testing.T, ds dstore.Batching) {
Jeromy's avatar
Jeromy committed
66
	var keys []dstore.Key
Jeromy's avatar
Jeromy committed
67 68
	for i := 0; i < 20; i++ {
		blk := make([]byte, 16)
Jeromy's avatar
Jeromy committed
69
		rand.Read(blk)
Jeromy's avatar
Jeromy committed
70

Jeromy's avatar
Jeromy committed
71
		key := dstore.NewKey(base32.StdEncoding.EncodeToString(blk[:8]))
Jeromy's avatar
Jeromy committed
72 73 74 75 76 77 78 79
		keys = append(keys, key)

		err := ds.Put(key, blk)
		if err != nil {
			t.Fatal(err)
		}
	}

Jeromy's avatar
Jeromy committed
80 81 82 83 84
	batch, err := ds.Batch()
	if err != nil {
		t.Fatal(err)
	}

Jeromy's avatar
Jeromy committed
85 86 87 88 89 90
	for _, k := range keys {
		err := batch.Delete(k)
		if err != nil {
			t.Fatal(err)
		}
	}
Jeromy's avatar
Jeromy committed
91
	err = batch.Commit()
Jeromy's avatar
Jeromy committed
92 93 94 95 96 97 98 99 100 101 102
	if err != nil {
		t.Fatal(err)
	}

	for _, k := range keys {
		_, err := ds.Get(k)
		if err == nil {
			t.Fatal("shouldnt have found block")
		}
	}
}
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136

type testDatastore struct {
	testErrors bool

	*dstore.MapDatastore
}

func NewTestDatastore(testErrors bool) *testDatastore {
	return &testDatastore{
		testErrors:   testErrors,
		MapDatastore: dstore.NewMapDatastore(),
	}
}

func (d *testDatastore) Check() error {
	if d.testErrors {
		return TestError
	}
	return nil
}

func (d *testDatastore) Scrub() error {
	if d.testErrors {
		return TestError
	}
	return nil
}

func (d *testDatastore) CollectGarbage() error {
	if d.testErrors {
		return TestError
	}
	return nil
}