github.com/pingcap/chaos@v0.0.0-20190710112158-c86faf4b3719/db/tidb/bank_test.go (about) 1 package tidb 2 3 import ( 4 "testing" 5 6 "github.com/anishathalye/porcupine" 7 ) 8 9 func checkTsoEvents(evnets []porcupine.Event) bool { 10 tEvents := generateTsoEvents(evnets) 11 return verifyTsoEvents(tEvents) 12 } 13 14 func getBankModel(accountNum int) porcupine.Model { 15 m := bank{ 16 accountNum: 2, 17 } 18 return porcupine.Model{ 19 Init: m.Init, 20 Step: m.Step, 21 Equal: m.Equal, 22 } 23 } 24 25 func newBankEvent(v interface{}, id uint) porcupine.Event { 26 if _, ok := v.(bankRequest); ok { 27 return porcupine.Event{Kind: porcupine.CallEvent, Value: v, Id: id} 28 } 29 30 return porcupine.Event{Kind: porcupine.ReturnEvent, Value: v, Id: id} 31 } 32 33 func TestBankVerify(t *testing.T) { 34 m := getBankModel(2) 35 36 events := []porcupine.Event{ 37 newBankEvent(bankRequest{Op: 0}, 1), 38 newBankEvent(bankResponse{Balances: []int64{1000, 1000}, Tso: 1}, 1), 39 newBankEvent(bankRequest{Op: 1, From: 0, To: 1, Amount: 500}, 2), 40 newBankEvent(bankResponse{Ok: true, Tso: 2, FromBalance: 1000, ToBalance: 1000}, 2), 41 newBankEvent(bankRequest{Op: 0}, 3), 42 newBankEvent(bankResponse{Balances: []int64{500, 1500}, Tso: 3}, 3), 43 } 44 45 if !porcupine.CheckEvents(m, events) { 46 t.Fatal("must be linearizable") 47 } 48 49 if !checkTsoEvents(events) { 50 t.Fatal("must be linearizable") 51 } 52 } 53 54 func TestBankVerifyUnknown(t *testing.T) { 55 m := getBankModel(2) 56 57 events := []porcupine.Event{ 58 newBankEvent(bankRequest{Op: 0}, 1), 59 newBankEvent(bankResponse{Balances: []int64{1000, 1000}, Tso: 1}, 1), 60 newBankEvent(bankRequest{Op: 1, From: 0, To: 1, Amount: 500}, 2), 61 // write return unknow, so we consider its return time is infinite. 62 // newBankEvent(bankResponse{Unknown: true}, 2), 63 64 newBankEvent(bankRequest{Op: 0}, 3), 65 newBankEvent(bankResponse{Balances: []int64{500, 1500}, Tso: 3}, 3), 66 newBankEvent(bankRequest{Op: 0}, 4), 67 68 newBankEvent(bankResponse{Unknown: true, Tso: 2, FromBalance: 1000, ToBalance: 1000}, 2), 69 newBankEvent(bankResponse{Unknown: true, Tso: 4}, 4), 70 } 71 72 if !porcupine.CheckEvents(m, events) { 73 t.Fatal("must be linearizable") 74 } 75 76 if !checkTsoEvents(events) { 77 t.Fatal("must be linearizable") 78 } 79 } 80 81 func TestBankVerifyWriteNotOk(t *testing.T) { 82 m := getBankModel(2) 83 84 events := []porcupine.Event{ 85 newBankEvent(bankRequest{Op: 0}, 1), 86 newBankEvent(bankResponse{Balances: []int64{1000, 1000}, Tso: 1}, 1), 87 newBankEvent(bankRequest{Op: 1, From: 0, To: 1, Amount: 500}, 2), 88 newBankEvent(bankResponse{Ok: false}, 2), 89 90 newBankEvent(bankRequest{Op: 0}, 3), 91 newBankEvent(bankResponse{Balances: []int64{1000, 1000}, Tso: 3}, 3), 92 } 93 94 if !porcupine.CheckEvents(m, events) { 95 t.Fatal("must be linearizable") 96 } 97 98 if !checkTsoEvents(events) { 99 t.Fatal("must be linearizable") 100 } 101 } 102 func TestBankVerifyNoLinerizable(t *testing.T) { 103 m := getBankModel(2) 104 105 events := []porcupine.Event{ 106 newBankEvent(bankRequest{Op: 0}, 1), 107 newBankEvent(bankResponse{Balances: []int64{1000, 1000}, Tso: 1}, 1), 108 newBankEvent(bankRequest{Op: 1, From: 0, To: 1, Amount: 500}, 2), 109 newBankEvent(bankResponse{Ok: true, Tso: 2, FromBalance: 1000, ToBalance: 1000}, 2), 110 newBankEvent(bankRequest{Op: 0}, 3), 111 newBankEvent(bankResponse{Balances: []int64{1000, 1000}, Tso: 3}, 3), 112 } 113 114 if porcupine.CheckEvents(m, events) { 115 t.Fatal("must be not linearizable") 116 } 117 118 // if checkTsoEvents(events) { 119 // t.Fatal("must be not linearizable") 120 // } 121 } 122 123 func TestBankVerifyNoLinerizable2(t *testing.T) { 124 events := []porcupine.Event{ 125 newBankEvent(bankRequest{Op: 0}, 1), 126 newBankEvent(bankResponse{Balances: []int64{1000, 1000}, Tso: 1}, 1), 127 newBankEvent(bankRequest{Op: 1, From: 0, To: 1, Amount: 100}, 2), 128 newBankEvent(bankRequest{Op: 1, From: 0, To: 1, Amount: 200}, 3), 129 newBankEvent(bankResponse{Ok: true, Tso: 3, FromBalance: 1000, ToBalance: 1000}, 3), 130 newBankEvent(bankResponse{Ok: true, Tso: 2, FromBalance: 1000, ToBalance: 1000}, 2), 131 } 132 133 if checkTsoEvents(events) { 134 t.Fatal("must be not linearizable") 135 } 136 }