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 }