github.com/pingcap/chaos@v0.0.0-20190710112158-c86faf4b3719/db/tidb/long_fork_test.go (about)

     1  package tidb
     2  
     3  import (
     4  	"database/sql"
     5  	"testing"
     6  
     7  	"github.com/pingcap/chaos/pkg/core"
     8  )
     9  
    10  func TestCheckLongFork(t *testing.T) {
    11  	good := []core.Operation{
    12  		core.Operation{Action: core.InvokeOperation, Proc: 0, Data: lfRequest{}},
    13  		core.Operation{Action: core.InvokeOperation, Proc: 1, Data: lfRequest{}},
    14  		core.Operation{Action: core.InvokeOperation, Proc: 2, Data: lfRequest{}},
    15  		core.Operation{Action: core.ReturnOperation, Proc: 2, Data: lfResponse{Ok: true, Keys: []uint64{2, 1, 0}, Values: []sql.NullInt64{sql.NullInt64{Valid: true, Int64: 1}, sql.NullInt64{Valid: true, Int64: 1}, sql.NullInt64{Valid: true, Int64: 1}}}},
    16  		core.Operation{Action: core.ReturnOperation, Proc: 1, Data: lfResponse{Ok: true, Keys: []uint64{0, 1, 2}, Values: []sql.NullInt64{sql.NullInt64{Valid: false}, sql.NullInt64{Valid: false}, sql.NullInt64{Valid: true, Int64: 1}}}},
    17  		core.Operation{Action: core.ReturnOperation, Proc: 0, Data: lfResponse{Ok: true, Keys: []uint64{1, 2, 0}, Values: []sql.NullInt64{sql.NullInt64{Valid: false}, sql.NullInt64{Valid: true, Int64: 1}, sql.NullInt64{Valid: true, Int64: 1}}}},
    18  		core.Operation{Action: core.InvokeOperation, Proc: 3, Data: lfRequest{}},
    19  		core.Operation{Action: core.InvokeOperation, Proc: 4, Data: lfRequest{}},
    20  		core.Operation{Action: core.InvokeOperation, Proc: 5, Data: lfRequest{}},
    21  		core.Operation{Action: core.InvokeOperation, Proc: 6, Data: lfRequest{}},
    22  		core.Operation{Action: core.ReturnOperation, Proc: 5, Data: lfResponse{Ok: true, Keys: []uint64{3, 4, 5}, Values: []sql.NullInt64{sql.NullInt64{Valid: false}, sql.NullInt64{Valid: false}, sql.NullInt64{Valid: false}}}},
    23  		core.Operation{Action: core.ReturnOperation, Proc: 3, Data: lfResponse{Ok: true, Keys: []uint64{5, 4, 3}, Values: []sql.NullInt64{sql.NullInt64{Valid: false}, sql.NullInt64{Valid: false}, sql.NullInt64{Valid: true, Int64: 1}}}},
    24  		core.Operation{Action: core.ReturnOperation, Proc: 4, Data: lfResponse{Ok: true, Keys: []uint64{4, 3, 5}, Values: []sql.NullInt64{sql.NullInt64{Valid: false}, sql.NullInt64{Valid: true, Int64: 1}, sql.NullInt64{Valid: true, Int64: 1}}}},
    25  		core.Operation{Action: core.ReturnOperation, Proc: 6, Data: lfResponse{Ok: true, Keys: []uint64{5, 3, 4}, Values: []sql.NullInt64{sql.NullInt64{Valid: true, Int64: 1}, sql.NullInt64{Valid: true, Int64: 1}, sql.NullInt64{Valid: true, Int64: 1}}}},
    26  	}
    27  	bad := []core.Operation{
    28  		core.Operation{Action: core.InvokeOperation, Proc: 0, Data: lfRequest{}},
    29  		core.Operation{Action: core.InvokeOperation, Proc: 1, Data: lfRequest{}},
    30  		core.Operation{Action: core.InvokeOperation, Proc: 2, Data: lfRequest{}},
    31  		core.Operation{Action: core.ReturnOperation, Proc: 2, Data: lfResponse{Ok: true, Keys: []uint64{2, 1, 0}, Values: []sql.NullInt64{sql.NullInt64{Valid: true, Int64: 1}, sql.NullInt64{Valid: true, Int64: 1}, sql.NullInt64{Valid: true, Int64: 1}}}},
    32  		// long fork!
    33  		core.Operation{Action: core.ReturnOperation, Proc: 1, Data: lfResponse{Ok: true, Keys: []uint64{0, 1, 2}, Values: []sql.NullInt64{sql.NullInt64{Valid: false}, sql.NullInt64{Valid: false}, sql.NullInt64{Valid: true, Int64: 1}}}},
    34  		core.Operation{Action: core.ReturnOperation, Proc: 0, Data: lfResponse{Ok: true, Keys: []uint64{1, 2, 0}, Values: []sql.NullInt64{sql.NullInt64{Valid: true, Int64: 1}, sql.NullInt64{Valid: false}, sql.NullInt64{Valid: false}}}},
    35  	}
    36  	ok, err := ensureNoLongForks(good, 3)
    37  	if !ok || err != nil {
    38  		t.Fatalf("good must pass check")
    39  	}
    40  	ok, err = ensureNoLongForks(bad, 3)
    41  	if ok {
    42  		t.Fatalf("bad must fail check")
    43  	}
    44  }