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  }