github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/contracts/chequebook/cheque_test.go (about)

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