Add test for provider gettables
authorShane Lontis <shane.lontis@oracle.com>
Fri, 25 Jun 2021 02:01:13 +0000 (12:01 +1000)
committerPauli <pauli@openssl.org>
Tue, 6 Jul 2021 00:55:19 +0000 (10:55 +1000)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15970)

test/provider_status_test.c
test/recipes/30-test_provider_status.t

index fb52fa67f00bb39c10ee8d97cd9a63a59228ed18..551277c8e0b269826f8194e3dbd531b49bcd9515 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
  *
  * Licensed under the Apache License 2.0 (the "License").  You may not use
  * this file except in compliance with the License.  You can obtain a copy
@@ -103,6 +103,43 @@ static int self_test_on_load(const OSSL_PARAM params[], void *arg)
     return self_test_events(params, arg, "On Loading", 0);
 }
 
+static int get_provider_params(const OSSL_PROVIDER *prov)
+{
+    int ret = 0;
+    OSSL_PARAM params[5];
+    char *name, *version, *buildinfo;
+    int status;
+    const OSSL_PARAM *gettable, *p;
+
+    if (!TEST_ptr(gettable = OSSL_PROVIDER_gettable_params(prov))
+        || !TEST_ptr(p = OSSL_PARAM_locate_const(gettable, OSSL_PROV_PARAM_NAME))
+        || !TEST_ptr(p = OSSL_PARAM_locate_const(gettable, OSSL_PROV_PARAM_VERSION))
+        || !TEST_ptr(p = OSSL_PARAM_locate_const(gettable, OSSL_PROV_PARAM_STATUS))
+        || !TEST_ptr(p = OSSL_PARAM_locate_const(gettable, OSSL_PROV_PARAM_BUILDINFO)))
+        goto end;
+
+    params[0] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_NAME, &name, 0);
+    params[1] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_VERSION,
+                                              &version, 0);
+    params[2] = OSSL_PARAM_construct_int(OSSL_PROV_PARAM_STATUS, &status);
+    params[3] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_BUILDINFO,
+                                              &buildinfo, 0);
+    params[4] = OSSL_PARAM_construct_end();
+    OSSL_PARAM_set_all_unmodified(params);
+    if (!TEST_true(OSSL_PROVIDER_get_params(prov, params)))
+        goto end;
+    if (!TEST_true(OSSL_PARAM_modified(params + 0))
+        || !TEST_true(OSSL_PARAM_modified(params + 1))
+        || !TEST_true(OSSL_PARAM_modified(params + 2))
+        || !TEST_true(OSSL_PARAM_modified(params + 3))
+        || !TEST_true(status == 1))
+        goto end;
+
+    ret = 1;
+end:
+    return ret;
+}
+
 static int test_provider_status(void)
 {
     int ret = 0;
@@ -113,6 +150,8 @@ static int test_provider_status(void)
 
     if (!TEST_ptr(prov = OSSL_PROVIDER_load(libctx, provider_name)))
         goto err;
+    if (!get_provider_params(prov))
+        goto err;
 
     /* Test that the provider status is ok */
     params[0] = OSSL_PARAM_construct_uint(OSSL_PROV_PARAM_STATUS, &status);
@@ -149,6 +188,18 @@ err:
     return ret;
 }
 
+static int test_provider_gettable_params(void)
+{
+    OSSL_PROVIDER *prov;
+    int ret;
+
+    if (!TEST_ptr(prov = OSSL_PROVIDER_load(libctx, provider_name)))
+        return 0;
+    ret = get_provider_params(prov);
+    OSSL_PROVIDER_unload(prov);
+    return ret;
+}
+
 int setup_tests(void)
 {
     OPTION_CHOICE o;
@@ -173,13 +224,22 @@ int setup_tests(void)
     libctx = OSSL_LIB_CTX_new();
     if (libctx == NULL)
         return 0;
-    self_test_args.count = 0;
-    OSSL_SELF_TEST_set_callback(libctx, self_test_on_load, &self_test_args);
 
-    if (!OSSL_LIB_CTX_load_config(libctx, config_file)) {
-        opt_printf_stderr("Failed to load config\n");
-        return 0;
+    if (strcmp(provider_name, "fips") == 0) {
+        self_test_args.count = 0;
+        OSSL_SELF_TEST_set_callback(libctx, self_test_on_load, &self_test_args);
+        if (!OSSL_LIB_CTX_load_config(libctx, config_file)) {
+            opt_printf_stderr("Failed to load config\n");
+            return 0;
+        }
+        ADD_TEST(test_provider_status);
+    } else {
+        ADD_TEST(test_provider_gettable_params);
     }
-    ADD_TEST(test_provider_status);
     return 1;
 }
+
+void cleanup_tests(void)
+{
+    OSSL_LIB_CTX_free(libctx);
+}
index b3a239fb6ae7f22dbda7ade941e49ec5f314e058..2b2e242a5fa7ce88e12886ae5074105728ba1564 100644 (file)
@@ -22,11 +22,28 @@ use lib bldtop_dir('.');
 
 my $no_fips = disabled('fips') || ($ENV{NO_FIPS} // 0);
 
-plan skip_all => "provider_status is not supported by this test"
-    if $no_fips;
+plan tests => 5;
 
-plan tests => 1;
+ok(run(test(["provider_status_test", "-provider_name", "null"])),
+   "null provider test");
 
-ok(run(test(["provider_status_test", "-config", srctop_file("test","fips.cnf"),
-             "-provider_name", "fips"])),
-   "running provider_status_test");
+ok(run(test(["provider_status_test", "-provider_name", "base"])),
+   "base provider test");
+
+ok(run(test(["provider_status_test", "-provider_name", "default"])),
+   "default provider test");
+
+SKIP: {
+    skip "Skipping legacy test", 1
+        if disabled("legacy");
+    ok(run(test(["provider_status_test", "-provider_name", "legacy"])),
+       "legacy provider test");
+}
+
+SKIP: {
+    skip "Skipping fips test", 1
+        if $no_fips;
+    ok(run(test(["provider_status_test", "-config", srctop_file("test","fips.cnf"),
+                 "-provider_name", "fips"])),
+       "fips provider test");
+}