aboutsummaryrefslogtreecommitdiffstats
path: root/swarm/storage/mock/mock.go
blob: 586112a98be69624b379f45c24afe43edfe3565c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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
137
138
139
140
141
142
// Copyright 2018 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.

// Package mock defines types that are used by different implementations
// of mock storages.
//
// Implementations of mock storages are located in directories
// under this package:
//
//  - db - LevelDB backend
//  - mem - in memory map backend
//  - rpc - RPC client that can connect to other backends
//
// Mock storages can implement Importer and Exporter interfaces
// for importing and exporting all chunk data that they contain.
// The exported file is a tar archive with all files named by
// hexadecimal representations of chunk keys and with content
// with JSON-encoded ExportedChunk structure. Exported format
// should be preserved across all mock store implementations.
package mock

import (
    "errors"
    "io"

    "github.com/ethereum/go-ethereum/common"
)

const (
    // DefaultLimit should be used as default limit for
    // Keys, Nodes, NodeKeys and KeyNodes GlobarStorer
    // methids implementations.
    DefaultLimit = 100
    // MaxLimit should be used as the maximal returned number
    // of items for Keys, Nodes, NodeKeys and KeyNodes GlobarStorer
    // methids implementations, regardless of provided limit.
    MaxLimit = 1000
)

// ErrNotFound indicates that the chunk is not found.
var ErrNotFound = errors.New("not found")

// NodeStore holds the node address and a reference to the GlobalStore
// in order to access and store chunk data only for one node.
type NodeStore struct {
    store GlobalStorer
    addr  common.Address
}

// NewNodeStore creates a new instance of NodeStore that keeps
// chunk data using GlobalStorer with a provided address.
func NewNodeStore(addr common.Address, store GlobalStorer) *NodeStore {
    return &NodeStore{
        store: store,
        addr:  addr,
    }
}

// Get returns chunk data for a key for a node that has the address
// provided on NodeStore initialization.
func (n *NodeStore) Get(key []byte) (data []byte, err error) {
    return n.store.Get(n.addr, key)
}

// Put saves chunk data for a key for a node that has the address
// provided on NodeStore initialization.
func (n *NodeStore) Put(key []byte, data []byte) error {
    return n.store.Put(n.addr, key, data)
}

// Delete removes chunk data for a key for a node that has the address
// provided on NodeStore initialization.
func (n *NodeStore) Delete(key []byte) error {
    return n.store.Delete(n.addr, key)
}

func (n *NodeStore) Keys(startKey []byte, limit int) (keys Keys, err error) {
    return n.store.NodeKeys(n.addr, startKey, limit)
}

// GlobalStorer defines methods for mock db store
// that stores chunk data for all swarm nodes.
// It is used in tests to construct mock NodeStores
// for swarm nodes and to track and validate chunks.
type GlobalStorer interface {
    Get(addr common.Address, key []byte) (data []byte, err error)
    Put(addr common.Address, key []byte, data []byte) error
    Delete(addr common.Address, key []byte) error
    HasKey(addr common.Address, key []byte) bool
    Keys(startKey []byte, limit int) (keys Keys, err error)
    Nodes(startAddr *common.Address, limit int) (nodes Nodes, err error)
    NodeKeys(addr common.Address, startKey []byte, limit int) (keys Keys, err error)
    KeyNodes(key []byte, startAddr *common.Address, limit int) (nodes Nodes, err error)
    // NewNodeStore creates an instance of NodeStore
    // to be used by a single swarm node with
    // address addr.
    NewNodeStore(addr common.Address) *NodeStore
}

// Keys are returned results by Keys and NodeKeys GlobalStorer methods.
type Keys struct {
    Keys [][]byte
    Next []byte
}

// Nodes are returned results by Nodes and KeyNodes GlobalStorer methods.
type Nodes struct {
    Addrs []common.Address
    Next  *common.Address
}

// Importer defines method for importing mock store data
// from an exported tar archive.
type Importer interface {
    Import(r io.Reader) (n int, err error)
}

// Exporter defines method for exporting mock store data
// to a tar archive.
type Exporter interface {
    Export(w io.Writer) (n int, err error)
}

// ExportedChunk is the structure that is saved in tar archive for
// each chunk as JSON-encoded bytes.
type ExportedChunk struct {
    Data  []byte           `json:"d"`
    Addrs []common.Address `json:"a"`
}