From f98c93ab193bd7258f165de8c61a1809087975ee Mon Sep 17 00:00:00 2001
From: raylu-hdf <60487644+raylu-hdf@users.noreply.github.com>
Date: Tue, 25 Oct 2022 07:59:03 -0500
Subject: Added a test case to verify the VOL capacity flags work correctly.
 (#2178)

* Added a test case to verify the VOL capacity flags work correctly.

* Committing clang-format changes

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
---
 test/vol.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 112 insertions(+), 10 deletions(-)

diff --git a/test/vol.c b/test/vol.c
index a39ce96..22adf88 100644
--- a/test/vol.c
+++ b/test/vol.c
@@ -47,6 +47,7 @@ static herr_t reg_opt_op_optional(void *obj, H5VL_optional_args_t *args, hid_t d
 static herr_t reg_opt_link_optional(void *obj, const H5VL_loc_params_t *loc_params,
                                     H5VL_optional_args_t *args, hid_t dxpl_id, void **req);
 static herr_t reg_opt_datatype_get(void *obj, H5VL_datatype_get_args_t *args, hid_t dxpl_id, void **req);
+
 #define REG_OPT_VOL_NAME  "reg_opt"
 #define REG_OPT_VOL_VALUE ((H5VL_class_value_t)502)
 static const H5VL_class_t reg_opt_vol_g = {
@@ -171,20 +172,24 @@ static const H5VL_class_t reg_opt_vol_g = {
     NULL /* optional     */
 };
 
+static herr_t fake_get_cap_flags(const void *info, uint64_t *cap_flags);
+
 #define FAKE_VOL_NAME  "fake"
 #define FAKE_VOL_VALUE ((H5VL_class_value_t)501)
+#define H5VL_FAKE_CAP_FLAGS                                                                                  \
+    (H5VL_CAP_FLAG_DATASET_BASIC | H5VL_CAP_FLAG_GROUP_BASIC | H5VL_CAP_FLAG_FILE_BASIC)
 
 /* A VOL class struct that describes a VOL class with no
  * functionality.
  */
 static const H5VL_class_t fake_vol_g = {
-    H5VL_VERSION,       /* VOL class struct version */
-    FAKE_VOL_VALUE,     /* value        */
-    FAKE_VOL_NAME,      /* name         */
-    0,                  /* connector version */
-    H5VL_CAP_FLAG_NONE, /* capability flags */
-    NULL,               /* initialize   */
-    NULL,               /* terminate    */
+    H5VL_VERSION,        /* VOL class struct version */
+    FAKE_VOL_VALUE,      /* value        */
+    FAKE_VOL_NAME,       /* name         */
+    0,                   /* connector version */
+    H5VL_FAKE_CAP_FLAGS, /* capability flags */
+    NULL,                /* initialize   */
+    NULL,                /* terminate    */
     {
         /* info_cls */
         (size_t)0, /* size    */
@@ -270,9 +275,9 @@ static const H5VL_class_t fake_vol_g = {
     },
     {
         /* introspect_cls */
-        NULL, /* get_conn_cls */
-        NULL, /* get_cap_flags */
-        NULL, /* opt_query    */
+        NULL,               /* get_conn_cls */
+        fake_get_cap_flags, /* get_cap_flags */
+        NULL,               /* opt_query    */
     },
     {
         /* request_cls */
@@ -553,6 +558,23 @@ reg_opt_datatype_get(void H5_ATTR_UNUSED *obj, H5VL_datatype_get_args_t *args, h
 } /* end reg_opt_datatype_get() */
 
 /*-------------------------------------------------------------------------
+ * Function:    fake_get_cap_flags
+ *
+ * Purpose:     Return the capability flags for the 'fake' connector
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+fake_get_cap_flags(const void H5_ATTR_UNUSED *info, uint64_t *cap_flags)
+{
+    *cap_flags = fake_vol_g.cap_flags;
+
+    return SUCCEED;
+} /* end fake_get_cap_flags() */
+
+/*-------------------------------------------------------------------------
  * Function:    fake_async_get_cap_flags
  *
  * Purpose:     Return the capability flags for the 'fake async' connector
@@ -2116,6 +2138,85 @@ error:
 } /* end test_async_vol_props() */
 
 /*-------------------------------------------------------------------------
+ * Function:    test_vol_cap_flags()
+ *
+ * Purpose:     Tests the VOL cap flags
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_vol_cap_flags(void)
+{
+    hid_t                    fapl_id       = H5I_INVALID_HID;
+    hid_t                    vol_id        = H5I_INVALID_HID;
+    uint64_t                 vol_cap_flags = H5VL_CAP_FLAG_NONE;
+    H5VL_pass_through_info_t passthru_info;
+
+    TESTING("VOL capacity flags");
+
+    /* Register a fake VOL */
+    if ((vol_id = H5VLregister_connector(&fake_vol_g, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+
+    if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR;
+
+    if (H5Pset_vol(fapl_id, vol_id, NULL) < 0)
+        TEST_ERROR;
+
+    /* Verify the correctness of the VOL capacity flags */
+    if (H5Pget_vol_cap_flags(fapl_id, &vol_cap_flags) < 0)
+        TEST_ERROR;
+
+    if (!(vol_cap_flags & H5VL_CAP_FLAG_FILE_BASIC))
+        TEST_ERROR;
+
+    if (vol_cap_flags & H5VL_CAP_FLAG_ATTR_BASIC)
+        TEST_ERROR;
+
+    /* Stack the [internal] passthrough VOL connector on top of the fake connector */
+    passthru_info.under_vol_id   = vol_id;
+    passthru_info.under_vol_info = NULL;
+
+    if (H5Pset_vol(fapl_id, H5VL_PASSTHRU, &passthru_info) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Verify the correctness of the VOL capacity flags */
+    vol_cap_flags = H5VL_CAP_FLAG_NONE;
+
+    if (H5Pget_vol_cap_flags(fapl_id, &vol_cap_flags) < 0)
+        TEST_ERROR;
+
+    if (!(vol_cap_flags & H5VL_CAP_FLAG_FILE_BASIC))
+        TEST_ERROR;
+
+    if (vol_cap_flags & H5VL_CAP_FLAG_ATTR_BASIC)
+        TEST_ERROR;
+
+    if (H5Pclose(fapl_id) < 0)
+        TEST_ERROR;
+
+    /* Unregister the fake VOL ID */
+    if (H5VLunregister_connector(vol_id) < 0)
+        TEST_ERROR;
+
+    PASSED();
+    return SUCCEED;
+
+error:
+    H5E_BEGIN_TRY
+    {
+        H5VLunregister_connector(vol_id);
+        H5Pclose(fapl_id);
+    }
+    H5E_END_TRY;
+
+    return FAIL;
+} /* end test_vol_cap_flags() */
+
+/*-------------------------------------------------------------------------
  * Function:    main
  *
  * Purpose:     Tests the virtual object layer interface (H5VL)
@@ -2150,6 +2251,7 @@ main(void)
     nerrors += test_basic_link_operation() < 0 ? 1 : 0;
     nerrors += test_basic_datatype_operation() < 0 ? 1 : 0;
     nerrors += test_async_vol_props() < 0 ? 1 : 0;
+    nerrors += test_vol_cap_flags() < 0 ? 1 : 0;
 
     if (nerrors) {
         HDprintf("***** %d Virtual Object Layer TEST%s FAILED! *****\n", nerrors, nerrors > 1 ? "S" : "");
-- 
cgit v0.12