| package jsonio |
| |
| import ( |
| "bytes" |
| "encoding/json" |
| "fmt" |
| "strings" |
| "testing" |
| |
| assert "github.com/stretchr/testify/require" |
| "go.skia.org/infra/go/testutils/unittest" |
| ) |
| |
| var ( |
| testJSON = ` |
| { |
| "gitHash" : "c4711517219f333c1116f47706eb57b51b5f8fc7", |
| "key" : { |
| "arch" : "arm64", |
| "compiler" : "Clang", |
| "configuration" : "Debug", |
| "cpu_or_gpu" : "GPU", |
| "cpu_or_gpu_value" : "PowerVRGT7600", |
| "extra_config" : "Metal", |
| "model" : "iPhone7", |
| "os" : "iOS" |
| }, |
| "issue": "12345", |
| "patchset": "10", |
| "buildbucket_build_id" : "549340494940393", |
| "builder" : "Test-Android-Clang-iPhone7-GPU-PowerVRGT7600-arm64-Debug-All-Metal", |
| "swarming_bot_id" : "skia-rpi-102", |
| "swarming_task_id" : "3fcd8d4a539ba311", |
| "task_id" : "Xb0VhENPSRFGnf2elVQd", |
| "results" : [ |
| { |
| "key" : { |
| "config" : "mtl", |
| "name" : "yuv_nv12_to_rgb_effect", |
| "source_type" : "gm" |
| }, |
| "md5" : "30a470b6ac174aa1ffb54fcb77a21f21", |
| "options" : { |
| "ext" : "png", |
| "gamma_correct" : "no" |
| } |
| }, |
| { |
| "key" : { |
| "config" : "mtl", |
| "name" : "yuv_to_rgb_effect", |
| "source_type" : "gm" |
| }, |
| "md5" : "0ea32027e1e651e4250797aa44bfadaa", |
| "options" : { |
| "ext" : "png", |
| "gamma_correct" : "no" |
| } |
| }, |
| { |
| "key" : { |
| "config" : "pipe-8888", |
| "name" : "clipcubic", |
| "source_type" : "gm" |
| }, |
| "md5" : "64e446d96bebba035887dd7dda6db6c4", |
| "options" : { |
| "ext" : "png" |
| } |
| } |
| ] |
| }` |
| ) |
| |
| func TestValidate(t *testing.T) { |
| unittest.SmallTest(t) |
| |
| empty := &GoldResults{} |
| errMsgs, err := empty.Validate(false) |
| assert.Error(t, err) |
| assertErrorFields(t, errMsgs, |
| "gitHash", |
| "key", |
| "results") |
| assert.NotNil(t, errMsgs) |
| |
| wrongResults := &GoldResults{ |
| GitHash: "a1b2c3d4e5f6a7b8c9d0e1f2", |
| Key: map[string]string{"param1": "value1"}, |
| } |
| errMsgs, err = wrongResults.Validate(false) |
| assert.Error(t, err) |
| assertErrorFields(t, errMsgs, "results") |
| |
| wrongResults.Results = []*Result{} |
| errMsgs, err = wrongResults.Validate(false) |
| assert.Error(t, err) |
| assertErrorFields(t, errMsgs, "results") |
| |
| wrongResults.Results = []*Result{ |
| {Key: map[string]string{}}, |
| } |
| errMsgs, err = wrongResults.Validate(false) |
| assert.Error(t, err) |
| assertErrorFields(t, errMsgs, "results") |
| |
| // Now ignore the results in the validation. |
| errMsgs, err = wrongResults.Validate(true) |
| assert.NoError(t, err) |
| assert.Equal(t, []string(nil), errMsgs) |
| } |
| |
| func TestParseGoldResults(t *testing.T) { |
| unittest.SmallTest(t) |
| r := testParse(t, testJSON) |
| |
| // Make sure some key fields come out correctly, i.e. are converted correctly from string to int. |
| assert.Equal(t, "c4711517219f333c1116f47706eb57b51b5f8fc7", r.GitHash) |
| assert.Equal(t, "Xb0VhENPSRFGnf2elVQd", r.TaskID) |
| assert.Equal(t, int64(12345), r.Issue) |
| assert.Equal(t, int64(10), r.Patchset) |
| assert.Equal(t, int64(549340494940393), r.BuildBucketID) |
| } |
| |
| func TestGenJson(t *testing.T) { |
| unittest.SmallTest(t) |
| |
| // Test parsing the test JSON. |
| goldResults := testParse(t, testJSON) |
| |
| // For good measure we validate. |
| _, err := goldResults.Validate(false) |
| assert.NoError(t, err) |
| |
| // Encode and decode the results. |
| var buf bytes.Buffer |
| assert.NoError(t, json.NewEncoder(&buf).Encode(goldResults)) |
| newGoldResults := testParse(t, buf.String()) |
| assert.Equal(t, goldResults, newGoldResults) |
| } |
| |
| func testParse(t *testing.T, jsonStr string) *GoldResults { |
| buf := bytes.NewBuffer([]byte(jsonStr)) |
| |
| ret, errMsg, err := ParseGoldResults(buf) |
| assert.NoError(t, err) |
| assert.Nil(t, errMsg) |
| return ret |
| } |
| |
| func assertErrorFields(t *testing.T, errMsgs []string, expectedFields ...string) { |
| for _, msg := range errMsgs { |
| found := false |
| for _, ef := range expectedFields { |
| found = found || strings.Contains(msg, ef) |
| } |
| assert.True(t, found, fmt.Sprintf("Could not find %v in msg: %s", expectedFields, msg)) |
| } |
| } |