github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/core/state/iterator_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:35</date> 10 //</624450079956144128> 11 12 13 package state 14 15 import ( 16 "bytes" 17 "testing" 18 19 "github.com/ethereum/go-ethereum/common" 20 "github.com/ethereum/go-ethereum/ethdb" 21 ) 22 23 //测试节点迭代器是否确实遍历整个数据库内容。 24 func TestNodeIteratorCoverage(t *testing.T) { 25 //创建一些迭代的测试状态 26 db, root, _ := makeTestState() 27 28 state, err := New(root, db) 29 if err != nil { 30 t.Fatalf("failed to create state trie at %x: %v", root, err) 31 } 32 //收集迭代器找到的所有节点散列 33 hashes := make(map[common.Hash]struct{}) 34 for it := NewNodeIterator(state); it.Next(); { 35 if it.Hash != (common.Hash{}) { 36 hashes[it.Hash] = struct{}{} 37 } 38 } 39 //交叉检查迭代哈希和数据库/nodepol内容 40 for hash := range hashes { 41 if _, err := db.TrieDB().Node(hash); err != nil { 42 t.Errorf("failed to retrieve reported node %x", hash) 43 } 44 } 45 for _, hash := range db.TrieDB().Nodes() { 46 if _, ok := hashes[hash]; !ok { 47 t.Errorf("state entry not reported %x", hash) 48 } 49 } 50 for _, key := range db.TrieDB().DiskDB().(*ethdb.MemDatabase).Keys() { 51 if bytes.HasPrefix(key, []byte("secure-key-")) { 52 continue 53 } 54 if _, ok := hashes[common.BytesToHash(key)]; !ok { 55 t.Errorf("state entry not reported %x", key) 56 } 57 } 58 } 59