From 45160e45e044351de69cc3c8740c8013be372458 Mon Sep 17 00:00:00 2001
From: Ludovico de Nittis <ludovico.denittis@collabora.com>
Date: Thu, 28 Jan 2021 11:05:17 +0100
Subject: [PATCH] Add report parsing tests for the Vulkan graphics devices

Signed-off-by: Ludovico de Nittis <ludovico.denittis@collabora.com>
---
 tests/json-report/full-good-report.json | 18 ++++--
 tests/json-report/partial-report.json   | 18 ++++++
 tests/system-info.c                     | 82 ++++++++++++++++++++++++-
 3 files changed, 111 insertions(+), 7 deletions(-)

diff --git a/tests/json-report/full-good-report.json b/tests/json-report/full-good-report.json
index 96b119ca3..223105bec 100644
--- a/tests/json-report/full-good-report.json
+++ b/tests/json-report/full-good-report.json
@@ -138,16 +138,24 @@
       ],
       "graphics-details" : {
         "x11/vulkan" : {
-          "renderer" : "AMD Radeon RX 5700 XT",
-          "version" : "1.2.136 (device 1002:731f) (driver 2.0.140)",
+          "renderer" : "AMD RADV NAVI10 (ACO)",
+          "version" : "1.2.145 (device 0x1002:0x731f) (driver 20.3.3)",
           "devices" : [
             {
-              "name" : "AMD Radeon RX 5700 XT",
-              "api-version" : "1.2.136",
-              "driver-version" : "2.0.140",
+              "name" : "AMD RADV NAVI10 (ACO)",
+              "api-version" : "1.2.145",
+              "driver-version" : "20.3.3",
               "vendor-id" : "0x1002",
               "device-id" : "0x731f",
               "type" : "discrete-gpu"
+            },
+            {
+              "name" : "llvmpipe (LLVM 8.0, 256 bits)",
+              "api-version" : "1.0.2",
+              "driver-version" : "0.0.1",
+              "vendor-id" : "0x10005",
+              "device-id" : "0",
+              "type" : "cpu"
             }
           ]
         },
diff --git a/tests/json-report/partial-report.json b/tests/json-report/partial-report.json
index d843f8237..a76188cef 100644
--- a/tests/json-report/partial-report.json
+++ b/tests/json-report/partial-report.json
@@ -17,6 +17,24 @@
         "error": "We just don't know"
       },
       "graphics-details" : {
+        "x11/vulkan" : {
+          "renderer" : "AMD RADV NAVI10 (ACO)",
+          "version" : "1.2.145 (device 0x1002:0x731f) (driver 20.3.3)",
+          "devices" : [
+            {
+              "name" : "AMD RADV NAVI10 (ACO)",
+              "api-version" : "1.2.145",
+              "driver-version" : "20.3.3",
+              "type" : "discrete-gpu",
+              "messages" : [
+                "vkWaitForFences (dev_props->device, 1, &dev_props->in_flight_fences[dev_props->current_frame], VK_TRUE, 1) failed: TIMEOUT (2)"
+              ],
+              "issues" : [
+                "cannot-draw"
+              ]
+            }
+          ]
+        },
         "x11/vdpau" : {
           "renderer" : "G3DVL VDPAU Driver Shared Library version 1.0\n",
           "library-vendor" : "futuristic"
diff --git a/tests/system-info.c b/tests/system-info.c
index 4967bfc71..f4f92e979 100644
--- a/tests/system-info.c
+++ b/tests/system-info.c
@@ -25,6 +25,7 @@
 
 #include <libglnx.h>
 
+#include "steam-runtime-tools/graphics-test-defines.h"
 #include <steam-runtime-tools/steam-runtime-tools.h>
 #include "steam-runtime-tools/utils-internal.h"
 
@@ -2447,6 +2448,18 @@ typedef struct
   gboolean is_extra;
 } DriverTest;
 
+typedef struct
+{
+  SrtGraphicsIssues issues;
+  const gchar *name;
+  const gchar *api_version;
+  const gchar *driver_version;
+  const gchar *vendor_id;
+  const gchar *device_id;
+  const gchar *messages;
+  SrtVkPhysicalDeviceType type;
+} GraphicsDeviceTest;
+
 typedef struct
 {
   SrtWindowSystem window_system;
@@ -2456,6 +2469,7 @@ typedef struct
   SrtGraphicsLibraryVendor library_vendor;
   SrtGraphicsIssues issues;
   const gchar *messages;
+  GraphicsDeviceTest devices[4];
   int exit_status;
   int terminating_signal;
   gboolean is_available;
@@ -2721,9 +2735,28 @@ static const JsonTest json_test[] =
           {
             .window_system = SRT_WINDOW_SYSTEM_X11,
             .rendering_interface = SRT_RENDERING_INTERFACE_VULKAN,
-            .renderer = "AMD Radeon RX 5700 XT",
-            .version = "1.2.136 (device 1002:731f) (driver 2.0.140)",
+            .renderer = SRT_TEST_GOOD_GRAPHICS_RENDERER,
+            .version = SRT_TEST_GOOD_VULKAN_VERSION,
             .is_available = TRUE,
+            .devices =
+            {
+              {
+                .name = SRT_TEST_GOOD_GRAPHICS_RENDERER,
+                .api_version = SRT_TEST_GOOD_GRAPHICS_API_VERSION,
+                .driver_version = SRT_TEST_GOOD_GRAPHICS_DRIVER_VERSION,
+                .vendor_id = SRT_TEST_GOOD_GRAPHICS_VENDOR_ID,
+                .device_id = SRT_TEST_GOOD_GRAPHICS_DEVICE_ID,
+                .type = SRT_VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
+              },
+              {
+                .name = SRT_TEST_SOFTWARE_GRAPHICS_RENDERER,
+                .api_version = SRT_TEST_SOFTWARE_GRAPHICS_API_VERSION,
+                .driver_version = SRT_TEST_SOFTWARE_GRAPHICS_DRIVER_VERSION,
+                .vendor_id = SRT_TEST_SOFTWARE_GRAPHICS_VENDOR_ID,
+                .device_id = SRT_TEST_SOFTWARE_GRAPHICS_DEVICE_ID,
+                .type = SRT_VK_PHYSICAL_DEVICE_TYPE_CPU,
+              },
+            },
           },
           {
             .window_system = SRT_WINDOW_SYSTEM_X11,
@@ -2961,6 +2994,26 @@ static const JsonTest json_test[] =
         .issues = SRT_LIBRARY_ISSUES_UNKNOWN,
         .graphics =
         {
+          {
+            .window_system = SRT_WINDOW_SYSTEM_X11,
+            .rendering_interface = SRT_RENDERING_INTERFACE_VULKAN,
+            .renderer = SRT_TEST_GOOD_GRAPHICS_RENDERER,
+            .version = SRT_TEST_GOOD_VULKAN_VERSION,
+            .is_available = TRUE,
+            .devices =
+            {
+              {
+                .name = SRT_TEST_GOOD_GRAPHICS_RENDERER,
+                .api_version = SRT_TEST_GOOD_GRAPHICS_API_VERSION,
+                .driver_version = SRT_TEST_GOOD_GRAPHICS_DRIVER_VERSION,
+                .type = SRT_VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
+                /* A trailing newline is added by
+                 * _srt_json_object_dup_array_of_lines_member() */
+                .messages = SRT_TEST_MIXED_VULKAN_MESSAGES_2 "\n",
+                .issues = SRT_GRAPHICS_ISSUES_CANNOT_DRAW,
+              },
+            },
+          },
           {
             .window_system = SRT_WINDOW_SYSTEM_X11,
             .rendering_interface = SRT_RENDERING_INTERFACE_VDPAU,
@@ -3239,6 +3292,7 @@ json_parsing (Fixture *f,
       gchar **driver_environment_list;
       gsize j;
       gsize jj;
+      gsize k;
       GList *icds;
       GList *iter;
       GList *desktop_entries;
@@ -3342,6 +3396,7 @@ json_parsing (Fixture *f,
           for (jj = 0; this_arch.graphics[jj].is_available; jj++)
             {
               SrtGraphics *graphics = NULL;
+              g_autoptr(SrtObjectList) devices = NULL;
               SrtGraphicsLibraryVendor library_vendor;
               srt_system_info_check_graphics (info,
                                               multiarch_tuples[j],
@@ -3362,6 +3417,29 @@ json_parsing (Fixture *f,
                                srt_graphics_get_exit_status (graphics));
               g_assert_cmpint (this_arch.graphics[jj].terminating_signal, ==,
                                srt_graphics_get_terminating_signal (graphics));
+
+              devices = srt_graphics_get_devices (graphics);
+              for (k = 0, iter = devices; iter != NULL; iter = iter->next, k++)
+                {
+                  GraphicsDeviceTest this_device_test = this_arch.graphics[jj].devices[k];
+                  g_assert_cmpstr (srt_graphics_device_get_name (iter->data), ==,
+                                   this_device_test.name);
+                  g_assert_cmpstr (srt_graphics_device_get_api_version (iter->data), ==,
+                                   this_device_test.api_version);
+                  g_assert_cmpstr (srt_graphics_device_get_driver_version (iter->data), ==,
+                                   this_device_test.driver_version);
+                  g_assert_cmpstr (srt_graphics_device_get_vendor_id (iter->data), ==,
+                                   this_device_test.vendor_id);
+                  g_assert_cmpstr (srt_graphics_device_get_device_id (iter->data), ==,
+                                   this_device_test.device_id);
+                  g_assert_cmpint (srt_graphics_device_get_device_type (iter->data), ==,
+                                   this_device_test.type);
+                  g_assert_cmpstr (srt_graphics_device_get_messages (iter->data), ==,
+                                   this_device_test.messages);
+                  g_assert_cmpint (srt_graphics_device_get_issues (iter->data), ==,
+                                   this_device_test.issues);
+                }
+
               g_object_unref (graphics);
             }
 
-- 
GitLab