diff --git a/go.mod b/go.mod index 577b93bb29..140ce89bc0 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/mattn/go-isatty v0.0.14 github.com/sergi/go-diff v1.2.0 github.com/shirou/gopsutil v3.21.11+incompatible + github.com/tidwall/jsonc v0.3.2 go.chromium.org/luci v0.0.0-20220412023008-ab2409fe739a golang.org/x/net v0.0.0-20220403103023-749bd193bc2b google.golang.org/protobuf v1.28.0 diff --git a/go.sum b/go.sum index 04bd2819a1..b5d4243364 100644 --- a/go.sum +++ b/go.sum @@ -456,6 +456,8 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8= +github.com/tidwall/jsonc v0.3.2 h1:ZTKrmejRlAJYdn0kcaFqRAKlxxFIC21pYq8vLa4p2Wc= +github.com/tidwall/jsonc v0.3.2/go.mod h1:dw+3CIxqHi+t8eFSpzzMlcVYxKp08UP5CD8/uSFCyJE= github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= diff --git a/tools/src/cmd/cts/common/config.go b/tools/src/cmd/cts/common/config.go new file mode 100644 index 0000000000..3aa90d5b73 --- /dev/null +++ b/tools/src/cmd/cts/common/config.go @@ -0,0 +1,93 @@ +// Copyright 2022 The Dawn Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package common + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "time" + + "dawn.googlesource.com/dawn/tools/src/buildbucket" + "github.com/tidwall/jsonc" +) + +// Config holds the configuration data for the 'cts' command. +// Config is loaded from a JSON file stored next to the +// tools/src/cmd/cts/config.json. +type Config struct { + // Test holds configuration data for test results. + Test struct { + // The ResultDB string prefix for CTS tests. + Prefix string + // The time threshold used to classify tests as slow. + SlowThreshold time.Duration + } + // Gerrit holds configuration for Dawn's Gerrit server. + Gerrit struct { + // The host URL + Host string + // The project name + Project string + } + // Git holds configuration data for the various Git repositories. + Git struct { + // The CTS git repository. + CTS GitProject + // The Dawn git repository. + Dawn GitProject + } + // Builders is a map of builder name (as displayed in the UI) to buildbucket + // builder information. + Builders map[string]buildbucket.Builder + // TagAliases is a list of tags which are treated as equivalent. + // For example, some GPUs are similar enough to be considered equivalent. + // See crbug.com/dawn/1387 for more information. + TagAliases [][]string + // Sheets holds information about the Google Sheets document used for + // tracking CTS statistics. + Sheets struct { + ID string + } +} + +// GitProject holds a git host URL and project. +type GitProject struct { + Host string + Project string +} + +// HttpsURL returns the https URL of the project +func (g GitProject) HttpsURL() string { + return fmt.Sprintf("https://%v/%v", g.Host, g.Project) +} + +// LoadConfig loads the JSON config file at the given path +func LoadConfig(path string) (*Config, error) { + data, err := ioutil.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("failed to open '%v': %w", path, err) + } + + // Remove comments, trailing commas. + data = jsonc.ToJSONInPlace(data) + + cfg := Config{} + if err := json.NewDecoder(bytes.NewReader(data)).Decode(&cfg); err != nil { + return nil, fmt.Errorf("failed to load config: %w", err) + } + return &cfg, nil +} diff --git a/tools/src/cmd/cts/config.json b/tools/src/cmd/cts/config.json new file mode 100644 index 0000000000..b408eed0aa --- /dev/null +++ b/tools/src/cmd/cts/config.json @@ -0,0 +1,54 @@ +{ + "Test": { + "Prefix": "ninja://chrome/test:telemetry_gpu_integration_test/gpu_tests.webgpu_cts_integration_test.WebGpuCtsIntegrationTest.", + "SlowThreshold": 15000000000 // 15 seconds + }, + "Gerrit": { + "Host": "https://dawn-review.googlesource.com", + "Project": "dawn" + }, + "Git": { + "CTS": { + "Host": "chromium.googlesource.com", + "Project": "external/github.com/gpuweb/cts" + }, + "Dawn": { + "Host": "dawn.googlesource.com", + "Project": "dawn" + } + }, + "Builders": { + "Win": { + "Project": "chromium", + "Bucket": "try", + "Builder": "win-dawn-rel" + }, + "Win10-x86": { + "Project": "chromium", + "Bucket": "try", + "Builder": "dawn-try-win10-x86-rel" + }, + "Mac": { + "Project": "chromium", + "Bucket": "try", + "Builder": "mac-dawn-rel" + }, + "Linux": { + "Project": "chromium", + "Bucket": "try", + "Builder": "linux-dawn-rel" + } + }, + "TagAliases": [ + [ + // crbug.com/dawn/1387 + "intel-0x5912", + "intel-0x3e92" + ] + ], + "Sheets": { + // Spreadsheet to export results data to + // https://docs.google.com/spreadsheets/d/1OFsh-r_njG5pKDwjL1HOvLJKDRC4FgO-LE9Kw7WPQcc + "ID": "1OFsh-r_njG5pKDwjL1HOvLJKDRC4FgO-LE9Kw7WPQcc" + } +}