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 }