Test Expectations: Use file order as override priority.

Now expectations that happen first in the file will override those
later expressions. This fixes the weird conflict that could occur
when we use wildcards inside the expression. e.g.:

a) 6746 : *BadConfig = SKIP
b) 5076 : TestSuite.Test/* = TIMEOUT

Previously b) would override a) for TestSuite.Test/BadConfig and we
would give the expectation as TIMEOUT because the string length of
the expectation was longer.

This will allow us to use short skip expressions for e.g. TSAN.

Bug: angleproject:6746
Change-Id: I2dc651c3593c02b6f8723d67c0fc311701ee15f8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3365659
Reviewed-by: Jonah Ryan-Davis <jonahr@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
This commit is contained in:
Jamie Madill 2022-01-04 14:24:57 -05:00 коммит произвёл Angle LUCI CQ
Родитель ece463808d
Коммит c2a2961493
8 изменённых файлов: 37 добавлений и 77 удалений

Просмотреть файл

@ -4,6 +4,12 @@
// See deqp_support/README.md for format.
// Thread sanitizer skips.
6718 TSAN : MultithreadingTestES3.MultithreadFenceDraw/* = SKIP
6718 TSAN : MultithreadingTestES3.MultithreadFenceTexImage/* = SKIP
6746 TSAN : *Vulkan_AsyncQueue = SKIP
6804 LINUX VULKAN TSAN : MultithreadingTest.MultiContextDrawWithSwapBuffers/* = SKIP
// Generic
// Fails in the flush thread when calling eglMakeCurrent.
6063 OPENGL : SimpleStateChangeTestES31.DrawThenChangeFBOThenDrawThenFlushInAnotherThreadThenDrawIndexed/* = SKIP
@ -421,11 +427,6 @@
6652 WIN AMD VULKAN : DrawTextureTest.ColorArrayDifferentTypes/* = SKIP
6652 WIN AMD VULKAN : PointSpriteTest.TrianglesNotTreatedAsPointSprites/* = SKIP
6718 TSAN : MultithreadingTestES3.MultithreadFenceDraw/* = SKIP
6718 TSAN : MultithreadingTestES3.MultithreadFenceTexImage/* = SKIP
6746 TSAN : *Vulkan_AsyncQueue = SKIP
6804 LINUX VULKAN TSAN : MultithreadingTest.MultiContextDrawWithSwapBuffers/* = SKIP
// Indexed indirect draw offset bug
6751 METAL : MultiDrawIndirectTest.MultiDrawElementsIndirect* = SKIP
6751 D3D11 : MultiDrawIndirectTest.MultiDrawElementsIndirect* = SKIP

Просмотреть файл

@ -18,6 +18,10 @@ exists to let the test harness know which tests it should skip (as they are know
expect to see failed. Warnings are generated if a test unexpectedly passes, but an unexpected
failure is an error. This let's ANGLE ensure there are no regressions.
If multiple test expectations in a file match a specific test due to
wildcards, the test harness picks the first match in the file as the
overriding expectation.
While developing a feature, or testing on a new platform, the expectations files can be modified to
reflect the reality of the situation. The expected format for every line in these files is:

Просмотреть файл

@ -125,6 +125,9 @@
6277 ANDROID VULKAN : dEQP-EGL.functional.image.render_multiple_contexts.gles2_android_native_rgb8_texture = FAIL
// Robustness failures on multiple platforms
6707 NVIDIA : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.reads.uniform_block.compute = SKIP
6707 NVIDIA : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.writes.uniform_block.compute = SKIP
3711 : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.reads.* = FAIL
3711 : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.writes.* = FAIL
@ -269,9 +272,6 @@
6528 PIXEL4ORXL GLES : dEQP-EGL.functional.thread_cleanup.multi_context_* = FAIL
6528 PIXEL4ORXL GLES : dEQP-EGL.functional.thread_cleanup.single_context_* = FAIL
6707 NVIDIA : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.reads.uniform_block.compute = SKIP
6707 NVIDIA : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.writes.uniform_block.compute = SKIP
6678 TSAN : dEQP-EGL.functional.multithread.* = SKIP
6678 TSAN : dEQP-EGL.functional.sharing.gles2.multithread.random* = FLAKY

Просмотреть файл

@ -362,7 +362,7 @@
6297 MAC METAL : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond* = FAIL
// Test bug - fails in ASAN.
6678 : dEQP-GLES2.functional.negative_api.texture.compressedtexsubimage2d* = SKIP
6678 ASAN : dEQP-GLES2.functional.negative_api.texture.compressedtexsubimage2d* = SKIP
// Vulkan
4944 VULKAN ANDROID : dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_rbo_rgba4 = FAIL

Просмотреть файл

@ -17,6 +17,9 @@
// Times out shader compilation because it uses so many resources.
3445 : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.48 = SKIP
// Slow tests.
6021 : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.36 = TIMEOUT
// D3D11 Failing Tests
// Below cases are failed due to binding multi-UAVs to a single buffer is not supported in D3D backend.
// http://anglebug.com/3032
@ -85,7 +88,10 @@
4234 D3D11 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.compute.program_not_active = SKIP
4234 OPENGL : dEQP-GLES31.functional.debug.negative_coverage.callbacks.compute.program_not_active = SKIP
// OPENGL Failing Tests
// OpenGL Passing tests.
3584 OPENGL : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.*samplercubearray* = PASS
// OpenGL Failing Tests
1442 NVIDIA OPENGL : dEQP-GLES31.functional.fbo.no_attachments.maximums.all = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by* = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.buffer_limited_query.resource_query = FAIL
@ -106,6 +112,7 @@
5197 LINUX OPENGL : dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations = TIMEOUT
// OpenGL/D3D11 Failing Tests
1951 D3D11 : dEQP-GLES31.functional.shaders.opaque_type_indexing.ssbo.* = SKIP
1442 OPENGL : dEQP-GLES31.functional.shaders.opaque_type_indexing.* = FAIL
1442 D3D11 : dEQP-GLES31.functional.shaders.opaque_type_indexing.* = FAIL
1442 OPENGL : dEQP-GLES31.functional.separate_shader.* = SKIP
@ -115,8 +122,6 @@
1442 OPENGL : dEQP-GLES31.functional.state_query.program_pipeline.* = SKIP
1442 D3D11 : dEQP-GLES31.functional.state_query.program_pipeline.* = SKIP
3584 OPENGL : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.*samplercubearray* = PASS
// These tests are failing because of compile errors with SSBOs in compute shaders.
1442 D3D11 : dEQP-GLES31.functional.stencil_texturing.* = SKIP
@ -125,7 +130,6 @@
1729 D3D11 : dEQP-GLES31.functional.atomic_counter.* = SKIP
1951 D3D11 : dEQP-GLES31.functional.layout_binding.ssbo.* = SKIP
1951 D3D11 : dEQP-GLES31.functional.shaders.opaque_type_indexing.ssbo.* = SKIP
4330 D3D11 : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.* = SKIP
4329 D3D11 : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.* = SKIP
4329 D3D11 : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.* = SKIP
@ -139,10 +143,6 @@
// This case is skipped since it uses atomic counter builtin functions which haven't been implemented.
1729 D3D11 : dEQP-GLES31.functional.state_query.program.active_atomic_counter_buffers_get_programiv = SKIP
// The D3D backend does not expect missing shader stages
1588 D3D11 : dEQP-GLES31.functional.separate_shader.validation.es31.varying.* = SKIP
////
//// Failures blocking an official GLES 3.1 conformance run on SwiftShader
////
@ -202,16 +202,6 @@
4371 VULKAN ANDROID : dEQP-GLES31.functional.shaders.implicit_conversions.es31.arithmetic.input_before_literal.add.int_to_uvec3_vertex = FAIL
4371 SWIFTSHADER : dEQP-GLES31.functional.shaders.implicit_conversions.* = FAIL
// Swiftshader fails to create a correct source/destination srgb8_alpha8_astc image before copy, however 5x4 is correct
5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*rgba*srgb8_alpha8_astc_*_khr.*_to_texture2d* = FAIL
5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*rgba*srgb8_alpha8_astc_*_khr.*_to_cubemap* = FAIL
5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_*_khr_rgba*.*cubemap_to* = FAIL
5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_*_khr_rgba*.*texture2d*_to* = FAIL
5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_5x4_khr.*texture2d*_to_texture2d* = PASS
5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_5x4_khr.*texture2d*_to_cubemap = PASS
5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_5x4_khr.*cubemap*_to_texture2d* = PASS
5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_5x4_khr.*cubemap_to_cubemap = PASS
// Desktop cards without native etc support, angle emulated format fails
5276 AMD VULKAN : dEQP-GLES31.functional.copy_image.compressed.viewclass_eac* = FAIL
5276 AMD VULKAN : dEQP-GLES31.functional.copy_image.compressed.viewclass_etc* = FAIL
@ -275,17 +265,6 @@
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.android_extension_pack.extensions.oes_sample_variables = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.android_extension_pack.shaders.es31.extension_directive.oes_texture_storage_multisample_2d_array = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.android_extension_pack.shaders.es32.extension_directive.ext_shader_io_blocks = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.get_dec.1_counter_100_calls_10_threads = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.get_dec.4_counters_5_calls_10_threads = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.get_inc_dec.8_counters_5_calls_10_threads = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.inc.4_counters_100_calls_1_thread = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.inc_branch.8_counters_5_calls_1_thread = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.8_counters_5_calls_1_thread = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_dec.8_counters_5_calls_1_thread = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_inc.8_counters_1_call_1000_threads = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.inc_dec.8_counters_1_call_1000_threads = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.get_dec.8_counters_1_call_1000_threads = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.inc_dec.8_counters_5_calls_1_thread = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.blend_equation_advanced.coherent.hsl_hue = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.blend_equation_advanced.msaa.colordodge = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.blend_equation_advanced.msaa.screen = SKIP
@ -605,8 +584,6 @@
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui.texture2d_to_renderbuffer = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui.texture3d_to_cubemap = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui.texture3d_to_renderbuffer = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2.texture2d_to_cubemap = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb9_e5.cubemap_to_cubemap = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8i.texture3d_to_cubemap = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8ui.texture2d_array_to_texture2d_array = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32ui.texture2d_array_to_cubemap = SKIP
@ -733,10 +710,6 @@
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.color.texcubearray.r11f_g11f_b10f = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.color.texcubearray.r16f = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.color.texcubearray.rgba4 = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.no_attachments.npot_size.1025x1025 = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.no_attachments.npot_size.31x31 = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.no_attachments.size.1024x1024 = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.no_attachments.size.256x1024 = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.geometry_shading.basic.output_max = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.geometry_shading.basic.primitive_id = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.geometry_shading.input.basic_primitive.line_strip = SKIP
@ -757,7 +730,6 @@
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.3d.atomic.max_r32ui_return_value = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.3d.atomic.xor_r32ui_result = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba16i_rgba16f = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.3d.store.rgba32i_single_layer = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.3d.store.rgba8_snorm = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.buffer.atomic.add_r32i_result = SKIP
5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.buffer.atomic.max_r32ui_result = SKIP
@ -1381,9 +1353,6 @@
// Fails when the expression being interpolated as an indexed varying array.
6194 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.array_element.* = FAIL
// Slow tests.
6021 : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.36 = TIMEOUT
// ASAN Test bugs
6678 ASAN : dEQP-GLES31.functional.ssbo.array_length.* = SKIP
6678 ASAN : dEQP-GLES31.functional.debug.negative_coverage.*.texparameter*v = SKIP

Просмотреть файл

@ -296,6 +296,12 @@
// Flaky test
3305 LINUX OPENGL : dEQP-GLES3.functional.shaders.builtin_functions.common.uintbitstofloat.uint_highp_vertex = FAIL
// Seems to fail on all desktop GL
2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8 = FAIL
2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_out_of_bounds_blit_to_default = FAIL
2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_scale_blit_to_default = FAIL
2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_nearest_scale_blit_to_default = FAIL
// Mac failures (overbroad suppresions)
3466 MAC OPENGL : dEQP-GLES3.functional.attribute_location.bind_aliasing.cond* = SKIP
3466 MAC OPENGL : dEQP-GLES3.functional.attribute_location.bind_aliasing.max_cond* = SKIP
@ -481,12 +487,6 @@
2567 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.red_unsigned_byte = FAIL
2567 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.rg_unsigned_byte = FAIL
// Seems to fail on all desktop GL
2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8 = FAIL
2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_out_of_bounds_blit_to_default = FAIL
2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_scale_blit_to_default = FAIL
2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_nearest_scale_blit_to_default = FAIL
// Fails on Windows + Linux.
2222 OPENGL NVIDIA : dEQP-GLES3.functional.fbo.completeness.samples.rbo2_rbo2_rbo0 = FAIL
2222 OPENGL NVIDIA : dEQP-GLES3.functional.fbo.completeness.samples.rbo1_rbo2_rbo0 = FAIL

Просмотреть файл

@ -385,14 +385,10 @@ bool GPUTestExpectationsParser::loadAllTestExpectationsFromFile(const std::strin
int32_t GPUTestExpectationsParser::getTestExpectationImpl(const GPUTestConfig *config,
const std::string &testName)
{
size_t maxExpectationLen = 0;
GPUTestExpectationEntry *foundEntry = nullptr;
for (GPUTestExpectationEntry &entry : mEntries)
{
if (NamesMatchWithWildcard(entry.testName.c_str(), testName.c_str()))
{
size_t expectationLen = entry.testName.length();
// Filter by condition first.
bool satisfiesConditions = true;
if (config)
@ -407,19 +403,14 @@ int32_t GPUTestExpectationsParser::getTestExpectationImpl(const GPUTestConfig *c
}
}
// The longest/most specific matching expectation overrides any others.
if (satisfiesConditions && expectationLen > maxExpectationLen)
// Use the first matching expectation in the file as the matching expression.
if (satisfiesConditions)
{
maxExpectationLen = expectationLen;
foundEntry = &entry;
entry.used = true;
return entry.testExpectation;
}
}
}
if (foundEntry != nullptr)
{
foundEntry->used = true;
return foundEntry->testExpectation;
}
return kGpuTestPass;
}

Просмотреть файл

@ -362,7 +362,6 @@ TEST_P(GPUTestExpectationsParserTest, GPUTestExpectationsParserMisspelledExpecta
}
}
// Wild characters that match groups of expectations can be overridden with more specific lines.
// The parse should still compute correctly which lines were used and which were unused.
TEST_P(GPUTestExpectationsParserTest, GPUTestExpectationsParserOverrideExpectation)
{
@ -370,20 +369,17 @@ TEST_P(GPUTestExpectationsParserTest, GPUTestExpectationsParserOverrideExpectati
std::string line = R"(100 : dEQP-GLES31.functional.layout_binding.* = FAIL
100 : dEQP-GLES31.functional.layout_binding.ubo.* = SKIP)";
EXPECT_TRUE(load(line));
EXPECT_TRUE(parser.getErrorMessages().empty());
// Default behavior is to let missing tests pass
EXPECT_EQ(get("dEQP-GLES31.functional.layout_binding.ubo.vertex_binding_max"),
GPUTestExpectationsParser::kGpuTestSkip);
GPUTestExpectationsParser::kGpuTestFail);
// The FAIL expectation was unused because it was overridden.
EXPECT_EQ(parser.getUnusedExpectationsMessages().size(), 1u);
if (parser.getUnusedExpectationsMessages().size() >= 1)
{
EXPECT_EQ(parser.getUnusedExpectationsMessages()[0], "Line 1: expectation was unused.");
}
ASSERT_EQ(parser.getUnusedExpectationsMessages().size(), 1u);
EXPECT_EQ(parser.getUnusedExpectationsMessages()[0], "Line 2: expectation was unused.");
// Now try a test that doesn't match the override criteria
EXPECT_EQ(get("dEQP-GLES31.functional.layout_binding.image.test"),
GPUTestExpectationsParser::kGpuTestFail);
EXPECT_TRUE(parser.getUnusedExpectationsMessages().empty());
ASSERT_EQ(parser.getUnusedExpectationsMessages().size(), 1u);
EXPECT_EQ(parser.getUnusedExpectationsMessages()[0], "Line 2: expectation was unused.");
}
// This test is the same as GPUTestExpectationsParserOverrideExpectation, but verifying the order
@ -394,7 +390,6 @@ TEST_P(GPUTestExpectationsParserTest, GPUTestExpectationsParserOverrideExpectati
std::string line = R"(100 : dEQP-GLES31.functional.layout_binding.ubo.* = SKIP
100 : dEQP-GLES31.functional.layout_binding.* = FAIL)";
EXPECT_TRUE(load(line));
EXPECT_TRUE(parser.getErrorMessages().empty());
// Default behavior is to let missing tests pass
EXPECT_EQ(get("dEQP-GLES31.functional.layout_binding.ubo.vertex_binding_max"),
GPUTestExpectationsParser::kGpuTestSkip);