blob: b9eef884588ae01a53bee52aef98a3dadc3d684c [file] [log] [blame]
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))
}
}