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 }