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