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  }