diff --git a/tests/robustness/model/deterministic_test.go b/tests/robustness/model/deterministic_test.go index 673ab2e97..17a9d1646 100644 --- a/tests/robustness/model/deterministic_test.go +++ b/tests/robustness/model/deterministic_test.go @@ -15,8 +15,11 @@ package model import ( + "encoding/json" "testing" + "github.com/google/go-cmp/cmp" + "go.etcd.io/etcd/api/v3/mvccpb" ) @@ -26,14 +29,22 @@ func TestModelDeterministic(t *testing.T) { t.Run(tc.name, func(t *testing.T) { state := DeterministicModel.Init() for _, op := range tc.operations { - t.Logf("state: %v", state) ok, newState := DeterministicModel.Step(state, op.req, op.resp) if op.expectFailure == ok { + t.Logf("state: %v", state) t.Errorf("Unexpected operation result, expect: %v, got: %v, operation: %s", !op.expectFailure, ok, DeterministicModel.DescribeOperation(op.req, op.resp)) + var loadedState etcdState + err := json.Unmarshal([]byte(state.(string)), &loadedState) + if err != nil { + t.Fatalf("Failed to load state: %v", err) + } + _, resp := loadedState.step(op.req) + t.Errorf("Response diff: %s", cmp.Diff(op.resp, resp)) break } if ok { state = newState + t.Logf("state: %v", state) } } }) diff --git a/tests/robustness/model/non_deterministic_test.go b/tests/robustness/model/non_deterministic_test.go index e51fd3625..154e6e20c 100644 --- a/tests/robustness/model/non_deterministic_test.go +++ b/tests/robustness/model/non_deterministic_test.go @@ -15,9 +15,11 @@ package model import ( + "encoding/json" "errors" "testing" + "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/assert" ) @@ -322,6 +324,16 @@ func TestModelNonDeterministic(t *testing.T) { if ok != !op.expectFailure { t.Logf("state: %v", state) t.Errorf("Unexpected operation result, expect: %v, got: %v, operation: %s", !op.expectFailure, ok, NonDeterministicModel.DescribeOperation(op.req, op.resp)) + var loadedState nonDeterministicState + err := json.Unmarshal([]byte(state.(string)), &loadedState) + if err != nil { + t.Fatalf("Failed to load state: %v", err) + } + for i, s := range loadedState { + _, resp := s.step(op.req) + t.Errorf("For state %d, response diff: %s", i, cmp.Diff(op.resp.EtcdResponse, resp)) + } + break } if ok { state = newState