| // 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") |
| } |