github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/swap/swap_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:45</date> 10 //</624450121588805632> 11 12 13 package swap 14 15 import ( 16 "flag" 17 "fmt" 18 "io/ioutil" 19 mrand "math/rand" 20 "os" 21 "testing" 22 "time" 23 24 "github.com/ethereum/go-ethereum/log" 25 "github.com/ethereum/go-ethereum/p2p" 26 "github.com/ethereum/go-ethereum/p2p/protocols" 27 "github.com/ethereum/go-ethereum/p2p/simulations/adapters" 28 "github.com/ethereum/go-ethereum/swarm/state" 29 colorable "github.com/mattn/go-colorable" 30 ) 31 32 var ( 33 loglevel = flag.Int("loglevel", 2, "verbosity of logs") 34 ) 35 36 func init() { 37 flag.Parse() 38 mrand.Seed(time.Now().UnixNano()) 39 40 log.PrintOrigins(true) 41 log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) 42 } 43 44 //测试获得同伴的平衡 45 func TestGetPeerBalance(t *testing.T) { 46 //创建测试交换帐户 47 swap, testDir := createTestSwap(t) 48 defer os.RemoveAll(testDir) 49 50 //测试正确值 51 testPeer := newDummyPeer() 52 swap.balances[testPeer.ID()] = 888 53 b, err := swap.GetPeerBalance(testPeer.ID()) 54 if err != nil { 55 t.Fatal(err) 56 } 57 if b != 888 { 58 t.Fatalf("Expected peer's balance to be %d, but is %d", 888, b) 59 } 60 61 //不存在节点的测试 62 id := adapters.RandomNodeConfig().ID 63 _, err = swap.GetPeerBalance(id) 64 if err == nil { 65 t.Fatal("Expected call to fail, but it didn't!") 66 } 67 if err.Error() != "Peer not found" { 68 t.Fatalf("Expected test to fail with %s, but is %s", "Peer not found", err.Error()) 69 } 70 } 71 72 //测试重复预订是否正确记帐 73 func TestRepeatedBookings(t *testing.T) { 74 //创建测试交换帐户 75 swap, testDir := createTestSwap(t) 76 defer os.RemoveAll(testDir) 77 78 testPeer := newDummyPeer() 79 amount := mrand.Intn(100) 80 cnt := 1 + mrand.Intn(10) 81 for i := 0; i < cnt; i++ { 82 swap.Add(int64(amount), testPeer.Peer) 83 } 84 expectedBalance := int64(cnt * amount) 85 realBalance := swap.balances[testPeer.ID()] 86 if expectedBalance != realBalance { 87 t.Fatal(fmt.Sprintf("After %d credits of %d, expected balance to be: %d, but is: %d", cnt, amount, expectedBalance, realBalance)) 88 } 89 90 testPeer2 := newDummyPeer() 91 amount = mrand.Intn(100) 92 cnt = 1 + mrand.Intn(10) 93 for i := 0; i < cnt; i++ { 94 swap.Add(0-int64(amount), testPeer2.Peer) 95 } 96 expectedBalance = int64(0 - (cnt * amount)) 97 realBalance = swap.balances[testPeer2.ID()] 98 if expectedBalance != realBalance { 99 t.Fatal(fmt.Sprintf("After %d debits of %d, expected balance to be: %d, but is: %d", cnt, amount, expectedBalance, realBalance)) 100 } 101 102 //借贷混合 103 amount1 := mrand.Intn(100) 104 amount2 := mrand.Intn(55) 105 amount3 := mrand.Intn(999) 106 swap.Add(int64(amount1), testPeer2.Peer) 107 swap.Add(int64(0-amount2), testPeer2.Peer) 108 swap.Add(int64(0-amount3), testPeer2.Peer) 109 110 expectedBalance = expectedBalance + int64(amount1-amount2-amount3) 111 realBalance = swap.balances[testPeer2.ID()] 112 113 if expectedBalance != realBalance { 114 t.Fatal(fmt.Sprintf("After mixed debits and credits, expected balance to be: %d, but is: %d", expectedBalance, realBalance)) 115 } 116 } 117 118 //尝试从状态存储恢复平衡 119 //这是通过创建一个节点来模拟的, 120 //给它分配一个任意的平衡, 121 //然后关闭状态存储。 122 //然后我们重新打开国营商店检查一下 123 //余额还是一样的 124 func TestRestoreBalanceFromStateStore(t *testing.T) { 125 //创建测试交换帐户 126 swap, testDir := createTestSwap(t) 127 defer os.RemoveAll(testDir) 128 129 testPeer := newDummyPeer() 130 swap.balances[testPeer.ID()] = -8888 131 132 tmpBalance := swap.balances[testPeer.ID()] 133 swap.stateStore.Put(testPeer.ID().String(), &tmpBalance) 134 135 swap.stateStore.Close() 136 swap.stateStore = nil 137 138 stateStore, err := state.NewDBStore(testDir) 139 if err != nil { 140 t.Fatal(err) 141 } 142 143 var newBalance int64 144 stateStore.Get(testPeer.ID().String(), &newBalance) 145 146 //比较余额 147 if tmpBalance != newBalance { 148 t.Fatal(fmt.Sprintf("Unexpected balance value after sending cheap message test. Expected balance: %d, balance is: %d", 149 tmpBalance, newBalance)) 150 } 151 } 152 153 //创建测试交换帐户 154 //为持久性和交换帐户创建StateStore 155 func createTestSwap(t *testing.T) (*Swap, string) { 156 dir, err := ioutil.TempDir("", "swap_test_store") 157 if err != nil { 158 t.Fatal(err) 159 } 160 stateStore, err2 := state.NewDBStore(dir) 161 if err2 != nil { 162 t.Fatal(err2) 163 } 164 swap := New(stateStore) 165 return swap, dir 166 } 167 168 type dummyPeer struct { 169 *protocols.Peer 170 } 171 172 //创建虚拟协议。使用虚拟msgreadwriter进行对等 173 func newDummyPeer() *dummyPeer { 174 id := adapters.RandomNodeConfig().ID 175 protoPeer := protocols.NewPeer(p2p.NewPeer(id, "testPeer", nil), nil, nil) 176 dummy := &dummyPeer{ 177 Peer: protoPeer, 178 } 179 return dummy 180 } 181