github.com/cheng762/platon-go@v1.8.17-0.20190529111256-7deff2d7be26/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  	"github.com/PlatONnetwork/PlatON-Go/accounts/abi/bind"
    22  	"github.com/PlatONnetwork/PlatON-Go/accounts/abi/bind/backends"
    23  	"github.com/PlatONnetwork/PlatON-Go/common"
    24  	"github.com/PlatONnetwork/PlatON-Go/contracts/chequebook/contract"
    25  	"github.com/PlatONnetwork/PlatON-Go/core"
    26  	"github.com/PlatONnetwork/PlatON-Go/crypto"
    27  	"math/big"
    28  	"testing"
    29  )
    30  
    31  var (
    32  	key0, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
    33  	key1, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a")
    34  	key2, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee")
    35  	addr0   = crypto.PubkeyToAddress(key0.PublicKey)
    36  	addr1   = crypto.PubkeyToAddress(key1.PublicKey)
    37  	addr2   = crypto.PubkeyToAddress(key2.PublicKey)
    38  )
    39  
    40  func newTestBackend() *backends.SimulatedBackend {
    41  	return backends.NewSimulatedBackend(core.GenesisAlloc{
    42  		addr0: {Balance: big.NewInt(1000000000)},
    43  		addr1: {Balance: big.NewInt(1000000000)},
    44  		addr2: {Balance: big.NewInt(1000000000)},
    45  	}, 10000000)
    46  }
    47  
    48  func deploy(prvKey *ecdsa.PrivateKey, amount *big.Int, backend *backends.SimulatedBackend) (common.Address, error) {
    49  	deployTransactor := bind.NewKeyedTransactor(prvKey)
    50  	deployTransactor.Value = amount
    51  	addr, _, _, err := contract.DeployChequebook(deployTransactor, backend)
    52  	if err != nil {
    53  		return common.Address{}, err
    54  	}
    55  	backend.Commit()
    56  	return addr, nil
    57  }
    58  
    59  func TestIssueAndReceive(t *testing.T) {
    60  	// TODO test
    61  	/*path := filepath.Join(os.TempDir(), "chequebook-test.json")
    62  	backend := newTestBackend()
    63  	addr0, err := deploy(key0, big.NewInt(0), backend)
    64  	if err != nil {
    65  		t.Fatalf("deploy contract: expected no error, got %v", err)
    66  	}
    67  	chbook, err := NewChequebook(path, addr0, key0, backend)
    68  	if err != nil {
    69  		t.Fatalf("expected no error, got %v", err)
    70  	}
    71  	chbook.sent[addr1] = new(big.Int).SetUint64(42)
    72  	amount := common.Big1
    73  
    74  	if _, err = chbook.Issue(addr1, amount); err == nil {
    75  		t.Fatalf("expected insufficient funds error, got none")
    76  	}
    77  
    78  	chbook.balance = new(big.Int).Set(common.Big1)
    79  	if chbook.Balance().Cmp(common.Big1) != 0 {
    80  		t.Fatalf("expected: %v, got %v", "0", chbook.Balance())
    81  	}
    82  
    83  	ch, err := chbook.Issue(addr1, amount)
    84  	if err != nil {
    85  		t.Fatalf("expected no error, got %v", err)
    86  	}
    87  
    88  	if chbook.Balance().Sign() != 0 {
    89  		t.Errorf("expected: %v, got %v", "0", chbook.Balance())
    90  	}
    91  
    92  	chbox, err := NewInbox(key1, addr0, addr1, &key0.PublicKey, backend)
    93  	if err != nil {
    94  		t.Fatalf("expected no error, got %v", err)
    95  	}
    96  
    97  	received, err := chbox.Receive(ch)
    98  	if err != nil {
    99  		t.Fatalf("expected no error, got %v", err)
   100  	}
   101  
   102  	if received.Cmp(big.NewInt(43)) != 0 {
   103  		t.Errorf("expected: %v, got %v", "43", received)
   104  	}*/
   105  
   106  }
   107  
   108  func TestCheckbookFile(t *testing.T) {
   109  	// TODO test
   110  	/*path := filepath.Join(os.TempDir(), "chequebook-test.json")
   111  	backend := newTestBackend()
   112  	chbook, err := NewChequebook(path, addr0, key0, backend)
   113  	if err != nil {
   114  		t.Fatalf("expected no error, got %v", err)
   115  	}
   116  	chbook.sent[addr1] = new(big.Int).SetUint64(42)
   117  	chbook.balance = new(big.Int).Set(common.Big1)
   118  
   119  	chbook.Save()
   120  
   121  	chbook, err = LoadChequebook(path, key0, backend, false)
   122  	if err != nil {
   123  		t.Fatalf("expected no error, got %v", err)
   124  	}
   125  	if chbook.Balance().Cmp(common.Big1) != 0 {
   126  		t.Errorf("expected: %v, got %v", "0", chbook.Balance())
   127  	}
   128  
   129  	var ch *Cheque
   130  	if ch, err = chbook.Issue(addr1, common.Big1); err != nil {
   131  		t.Fatalf("expected no error, got %v", err)
   132  	}
   133  	if ch.Amount.Cmp(new(big.Int).SetUint64(43)) != 0 {
   134  		t.Errorf("expected: %v, got %v", "0", ch.Amount)
   135  	}
   136  
   137  	err = chbook.Save()
   138  	if err != nil {
   139  		t.Fatalf("expected no error, got %v", err)
   140  	}*/
   141  }
   142  
   143  func TestVerifyErrors(t *testing.T) {
   144  	// TODO test
   145  	/*path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json")
   146  	backend := newTestBackend()
   147  	contr0, err := deploy(key0, common.Big2, backend)
   148  	if err != nil {
   149  		t.Errorf("expected no error, got %v", err)
   150  	}
   151  	chbook0, err := NewChequebook(path0, contr0, key0, backend)
   152  	if err != nil {
   153  		t.Errorf("expected no error, got %v", err)
   154  	}
   155  
   156  	path1 := filepath.Join(os.TempDir(), "chequebook-test-1.json")
   157  	contr1, _ := deploy(key1, common.Big2, backend)
   158  	chbook1, err := NewChequebook(path1, contr1, key1, backend)
   159  	if err != nil {
   160  		t.Errorf("expected no error, got %v", err)
   161  	}
   162  
   163  	chbook0.sent[addr1] = new(big.Int).SetUint64(42)
   164  	chbook0.balance = new(big.Int).Set(common.Big2)
   165  	chbook1.balance = new(big.Int).Set(common.Big1)
   166  	amount := common.Big1
   167  	ch0, err := chbook0.Issue(addr1, amount)
   168  	if err != nil {
   169  		t.Fatalf("expected no error, got %v", err)
   170  	}
   171  
   172  	chbox, err := NewInbox(key1, contr0, addr1, &key0.PublicKey, backend)
   173  	if err != nil {
   174  		t.Fatalf("expected no error, got %v", err)
   175  	}
   176  
   177  	received, err := chbox.Receive(ch0)
   178  	if err != nil {
   179  		t.Fatalf("expected no error, got %v", err)
   180  	}
   181  
   182  	if received.Cmp(big.NewInt(43)) != 0 {
   183  		t.Errorf("expected: %v, got %v", "43", received)
   184  	}
   185  
   186  	ch1, err := chbook0.Issue(addr2, amount)
   187  	if err != nil {
   188  		t.Fatalf("expected no error, got %v", err)
   189  	}
   190  
   191  	received, err = chbox.Receive(ch1)
   192  	t.Logf("correct error: %v", err)
   193  	if err == nil {
   194  		t.Fatalf("expected receiver error, got none and value %v", received)
   195  	}
   196  
   197  	ch2, err := chbook1.Issue(addr1, amount)
   198  	if err != nil {
   199  		t.Fatalf("expected no error, got %v", err)
   200  	}
   201  	received, err = chbox.Receive(ch2)
   202  	t.Logf("correct error: %v", err)
   203  	if err == nil {
   204  		t.Fatalf("expected sender error, got none and value %v", received)
   205  	}
   206  
   207  	_, err = chbook1.Issue(addr1, new(big.Int).SetInt64(-1))
   208  	t.Logf("correct error: %v", err)
   209  	if err == nil {
   210  		t.Fatalf("expected incorrect amount error, got none")
   211  	}
   212  
   213  	received, err = chbox.Receive(ch0)
   214  	t.Logf("correct error: %v", err)
   215  	if err == nil {
   216  		t.Fatalf("expected incorrect amount error, got none and value %v", received)
   217  	}*/
   218  
   219  }
   220  
   221  func TestDeposit(t *testing.T) {
   222  	// TODO test
   223  	/*path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json")
   224  	backend := newTestBackend()
   225  	contr0, _ := deploy(key0, new(big.Int), backend)
   226  
   227  	chbook, err := NewChequebook(path0, contr0, key0, backend)
   228  	if err != nil {
   229  		t.Errorf("expected no error, got %v", err)
   230  	}
   231  
   232  	balance := new(big.Int).SetUint64(42)
   233  	chbook.Deposit(balance)
   234  	backend.Commit()
   235  	if chbook.Balance().Cmp(balance) != 0 {
   236  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   237  	}
   238  
   239  	amount := common.Big1
   240  	_, err = chbook.Issue(addr1, amount)
   241  	if err != nil {
   242  		t.Fatalf("expected no error, got %v", err)
   243  	}
   244  	backend.Commit()
   245  	exp := new(big.Int).SetUint64(41)
   246  	if chbook.Balance().Cmp(exp) != 0 {
   247  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   248  	}
   249  
   250  	// autodeposit on each issue
   251  	chbook.AutoDeposit(0, balance, 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  	if chbook.Balance().Cmp(balance) != 0 {
   263  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   264  	}
   265  
   266  	// autodeposit off
   267  	chbook.AutoDeposit(0, common.Big0, balance)
   268  	_, err = chbook.Issue(addr1, amount)
   269  	if err != nil {
   270  		t.Fatalf("expected no error, got %v", err)
   271  	}
   272  	backend.Commit()
   273  	_, err = chbook.Issue(addr1, amount)
   274  	if err != nil {
   275  		t.Fatalf("expected no error, got %v", err)
   276  	}
   277  	backend.Commit()
   278  
   279  	exp = new(big.Int).SetUint64(40)
   280  	if chbook.Balance().Cmp(exp) != 0 {
   281  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   282  	}
   283  
   284  	// autodeposit every 200ms if new cheque issued
   285  	interval := 200 * time.Millisecond
   286  	chbook.AutoDeposit(interval, common.Big1, balance)
   287  	_, err = chbook.Issue(addr1, amount)
   288  	if err != nil {
   289  		t.Fatalf("expected no error, got %v", err)
   290  	}
   291  	backend.Commit()
   292  	_, err = chbook.Issue(addr1, amount)
   293  	if err != nil {
   294  		t.Fatalf("expected no error, got %v", err)
   295  	}
   296  	backend.Commit()
   297  
   298  	exp = new(big.Int).SetUint64(38)
   299  	if chbook.Balance().Cmp(exp) != 0 {
   300  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   301  	}
   302  
   303  	time.Sleep(3 * interval)
   304  	backend.Commit()
   305  	if chbook.Balance().Cmp(balance) != 0 {
   306  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   307  	}
   308  
   309  	exp = new(big.Int).SetUint64(40)
   310  	chbook.AutoDeposit(4*interval, exp, balance)
   311  	_, err = chbook.Issue(addr1, amount)
   312  	if err != nil {
   313  		t.Fatalf("expected no error, got %v", err)
   314  	}
   315  	backend.Commit()
   316  	_, err = chbook.Issue(addr1, amount)
   317  	if err != nil {
   318  		t.Fatalf("expected no error, got %v", err)
   319  	}
   320  	time.Sleep(3 * interval)
   321  	backend.Commit()
   322  	if chbook.Balance().Cmp(exp) != 0 {
   323  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   324  	}
   325  
   326  	_, err = chbook.Issue(addr1, amount)
   327  	if err != nil {
   328  		t.Fatalf("expected no error, got %v", err)
   329  	}
   330  	time.Sleep(1 * interval)
   331  	backend.Commit()
   332  
   333  	if chbook.Balance().Cmp(balance) != 0 {
   334  		t.Fatalf("expected balance %v, got %v", balance, chbook.Balance())
   335  	}
   336  
   337  	chbook.AutoDeposit(1*interval, common.Big0, balance)
   338  	chbook.Stop()
   339  
   340  	_, err = chbook.Issue(addr1, common.Big1)
   341  	if err != nil {
   342  		t.Fatalf("expected no error, got %v", err)
   343  	}
   344  	backend.Commit()
   345  
   346  	_, err = chbook.Issue(addr1, common.Big2)
   347  	if err != nil {
   348  		t.Fatalf("expected no error, got %v", err)
   349  	}
   350  
   351  	time.Sleep(1 * interval)
   352  	backend.Commit()
   353  
   354  	exp = new(big.Int).SetUint64(39)
   355  	if chbook.Balance().Cmp(exp) != 0 {
   356  		t.Fatalf("expected balance %v, got %v", exp, chbook.Balance())
   357  	}*/
   358  
   359  }
   360  
   361  func TestCash(t *testing.T) {
   362  	// TODO test
   363  	/*path := filepath.Join(os.TempDir(), "chequebook-test.json")
   364  	backend := newTestBackend()
   365  	contr0, _ := deploy(key0, common.Big2, backend)
   366  
   367  	chbook, err := NewChequebook(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(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  }