blob: bcf97be6da2ecd0e0de5c86a6e246d81da42c6d7 [file] [log] [blame]
// Copyright 2022 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package expectations
import (
"testing"
"dawn.googlesource.com/dawn/tools/src/cts/query"
"dawn.googlesource.com/dawn/tools/src/cts/result"
"github.com/stretchr/testify/require"
)
var Q = query.Parse
/*******************************************************************************
* removeUnknownTags tests
******************************************************************************/
// Tests that unknown tags are properly removed.
func TestRemoveUnknownTags(t *testing.T) {
header := `# BEGIN TAG HEADER
# OS
# tags: [ android linux win10 ]
# END TAG HEADER
`
content, err := Parse("expectations.txt", header)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("android", "android-14", "arm"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("win", "win10", "intel", "intel-gen-9", "intel-0x3e9b"),
Status: result.Failure,
},
}
content.removeUnknownTags(&resultList)
expectedList := result.List{
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("android"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("win10"),
Status: result.Failure,
},
}
require.Equal(t, expectedList, resultList)
}
/*******************************************************************************
* reduceTagsToMostExplicitOnly tests
******************************************************************************/
// Tests that result tags are properly filtered to only include the most
// explicit tags based on the tag sets in the header.
func TestReduceTagsToMostExplicitOnly(t *testing.T) {
header := `
# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# END TAG HEADER
`
content, err := Parse("expectations.txt", header)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("android", "android-14", "arm"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("win", "win10", "intel", "intel-gen-9", "intel-0x3e9b"),
Status: result.Failure,
},
}
content.reduceTagsToMostExplicitOnly(&resultList)
expectedList := result.List{
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("android-14", "arm"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("win10", "intel-0x3e9b"),
Status: result.Failure,
},
}
require.Equal(t, expectedList, resultList)
}
/*******************************************************************************
* reduceTagsToBroadGroups tests
******************************************************************************/
func getBroadTagSuccessHeader() string {
return `
# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# Devices
# tags: [ android-nexus-5x android-pixel-2 android-pixel-4
# android-pixel-6 android-shield-android-tv android-sm-a135m
# android-sm-a235m android-sm-s926b
# chromeos-board-amd64-generic chromeos-board-eve chromeos-board-jacuzzi
# chromeos-board-octopus chromeos-board-volteer
# fuchsia-board-astro fuchsia-board-sherlock fuchsia-board-qemu-x64 ]
# END TAG HEADER
`
}
func TestReduceTagsToBroadGroups_Success(t *testing.T) {
header := getBroadTagSuccessHeader()
content, err := Parse("expectations.txt", header)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
// Android, Fuchsia, and ChromeOS should only use the device tag and should
// still reduce properly with only the device tag available.
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("android", "android-t", "qualcomm", "qualcomm-0x41333430", "android-pixel-4", "unused"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("android-pixel-4", "unused"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("chromeos", "intel", "intel-0x3e92", "chromeos-board-volteer", "unused"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("chromeos-board-volteer", "unused"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("fuchsia", "intel", "intel-0x3e9b", "fuchsia-board-astro", "unused"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("fuchsia-board-astro", "unused"),
Status: result.Failure,
},
// Other platforms should use OS + GPU.
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("linux", "ubuntu", "amd", "amd-0x7340", "unused"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("mac", "ventura", "apple", "apple-apple-m2", "unused"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("win", "win10", "nvidia", "nvidia-0x2184", "unused"),
Status: result.Failure,
},
}
err = content.reduceTagsToBroadGroups(&resultList)
require.NoErrorf(t, err, "Failed to reduce tags: %v", err)
expectedList := result.List{
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("android-pixel-4"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("android-pixel-4"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("chromeos-board-volteer"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("chromeos-board-volteer"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("fuchsia-board-astro"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("fuchsia-board-astro"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("linux", "amd"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("mac", "apple"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("win", "nvidia"),
Status: result.Failure,
},
}
require.Equal(t, expectedList, resultList)
}
func TestReduceTagsToBroadGroups_FailToGetBroadTagSets(t *testing.T) {
header := `
# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# Devices
# tags: [ android-nexus-5x android-pixel-2 android-pixel-4
# android-pixel-6 android-shield-android-tv android-sm-a135m
# android-sm-a235m android-sm-s926b
# chromeos-board-amd64-generic chromeos-board-eve chromeos-board-jacuzzi
# chromeos-board-octopus chromeos-board-volteer
# fuchsia-board-astro fuchsia-board-sherlock fuchsia-board-qemu-x64 ]
# END TAG HEADER
`
content, err := Parse("expectations.txt", header)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{}
err = content.reduceTagsToBroadGroups(&resultList)
require.ErrorContains(t, err, "Did not find expected tag sets.")
require.ErrorContains(t, err, "osTagSet: []")
}
func TestReduceTagsToBroadGroups_FailToFindOsTag(t *testing.T) {
header := getBroadTagSuccessHeader()
content, err := Parse("expectations.txt", header)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("qualcomm", "qualcomm-0x41333430", "unused"),
Status: result.Failure,
},
}
err = content.reduceTagsToBroadGroups(&resultList)
require.ErrorContains(t, err, "did not have exactly one overlap with [qualcomm, unused]")
}
func TestReduceTagsToBroadGroups_FailToFindGpuTag(t *testing.T) {
header := getBroadTagSuccessHeader()
content, err := Parse("expectations.txt", header)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("linux", "ubuntu", "unused"),
Status: result.Failure,
},
}
err = content.reduceTagsToBroadGroups(&resultList)
require.ErrorContains(t, err, "did not have exactly one overlap with [linux, unused]")
}
/*******************************************************************************
* getAndAssertOneOverlappingTag tests
******************************************************************************/
func TestGetAndAssertOneOverlappingTag(t *testing.T) {
tests := []struct {
name string
validTags result.Tags
allTags result.Tags
want string
wantErr bool
wantErrMsg string
}{
{
name: "One overlapping tag",
validTags: result.NewTags("tag1", "tag2"),
allTags: result.NewTags("tag2", "tag3"),
want: "tag2",
wantErr: false,
wantErrMsg: "",
},
{
name: "No overlapping tag",
validTags: result.NewTags("tag1", "tag2"),
allTags: result.NewTags("tag3", "tag4"),
want: "",
wantErr: true,
wantErrMsg: "Tags [tag1, tag2] did not have exactly one overlap with [tag3, tag4]",
},
{
name: "Multiple overlapping tags",
validTags: result.NewTags("tag1", "tag2", "tag3"),
allTags: result.NewTags("tag2", "tag3", "tag4"),
want: "",
wantErr: true,
wantErrMsg: "Tags [tag1, tag2, tag3] did not have exactly one overlap with [tag2, tag3, tag4]",
},
{
name: "Empty validTags",
validTags: result.NewTags(),
allTags: result.NewTags("tag2", "tag3"),
want: "",
wantErr: true,
wantErrMsg: "Tags [] did not have exactly one overlap with [tag2, tag3]",
},
{
name: "Empty allTags",
validTags: result.NewTags("tag1", "tag2"),
allTags: result.NewTags(),
want: "",
wantErr: true,
wantErrMsg: "Tags [tag1, tag2] did not have exactly one overlap with []",
},
{
name: "Both empty",
validTags: result.NewTags(),
allTags: result.NewTags(),
want: "",
wantErr: true,
wantErrMsg: "Tags [] did not have exactly one overlap with []",
},
{
name: "One overlapping tag with duplicates in validTags",
validTags: result.NewTags("tag1", "tag2", "tag2"),
allTags: result.NewTags("tag2", "tag3"),
want: "tag2",
wantErr: false,
},
{
name: "One overlapping tag with duplicates in allTags",
validTags: result.NewTags("tag1", "tag2"),
allTags: result.NewTags("tag2", "tag3", "tag2"),
want: "tag2",
wantErr: false,
},
{
name: "One overlapping tag with duplicates in both",
validTags: result.NewTags("tag1", "tag2", "tag2"),
allTags: result.NewTags("tag2", "tag3", "tag2"),
want: "tag2",
wantErr: false,
},
{
name: "Multiple overlapping tags with duplicates",
validTags: result.NewTags("tag1", "tag2", "tag3", "tag2"),
allTags: result.NewTags("tag2", "tag3", "tag4", "tag2"),
want: "",
wantErr: true,
wantErrMsg: "Tags [tag1, tag2, tag3] did not have exactly one overlap with [tag2, tag3, tag4]",
},
}
for _, testCase := range tests {
t.Run(testCase.name, func(t *testing.T) {
got, err := getAndAssertOneOverlappingTag(testCase.validTags, testCase.allTags)
if (err != nil) != testCase.wantErr {
t.Errorf("getAndAssertOneOverlappingTag() error = %v, wantErr %v", err, testCase.wantErr)
return
}
if testCase.wantErr && err.Error() != testCase.wantErrMsg {
t.Errorf("getAndAssertOneOverlappingTag() errorMsg = %v, wantErrMsg %v", err.Error(), testCase.wantErrMsg)
return
}
if got != testCase.want {
t.Errorf("getAndAssertOneOverlappingTag() = %v, want %v", got, testCase.want)
return
}
})
}
}
/*******************************************************************************
* getBroadTagSets tests
******************************************************************************/
func TestGetBroadTagSets_Success(t *testing.T) {
c := &Content{
Tags: Tags{
Sets: []TagSet{
{
Name: "other",
Tags: result.NewTags("unused"),
},
{
Name: "os",
Tags: result.NewTags("android", "linux", "special-os"),
},
{
Name: "gpu",
Tags: result.NewTags("intel", "nvidia", "special-vendor"),
},
{
Name: "device",
Tags: result.NewTags("android-pixel-4", "android-pixel-6", "special-device"),
},
},
},
}
osTagSet, gpuTagSet, deviceTagSet, err := c.getBroadTagSets()
require.NoError(t, err)
require.Equal(t, result.NewTags("android", "linux", "special-os"), osTagSet)
require.Equal(t, result.NewTags("intel", "nvidia", "special-vendor"), gpuTagSet)
require.Equal(t, result.NewTags("android-pixel-4", "android-pixel-6", "special-device"), deviceTagSet)
}
func TestGetBroadTagSets_MissingOSTagSet(t *testing.T) {
c := &Content{
Tags: Tags{
Sets: []TagSet{
{
Name: "gpu",
Tags: result.NewTags("intel", "nvidia"),
},
{
Name: "device",
Tags: result.NewTags("android-pixel-4", "android-pixel-6"),
},
},
},
}
_, _, _, err := c.getBroadTagSets()
require.Error(t, err)
require.Contains(t, err.Error(), "Did not find expected tag sets")
require.Contains(t, err.Error(), "osTagSet: []")
}
func TestGetBroadTagSets_MismatchedOSTagSet(t *testing.T) {
c := &Content{
Tags: Tags{
Sets: []TagSet{
{
Name: "os",
Tags: result.NewTags("special-os"),
},
{
Name: "gpu",
Tags: result.NewTags("intel", "nvidia"),
},
{
Name: "device",
Tags: result.NewTags("android-pixel-4", "android-pixel-6"),
},
},
},
}
_, _, _, err := c.getBroadTagSets()
require.Error(t, err)
require.Contains(t, err.Error(), "Did not find expected tag sets")
require.Contains(t, err.Error(), "osTagSet: []")
}
func TestGetBroadTagSets_MissingGPUTagSet(t *testing.T) {
c := &Content{
Tags: Tags{
Sets: []TagSet{
{
Name: "os",
Tags: result.NewTags("android", "linux"),
},
{
Name: "device",
Tags: result.NewTags("android-pixel-4", "android-pixel-6"),
},
},
},
}
_, _, _, err := c.getBroadTagSets()
require.Error(t, err)
require.Contains(t, err.Error(), "Did not find expected tag sets")
require.Contains(t, err.Error(), "gpuTagSet: []")
}
func TestGetBroadTagSets_MismatchedGPUTagSet(t *testing.T) {
c := &Content{
Tags: Tags{
Sets: []TagSet{
{
Name: "os",
Tags: result.NewTags("android", "linux"),
},
{
Name: "gpu",
Tags: result.NewTags("special-vendor"),
},
{
Name: "device",
Tags: result.NewTags("android-pixel-4", "android-pixel-6"),
},
},
},
}
_, _, _, err := c.getBroadTagSets()
require.Error(t, err)
require.Contains(t, err.Error(), "Did not find expected tag sets")
require.Contains(t, err.Error(), "gpuTagSet: []")
}
func TestGetBroadTagSets_MissingDeviceTagSet(t *testing.T) {
c := &Content{
Tags: Tags{
Sets: []TagSet{
{
Name: "os",
Tags: result.NewTags("android", "linux"),
},
{
Name: "gpu",
Tags: result.NewTags("intel", "nvidia"),
},
},
},
}
_, _, _, err := c.getBroadTagSets()
require.Error(t, err)
require.Contains(t, err.Error(), "Did not find expected tag sets")
require.Contains(t, err.Error(), "deviceTagSet: []")
}
func TestGetBroadTagSets_MismatchedDeviceTagSet(t *testing.T) {
c := &Content{
Tags: Tags{
Sets: []TagSet{
{
Name: "os",
Tags: result.NewTags("android", "linux"),
},
{
Name: "gpu",
Tags: result.NewTags("intel", "nvidia"),
},
{
Name: "device",
Tags: result.NewTags("special-device"),
},
},
},
}
_, _, _, err := c.getBroadTagSets()
require.Error(t, err)
require.Contains(t, err.Error(), "Did not find expected tag sets")
require.Contains(t, err.Error(), "deviceTagSet: []")
}
/*******************************************************************************
* addExpectationsToMutableChunk tests
******************************************************************************/
// Tests that multiple mutable chunks result in an error.
func TestAddExpectationsToMutableChunkMultipleMutableChunks(t *testing.T) {
fileContent := `
# BEGIN TAG HEADER
# OS
# tags: [ android linux win10 ]
# END TAG HEADER
# ##ROLLER_AUTOGENERATED_FAILURES##
[ win10 ] valid_test1 [ Failure ]
[ win10 ] valid_test2 [ Failure ]
# ##ROLLER_AUTOGENERATED_FAILURES##
[ linux ] valid_test1 [ Failure ]
[ linux ] valid_test2 [ Failure ]
`
content, err := Parse("expectations.txt", fileContent)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("test"),
Tags: result.NewTags("android-14", "arm"),
Status: result.Failure,
},
}
err = content.addExpectationsToMutableChunk(&resultList)
require.EqualError(t, err, "Expected 1 mutable chunk, found 2")
}
// Tests that a single mutable chunk gets expectations added to it.
func TestAddExpectationsToMutableChunkSingleMutableChunk(t *testing.T) {
fileContent := `
# BEGIN TAG HEADER
# OS
# tags: [ android linux win10 ]
# END TAG HEADER
# ##ROLLER_AUTOGENERATED_FAILURES##
[ win10 ] valid_test1 [ Failure ]
[ win10 ] valid_test2 [ Failure ]
`
content, err := Parse("expectations.txt", fileContent)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("a:b,c:d"),
Tags: result.NewTags("android-14", "arm"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("z:b,c:d,e:f=g"),
Tags: result.NewTags("android-14", "arm"),
Status: result.Failure,
},
}
err = content.addExpectationsToMutableChunk(&resultList)
require.NoErrorf(t, err, "Failed to add expectations: %v", err)
expectedContent := `# BEGIN TAG HEADER
# OS
# tags: [ android linux win10 ]
# END TAG HEADER
# ##ROLLER_AUTOGENERATED_FAILURES##
crbug.com/0000 [ android-14 arm ] a:b,c:d: [ Failure ]
[ win10 ] valid_test1 [ Failure ]
[ win10 ] valid_test2 [ Failure ]
crbug.com/0000 [ android-14 arm ] z:b,c:d,e:f=g [ Failure ]
`
require.Equal(t, expectedContent, content.String())
}
// Tests that a lack of a mutable chunk causes a new mutable chunk to be added
// which has the new expectations.
func TestAddExpectationsToMutableChunkNoMutableChunk(t *testing.T) {
fileContent := `
# BEGIN TAG HEADER
# OS
# tags: [ android linux win10 ]
# END TAG HEADER
# Immutable
[ win10 ] valid_test1 [ Failure ]
[ win10 ] valid_test2 [ Failure ]
`
content, err := Parse("expectations.txt", fileContent)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("a:b,c:d"),
Tags: result.NewTags("android-14", "arm"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("z:b,c:d,e:f=g"),
Tags: result.NewTags("android-14", "arm"),
Status: result.Failure,
},
}
err = content.addExpectationsToMutableChunk(&resultList)
require.NoErrorf(t, err, "Failed to add expectations: %v", err)
expectedContent := `# BEGIN TAG HEADER
# OS
# tags: [ android linux win10 ]
# END TAG HEADER
# Immutable
[ win10 ] valid_test1 [ Failure ]
[ win10 ] valid_test2 [ Failure ]
################################################################################
# Autogenerated Failure expectations. Please triage.
# ##ROLLER_AUTOGENERATED_FAILURES##
################################################################################
crbug.com/0000 [ android-14 arm ] a:b,c:d: [ Failure ]
crbug.com/0000 [ android-14 arm ] z:b,c:d,e:f=g [ Failure ]
`
require.Equal(t, expectedContent, content.String())
}
/*******************************************************************************
* AddExpectationsForFailingResults tests
******************************************************************************/
// Tests overall behavior with an existing mutable chunk using explicit tags.
func TestAddExpectationsForFailingResults_ExplicitTags_ExistingChunk(t *testing.T) {
fileContent := `
# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# END TAG HEADER
# Partially removed, immutable.
[ android ] * [ Failure ]
[ mac ] a:* [ Failure ]
[ linux ] z:b,c:d,e:f=* [ Failure ]
[ linux ] valid_test1 [ Failure ]
[ linux ] valid_test2 [ Failure ]
# Partially removed, mutable.
# ##ROLLER_AUTOGENERATED_FAILURES##
[ win10 ] valid_test1 [ Failure ]
[ win10 ] valid_test2 [ Failure ]
`
content, err := Parse("expectations.txt", fileContent)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("a:b,c:d"),
Tags: result.NewTags("android", "android-14", "arm", "unknown1"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("z:b,c:d,e:f=g"),
Tags: result.NewTags("android", "android-14", "arm", "unknown2"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-9", "intel-0x3e9b", "unknown3"),
Status: result.Failure,
},
// This should be merged with the one above after only the most explicit
// tags remain. Multiple generations mapping to the same actual GPU
// shouldn't happen in real life, but serves to test merging.
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-12", "intel-0x3e9b", "unknown4"),
Status: result.Failure,
},
}
err = content.AddExpectationsForFailingResults(resultList /*use_explicit_tags=*/, true /*verbose=*/, false)
require.NoErrorf(t, err, "Failed to add expectations: %v", err)
expectedContent := `# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# END TAG HEADER
# Partially removed, immutable.
[ android ] * [ Failure ]
[ mac ] a:* [ Failure ]
[ linux ] z:b,c:d,e:f=* [ Failure ]
[ linux ] valid_test1 [ Failure ]
[ linux ] valid_test2 [ Failure ]
# Partially removed, mutable.
# ##ROLLER_AUTOGENERATED_FAILURES##
crbug.com/0000 [ android-14 arm ] a:b,c:d: [ Failure ]
crbug.com/0000 [ intel-0x3e9b linux ] valid_test1 [ Failure ]
[ win10 ] valid_test1 [ Failure ]
[ win10 ] valid_test2 [ Failure ]
crbug.com/0000 [ android-14 arm ] z:b,c:d,e:f=g [ Failure ]
`
require.Equal(t, expectedContent, content.String())
}
// Tests overall behavior without an existing mutable chunk using explicit tags.
func TestAddExpectationsForFailingResults_ExplicitTags_WithoutExistingChunk(t *testing.T) {
fileContent := `
# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# END TAG HEADER
# Partially removed, immutable.
[ android ] * [ Failure ]
[ mac ] a:* [ Failure ]
[ linux ] z:b,c:d,e:f=* [ Failure ]
[ linux ] valid_test1 [ Failure ]
[ linux ] valid_test2 [ Failure ]
`
content, err := Parse("expectations.txt", fileContent)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("a:b,c:d"),
Tags: result.NewTags("android", "android-14", "arm", "unknown1"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("z:b,c:d,e:f=g"),
Tags: result.NewTags("android", "android-14", "arm", "unknown2"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-9", "intel-0x3e9b", "unknown3"),
Status: result.Failure,
},
// This should be merged with the one above after only the most explicit
// tags remain. Multiple generations mapping to the same actual GPU
// shouldn't happen in real life, but serves to test merging.
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-12", "intel-0x3e9b", "unknown4"),
Status: result.Failure,
},
}
err = content.AddExpectationsForFailingResults(resultList /*use_explicit_tags=*/, true /*verbose=*/, false)
require.NoErrorf(t, err, "Failed to add expectations: %v", err)
expectedContent := `# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# END TAG HEADER
# Partially removed, immutable.
[ android ] * [ Failure ]
[ mac ] a:* [ Failure ]
[ linux ] z:b,c:d,e:f=* [ Failure ]
[ linux ] valid_test1 [ Failure ]
[ linux ] valid_test2 [ Failure ]
################################################################################
# Autogenerated Failure expectations. Please triage.
# ##ROLLER_AUTOGENERATED_FAILURES##
################################################################################
crbug.com/0000 [ android-14 arm ] a:b,c:d: [ Failure ]
crbug.com/0000 [ intel-0x3e9b linux ] valid_test1 [ Failure ]
crbug.com/0000 [ android-14 arm ] z:b,c:d,e:f=g [ Failure ]
`
require.Equal(t, expectedContent, content.String())
}
// Tests overall behavior with multiple mutable chunks using explicit tags.
func TestAddExpectationsForFailingResults_ExplicitTags_MultipleExistingChunk(t *testing.T) {
fileContent := `
# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# END TAG HEADER
# Partially removed, immutable.
[ linux ] valid_test1 [ Failure ]
[ linux ] invalid_test [ Failure ]
[ linux ] valid_test2 [ Failure ]
# Fully removed, immutable.
[ android ] invalid_test [ Failure ]
# Partially removed, mutable.
# ##ROLLER_AUTOGENERATED_FAILURES##
[ win10 ] valid_test1 [ Failure ]
[ win10 ] invalid_test [ Failure ]
[ win10 ] valid_test2 [ Failure ]
# ##ROLLER_AUTOGENERATED_FAILURES##
[ android ] valid_test1 [ Failure ]
[ android ] valid_test2 [ Failure ]
`
content, err := Parse("expectations.txt", fileContent)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("new_test"),
Tags: result.NewTags("android", "android-14", "arm", "unknown1"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("z_new_test"),
Tags: result.NewTags("android", "android-14", "arm", "unknown2"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-9", "intel-0x3e9b", "unknown3"),
Status: result.Failure,
},
// This should be merged with the one above after only the most explicit
// tags remain. Multiple generations mapping to the same actual GPU
// shouldn't happen in real life, but serves to test merging.
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-12", "intel-0x3e9b", "unknown4"),
Status: result.Failure,
},
}
err = content.AddExpectationsForFailingResults(resultList /*use_explicit_tags=*/, true /*verbose=*/, false)
require.EqualError(t, err, "Expected 1 mutable chunk, found 2")
}
// Tests overall behavior with an existing mutable chunk using broad tags.
func TestAddExpectationsForFailingResults_BroadTags_ExistingChunk(t *testing.T) {
fileContent := `
# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# Devices
# tags: [ android-nexus-5x android-pixel-2 android-pixel-4
# android-pixel-6 android-shield-android-tv android-sm-a135m
# android-sm-a235m android-sm-s926b
# chromeos-board-amd64-generic chromeos-board-eve chromeos-board-jacuzzi
# chromeos-board-octopus chromeos-board-volteer
# fuchsia-board-astro fuchsia-board-sherlock fuchsia-board-qemu-x64 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# END TAG HEADER
# Partially removed, immutable.
[ android ] * [ Failure ]
[ mac ] a:* [ Failure ]
[ linux ] z:b,c:d,e:f=* [ Failure ]
[ linux ] valid_test1 [ Failure ]
[ linux ] valid_test2 [ Failure ]
# Partially removed, mutable.
# ##ROLLER_AUTOGENERATED_FAILURES##
[ win10 ] valid_test1 [ Failure ]
[ win10 ] valid_test2 [ Failure ]
`
content, err := Parse("expectations.txt", fileContent)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("a:b,c:d"),
Tags: result.NewTags("android", "android-14", "arm", "android-pixel-4", "unknown1"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("z:b,c:d,e:f=g"),
Tags: result.NewTags("android", "android-14", "arm", "android-pixel-4", "unknown2"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-9", "intel-0x3e9b", "unknown3"),
Status: result.Failure,
},
// This should be merged with the one above after only the most explicit
// tags remain. Multiple generations mapping to the same actual GPU
// shouldn't happen in real life, but serves to test merging.
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-12", "intel-0x3e9b", "unknown4"),
Status: result.Failure,
},
}
err = content.AddExpectationsForFailingResults(resultList /*use_explicit_tags=*/, false /*verbose=*/, false)
require.NoErrorf(t, err, "Failed to add expectations: %v", err)
expectedContent := `# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# Devices
# tags: [ android-nexus-5x android-pixel-2 android-pixel-4
# android-pixel-6 android-shield-android-tv android-sm-a135m
# android-sm-a235m android-sm-s926b
# chromeos-board-amd64-generic chromeos-board-eve chromeos-board-jacuzzi
# chromeos-board-octopus chromeos-board-volteer
# fuchsia-board-astro fuchsia-board-sherlock fuchsia-board-qemu-x64 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# END TAG HEADER
# Partially removed, immutable.
[ android ] * [ Failure ]
[ mac ] a:* [ Failure ]
[ linux ] z:b,c:d,e:f=* [ Failure ]
[ linux ] valid_test1 [ Failure ]
[ linux ] valid_test2 [ Failure ]
# Partially removed, mutable.
# ##ROLLER_AUTOGENERATED_FAILURES##
crbug.com/0000 [ android-pixel-4 ] a:b,c:d: [ Failure ]
crbug.com/0000 [ intel linux ] valid_test1 [ Failure ]
[ win10 ] valid_test1 [ Failure ]
[ win10 ] valid_test2 [ Failure ]
crbug.com/0000 [ android-pixel-4 ] z:b,c:d,e:f=g [ Failure ]
`
require.Equal(t, expectedContent, content.String())
}
// Tests overall behavior without an existing mutable chunk using broad tags.
func TestAddExpectationsForFailingResults_BroadTags_WithoutExistingChunk(t *testing.T) {
fileContent := `
# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# Devices
# tags: [ android-nexus-5x android-pixel-2 android-pixel-4
# android-pixel-6 android-shield-android-tv android-sm-a135m
# android-sm-a235m android-sm-s926b
# chromeos-board-amd64-generic chromeos-board-eve chromeos-board-jacuzzi
# chromeos-board-octopus chromeos-board-volteer
# fuchsia-board-astro fuchsia-board-sherlock fuchsia-board-qemu-x64 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# END TAG HEADER
# Partially removed, immutable.
[ android ] * [ Failure ]
[ mac ] a:* [ Failure ]
[ linux ] z:b,c:d,e:f=* [ Failure ]
[ linux ] valid_test1 [ Failure ]
[ linux ] valid_test2 [ Failure ]
`
content, err := Parse("expectations.txt", fileContent)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("a:b,c:d"),
Tags: result.NewTags("android", "android-14", "arm", "android-pixel-4", "unknown1"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("z:b,c:d,e:f=g"),
Tags: result.NewTags("android", "android-14", "arm", "android-pixel-4", "unknown2"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-9", "intel-0x3e9b", "unknown3"),
Status: result.Failure,
},
// This should be merged with the one above after only the most explicit
// tags remain. Multiple generations mapping to the same actual GPU
// shouldn't happen in real life, but serves to test merging.
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-12", "intel-0x3e9b", "unknown4"),
Status: result.Failure,
},
}
err = content.AddExpectationsForFailingResults(resultList /*use_explicit_tags=*/, false /*verbose=*/, false)
require.NoErrorf(t, err, "Failed to add expectations: %v", err)
expectedContent := `# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# Devices
# tags: [ android-nexus-5x android-pixel-2 android-pixel-4
# android-pixel-6 android-shield-android-tv android-sm-a135m
# android-sm-a235m android-sm-s926b
# chromeos-board-amd64-generic chromeos-board-eve chromeos-board-jacuzzi
# chromeos-board-octopus chromeos-board-volteer
# fuchsia-board-astro fuchsia-board-sherlock fuchsia-board-qemu-x64 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# END TAG HEADER
# Partially removed, immutable.
[ android ] * [ Failure ]
[ mac ] a:* [ Failure ]
[ linux ] z:b,c:d,e:f=* [ Failure ]
[ linux ] valid_test1 [ Failure ]
[ linux ] valid_test2 [ Failure ]
################################################################################
# Autogenerated Failure expectations. Please triage.
# ##ROLLER_AUTOGENERATED_FAILURES##
################################################################################
crbug.com/0000 [ android-pixel-4 ] a:b,c:d: [ Failure ]
crbug.com/0000 [ intel linux ] valid_test1 [ Failure ]
crbug.com/0000 [ android-pixel-4 ] z:b,c:d,e:f=g [ Failure ]
`
require.Equal(t, expectedContent, content.String())
}
// Tests overall behavior with multiple mutable chunks using broad tags.
func TestAddExpectationsForFailingResults_BroadTags_MultipleExistingChunk(t *testing.T) {
fileContent := `
# BEGIN TAG HEADER (autogenerated, see validate_tag_consistency.py)
# OS
# tags: [ android android-oreo android-pie android-r android-s android-t
# android-14
# chromeos
# fuchsia
# linux ubuntu
# mac highsierra mojave catalina bigsur monterey ventura sonoma sequoia
# win win8 win10 win11 ]
# Devices
# tags: [ android-nexus-5x android-pixel-2 android-pixel-4
# android-pixel-6 android-shield-android-tv android-sm-a135m
# android-sm-a235m android-sm-s926b
# chromeos-board-amd64-generic chromeos-board-eve chromeos-board-jacuzzi
# chromeos-board-octopus chromeos-board-volteer
# fuchsia-board-astro fuchsia-board-sherlock fuchsia-board-qemu-x64 ]
# GPU
# tags: [ amd amd-0x6613 amd-0x679e amd-0x67ef amd-0x6821 amd-0x7340
# apple apple-apple-m1 apple-apple-m2
# apple-angle-metal-renderer:-apple-m1
# apple-angle-metal-renderer:-apple-m2
# arm
# google google-0xffff google-0xc0de
# imagination
# intel intel-gen-9 intel-gen-12 intel-0xa2e intel-0xd26 intel-0xa011
# intel-0x3e92 intel-0x3e9b intel-0x4680 intel-0x5912 intel-0x9bc5
# nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 nvidia-0x2783
# qualcomm qualcomm-0x41333430 qualcomm-0x36333630 qualcomm-0x36334330 ]
# END TAG HEADER
# Partially removed, immutable.
[ linux ] valid_test1 [ Failure ]
[ linux ] invalid_test [ Failure ]
[ linux ] valid_test2 [ Failure ]
# Fully removed, immutable.
[ android ] invalid_test [ Failure ]
# Partially removed, mutable.
# ##ROLLER_AUTOGENERATED_FAILURES##
[ win10 ] valid_test1 [ Failure ]
[ win10 ] invalid_test [ Failure ]
[ win10 ] valid_test2 [ Failure ]
# ##ROLLER_AUTOGENERATED_FAILURES##
[ android ] valid_test1 [ Failure ]
[ android ] valid_test2 [ Failure ]
`
content, err := Parse("expectations.txt", fileContent)
require.NoErrorf(t, err, "Failed to parse expectations: %v", err)
resultList := result.List{
result.Result{
Query: query.Parse("new_test"),
Tags: result.NewTags("android", "android-14", "arm", "android-pixel-4", "unknown1"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("z_new_test"),
Tags: result.NewTags("android", "android-14", "arm", "android-pixel-4", "unknown2"),
Status: result.Failure,
},
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-9", "intel-0x3e9b", "unknown3"),
Status: result.Failure,
},
// This should be merged with the one above after only the most explicit
// tags remain. Multiple generations mapping to the same actual GPU
// shouldn't happen in real life, but serves to test merging.
result.Result{
Query: query.Parse("valid_test1"),
Tags: result.NewTags("linux", "intel", "intel-gen-12", "intel-0x3e9b", "unknown4"),
Status: result.Failure,
},
}
err = content.AddExpectationsForFailingResults(resultList /*use_explicit_tags=*/, false /*verbose=*/, false)
require.EqualError(t, err, "Expected 1 mutable chunk, found 2")
}