github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/contracts/chequebook/cheque_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2016 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package chequebook
    26  
    27  import (
    28  	"crypto/ecdsa"
    29  	"math/big"
    30  	"os"
    31  	"path/filepath"
    32  	"testing"
    33  	"time"
    34  
    35  	"github.com/ethereum/go-ethereum/accounts/abi/bind"
    36  	"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
    37  	"github.com/ethereum/go-ethereum/common"
    38  	"github.com/ethereum/go-ethereum/contracts/chequebook/contract"
    39  	"github.com/ethereum/go-ethereum/core"
    40  	"github.com/ethereum/go-ethereum/crypto"
    41  )
    42  
    43  var (
    44  	key0, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
    45  	key1, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a")
    46  	key2, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee")
    47  	addr0   = crypto.PubkeyToAddress(key0.PublicKey)
    48  	addr1   = crypto.PubkeyToAddress(key1.PublicKey)
    49  	addr2   = crypto.PubkeyToAddress(key2.PublicKey)
    50  )
    51  
    52  func newTestBackend() *backends.SimulatedBackend {
    53  	return backends.NewSimulatedBackend(core.GenesisAlloc{
    54  		addr0: {Balance: big.NewInt(1000000000)},
    55  		addr1: {Balance: big.NewInt(1000000000)},
    56  		addr2: {Balance: big.NewInt(1000000000)},
    57  	}, 10000000)
    58  }
    59  
    60  func deploy(prvKey *ecdsa.PrivateKey, amount *big.Int, backend *backends.SimulatedBackend) (common.Address, error) {
    61  	deployTransactor := bind.NewKeyedTransactor(prvKey)
    62  	deployTransactor.Value = amount
    63  	addr, _, _, err := contract.DeployChequebook(deployTransactor, backend)
    64  	if err != nil {
    65  		return common.Address{}, err
    66  	}
    67  	backend.Commit()
    68  	return addr, nil
    69  }
    70  
    71  func TestIssueAndReceive(t *testing.T) {
    72  	path := filepath.Join(os.TempDir(), "chequebook-test.json")
    73  	backend := newTestBackend()
    74  	addr0, err := deploy(key0, big.NewInt(0), backend)
    75  	if err != nil {
    76  		t.Fatalf("deploy contract: expected no error, got %v", err)
    77  	}
    78  	chbook, err := NewChequebook(path, addr0, key0, backend)
    79  	if err != nil {
    80  		t.Fatalf("expected no error, got %v", err)
    81  	}
    82  	chbook.sent[addr1] = new(big.Int).SetUint64(42)
    83  	amount := common.Big1
    84  
    85  	if _, err = chbook.Issue(addr1, amount); err == nil {
    86  		t.Fatalf("expected insufficient funds error, got none")
    87  	}
    88  
    89  	chbook.balance = new(big.Int).Set(common.Big1)
    90  	if chbook.Balance().Cmp(common.Big1) != 0 {
    91  		t.Fatalf("expected: %v, got %v", "0", chbook.Balance())
    92  	}
    93  
    94  	ch, err := chbook.Issue(addr1, amount)
    95  	if err != nil {
    96  		t.Fatalf("expected no error, got %v", err)
    97  	}
    98  
    99  	if chbook.Balance().Sign() != 0 {
   100  		t.Errorf("expected: %v, got %v", "0", chbook.Balance())
   101  	}
   102  
   103  	chbox, err := NewInbox(key1, addr0, addr1, &key0.PublicKey, backend)
   104  	if err != nil {
   105  		t.Fatalf("expected no error, got %v", err)
   106  	}
   107  
   108  	received, err := chbox.Receive(ch)
   109  	if err != nil {
   110  		t.Fatalf("expected no error, got %v", err)
   111  	}
   112  
   113  	if received.Cmp(big.NewInt(43)) != 0 {
   114  		t.Errorf("expected: %v, got %v", "43", received)
   115  	}
   116  
   117  }
   118  
   119  func TestCheckbookFile(t *testing.T) {
   120  	path := filepath.Join(os.TempDir(), "chequebook-test.json")
   121  	backend := newTestBackend()
   122  	chbook, err := NewChequebook(path, addr0, key0, backend)
   123  	if err != nil {
   124  		t.Fatalf("expected no error, got %v", err)
   125  	}
   126  	chbook.sent[addr1] = new(big.Int).SetUint64(42)
   127  	chbook.balance = new(big.Int).Set(common.Big1)
   128  
   129  	chbook.Save()
   130  
   131  	chbook, err = LoadChequebook(path, key0, backend, false)
   132  	if err != nil {
   133  		t.Fatalf("expected no error, got %v", err)
   134  	}
   135  	if chbook.Balance().Cmp(common.Big1) != 0 {
   136  		t.Errorf("expected: %v, got %v", "0", chbook.Balance())
   137  	}
   138  
   139  	var ch *Cheque
   140  	if ch, err = chbook.Issue(addr1, common.Big1); err != nil {
   141  		t.Fatalf("expected no error, got %v", err)
   142  	}
   143  	if ch.Amount.Cmp(new(big.Int).SetUint64(43)) != 0 {
   144  		t.Errorf("expected: %v, got %v", "0", ch.Amount)
   145  	}
   146  
   147  	err = chbook.Save()
   148  	if err != nil {
   149  		t.Fatalf("expected no error, got %v", err)
   150  	}
   151  }
   152  
   153  func TestVerifyErrors(t *testing.T) {
   154  	path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json")
   155  	backend := newTestBackend()
   156  	contr0, err := deploy(key0, common.Big2, backend)
   157  	if err != nil {
   158  		t.Errorf("expected no error, got %v", err)
   159  	}
   160  	chbook0, err := NewChequebook(path0, contr0, key0, backend)
   161  	if err != nil {
   162  		t.Errorf("expected no error, got %v", err)
   163  	}
   164  
   165  	path1 := filepath.Join(os.TempDir(), "chequebook-test-1.json")
   166  	contr1, _ := deploy(key1, common.Big2, backend)
   167  	chbook1, err := NewChequebook(path1, contr1, key1, backend)
   168  	if err != nil {
   169  		t.Errorf("expected no error, got %v", err)
   170  	}
   171  
   172  	chbook0.sent[addr1] = new(big.Int).SetUint64(42)
   173  	chbook0.balance = new(big.Int).Set(common.Big2)
   174  	chbook1.balance = new(big.Int).Set(common.Big1)
   175  	amount := common.Big1
   176  	ch0, err := chbook0.Issue(addr1, amount)
   177  	if err != nil {
   178  		t.Fatalf("expected no error, got %v", err)
   179  	}
   180  
   181  	chbox, err := NewInbox(key1, contr0, addr1, &key0.PublicKey, backend)
   182  	if err != nil {
   183  		t.Fatalf("expected no error, got %v", err)
   184  	}
   185  
   186  	received, err := chbox.Receive(ch0)
   187  	if err != nil {
   188  		t.Fatalf("expected no error, got %v", err)
   189  	}
   190  
   191  	if received.Cmp(big.NewInt(43)) != 0 {
   192  		t.Errorf("expected: %v, got %v", "43", received)
   193  	}
   194  
   195  	ch1, err := chbook0.Issue(addr2, amount)
   196  	if err != nil {
   197  		t.Fatalf("expected no error, got %v", err)
   198  	}
   199  
   200  	received, err = chbox.Receive(ch1)
   201  	t.Logf("correct error: %v", err)
   202  	if err == nil {
   203  		t.Fatalf("expected receiver error, got none and value %v", received)
   204  	}
   205  
   206  	ch2, err := chbook1.Issue(addr1, amount)
   207  	if err != nil {
   208  		t.Fatalf("expected no error, got %v", err)
   209  	}
   210  	received, err = chbox.Receive(ch2)
   211  	t.Logf("correct error: %v", err)
   212  	if err == nil {
   213  		t.Fatalf("expected sender error, got none and value %v", received)
   214  	}
   215  
   216  	_, err = chbook1.Issue(addr1, new(big.Int).SetInt64(-1))
   217  	t.Logf("correct error: %v", err)
   218  	if err == nil {
   219  		t.Fatalf("expected incorrect amount error, got none")
   220  	}
   221  
   222  	received, err = chbox.Receive(ch0)
   223  	t.Logf("correct error: %v", err)
   224  	if err == nil {
   225  		t.Fatalf("expected incorrect amount error, got none and value %v", received)
   226  	}
   227  
   228  }
   229  
   230  func TestDeposit(t *testing.T) {
   231  	path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json")
   232  	backend := newTestBackend()
   233  	contr0, _ := deploy(key0, new(big.Int), backend)
   234  
   235  	chbook, err := NewChequebook(path0, contr0, key0, backend)
   236  	if err != nil {
   237  		t.Errorf("expected no error, got %v", err)
   238  	}
   239  
   240  	balance := new(big.Int).SetUint64(42)
   241  	chbook.Deposit(balance)
   242  	backend.Commit()
   243  	if chbook.Balance().Cmp(balance) != 0 {
   244  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   245  	}
   246  
   247  	amount := common.Big1
   248  	_, err = chbook.Issue(addr1, amount)
   249  	if err != nil {
   250  		t.Fatalf("expected no error, got %v", err)
   251  	}
   252  	backend.Commit()
   253  	exp := new(big.Int).SetUint64(41)
   254  	if chbook.Balance().Cmp(exp) != 0 {
   255  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   256  	}
   257  
   258  //
   259  	chbook.AutoDeposit(0, balance, balance)
   260  	_, err = chbook.Issue(addr1, amount)
   261  	if err != nil {
   262  		t.Fatalf("expected no error, got %v", err)
   263  	}
   264  	backend.Commit()
   265  	_, err = chbook.Issue(addr1, amount)
   266  	if err != nil {
   267  		t.Fatalf("expected no error, got %v", err)
   268  	}
   269  	backend.Commit()
   270  	if chbook.Balance().Cmp(balance) != 0 {
   271  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   272  	}
   273  
   274  //自动沉积
   275  	chbook.AutoDeposit(0, common.Big0, balance)
   276  	_, err = chbook.Issue(addr1, amount)
   277  	if err != nil {
   278  		t.Fatalf("expected no error, got %v", err)
   279  	}
   280  	backend.Commit()
   281  	_, err = chbook.Issue(addr1, amount)
   282  	if err != nil {
   283  		t.Fatalf("expected no error, got %v", err)
   284  	}
   285  	backend.Commit()
   286  
   287  	exp = new(big.Int).SetUint64(40)
   288  	if chbook.Balance().Cmp(exp) != 0 {
   289  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   290  	}
   291  
   292  //autodeposit every 200ms if new cheque issued
   293  	interval := 200 * time.Millisecond
   294  	chbook.AutoDeposit(interval, common.Big1, balance)
   295  	_, err = chbook.Issue(addr1, amount)
   296  	if err != nil {
   297  		t.Fatalf("expected no error, got %v", err)
   298  	}
   299  	backend.Commit()
   300  	_, err = chbook.Issue(addr1, amount)
   301  	if err != nil {
   302  		t.Fatalf("expected no error, got %v", err)
   303  	}
   304  	backend.Commit()
   305  
   306  	exp = new(big.Int).SetUint64(38)
   307  	if chbook.Balance().Cmp(exp) != 0 {
   308  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   309  	}
   310  
   311  	time.Sleep(3 * interval)
   312  	backend.Commit()
   313  	if chbook.Balance().Cmp(balance) != 0 {
   314  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   315  	}
   316  
   317  	exp = new(big.Int).SetUint64(40)
   318  	chbook.AutoDeposit(4*interval, exp, balance)
   319  	_, err = chbook.Issue(addr1, amount)
   320  	if err != nil {
   321  		t.Fatalf("expected no error, got %v", err)
   322  	}
   323  	backend.Commit()
   324  	_, err = chbook.Issue(addr1, amount)
   325  	if err != nil {
   326  		t.Fatalf("expected no error, got %v", err)
   327  	}
   328  	time.Sleep(3 * interval)
   329  	backend.Commit()
   330  	if chbook.Balance().Cmp(exp) != 0 {
   331  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   332  	}
   333  
   334  	_, err = chbook.Issue(addr1, amount)
   335  	if err != nil {
   336  		t.Fatalf("expected no error, got %v", err)
   337  	}
   338  	time.Sleep(1 * interval)
   339  	backend.Commit()
   340  
   341  	if chbook.Balance().Cmp(balance) != 0 {
   342  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   343  	}
   344  
   345  	chbook.AutoDeposit(1*interval, common.Big0, balance)
   346  	chbook.Stop()
   347  
   348  	_, err = chbook.Issue(addr1, common.Big1)
   349  	if err != nil {
   350  		t.Fatalf("expected no error, got %v", err)
   351  	}
   352  	backend.Commit()
   353  
   354  	_, err = chbook.Issue(addr1, common.Big2)
   355  	if err != nil {
   356  		t.Fatalf("expected no error, got %v", err)
   357  	}
   358  
   359  	time.Sleep(1 * interval)
   360  	backend.Commit()
   361  
   362  	exp = new(big.Int).SetUint64(39)
   363  	if chbook.Balance().Cmp(exp) != 0 {
   364  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   365  	}
   366  
   367  }
   368  
   369  func TestCash(t *testing.T) {
   370  	path := filepath.Join(os.TempDir(), "chequebook-test.json")
   371  	backend := newTestBackend()
   372  	contr0, _ := deploy(key0, common.Big2, backend)
   373  
   374  	chbook, err := NewChequebook(path, contr0, key0, backend)
   375  	if err != nil {
   376  		t.Errorf("expected no error, got %v", err)
   377  	}
   378  	chbook.sent[addr1] = new(big.Int).SetUint64(42)
   379  	amount := common.Big1
   380  	chbook.balance = new(big.Int).Set(common.Big1)
   381  	ch, err := chbook.Issue(addr1, amount)
   382  	if err != nil {
   383  		t.Fatalf("expected no error, got %v", err)
   384  	}
   385  	backend.Commit()
   386  	chbox, err := NewInbox(key1, contr0, addr1, &key0.PublicKey, backend)
   387  	if err != nil {
   388  		t.Fatalf("expected no error, got %v", err)
   389  	}
   390  
   391  //cashing latest cheque
   392  	if _, err = chbox.Receive(ch); err != nil {
   393  		t.Fatalf("expected no error, got %v", err)
   394  	}
   395  	if _, err = ch.Cash(chbook.session); err != nil {
   396  		t.Fatal("Cash failed:", err)
   397  	}
   398  	backend.Commit()
   399  
   400  	chbook.balance = new(big.Int).Set(common.Big3)
   401  	ch0, err := chbook.Issue(addr1, amount)
   402  	if err != nil {
   403  		t.Fatalf("expected no error, got %v", err)
   404  	}
   405  	backend.Commit()
   406  	ch1, err := chbook.Issue(addr1, amount)
   407  	if err != nil {
   408  		t.Fatalf("expected no error, got %v", err)
   409  	}
   410  	backend.Commit()
   411  
   412  	interval := 10 * time.Millisecond
   413  //用10ms间隔设置AutoCash
   414  	chbox.AutoCash(interval, nil)
   415  	_, err = chbox.Receive(ch0)
   416  	if err != nil {
   417  		t.Fatalf("expected no error, got %v", err)
   418  	}
   419  	_, err = chbox.Receive(ch1)
   420  	if err != nil {
   421  		t.Fatalf("expected no error, got %v", err)
   422  	}
   423  	backend.Commit()
   424  //after 3x interval time and 2 cheques received, exactly one cashing tx is sent
   425  	time.Sleep(4 * interval)
   426  	backend.Commit()
   427  
   428  //停止AutoCash后不再发送TX
   429  	ch2, err := chbook.Issue(addr1, amount)
   430  	if err != nil {
   431  		t.Fatalf("expected no error, got %v", err)
   432  	}
   433  	chbox.Stop()
   434  	_, err = chbox.Receive(ch2)
   435  	if err != nil {
   436  		t.Fatalf("expected no error, got %v", err)
   437  	}
   438  	time.Sleep(2 * interval)
   439  	backend.Commit()
   440  
   441  //autocash below 1
   442  	chbook.balance = big.NewInt(2)
   443  	chbox.AutoCash(0, common.Big1)
   444  
   445  	ch3, err := chbook.Issue(addr1, amount)
   446  	if err != nil {
   447  		t.Fatalf("expected no error, got %v", err)
   448  	}
   449  	backend.Commit()
   450  
   451  	ch4, err := chbook.Issue(addr1, amount)
   452  	if err != nil {
   453  		t.Fatalf("expected no error, got %v", err)
   454  	}
   455  	backend.Commit()
   456  
   457  	_, err = chbox.Receive(ch3)
   458  	if err != nil {
   459  		t.Fatalf("expected no error, got %v", err)
   460  	}
   461  	backend.Commit()
   462  	_, err = chbox.Receive(ch4)
   463  	if err != nil {
   464  		t.Fatalf("expected no error, got %v", err)
   465  	}
   466  	backend.Commit()
   467  
   468  //autochash on receipt when maxUncashed is 0
   469  	chbook.balance = new(big.Int).Set(common.Big2)
   470  	chbox.AutoCash(0, common.Big0)
   471  
   472  	ch5, err := chbook.Issue(addr1, amount)
   473  	if err != nil {
   474  		t.Fatalf("expected no error, got %v", err)
   475  	}
   476  	backend.Commit()
   477  
   478  	ch6, err := chbook.Issue(addr1, amount)
   479  	if err != nil {
   480  		t.Fatalf("expected no error, got %v", err)
   481  	}
   482  
   483  	_, err = chbox.Receive(ch5)
   484  	if err != nil {
   485  		t.Fatalf("expected no error, got %v", err)
   486  	}
   487  	backend.Commit()
   488  
   489  	_, err = chbox.Receive(ch6)
   490  	if err != nil {
   491  		t.Fatalf("expected no error, got %v", err)
   492  	}
   493  	backend.Commit()
   494  
   495  }