blob: 267c1b0e11a93184d171cb19d17ee1597065d707 [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"
"go.skia.org/infra/golden/go/types"
)
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: "aaa27ef254ad66609606c7af0730ee062b25edf9",
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)
// Check that the Validate accounts for both MasterBranch and
// LegacyMasterBranch values.
legacyMaster := &GoldResults{
GitHash: "aaa27ef254ad66609606c7af0730ee062b25edf9",
Key: map[string]string{"param1": "value1"},
GerritChangeListID: types.LegacyMasterBranch,
}
_, err = legacyMaster.Validate(true)
assert.NoError(t, err)
master := &GoldResults{
GitHash: "aaa27ef254ad66609606c7af0730ee062b25edf9",
Key: map[string]string{"param1": "value1"},
GerritChangeListID: types.MasterBranch,
}
_, err = master.Validate(true)
assert.NoError(t, err)
}
func TestParseGoldResults(t *testing.T) {
unittest.SmallTest(t)
r := testParse(t, legacySkiaTryjobJSON)
// 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.GerritChangeListID)
assert.Equal(t, int64(10), r.GerritPatchSet)
assert.Equal(t, int64(549340494940393), r.BuildBucketID)
assert.Len(t, r.Results, 3)
r = testParse(t, legacySkiaJSON)
assert.Equal(t, types.MasterBranch, r.GerritChangeListID)
assert.Equal(t, "Test-Android-Clang-Nexus7-CPU-Tegra3-arm-Release-All-Android", r.Builder)
assert.Equal(t, r.Results[0].Key[types.PRIMARY_KEY_FIELD], "skottie_multiframe")
assert.Contains(t, r.Results[0].Options, "color_type")
r = testParse(t, legacyGoldCtlTryjobJSON)
assert.Equal(t, int64(1762193), r.GerritChangeListID)
assert.Equal(t, int64(2), r.GerritPatchSet)
assert.Equal(t, int64(8904604368086838672), r.BuildBucketID)
assert.Contains(t, r.Key, "vendor_id")
r = testParse(t, legacyGoldCtlJSON)
assert.Equal(t, types.LegacyMasterBranch, r.GerritChangeListID)
assert.Contains(t, r.Key, "vendor_id")
r = testParse(t, legacyMasterBranchJSON)
assert.Equal(t, types.LegacyMasterBranch, r.GerritChangeListID)
r = testParse(t, masterBranchJSON)
assert.Equal(t, types.MasterBranch, r.GerritChangeListID)
r = testParse(t, emptyMasterBranchJSON)
assert.Equal(t, types.MasterBranch, r.GerritChangeListID)
}
func TestGenJson(t *testing.T) {
unittest.SmallTest(t)
// Test parsing the test JSON.
goldResults := testParse(t, legacySkiaTryjobJSON)
// 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))
}
}
const (
// This is what Skia uploads before Aug 2019 when run on a tryjob, it
// should continue to be valid if the schema changes (so we can re-ingest).
legacySkiaTryjobJSON = `{
"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"
}
}
]
}`
legacySkiaJSON = `{
"gitHash": "9c23a9e790b2f29b2cf204e67dbc67a363d0ce74",
"builder": "Test-Android-Clang-Nexus7-CPU-Tegra3-arm-Release-All-Android",
"buildbucket_build_id": "0",
"task_id": "56CzL86rgSDVSkFVK28r",
"swarming_bot_id": "skia-rpi-012",
"swarming_task_id": "469891c521e43d11",
"key": {
"arch": "arm",
"compiler": "Clang",
"extra_config": "Android",
"model": "Nexus7",
"os": "Android",
"style": "default"
},
"max_rss_MB": 274,
"results": [
{
"key": {
"name": "skottie_multiframe",
"config": "8888",
"source_type": "gm"
},
"options": {
"ext": "png",
"gamut": "untagged",
"transfer_fn": "untagged",
"color_type": "RGBA_8888",
"alpha_type": "Premul",
"color_depth": "8888"
},
"md5": "0abe3a2f7f58d2943f3b8b87f91dbff0"
},
{
"key": {
"name": "HTC.dng",
"config": "8888",
"source_type": "colorImage",
"source_options": "decode_native"
},
"options": {
"ext": "png",
"gamut": "untagged",
"transfer_fn": "untagged",
"color_type": "RGBA_8888",
"alpha_type": "Premul",
"color_depth": "8888"
},
"md5": "9cb31c854f22413841354f98b22a9acc"
},
{
"key": {
"name": "HTC.dng",
"config": "8888",
"source_type": "colorImage",
"source_options": "decode_to_dst"
},
"options": {
"ext": "png",
"gamut": "untagged",
"transfer_fn": "untagged",
"color_type": "RGBA_8888",
"alpha_type": "Premul",
"color_depth": "8888"
},
"md5": "9cb31c854f22413841354f98b22a9acc"
}
]
}`
legacyMasterBranchJSON = `{
"gitHash" : "c4711517219f333c1116f47706eb57b51b5f8fc7",
"key" : {
"arch" : "arm64"
},
"issue": "0"
}`
masterBranchJSON = `{
"gitHash" : "c4711517219f333c1116f47706eb57b51b5f8fc7",
"key" : {
"arch" : "arm64"
},
"issue": "-1"
}`
emptyMasterBranchJSON = `{
"gitHash" : "c4711517219f333c1116f47706eb57b51b5f8fc7",
"key" : {
"arch" : "arm64"
},
"issue": ""
}`
// This is what goldctl spits out before Aug 2019 when run on a tryjob, it
// should continue to be valid if the schema changes (so we can re-ingest).
legacyGoldCtlTryjobJSON = `{
"gitHash": "e1681c90cf6a4c3b6be2bc4b4cea59849c16a438",
"key": {
"device_id": "0x1cb3",
"device_string": "None",
"model_name": "",
"msaa": "True",
"vendor_id": "0x10de",
"vendor_string": "None"
},
"results": [
{
"key": {
"name": "Pixel_CanvasDisplayLinearRGBUnaccelerated2DGPUCompositing",
"source_type": "chrome-gpu"
},
"options": {
"ext": "png"
},
"md5": "690f72c0b56ae014c8ac66e7f25c0779"
}
],
"issue": "1762193",
"buildbucket_build_id": "8904604368086838672",
"patchset": "2",
"builder": "",
"task_id": ""
}`
// This is what goldctl spits out before Aug 2019 when run on the waterfall, it
// should continue to be valid if the schema changes (so we can re-ingest).
legacyGoldCtlJSON = `{"gitHash":"7d3833876fb941a69bc3f49736eb8912c44156a8","key":{"device_id":"None","device_string":"Adreno (TM) 418","model_name":"Nexus 5X","msaa":"True","vendor_id":"None","vendor_string":"Qualcomm"},"results":[{"key":{"name":"Pixel_CanvasDisplayLinearRGBAccelerated2D","source_type":"chrome-gpu"},"options":{"ext":"png"},"md5":"301c213d21e2e0c8b0a0ddf5771453d2"}],"issue":"0","buildbucket_build_id":"0","patchset":"0","builder":"","task_id":""}`
)