Skip tests if no adapter is available

Bug: dawn:208
Change-Id: I076fd497101dd017e8d83ae034edb7b1fa1f8581
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/11941
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
diff --git a/src/tests/DawnTest.cpp b/src/tests/DawnTest.cpp
index 9e89dac..02f27bb 100644
--- a/src/tests/DawnTest.cpp
+++ b/src/tests/DawnTest.cpp
@@ -164,20 +164,8 @@
     mInstance->EnableBackendValidation(mEnableBackendValidation);
     mInstance->EnableBeginCaptureOnStartup(mBeginCaptureOnStartup);
 
-    static constexpr dawn_native::BackendType kWindowlessBackends[] = {
-        dawn_native::BackendType::D3D12,
-        dawn_native::BackendType::Metal,
-        dawn_native::BackendType::Vulkan,
-    };
-    for (dawn_native::BackendType backend : kWindowlessBackends) {
-        if (detail::IsBackendAvailable(backend)) {
-            mInstance.get()->DiscoverDefaultAdapters();
-        }
-    }
-
-    if (detail::IsBackendAvailable(dawn_native::BackendType::OpenGL)) {
-        DiscoverOpenGLAdapter();
-    }
+    mInstance.get()->DiscoverDefaultAdapters();
+    DiscoverOpenGLAdapter();
 
     std::cout << "Testing configuration\n"
                  "---------------------\n"
@@ -238,7 +226,9 @@
 
 void DawnTestEnvironment::DiscoverOpenGLAdapter() {
 #ifdef DAWN_ENABLE_BACKEND_OPENGL
-    ASSERT_TRUE(glfwInit());
+    if (!glfwInit()) {
+        return;
+    }
     glfwDefaultWindowHints();
     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4);
@@ -407,7 +397,9 @@
             }
         }
 
-        ASSERT(mBackendAdapter);
+        if (!mBackendAdapter) {
+            return;
+        }
     }
 
     mPCIInfo = mBackendAdapter.GetPCIInfo();
@@ -478,6 +470,10 @@
     }
 }
 
+bool DawnTestBase::HasAdapter() const {
+    return !!mBackendAdapter;
+}
+
 void DawnTestBase::StartExpectDeviceError() {
     mExpectError = true;
     mError = false;
diff --git a/src/tests/DawnTest.h b/src/tests/DawnTest.h
index 46d5a05..2f50e8b 100644
--- a/src/tests/DawnTest.h
+++ b/src/tests/DawnTest.h
@@ -200,6 +200,7 @@
                                               uint32_t pixelSize,
                                               detail::Expectation* expectation);
 
+    bool HasAdapter() const;
     void WaitABit();
     void FlushWire();
 
@@ -272,14 +273,31 @@
     dawn_native::Adapter mBackendAdapter;
 };
 
+// Skip a test when the given condition is satisfied.
+#define DAWN_SKIP_TEST_IF(condition)                               \
+    if (condition) {                                               \
+        std::cout << "Test skipped: " #condition "." << std::endl; \
+        GTEST_SKIP();                                              \
+        return;                                                    \
+    }
+
 template <typename Params = DawnTestParam>
 class DawnTestWithParams : public DawnTestBase, public ::testing::TestWithParam<Params> {
+  private:
+    void SetUp() override final {
+        // DawnTestBase::SetUp() gets the adapter, and creates the device and wire.
+        // It's separate from TestSetUp() so we can skip tests completely if no adapter
+        // is available.
+        DawnTestBase::SetUp();
+        DAWN_SKIP_TEST_IF(!HasAdapter());
+        TestSetUp();
+    }
+
   protected:
     DawnTestWithParams();
     ~DawnTestWithParams() override = default;
 
-    void SetUp() override {
-        DawnTestBase::SetUp();
+    virtual void TestSetUp() {
     }
 
     void TearDown() override {
@@ -303,12 +321,6 @@
             testName##params, sizeof(testName##params) / sizeof(firstParam))),   \
         testing::PrintToStringParamName())
 
-// Skip a test when the given condition is satisfied.
-#define DAWN_SKIP_TEST_IF(condition)                               \
-    if (condition) {                                               \
-        std::cout << "Test skipped: " #condition "." << std::endl; \
-        return;                                                    \
-    }
 
 namespace detail {
     // Helper functions used for DAWN_INSTANTIATE_TEST
diff --git a/src/tests/end2end/ColorStateTests.cpp b/src/tests/end2end/ColorStateTests.cpp
index 18bae35..ef049b7 100644
--- a/src/tests/end2end/ColorStateTests.cpp
+++ b/src/tests/end2end/ColorStateTests.cpp
@@ -26,8 +26,8 @@
 
 class ColorStateTest : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         vsModule = utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"(
                 #version 450
diff --git a/src/tests/end2end/CompressedTextureFormatTests.cpp b/src/tests/end2end/CompressedTextureFormatTests.cpp
index 3208481..5f52fa6 100644
--- a/src/tests/end2end/CompressedTextureFormatTests.cpp
+++ b/src/tests/end2end/CompressedTextureFormatTests.cpp
@@ -34,8 +34,8 @@
 
 class CompressedTextureBCFormatTest : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
         mBindGroupLayout = utils::MakeBindGroupLayout(
             device, {{0, dawn::ShaderStage::Fragment, dawn::BindingType::Sampler},
                      {1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture}});
diff --git a/src/tests/end2end/D3D12ResourceWrappingTests.cpp b/src/tests/end2end/D3D12ResourceWrappingTests.cpp
index 0123216..5bb4fa3 100644
--- a/src/tests/end2end/D3D12ResourceWrappingTests.cpp
+++ b/src/tests/end2end/D3D12ResourceWrappingTests.cpp
@@ -29,8 +29,8 @@
 
     class D3D12ResourceTestBase : public DawnTest {
       public:
-        void SetUp() override {
-            DawnTest::SetUp();
+        void TestSetUp() override {
+            DawnTest::TestSetUp();
             if (UsesWire()) {
                 return;
             }
@@ -101,8 +101,8 @@
 // These tests are skipped if the harness is using the wire.
 class D3D12SharedHandleValidation : public D3D12ResourceTestBase {
   public:
-    void SetUp() override {
-        D3D12ResourceTestBase::SetUp();
+    void TestSetUp() override {
+        D3D12ResourceTestBase::TestSetUp();
 
         dawnDescriptor.dimension = dawn::TextureDimension::e2D;
         dawnDescriptor.format = dawn::TextureFormat::BGRA8Unorm;
diff --git a/src/tests/end2end/DepthStencilStateTests.cpp b/src/tests/end2end/DepthStencilStateTests.cpp
index c287d7e..b798de1 100644
--- a/src/tests/end2end/DepthStencilStateTests.cpp
+++ b/src/tests/end2end/DepthStencilStateTests.cpp
@@ -22,8 +22,8 @@
 
 class DepthStencilStateTest : public DawnTest {
     protected:
-        void SetUp() override {
-            DawnTest::SetUp();
+        void TestSetUp() override {
+            DawnTest::TestSetUp();
 
             dawn::TextureDescriptor renderTargetDescriptor;
             renderTargetDescriptor.dimension = dawn::TextureDimension::e2D;
diff --git a/src/tests/end2end/DestroyTests.cpp b/src/tests/end2end/DestroyTests.cpp
index 2e82010..dc5c491 100644
--- a/src/tests/end2end/DestroyTests.cpp
+++ b/src/tests/end2end/DestroyTests.cpp
@@ -21,8 +21,8 @@
 
 class DestroyTest : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
 
diff --git a/src/tests/end2end/DrawIndexedIndirectTests.cpp b/src/tests/end2end/DrawIndexedIndirectTests.cpp
index e497d8b..a40dc5d 100644
--- a/src/tests/end2end/DrawIndexedIndirectTests.cpp
+++ b/src/tests/end2end/DrawIndexedIndirectTests.cpp
@@ -21,8 +21,8 @@
 
 class DrawIndexedIndirectTest : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
 
diff --git a/src/tests/end2end/DrawIndexedTests.cpp b/src/tests/end2end/DrawIndexedTests.cpp
index a484d1c..299c573 100644
--- a/src/tests/end2end/DrawIndexedTests.cpp
+++ b/src/tests/end2end/DrawIndexedTests.cpp
@@ -21,8 +21,8 @@
 
 class DrawIndexedTest : public DawnTest {
     protected:
-        void SetUp() override {
-            DawnTest::SetUp();
+        void TestSetUp() override {
+            DawnTest::TestSetUp();
 
             renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
 
diff --git a/src/tests/end2end/DrawIndirectTests.cpp b/src/tests/end2end/DrawIndirectTests.cpp
index 47d554d..3f071a6 100644
--- a/src/tests/end2end/DrawIndirectTests.cpp
+++ b/src/tests/end2end/DrawIndirectTests.cpp
@@ -21,8 +21,8 @@
 
 class DrawIndirectTest : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
 
diff --git a/src/tests/end2end/DrawTests.cpp b/src/tests/end2end/DrawTests.cpp
index e12f817..6ca6f59 100644
--- a/src/tests/end2end/DrawTests.cpp
+++ b/src/tests/end2end/DrawTests.cpp
@@ -21,8 +21,8 @@
 
 class DrawTest : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
 
diff --git a/src/tests/end2end/DynamicBufferOffsetTests.cpp b/src/tests/end2end/DynamicBufferOffsetTests.cpp
index dfd8f11..ec78996 100644
--- a/src/tests/end2end/DynamicBufferOffsetTests.cpp
+++ b/src/tests/end2end/DynamicBufferOffsetTests.cpp
@@ -24,8 +24,8 @@
 
 class DynamicBufferOffsetTests : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         // Mix up dynamic and non dynamic resources in one bind group and using not continuous
         // binding number to cover more cases.
diff --git a/src/tests/end2end/FenceTests.cpp b/src/tests/end2end/FenceTests.cpp
index 4a06ea94..a637080 100644
--- a/src/tests/end2end/FenceTests.cpp
+++ b/src/tests/end2end/FenceTests.cpp
@@ -60,8 +60,8 @@
     FenceTests() : mCallIndex(0) {
     }
 
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
         mockFenceOnCompletionCallback = std::make_unique<MockFenceOnCompletionCallback>();
         mockPopErrorScopeCallback = std::make_unique<MockPopErrorScopeCallback>();
     }
diff --git a/src/tests/end2end/IndexFormatTests.cpp b/src/tests/end2end/IndexFormatTests.cpp
index 1a286ab..cc321a8 100644
--- a/src/tests/end2end/IndexFormatTests.cpp
+++ b/src/tests/end2end/IndexFormatTests.cpp
@@ -22,8 +22,8 @@
 
 class IndexFormatTest : public DawnTest {
     protected:
-        void SetUp() override {
-            DawnTest::SetUp();
+        void TestSetUp() override {
+            DawnTest::TestSetUp();
 
             renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
         }
diff --git a/src/tests/end2end/MultisampledRenderingTests.cpp b/src/tests/end2end/MultisampledRenderingTests.cpp
index e662acc..9f04cd6 100644
--- a/src/tests/end2end/MultisampledRenderingTests.cpp
+++ b/src/tests/end2end/MultisampledRenderingTests.cpp
@@ -20,8 +20,8 @@
 
 class MultisampledRenderingTest : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         InitTexturesForTest();
     }
diff --git a/src/tests/end2end/NonzeroTextureCreationTests.cpp b/src/tests/end2end/NonzeroTextureCreationTests.cpp
index fb507b8..13f0428 100644
--- a/src/tests/end2end/NonzeroTextureCreationTests.cpp
+++ b/src/tests/end2end/NonzeroTextureCreationTests.cpp
@@ -19,8 +19,8 @@
 
 class NonzeroTextureCreationTests : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
     }
 
     constexpr static uint32_t kSize = 128;
diff --git a/src/tests/end2end/OpArrayLengthTests.cpp b/src/tests/end2end/OpArrayLengthTests.cpp
index 8a02b75..770b973 100644
--- a/src/tests/end2end/OpArrayLengthTests.cpp
+++ b/src/tests/end2end/OpArrayLengthTests.cpp
@@ -20,8 +20,8 @@
 
 class OpArrayLengthTest : public DawnTest {
   protected:
-    void SetUp() {
-        DawnTest::SetUp();
+    void TestSetUp() {
+        DawnTest::TestSetUp();
 
         // Create buffers of various size to check the length() implementation
         dawn::BufferDescriptor bufferDesc;
diff --git a/src/tests/end2end/PrimitiveTopologyTests.cpp b/src/tests/end2end/PrimitiveTopologyTests.cpp
index 7d38267..e7647ba 100644
--- a/src/tests/end2end/PrimitiveTopologyTests.cpp
+++ b/src/tests/end2end/PrimitiveTopologyTests.cpp
@@ -145,8 +145,8 @@
 
 class PrimitiveTopologyTest : public DawnTest {
     protected:
-        void SetUp() override {
-            DawnTest::SetUp();
+        void TestSetUp() override {
+            DawnTest::TestSetUp();
 
             renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
 
diff --git a/src/tests/end2end/RenderBundleTests.cpp b/src/tests/end2end/RenderBundleTests.cpp
index 3675cf9..7a9cc10 100644
--- a/src/tests/end2end/RenderBundleTests.cpp
+++ b/src/tests/end2end/RenderBundleTests.cpp
@@ -26,8 +26,8 @@
 // tested in all other rendering tests.
 class RenderBundleTest : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
 
diff --git a/src/tests/end2end/RenderPassLoadOpTests.cpp b/src/tests/end2end/RenderPassLoadOpTests.cpp
index 9c0d9ea..9669235 100644
--- a/src/tests/end2end/RenderPassLoadOpTests.cpp
+++ b/src/tests/end2end/RenderPassLoadOpTests.cpp
@@ -56,8 +56,8 @@
 
 class RenderPassLoadOpTests : public DawnTest {
     protected:
-        void SetUp() override {
-            DawnTest::SetUp();
+        void TestSetUp() override {
+            DawnTest::TestSetUp();
 
             dawn::TextureDescriptor descriptor;
             descriptor.dimension = dawn::TextureDimension::e2D;
diff --git a/src/tests/end2end/RenderPassTests.cpp b/src/tests/end2end/RenderPassTests.cpp
index 8b147c5..cd38233 100644
--- a/src/tests/end2end/RenderPassTests.cpp
+++ b/src/tests/end2end/RenderPassTests.cpp
@@ -22,8 +22,8 @@
 
 class RenderPassTest : public DawnTest {
 protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         // Shaders to draw a bottom-left triangle in blue.
         mVSModule = utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"(
diff --git a/src/tests/end2end/SamplerTests.cpp b/src/tests/end2end/SamplerTests.cpp
index 5cf4666..0497679 100644
--- a/src/tests/end2end/SamplerTests.cpp
+++ b/src/tests/end2end/SamplerTests.cpp
@@ -38,8 +38,8 @@
 
 class SamplerTest : public DawnTest {
 protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
         mRenderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
 
         mBindGroupLayout = utils::MakeBindGroupLayout(
diff --git a/src/tests/end2end/TextureFormatTests.cpp b/src/tests/end2end/TextureFormatTests.cpp
index 1aa316d..5dacaca 100644
--- a/src/tests/end2end/TextureFormatTests.cpp
+++ b/src/tests/end2end/TextureFormatTests.cpp
@@ -111,8 +111,8 @@
 
 class TextureFormatTest : public DawnTest {
   protected:
-    void SetUp() {
-        DawnTest::SetUp();
+    void TestSetUp() {
+        DawnTest::TestSetUp();
     }
 
     // Structure containing all the information that tests need to know about the format.
diff --git a/src/tests/end2end/TextureViewTests.cpp b/src/tests/end2end/TextureViewTests.cpp
index 40add9f..30cafbf 100644
--- a/src/tests/end2end/TextureViewTests.cpp
+++ b/src/tests/end2end/TextureViewTests.cpp
@@ -78,8 +78,8 @@
         return static_cast<int>(level * 10) + static_cast<int>(layer + 1);
     }
 
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         mRenderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
 
diff --git a/src/tests/end2end/TextureZeroInitTests.cpp b/src/tests/end2end/TextureZeroInitTests.cpp
index 2ae0a6d..5239438 100644
--- a/src/tests/end2end/TextureZeroInitTests.cpp
+++ b/src/tests/end2end/TextureZeroInitTests.cpp
@@ -20,8 +20,8 @@
 
 class TextureZeroInitTest : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
     }
     dawn::TextureDescriptor CreateTextureDescriptor(uint32_t mipLevelCount,
                                                     uint32_t arrayLayerCount,
diff --git a/src/tests/end2end/VertexFormatTests.cpp b/src/tests/end2end/VertexFormatTests.cpp
index e27994a..6fb920b 100644
--- a/src/tests/end2end/VertexFormatTests.cpp
+++ b/src/tests/end2end/VertexFormatTests.cpp
@@ -46,8 +46,8 @@
 
 class VertexFormatTest : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
     }
diff --git a/src/tests/end2end/VertexInputTests.cpp b/src/tests/end2end/VertexInputTests.cpp
index 477956d..94faf5b 100644
--- a/src/tests/end2end/VertexInputTests.cpp
+++ b/src/tests/end2end/VertexInputTests.cpp
@@ -35,8 +35,8 @@
 
 class VertexInputTest : public DawnTest {
   protected:
-    void SetUp() override {
-        DawnTest::SetUp();
+    void TestSetUp() override {
+        DawnTest::TestSetUp();
 
         renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
     }
diff --git a/src/tests/perf_tests/BufferUploadPerf.cpp b/src/tests/perf_tests/BufferUploadPerf.cpp
index 4692306..856838d 100644
--- a/src/tests/perf_tests/BufferUploadPerf.cpp
+++ b/src/tests/perf_tests/BufferUploadPerf.cpp
@@ -58,7 +58,7 @@
     }
     ~BufferUploadPerf() override = default;
 
-    void SetUp() override;
+    void TestSetUp() override;
 
   private:
     void Step() override;
@@ -67,8 +67,8 @@
     std::vector<uint8_t> data;
 };
 
-void BufferUploadPerf::SetUp() {
-    DawnPerfTestWithParams<BufferUploadParams>::SetUp();
+void BufferUploadPerf::TestSetUp() {
+    DawnPerfTestWithParams<BufferUploadParams>::TestSetUp();
 
     dawn::BufferDescriptor desc = {};
     desc.size = kBufferSize;
diff --git a/src/tests/white_box/VulkanImageWrappingTests.cpp b/src/tests/white_box/VulkanImageWrappingTests.cpp
index 53e7166..5131d63 100644
--- a/src/tests/white_box/VulkanImageWrappingTests.cpp
+++ b/src/tests/white_box/VulkanImageWrappingTests.cpp
@@ -31,8 +31,7 @@
 
     class VulkanImageWrappingTestBase : public DawnTest {
       public:
-        void SetUp() override {
-            DawnTest::SetUp();
+        void TestSetUp() override {
             if (UsesWire() || IsIntel()) {
                 return;
             }
@@ -198,8 +197,8 @@
 
 class VulkanImageWrappingValidationTests : public VulkanImageWrappingTestBase {
   public:
-    void SetUp() override {
-        VulkanImageWrappingTestBase::SetUp();
+    void TestSetUp() override {
+        VulkanImageWrappingTestBase::TestSetUp();
         if (UsesWire() || IsIntel()) {
             return;
         }
@@ -349,8 +348,8 @@
 // These tests are skipped if the harness is using the wire.
 class VulkanImageWrappingUsageTests : public VulkanImageWrappingTestBase {
   public:
-    void SetUp() override {
-        VulkanImageWrappingTestBase::SetUp();
+    void TestSetUp() override {
+        VulkanImageWrappingTestBase::TestSetUp();
         if (UsesWire() || IsIntel()) {
             return;
         }