aboutsummaryrefslogtreecommitdiffstats
path: root/swarm/storage/mock/test/test.go
diff options
context:
space:
mode:
Diffstat (limited to 'swarm/storage/mock/test/test.go')
-rw-r--r--swarm/storage/mock/test/test.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/swarm/storage/mock/test/test.go b/swarm/storage/mock/test/test.go
index 69828b144..cc837f0b7 100644
--- a/swarm/storage/mock/test/test.go
+++ b/swarm/storage/mock/test/test.go
@@ -20,6 +20,7 @@ package test
import (
"bytes"
+ "encoding/binary"
"fmt"
"io"
"strconv"
@@ -170,6 +171,123 @@ func MockStore(t *testing.T, globalStore mock.GlobalStorer, n int) {
})
}
+// MockStoreListings tests global store methods Keys, Nodes, NodeKeys and KeyNodes.
+// It uses a provided globalstore to put chunks for n number of node addresses
+// and to validate that methods are returning the right responses.
+func MockStoreListings(t *testing.T, globalStore mock.GlobalStorer, n int) {
+ addrs := make([]common.Address, n)
+ for i := 0; i < n; i++ {
+ addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16))
+ }
+ type chunk struct {
+ key []byte
+ data []byte
+ }
+ const chunksPerNode = 5
+ keys := make([][]byte, n*chunksPerNode)
+ for i := 0; i < n*chunksPerNode; i++ {
+ b := make([]byte, 8)
+ binary.BigEndian.PutUint64(b, uint64(i))
+ keys[i] = b
+ }
+
+ // keep track of keys on every node
+ nodeKeys := make(map[common.Address][][]byte)
+ // keep track of nodes that store particular key
+ keyNodes := make(map[string][]common.Address)
+ for i := 0; i < chunksPerNode; i++ {
+ // put chunks for every address
+ for j := 0; j < n; j++ {
+ addr := addrs[j]
+ key := keys[(i*n)+j]
+ err := globalStore.Put(addr, key, []byte("data"))
+ if err != nil {
+ t.Fatal(err)
+ }
+ nodeKeys[addr] = append(nodeKeys[addr], key)
+ keyNodes[string(key)] = append(keyNodes[string(key)], addr)
+ }
+
+ // test Keys method
+ var startKey []byte
+ var gotKeys [][]byte
+ for {
+ keys, err := globalStore.Keys(startKey, 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ gotKeys = append(gotKeys, keys.Keys...)
+ if keys.Next == nil {
+ break
+ }
+ startKey = keys.Next
+ }
+ wantKeys := keys[:(i+1)*n]
+ if fmt.Sprint(gotKeys) != fmt.Sprint(wantKeys) {
+ t.Fatalf("got #%v keys %v, want %v", i+1, gotKeys, wantKeys)
+ }
+
+ // test Nodes method
+ var startNode *common.Address
+ var gotNodes []common.Address
+ for {
+ nodes, err := globalStore.Nodes(startNode, 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ gotNodes = append(gotNodes, nodes.Addrs...)
+ if nodes.Next == nil {
+ break
+ }
+ startNode = nodes.Next
+ }
+ wantNodes := addrs
+ if fmt.Sprint(gotNodes) != fmt.Sprint(wantNodes) {
+ t.Fatalf("got #%v nodes %v, want %v", i+1, gotNodes, wantNodes)
+ }
+
+ // test NodeKeys method
+ for addr, wantKeys := range nodeKeys {
+ var startKey []byte
+ var gotKeys [][]byte
+ for {
+ keys, err := globalStore.NodeKeys(addr, startKey, 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ gotKeys = append(gotKeys, keys.Keys...)
+ if keys.Next == nil {
+ break
+ }
+ startKey = keys.Next
+ }
+ if fmt.Sprint(gotKeys) != fmt.Sprint(wantKeys) {
+ t.Fatalf("got #%v %s node keys %v, want %v", i+1, addr.Hex(), gotKeys, wantKeys)
+ }
+ }
+
+ // test KeyNodes method
+ for key, wantNodes := range keyNodes {
+ var startNode *common.Address
+ var gotNodes []common.Address
+ for {
+ nodes, err := globalStore.KeyNodes([]byte(key), startNode, 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ gotNodes = append(gotNodes, nodes.Addrs...)
+ if nodes.Next == nil {
+ break
+ }
+ startNode = nodes.Next
+ }
+ if fmt.Sprint(gotNodes) != fmt.Sprint(wantNodes) {
+ t.Fatalf("got #%v %x key nodes %v, want %v", i+1, []byte(key), gotNodes, wantNodes)
+ }
+ }
+ }
+}
+
// ImportExport saves chunks to the outStore, exports them to the tar archive,
// imports tar archive to the inStore and checks if all chunks are imported correctly.
func ImportExport(t *testing.T, outStore, inStore mock.GlobalStorer, n int) {