github.com/n1ghtfa1l/go-vnt@v0.6.4-alpha.6/contracts/chequebook/cheque_test.go (about)

     1  // Copyright 2016 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package chequebook
    18  
    19  import (
    20  	"crypto/ecdsa"
    21  	"math/big"
    22  	"os"
    23  	"path/filepath"
    24  	"testing"
    25  	"time"
    26  
    27  	"github.com/vntchain/go-vnt/accounts/abi/bind"
    28  	"github.com/vntchain/go-vnt/accounts/abi/bind/backends"
    29  	"github.com/vntchain/go-vnt/common"
    30  	"github.com/vntchain/go-vnt/contracts/chequebook/contract"
    31  	"github.com/vntchain/go-vnt/core"
    32  	"github.com/vntchain/go-vnt/crypto"
    33  	"github.com/vntchain/go-vnt/params"
    34  )
    35  
    36  var (
    37  	chainID      = params.TestChainConfig.ChainID
    38  	key0, _      = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
    39  	key1, _      = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a")
    40  	key2, _      = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee")
    41  	addr0        = crypto.PubkeyToAddress(key0.PublicKey)
    42  	addr1        = crypto.PubkeyToAddress(key1.PublicKey)
    43  	addr2        = crypto.PubkeyToAddress(key2.PublicKey)
    44  	activeKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f292")
    45  	activeAddr   = crypto.PubkeyToAddress(activeKey.PublicKey)
    46  )
    47  
    48  func newTestBackend() *backends.SimulatedBackend {
    49  
    50  	backend := backends.NewSimulatedBackend(core.GenesisAlloc{
    51  		addr0:      {Balance: big.NewInt(1000000000)},
    52  		addr1:      {Balance: big.NewInt(1000000000)},
    53  		addr2:      {Balance: big.NewInt(1000000000)},
    54  		activeAddr: {Balance: big.NewInt(0).Mul(big.NewInt(1e9), big.NewInt(1e18))},
    55  	})
    56  
    57  	return backend
    58  }
    59  
    60  func deploy(prvKey *ecdsa.PrivateKey, amount *big.Int, backend *backends.SimulatedBackend) (common.Address, error) {
    61  	deployTransactor := bind.NewKeyedTransactor(prvKey, chainID)
    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(chainID, 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  	if _, err = chbook.Issue(addr1, amount); err == nil {
    85  		t.Fatalf("expected insufficient funds error, got none")
    86  	}
    87  
    88  	chbook.balance = new(big.Int).Set(common.Big1)
    89  	if chbook.Balance().Cmp(common.Big1) != 0 {
    90  		t.Fatalf("expected: %v, got %v", "0", chbook.Balance())
    91  	}
    92  
    93  	ch, err := chbook.Issue(addr1, amount)
    94  	if err != nil {
    95  		t.Fatalf("expected no error, got %v", err)
    96  	}
    97  
    98  	if chbook.Balance().Sign() != 0 {
    99  		t.Errorf("expected: %v, got %v", "0", chbook.Balance())
   100  	}
   101  
   102  	chbox, err := NewInbox(chainID, key1, addr0, addr1, &key0.PublicKey, backend)
   103  	if err != nil {
   104  		t.Fatalf("expected no error, got %v", err)
   105  	}
   106  
   107  	received, err := chbox.Receive(ch)
   108  	if err != nil {
   109  		t.Fatalf("expected no error, got %v", err)
   110  	}
   111  
   112  	if received.Cmp(big.NewInt(43)) != 0 {
   113  		t.Errorf("expected: %v, got %v", "43", received)
   114  	}
   115  
   116  }
   117  
   118  func TestCheckbookFile(t *testing.T) {
   119  	path := filepath.Join(os.TempDir(), "chequebook-test.json")
   120  	backend := newTestBackend()
   121  	chbook, err := NewChequebook(chainID, path, addr0, key0, backend)
   122  	if err != nil {
   123  		t.Fatalf("expected no error, got %v", err)
   124  	}
   125  	chbook.sent[addr1] = new(big.Int).SetUint64(42)
   126  	chbook.balance = new(big.Int).Set(common.Big1)
   127  
   128  	chbook.Save()
   129  
   130  	chbook, err = LoadChequebook(chainID, path, key0, backend, false)
   131  	if err != nil {
   132  		t.Fatalf("expected no error, got %v", err)
   133  	}
   134  	if chbook.Balance().Cmp(common.Big1) != 0 {
   135  		t.Errorf("expected: %v, got %v", "0", chbook.Balance())
   136  	}
   137  
   138  	var ch *Cheque
   139  	if ch, err = chbook.Issue(addr1, common.Big1); err != nil {
   140  		t.Fatalf("expected no error, got %v", err)
   141  	}
   142  	if ch.Amount.Cmp(new(big.Int).SetUint64(43)) != 0 {
   143  		t.Errorf("expected: %v, got %v", "0", ch.Amount)
   144  	}
   145  
   146  	err = chbook.Save()
   147  	if err != nil {
   148  		t.Fatalf("expected no error, got %v", err)
   149  	}
   150  }
   151  
   152  func TestVerifyErrors(t *testing.T) {
   153  	path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json")
   154  	backend := newTestBackend()
   155  	contr0, err := deploy(key0, common.Big2, backend)
   156  	if err != nil {
   157  		t.Errorf("expected no error, got %v", err)
   158  	}
   159  	chbook0, err := NewChequebook(chainID, path0, contr0, key0, backend)
   160  	if err != nil {
   161  		t.Errorf("expected no error, got %v", err)
   162  	}
   163  	path1 := filepath.Join(os.TempDir(), "chequebook-test-1.json")
   164  	contr1, _ := deploy(key1, common.Big2, backend)
   165  	chbook1, err := NewChequebook(chainID, path1, contr1, key1, backend)
   166  	if err != nil {
   167  		t.Errorf("expected no error, got %v", err)
   168  	}
   169  	chbook0.sent[addr1] = new(big.Int).SetUint64(42)
   170  	chbook0.balance = new(big.Int).Set(common.Big2)
   171  	chbook1.balance = new(big.Int).Set(common.Big1)
   172  	amount := common.Big1
   173  	ch0, err := chbook0.Issue(addr1, amount)
   174  	if err != nil {
   175  		t.Fatalf("expected no error, got %v", err)
   176  	}
   177  	chbox, err := NewInbox(chainID, key1, contr0, addr1, &key0.PublicKey, backend)
   178  	if err != nil {
   179  		t.Fatalf("expected no error, got %v", err)
   180  	}
   181  	received, err := chbox.Receive(ch0)
   182  	if err != nil {
   183  		t.Fatalf("expected no error, got %v", err)
   184  	}
   185  	if received.Cmp(big.NewInt(43)) != 0 {
   186  		t.Errorf("expected: %v, got %v", "43", received)
   187  	}
   188  
   189  	ch1, err := chbook0.Issue(addr2, amount)
   190  	if err != nil {
   191  		t.Fatalf("expected no error, got %v", err)
   192  	}
   193  	received, err = chbox.Receive(ch1)
   194  	t.Logf("correct error: %v", err)
   195  	if err == nil {
   196  		t.Fatalf("expected receiver error, got none and value %v", received)
   197  	}
   198  
   199  	ch2, err := chbook1.Issue(addr1, amount)
   200  	if err != nil {
   201  		t.Fatalf("expected no error, got %v", err)
   202  	}
   203  	received, err = chbox.Receive(ch2)
   204  	t.Logf("correct error: %v", err)
   205  	if err == nil {
   206  		t.Fatalf("expected sender error, got none and value %v", received)
   207  	}
   208  
   209  	_, err = chbook1.Issue(addr1, new(big.Int).SetInt64(-1))
   210  	t.Logf("correct error: %v", err)
   211  	if err == nil {
   212  		t.Fatalf("expected incorrect amount error, got none")
   213  	}
   214  
   215  	received, err = chbox.Receive(ch0)
   216  	t.Logf("correct error: %v", err)
   217  	if err == nil {
   218  		t.Fatalf("expected incorrect amount error, got none and value %v", received)
   219  	}
   220  
   221  }
   222  
   223  func TestDeposit(t *testing.T) {
   224  	path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json")
   225  	backend := newTestBackend()
   226  	contr0, _ := deploy(key0, new(big.Int), backend)
   227  
   228  	chbook, err := NewChequebook(chainID, path0, contr0, key0, backend)
   229  	if err != nil {
   230  		t.Errorf("expected no error, got %v", err)
   231  	}
   232  
   233  	balance := new(big.Int).SetUint64(42)
   234  	chbook.Deposit(balance)
   235  	backend.Commit()
   236  	if chbook.Balance().Cmp(balance) != 0 {
   237  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   238  	}
   239  
   240  	amount := common.Big1
   241  	_, err = chbook.Issue(addr1, amount)
   242  	if err != nil {
   243  		t.Fatalf("expected no error, got %v", err)
   244  	}
   245  	backend.Commit()
   246  	exp := new(big.Int).SetUint64(41)
   247  	if chbook.Balance().Cmp(exp) != 0 {
   248  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   249  	}
   250  
   251  	// autodeposit on each issue
   252  	chbook.AutoDeposit(0, balance, balance)
   253  	_, err = chbook.Issue(addr1, amount)
   254  	if err != nil {
   255  		t.Fatalf("expected no error, got %v", err)
   256  	}
   257  	backend.Commit()
   258  	_, err = chbook.Issue(addr1, amount)
   259  	if err != nil {
   260  		t.Fatalf("expected no error, got %v", err)
   261  	}
   262  	backend.Commit()
   263  	if chbook.Balance().Cmp(balance) != 0 {
   264  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   265  	}
   266  
   267  	// autodeposit off
   268  	chbook.AutoDeposit(0, common.Big0, balance)
   269  	_, err = chbook.Issue(addr1, amount)
   270  	if err != nil {
   271  		t.Fatalf("expected no error, got %v", err)
   272  	}
   273  	backend.Commit()
   274  	_, err = chbook.Issue(addr1, amount)
   275  	if err != nil {
   276  		t.Fatalf("expected no error, got %v", err)
   277  	}
   278  	backend.Commit()
   279  
   280  	exp = new(big.Int).SetUint64(40)
   281  	if chbook.Balance().Cmp(exp) != 0 {
   282  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   283  	}
   284  
   285  	// autodeposit every 200ms if new cheque issued
   286  	interval := 200 * time.Millisecond
   287  	chbook.AutoDeposit(interval, common.Big1, balance)
   288  	_, err = chbook.Issue(addr1, amount)
   289  	if err != nil {
   290  		t.Fatalf("expected no error, got %v", err)
   291  	}
   292  	backend.Commit()
   293  	_, err = chbook.Issue(addr1, amount)
   294  	if err != nil {
   295  		t.Fatalf("expected no error, got %v", err)
   296  	}
   297  	backend.Commit()
   298  
   299  	exp = new(big.Int).SetUint64(38)
   300  	if chbook.Balance().Cmp(exp) != 0 {
   301  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   302  	}
   303  
   304  	time.Sleep(3 * interval)
   305  	backend.Commit()
   306  	if chbook.Balance().Cmp(balance) != 0 {
   307  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   308  	}
   309  
   310  	exp = new(big.Int).SetUint64(40)
   311  	chbook.AutoDeposit(4*interval, exp, balance)
   312  	_, err = chbook.Issue(addr1, amount)
   313  	if err != nil {
   314  		t.Fatalf("expected no error, got %v", err)
   315  	}
   316  	backend.Commit()
   317  	_, err = chbook.Issue(addr1, amount)
   318  	if err != nil {
   319  		t.Fatalf("expected no error, got %v", err)
   320  	}
   321  	time.Sleep(3 * interval)
   322  	backend.Commit()
   323  	if chbook.Balance().Cmp(exp) != 0 {
   324  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   325  	}
   326  
   327  	_, err = chbook.Issue(addr1, amount)
   328  	if err != nil {
   329  		t.Fatalf("expected no error, got %v", err)
   330  	}
   331  	time.Sleep(1 * interval)
   332  	backend.Commit()
   333  
   334  	if chbook.Balance().Cmp(balance) != 0 {
   335  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   336  	}
   337  
   338  	chbook.AutoDeposit(1*interval, common.Big0, balance)
   339  	chbook.Stop()
   340  
   341  	_, err = chbook.Issue(addr1, common.Big1)
   342  	if err != nil {
   343  		t.Fatalf("expected no error, got %v", err)
   344  	}
   345  	backend.Commit()
   346  
   347  	_, err = chbook.Issue(addr1, common.Big2)
   348  	if err != nil {
   349  		t.Fatalf("expected no error, got %v", err)
   350  	}
   351  
   352  	time.Sleep(1 * interval)
   353  	backend.Commit()
   354  
   355  	exp = new(big.Int).SetUint64(39)
   356  	if chbook.Balance().Cmp(exp) != 0 {
   357  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   358  	}
   359  
   360  }
   361  
   362  func TestCash(t *testing.T) {
   363  	path := filepath.Join(os.TempDir(), "chequebook-test.json")
   364  	backend := newTestBackend()
   365  	contr0, _ := deploy(key0, common.Big2, backend)
   366  
   367  	chbook, err := NewChequebook(chainID, path, contr0, key0, backend)
   368  	if err != nil {
   369  		t.Errorf("expected no error, got %v", err)
   370  	}
   371  	chbook.sent[addr1] = new(big.Int).SetUint64(42)
   372  	amount := common.Big1
   373  	chbook.balance = new(big.Int).Set(common.Big1)
   374  	ch, err := chbook.Issue(addr1, amount)
   375  	if err != nil {
   376  		t.Fatalf("expected no error, got %v", err)
   377  	}
   378  	backend.Commit()
   379  	chbox, err := NewInbox(chainID, key1, contr0, addr1, &key0.PublicKey, backend)
   380  	if err != nil {
   381  		t.Fatalf("expected no error, got %v", err)
   382  	}
   383  
   384  	// cashing latest cheque
   385  	if _, err = chbox.Receive(ch); err != nil {
   386  		t.Fatalf("expected no error, got %v", err)
   387  	}
   388  	if _, err = ch.Cash(chbook.session); err != nil {
   389  		t.Fatal("Cash failed:", err)
   390  	}
   391  	backend.Commit()
   392  
   393  	chbook.balance = new(big.Int).Set(common.Big3)
   394  	ch0, err := chbook.Issue(addr1, amount)
   395  	if err != nil {
   396  		t.Fatalf("expected no error, got %v", err)
   397  	}
   398  	backend.Commit()
   399  	ch1, err := chbook.Issue(addr1, amount)
   400  	if err != nil {
   401  		t.Fatalf("expected no error, got %v", err)
   402  	}
   403  	backend.Commit()
   404  
   405  	interval := 10 * time.Millisecond
   406  	// setting autocash with interval of 10ms
   407  	chbox.AutoCash(interval, nil)
   408  	_, err = chbox.Receive(ch0)
   409  	if err != nil {
   410  		t.Fatalf("expected no error, got %v", err)
   411  	}
   412  	_, err = chbox.Receive(ch1)
   413  	if err != nil {
   414  		t.Fatalf("expected no error, got %v", err)
   415  	}
   416  	backend.Commit()
   417  	// after 3x interval time and 2 cheques received, exactly one cashing tx is sent
   418  	time.Sleep(4 * interval)
   419  	backend.Commit()
   420  
   421  	// after stopping autocash no more tx are sent
   422  	ch2, err := chbook.Issue(addr1, amount)
   423  	if err != nil {
   424  		t.Fatalf("expected no error, got %v", err)
   425  	}
   426  	chbox.Stop()
   427  	_, err = chbox.Receive(ch2)
   428  	if err != nil {
   429  		t.Fatalf("expected no error, got %v", err)
   430  	}
   431  	time.Sleep(2 * interval)
   432  	backend.Commit()
   433  
   434  	// autocash below 1
   435  	chbook.balance = big.NewInt(2)
   436  	chbox.AutoCash(0, common.Big1)
   437  
   438  	ch3, err := chbook.Issue(addr1, amount)
   439  	if err != nil {
   440  		t.Fatalf("expected no error, got %v", err)
   441  	}
   442  	backend.Commit()
   443  
   444  	ch4, err := chbook.Issue(addr1, amount)
   445  	if err != nil {
   446  		t.Fatalf("expected no error, got %v", err)
   447  	}
   448  	backend.Commit()
   449  
   450  	_, err = chbox.Receive(ch3)
   451  	if err != nil {
   452  		t.Fatalf("expected no error, got %v", err)
   453  	}
   454  	backend.Commit()
   455  	_, err = chbox.Receive(ch4)
   456  	if err != nil {
   457  		t.Fatalf("expected no error, got %v", err)
   458  	}
   459  	backend.Commit()
   460  
   461  	// autochash on receipt when maxUncashed is 0
   462  	chbook.balance = new(big.Int).Set(common.Big2)
   463  	chbox.AutoCash(0, common.Big0)
   464  
   465  	ch5, err := chbook.Issue(addr1, amount)
   466  	if err != nil {
   467  		t.Fatalf("expected no error, got %v", err)
   468  	}
   469  	backend.Commit()
   470  
   471  	ch6, err := chbook.Issue(addr1, amount)
   472  	if err != nil {
   473  		t.Fatalf("expected no error, got %v", err)
   474  	}
   475  
   476  	_, err = chbox.Receive(ch5)
   477  	if err != nil {
   478  		t.Fatalf("expected no error, got %v", err)
   479  	}
   480  	backend.Commit()
   481  
   482  	_, err = chbox.Receive(ch6)
   483  	if err != nil {
   484  		t.Fatalf("expected no error, got %v", err)
   485  	}
   486  	backend.Commit()
   487  
   488  }