DawnTest: Factor Instance creation, Adapter discovery, and config logging

Bug: dawn:396
Change-Id: Idae3f388cf001e97c7fb4c84c50bca6825a2020b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/21761
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Stephen White <senorblanco@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
diff --git a/src/tests/DawnTest.cpp b/src/tests/DawnTest.cpp
index 60fa7be..53805fe 100644
--- a/src/tests/DawnTest.cpp
+++ b/src/tests/DawnTest.cpp
@@ -146,7 +146,13 @@
     testing::AddGlobalTestEnvironment(gTestEnv);
 }
 
+// static
+void DawnTestEnvironment::SetEnvironment(DawnTestEnvironment* env) {
+    gTestEnv = env;
+}
+
 DawnTestEnvironment::DawnTestEnvironment(int argc, char** argv) {
+    size_t argLen = 0;  // Set when parsing --arg=X arguments
     for (int i = 1; i < argc; ++i) {
         if (strcmp("-w", argv[i]) == 0 || strcmp("--use-wire", argv[i]) == 0) {
             mUseWire = true;
@@ -235,8 +241,9 @@
         }
 
         constexpr const char kVendorIdFilterArg[] = "--adapter-vendor-id=";
-        if (strstr(argv[i], kVendorIdFilterArg) == argv[i]) {
-            const char* vendorIdFilter = argv[i] + strlen(kVendorIdFilterArg);
+        argLen = sizeof(kVendorIdFilterArg) - 1;
+        if (strncmp(argv[i], kVendorIdFilterArg, argLen) == 0) {
+            const char* vendorIdFilter = argv[i] + argLen;
             if (vendorIdFilter[0] != '\0') {
                 mVendorIdFilter = strtoul(vendorIdFilter, nullptr, 16);
                 // Set filter flag if vendor id is non-zero.
@@ -246,8 +253,9 @@
         }
 
         constexpr const char kWireTraceDirArg[] = "--wire-trace-dir=";
-        if (strstr(argv[i], kWireTraceDirArg) == argv[i]) {
-            const char* wireTraceDir = argv[i] + strlen(kWireTraceDirArg);
+        argLen = sizeof(kWireTraceDirArg) - 1;
+        if (strncmp(argv[i], kWireTraceDirArg, argLen) == 0) {
+            const char* wireTraceDir = argv[i] + argLen;
             if (wireTraceDir[0] != '\0') {
                 const char* sep = GetPathSeparator();
                 mWireTraceDir = wireTraceDir;
@@ -281,45 +289,64 @@
     }
 }
 
-// static
-void DawnTestEnvironment::SetEnvironment(DawnTestEnvironment* env) {
-    gTestEnv = env;
+std::unique_ptr<dawn_native::Instance> DawnTestEnvironment::CreateInstanceAndDiscoverAdapters()
+    const {
+    auto instance = std::make_unique<dawn_native::Instance>();
+    instance->EnableBackendValidation(mEnableBackendValidation);
+    instance->EnableBeginCaptureOnStartup(mBeginCaptureOnStartup);
+
+    instance->DiscoverDefaultAdapters();
+
+#ifdef DAWN_ENABLE_BACKEND_OPENGL
+    if (!glfwInit()) {
+        return instance;
+    }
+    glfwDefaultWindowHints();
+    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
+    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4);
+    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
+    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+
+    std::string windowName = "Dawn OpenGL test window";
+    GLFWwindow* window = glfwCreateWindow(400, 400, windowName.c_str(), nullptr, nullptr);
+
+    glfwMakeContextCurrent(window);
+    dawn_native::opengl::AdapterDiscoveryOptions adapterOptions;
+    adapterOptions.getProc = reinterpret_cast<void* (*)(const char*)>(glfwGetProcAddress);
+    instance->DiscoverAdapters(&adapterOptions);
+#endif  // DAWN_ENABLE_BACKEND_OPENGL
+
+    return instance;
 }
 
-void DawnTestEnvironment::SetUp() {
-    mInstance = std::make_unique<dawn_native::Instance>();
-    mInstance->EnableBackendValidation(mEnableBackendValidation);
-    mInstance->EnableBeginCaptureOnStartup(mBeginCaptureOnStartup);
+void DawnTestEnvironment::PrintTestConfigurationAndAdapterInfo() const {
+    dawn::LogMessage log = dawn::InfoLog();
+    log << "Testing configuration\n"
+           "---------------------\n"
+           "UseWire: "
+        << (mUseWire ? "true" : "false")
+        << "\n"
+           "EnableBackendValidation: "
+        << (mEnableBackendValidation ? "true" : "false")
+        << "\n"
+           "SkipDawnValidation: "
+        << (mSkipDawnValidation ? "true" : "false")
+        << "\n"
+           "UseSpvc: "
+        << (mUseSpvc ? "true" : "false")
+        << "\n"
+           "UseSpvcParser: "
+        << (mUseSpvcParser ? "true" : "false")
+        << "\n"
+           "BeginCaptureOnStartup: "
+        << (mBeginCaptureOnStartup ? "true" : "false")
+        << "\n"
+           "\n"
+        << "System adapters: \n";
 
-    mInstance.get()->DiscoverDefaultAdapters();
-    DiscoverOpenGLAdapter();
-
-    dawn::InfoLog() << "Testing configuration\n"
-                       "---------------------\n"
-                       "UseWire: "
-                    << (mUseWire ? "true" : "false")
-                    << "\n"
-                       "EnableBackendValidation: "
-                    << (mEnableBackendValidation ? "true" : "false")
-                    << "\n"
-                       "SkipDawnValidation: "
-                    << (mSkipDawnValidation ? "true" : "false")
-                    << "\n"
-                       "UseSpvc: "
-                    << (mUseSpvc ? "true" : "false")
-                    << "\n"
-                       "UseSpvcParser: "
-                    << (mUseSpvcParser ? "true" : "false")
-                    << "\n"
-                       "BeginCaptureOnStartup: "
-                    << (mBeginCaptureOnStartup ? "true" : "false")
-                    << "\n"
-                       "\n"
-                    << "System adapters: \n";
     for (const dawn_native::Adapter& adapter : mInstance->GetAdapters()) {
         wgpu::AdapterProperties properties;
         adapter.GetProperties(&properties);
-
         std::ostringstream vendorId;
         std::ostringstream deviceId;
         vendorId << std::setfill('0') << std::uppercase << std::internal << std::hex << std::setw(4)
@@ -328,19 +355,23 @@
                  << properties.deviceID;
 
         // Preparing for outputting hex numbers
-        dawn::InfoLog() << std::showbase << std::hex << std::setfill('0') << std::setw(4)
+        log << std::showbase << std::hex << std::setfill('0') << std::setw(4)
 
-                        << " - \"" << properties.name << "\"\n"
-                        << "   type: " << AdapterTypeName(properties.adapterType)
-                        << ", backend: " << ParamName(properties.backendType) << "\n"
-                        << "   vendorId: 0x" << vendorId.str() << ", deviceId: 0x" << deviceId.str()
-                        << (mHasVendorIdFilter && mVendorIdFilter == properties.vendorID
-                                ? " [Selected]"
-                                : "")
-                        << "\n";
+            << " - \"" << properties.name << "\"\n"
+            << "   type: " << AdapterTypeName(properties.adapterType)
+            << ", backend: " << ParamName(properties.backendType) << "\n"
+            << "   vendorId: 0x" << vendorId.str() << ", deviceId: 0x" << deviceId.str()
+            << (mHasVendorIdFilter && mVendorIdFilter == properties.vendorID ? " [Selected]" : "")
+            << "\n";
     }
 }
 
+void DawnTestEnvironment::SetUp() {
+    mInstance = CreateInstanceAndDiscoverAdapters();
+    ASSERT(mInstance);
+    PrintTestConfigurationAndAdapterInfo();
+}
+
 void DawnTestEnvironment::TearDown() {
     // When Vulkan validation layers are enabled, it's unsafe to call Vulkan APIs in the destructor
     // of a static/global variable, so the instance must be manually released beforehand.
@@ -386,27 +417,6 @@
     return mWireTraceDir.c_str();
 }
 
-void DawnTestEnvironment::DiscoverOpenGLAdapter() {
-#ifdef DAWN_ENABLE_BACKEND_OPENGL
-    if (!glfwInit()) {
-        return;
-    }
-    glfwDefaultWindowHints();
-    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
-    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4);
-    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
-    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
-
-    std::string windowName = "Dawn OpenGL test window";
-    GLFWwindow* window = glfwCreateWindow(400, 400, windowName.c_str(), nullptr, nullptr);
-
-    glfwMakeContextCurrent(window);
-    dawn_native::opengl::AdapterDiscoveryOptions adapterOptions;
-    adapterOptions.getProc = reinterpret_cast<void* (*)(const char*)>(glfwGetProcAddress);
-    mInstance->DiscoverAdapters(&adapterOptions);
-#endif  // DAWN_ENABLE_BACKEND_OPENGL
-}
-
 class WireServerTraceLayer : public dawn_wire::CommandHandler {
   public:
     WireServerTraceLayer(const char* file, dawn_wire::CommandHandler* handler)
diff --git a/src/tests/DawnTest.h b/src/tests/DawnTest.h
index 17cd7ea..45c3cbd 100644
--- a/src/tests/DawnTest.h
+++ b/src/tests/DawnTest.h
@@ -157,7 +157,8 @@
     std::unique_ptr<dawn_native::Instance> mInstance;
 
   private:
-    void DiscoverOpenGLAdapter();
+    std::unique_ptr<dawn_native::Instance> CreateInstanceAndDiscoverAdapters() const;
+    void PrintTestConfigurationAndAdapterInfo() const;
 
     bool mUseWire = false;
     bool mEnableBackendValidation = false;
diff --git a/src/tests/perf_tests/DawnPerfTest.cpp b/src/tests/perf_tests/DawnPerfTest.cpp
index 148e33d..58a0cbe6 100644
--- a/src/tests/perf_tests/DawnPerfTest.cpp
+++ b/src/tests/perf_tests/DawnPerfTest.cpp
@@ -78,6 +78,7 @@
 
 DawnPerfTestEnvironment::DawnPerfTestEnvironment(int argc, char** argv)
     : DawnTestEnvironment(argc, argv) {
+    size_t argLen = 0;  // Set when parsing --arg=X arguments
     for (int i = 1; i < argc; ++i) {
         if (strcmp("--calibration", argv[i]) == 0) {
             mIsCalibrating = true;
@@ -85,8 +86,9 @@
         }
 
         constexpr const char kOverrideStepsArg[] = "--override-steps=";
-        if (strstr(argv[i], kOverrideStepsArg) == argv[i]) {
-            const char* overrideSteps = argv[i] + strlen(kOverrideStepsArg);
+        argLen = sizeof(kOverrideStepsArg) - 1;
+        if (strncmp(argv[i], kOverrideStepsArg, argLen) == 0) {
+            const char* overrideSteps = argv[i] + argLen;
             if (overrideSteps[0] != '\0') {
                 mOverrideStepsToRun = strtoul(overrideSteps, nullptr, 0);
             }
@@ -94,8 +96,9 @@
         }
 
         constexpr const char kTraceFileArg[] = "--trace-file=";
-        if (strstr(argv[i], kTraceFileArg) == argv[i]) {
-            const char* traceFile = argv[i] + strlen(kTraceFileArg);
+        argLen = sizeof(kTraceFileArg) - 1;
+        if (strncmp(argv[i], kTraceFileArg, argLen) == 0) {
+            const char* traceFile = argv[i] + argLen;
             if (traceFile[0] != '\0') {
                 mTraceFile = traceFile;
             }