Increased coverage
This commit is contained in:
parent
0f460ad26e
commit
cab7e6000e
42
ptrie/cache.go
Normal file
42
ptrie/cache.go
Normal file
@ -0,0 +1,42 @@
|
||||
package ptrie
|
||||
|
||||
type Backend interface {
|
||||
Get([]byte) []byte
|
||||
Set([]byte, []byte)
|
||||
}
|
||||
|
||||
type Cache struct {
|
||||
store map[string][]byte
|
||||
backend Backend
|
||||
}
|
||||
|
||||
func NewCache(backend Backend) *Cache {
|
||||
return &Cache{make(map[string][]byte), backend}
|
||||
}
|
||||
|
||||
func (self *Cache) Get(key []byte) []byte {
|
||||
data := self.store[string(key)]
|
||||
if data == nil {
|
||||
data = self.backend.Get(key)
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
func (self *Cache) Set(key []byte, data []byte) {
|
||||
self.store[string(key)] = data
|
||||
}
|
||||
|
||||
func (self *Cache) Flush() {
|
||||
for k, v := range self.store {
|
||||
self.backend.Set([]byte(k), v)
|
||||
}
|
||||
|
||||
// This will eventually grow too large. We'd could
|
||||
// do a make limit on storage and push out not-so-popular nodes.
|
||||
//self.Reset()
|
||||
}
|
||||
|
||||
func (self *Cache) Reset() {
|
||||
self.store = make(map[string][]byte)
|
||||
}
|
@ -10,47 +10,6 @@ import (
|
||||
"github.com/ethereum/go-ethereum/trie"
|
||||
)
|
||||
|
||||
type Backend interface {
|
||||
Get([]byte) []byte
|
||||
Set([]byte, []byte)
|
||||
}
|
||||
|
||||
type Cache struct {
|
||||
store map[string][]byte
|
||||
backend Backend
|
||||
}
|
||||
|
||||
func NewCache(backend Backend) *Cache {
|
||||
return &Cache{make(map[string][]byte), backend}
|
||||
}
|
||||
|
||||
func (self *Cache) Get(key []byte) []byte {
|
||||
data := self.store[string(key)]
|
||||
if data == nil {
|
||||
data = self.backend.Get(key)
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
func (self *Cache) Set(key []byte, data []byte) {
|
||||
self.store[string(key)] = data
|
||||
}
|
||||
|
||||
func (self *Cache) Flush() {
|
||||
for k, v := range self.store {
|
||||
self.backend.Set([]byte(k), v)
|
||||
}
|
||||
|
||||
// This will eventually grow too large. We'd could
|
||||
// do a make limit on storage and push out not-so-popular nodes.
|
||||
//self.Reset()
|
||||
}
|
||||
|
||||
func (self *Cache) Reset() {
|
||||
self.store = make(map[string][]byte)
|
||||
}
|
||||
|
||||
type Trie struct {
|
||||
mu sync.Mutex
|
||||
root Node
|
||||
@ -83,14 +42,17 @@ func (self *Trie) Root() []byte { return self.Hash() }
|
||||
func (self *Trie) Hash() []byte {
|
||||
var hash []byte
|
||||
if self.root != nil {
|
||||
t := self.root.Hash()
|
||||
if byts, ok := t.([]byte); ok {
|
||||
hash = byts
|
||||
} else {
|
||||
hash = crypto.Sha3(ethutil.Encode(self.root.RlpData()))
|
||||
}
|
||||
hash = self.root.Hash().([]byte)
|
||||
/*
|
||||
t := self.root.Hash()
|
||||
if byts, ok := t.([]byte); ok {
|
||||
hash = byts
|
||||
} else {
|
||||
hash = crypto.Sha3(ethutil.Encode(self.root.RlpData()))
|
||||
}
|
||||
*/
|
||||
} else {
|
||||
hash = crypto.Sha3(ethutil.Encode(self.root))
|
||||
hash = crypto.Sha3(ethutil.Encode(""))
|
||||
}
|
||||
|
||||
if !bytes.Equal(hash, self.roothash) {
|
||||
@ -107,6 +69,7 @@ func (self *Trie) Commit() {
|
||||
self.cache.Flush()
|
||||
}
|
||||
|
||||
// Reset should only be called if the trie has been hashed
|
||||
func (self *Trie) Reset() {
|
||||
self.cache.Reset()
|
||||
|
||||
|
@ -5,6 +5,7 @@ import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
"github.com/ethereum/go-ethereum/ethutil"
|
||||
)
|
||||
|
||||
@ -18,6 +19,15 @@ func NewEmpty() *Trie {
|
||||
return New(nil, make(Db))
|
||||
}
|
||||
|
||||
func TestEmptyTrie(t *testing.T) {
|
||||
trie := NewEmpty()
|
||||
res := trie.Hash()
|
||||
exp := crypto.Sha3(ethutil.Encode(""))
|
||||
if !bytes.Equal(res, exp) {
|
||||
t.Errorf("expected %x got %x", exp, res)
|
||||
}
|
||||
}
|
||||
|
||||
func TestInsert(t *testing.T) {
|
||||
trie := NewEmpty()
|
||||
|
||||
@ -62,6 +72,34 @@ func TestGet(t *testing.T) {
|
||||
func TestDelete(t *testing.T) {
|
||||
trie := NewEmpty()
|
||||
|
||||
vals := []struct{ k, v string }{
|
||||
{"do", "verb"},
|
||||
{"ether", "wookiedoo"},
|
||||
{"horse", "stallion"},
|
||||
{"shaman", "horse"},
|
||||
{"doge", "coin"},
|
||||
{"ether", ""},
|
||||
{"dog", "puppy"},
|
||||
{"shaman", ""},
|
||||
}
|
||||
for _, val := range vals {
|
||||
if val.v != "" {
|
||||
trie.UpdateString(val.k, val.v)
|
||||
} else {
|
||||
trie.DeleteString(val.k)
|
||||
}
|
||||
}
|
||||
|
||||
hash := trie.Hash()
|
||||
exp := ethutil.Hex2Bytes("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84")
|
||||
if !bytes.Equal(hash, exp) {
|
||||
t.Errorf("expected %x got %x", exp, hash)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEmptyValues(t *testing.T) {
|
||||
trie := NewEmpty()
|
||||
|
||||
vals := []struct{ k, v string }{
|
||||
{"do", "verb"},
|
||||
{"ether", "wookiedoo"},
|
||||
@ -142,7 +180,7 @@ func TestReset(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// Not actual test
|
||||
// Not an actual test
|
||||
func TestOutput(t *testing.T) {
|
||||
t.Skip()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user