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 }