github.com/pingcap/chaos@v0.0.0-20190710112158-c86faf4b3719/pkg/check/porcupine/porcupine_test.go (about) 1 package porcupine 2 3 import ( 4 "testing" 5 6 "github.com/pingcap/chaos/pkg/core" 7 ) 8 9 type noopRequest struct { 10 // 0 for read, 1 for write 11 Op int 12 Value int 13 } 14 15 type noopResponse struct { 16 Value int 17 Ok bool 18 Unknown bool 19 } 20 21 type noop struct{} 22 23 func (noop) Prepare(_ interface{}) { 24 } 25 26 func (noop) Init() interface{} { 27 return 10 28 } 29 30 func (noop) Step(state interface{}, input interface{}, output interface{}) (bool, interface{}) { 31 st := state.(int) 32 inp := input.(noopRequest) 33 out := output.(noopResponse) 34 35 if inp.Op == 0 { 36 // read 37 ok := out.Unknown || st == out.Value 38 return ok, state 39 } 40 41 // for write 42 return out.Ok || out.Unknown, inp.Value 43 } 44 45 func (noop) Equal(state1, state2 interface{}) bool { 46 s1 := state1.(int) 47 s2 := state2.(int) 48 49 return s1 == s2 50 } 51 52 func (noop) Name() string { 53 return "noop" 54 } 55 56 func TestPorcupineChecker(t *testing.T) { 57 ops := []core.Operation{ 58 {core.InvokeOperation, 1, noopRequest{Op: 0}}, 59 {core.ReturnOperation, 1, noopResponse{Value: 10}}, 60 {core.InvokeOperation, 2, noopRequest{Op: 1, Value: 15}}, 61 {core.ReturnOperation, 2, noopResponse{Unknown: true}}, 62 {core.InvokeOperation, 3, noopRequest{Op: 0}}, 63 {core.ReturnOperation, 3, noopResponse{Value: 15}}, 64 } 65 66 var checker Checker 67 ok, err := checker.Check(noop{}, ops) 68 if err != nil { 69 t.Fatalf("verify history failed %v", err) 70 } 71 if !ok { 72 t.Fatal("must be linearizable") 73 } 74 }