aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/supplemental/util/CMakeLists.txt1
-rw-r--r--src/supplemental/util/options_test.c274
-rw-r--r--tests/CMakeLists.txt2
-rw-r--r--tests/options.c241
4 files changed, 275 insertions, 243 deletions
diff --git a/src/supplemental/util/CMakeLists.txt b/src/supplemental/util/CMakeLists.txt
index 6a820b21..edae518e 100644
--- a/src/supplemental/util/CMakeLists.txt
+++ b/src/supplemental/util/CMakeLists.txt
@@ -13,3 +13,4 @@ nng_headers(
nng/supplemental/util/options.h
nng/supplemental/util/platform.h)
nng_test(idhash_test)
+nng_test(options_test)
diff --git a/src/supplemental/util/options_test.c b/src/supplemental/util/options_test.c
new file mode 100644
index 00000000..f139f6fe
--- /dev/null
+++ b/src/supplemental/util/options_test.c
@@ -0,0 +1,274 @@
+//
+// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2018 Capitar IT Group BV <info@capitar.com>
+//
+// This software is supplied under the terms of the MIT License, a
+// copy of which should be located in the distribution where this
+// file was obtained (LICENSE.txt). A copy of the license may also be
+// found online at https://opensource.org/licenses/MIT.
+//
+
+#include <nuts.h>
+
+#include <nng/supplemental/util/options.h>
+
+static nng_optspec case1[] = {
+ // clang-format off
+ { "flag", 'f', 1, false },
+ { "longflag", 0, 2, false },
+ { "value", 'v', 3, true },
+ { NULL, 'b', 4, false },
+ { NULL, 0, 0, false },
+ // clang-format on
+};
+
+void
+test_simple_options(void)
+{
+ int opti = 1;
+ char *av[6];
+ int ac = 5;
+ int v;
+ char *a = NULL;
+
+ av[0] = "program";
+ av[1] = "-f";
+ av[2] = "-v";
+ av[3] = "123";
+ av[4] = "456";
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(v == 1);
+ NUTS_NULL(a);
+ NUTS_TRUE(opti == 2);
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(opti == 4);
+ NUTS_TRUE(v == 3);
+ NUTS_MATCH(a, "123");
+ NUTS_TRUE(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
+ NUTS_TRUE(opti == 4);
+ NUTS_MATCH(av[opti], "456");
+}
+
+void
+test_long_options(void)
+{
+ int opti = 1;
+ char *av[6];
+ int ac = 5;
+ int v;
+ char *a = NULL;
+
+ av[0] = "program";
+ av[1] = "--flag";
+ av[2] = "--value";
+ av[3] = "123";
+ av[4] = "456";
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(v == 1);
+ NUTS_NULL(a);
+ NUTS_TRUE(opti == 2);
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(opti == 4);
+ NUTS_TRUE(v == 3);
+ NUTS_MATCH(a, "123");
+ NUTS_TRUE(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
+ NUTS_TRUE(opti == 4);
+ NUTS_MATCH(av[opti], "456");
+}
+
+void
+test_attached_short(void)
+{
+ int opti = 1;
+ char *av[3];
+ int ac = 3;
+ int v;
+ char *a = NULL;
+
+ av[0] = "program";
+ av[1] = "-v123";
+ av[2] = "456";
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(opti == 2);
+ NUTS_TRUE(v == 3);
+ NUTS_MATCH(a, "123");
+ NUTS_TRUE(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
+ NUTS_TRUE(opti == 2);
+ NUTS_MATCH(av[opti], "456");
+}
+
+void
+test_attached_long_equals(void)
+{
+ int opti = 1;
+ char *av[3];
+ int ac = 3;
+ int v;
+ char *a = NULL;
+
+ av[0] = "program";
+ av[1] = "--value=123";
+ av[2] = "456";
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(opti == 2);
+ NUTS_TRUE(v == 3);
+ NUTS_MATCH(a, "123");
+ NUTS_TRUE(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
+ NUTS_TRUE(opti == 2);
+ NUTS_MATCH(av[opti], "456");
+}
+
+void
+test_attached_long_colon(void)
+{
+ int opti = 1;
+ char *av[3];
+ int ac = 3;
+ int v;
+ char *a = NULL;
+
+ av[0] = "program";
+ av[1] = "--value:123";
+ av[2] = "456";
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(opti == 2);
+ NUTS_TRUE(v == 3);
+ NUTS_MATCH(a, "123");
+ NUTS_TRUE(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
+ NUTS_TRUE(opti == 2);
+ NUTS_MATCH(av[opti], "456");
+}
+
+void
+test_negative_bad_short(void)
+{
+ int opti = 1;
+ char *av[3];
+ int ac = 3;
+ int v;
+ char *a = NULL;
+
+ av[0] = "program";
+ av[1] = "-Z";
+ av[2] = "456";
+ NUTS_FAIL(nng_opts_parse(ac, av, case1, &v, &a, &opti), NNG_EINVAL);
+ NUTS_TRUE(opti == 1);
+}
+
+void
+test_negative_bad_long(void)
+{
+ int opti = 1;
+ char *av[3];
+ int ac = 3;
+ int v;
+ char *a = NULL;
+
+ av[0] = "program";
+ av[1] = "--something";
+ av[2] = "456";
+ NUTS_FAIL(nng_opts_parse(ac, av, case1, &v, &a, &opti), NNG_EINVAL);
+ NUTS_TRUE(opti == 1);
+}
+
+void
+test_option_separator_flag(void)
+{
+ int opti = 1;
+ char *av[5];
+ int ac = 5;
+ int v;
+ char *a = NULL;
+
+ av[0] = "program";
+ av[1] = "-f";
+ av[2] = "-";
+ av[3] = "-v";
+ av[4] = "456";
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(v == 1);
+ NUTS_TRUE(opti == 2);
+ NUTS_TRUE(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
+ NUTS_TRUE(opti == 3);
+}
+
+void
+test_no_options(void)
+{
+ int opti = 1;
+ char *av[1];
+ int ac = 1;
+ int v;
+ char *a = NULL;
+
+ av[0] = "program";
+ NUTS_TRUE(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
+}
+
+void
+test_arg_only(void)
+{
+ int opti = 1;
+ char *av[2];
+ int ac = 2;
+ int v;
+ char *a = NULL;
+
+ av[0] = "program";
+ av[1] = "123";
+ NUTS_TRUE(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
+ NUTS_TRUE(opti == 1);
+}
+
+void
+test_mixed_long_short(void)
+{
+ int opti = 1;
+ char *av[7];
+ int ac = 7;
+ int v;
+ char *a = NULL;
+
+ av[0] = "program";
+ av[1] = "--value=123";
+ av[2] = "-f";
+ av[3] = "--longflag";
+ av[4] = "-b";
+ av[5] = "-vxyz";
+ av[6] = "456";
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(opti == 2);
+ NUTS_TRUE(v == 3);
+ NUTS_MATCH(a, "123");
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(opti == 3);
+ NUTS_TRUE(v == 1);
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(opti == 4);
+ NUTS_TRUE(v == 2);
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(opti == 5);
+ NUTS_TRUE(v == 4);
+ NUTS_PASS(nng_opts_parse(ac, av, case1, &v, &a, &opti));
+ NUTS_TRUE(opti == 6);
+ NUTS_TRUE(v == 3);
+ NUTS_MATCH(a, "xyz");
+ NUTS_MATCH(av[opti], "456");
+ NUTS_TRUE(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
+ NUTS_TRUE(opti == 6);
+}
+
+NUTS_TESTS = {
+ { "simple options", test_simple_options },
+ { "long options", test_long_options },
+ { "separator flag", test_option_separator_flag },
+ { "no options", test_no_options },
+ { "attached short", test_attached_long_equals },
+ { "attached long equals", test_attached_long_equals },
+ { "attached long colon", test_attached_long_colon },
+ { "bad short", test_negative_bad_short },
+ { "bad long", test_negative_bad_long },
+ { "arg only", test_arg_only },
+ { "options mixed long short", test_mixed_long_short },
+ { NULL, NULL },
+};
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 3868a955..d4e008bd 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -132,7 +132,6 @@ add_nng_test(inproc 5)
add_nng_test(ipcsupp 10)
add_nng_test(multistress 60)
add_nng_test(nonblock 60)
-add_nng_test(options 5)
add_nng_test(pipe 5)
add_nng_test(scalability 20 ON)
add_nng_test(synch 5)
@@ -143,7 +142,6 @@ add_nng_test(ws 30)
add_nng_test(wss 30)
add_nng_test1(zt 60 NNG_TRANSPORT_ZEROTIER)
-add_nng_test(reqctx 5)
add_nng_test(reqstress 60)
# c++ tests
diff --git a/tests/options.c b/tests/options.c
deleted file mode 100644
index 19134005..00000000
--- a/tests/options.c
+++ /dev/null
@@ -1,241 +0,0 @@
-//
-// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
-// Copyright 2018 Capitar IT Group BV <info@capitar.com>
-//
-// This software is supplied under the terms of the MIT License, a
-// copy of which should be located in the distribution where this
-// file was obtained (LICENSE.txt). A copy of the license may also be
-// found online at https://opensource.org/licenses/MIT.
-//
-
-#include <string.h>
-
-#include <nng/nng.h>
-#include <nng/supplemental/util/options.h>
-
-#include "convey.h"
-
-static nng_optspec case1[] = {
- // clang-format off
- { "flag", 'f', 1, false },
- { "longflag", 0, 2, false },
- { "value", 'v', 3, true },
- { NULL, 'b', 4, false },
- { NULL, 0, 0, false },
- // clang-format on
-};
-
-TestMain("Option Parsing", {
- Convey("Simple works", {
- int opti = 1;
- char *av[6];
- int ac = 5;
- int v;
- char *a = NULL;
-
- av[0] = "program";
- av[1] = "-f";
- av[2] = "-v";
- av[3] = "123";
- av[4] = "456";
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(v == 1);
- So(a == NULL);
- So(opti == 2);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(opti == 4);
- So(v == 3);
- So(strcmp(a, "123") == 0);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
- So(opti == 4);
- So(strcmp(av[opti], "456") == 0);
- });
-
- Convey("Long works", {
- int opti = 1;
- char *av[6];
- int ac = 5;
- int v;
- char *a = NULL;
-
- av[0] = "program";
- av[1] = "--flag";
- av[2] = "--value";
- av[3] = "123";
- av[4] = "456";
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(v == 1);
- So(a == NULL);
- So(opti == 2);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(opti == 4);
- So(v == 3);
- So(strcmp(a, "123") == 0);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
- So(opti == 4);
- So(strcmp(av[opti], "456") == 0);
- });
-
- Convey("Attached short works", {
- int opti = 1;
- char *av[3];
- int ac = 3;
- int v;
- char *a = NULL;
-
- av[0] = "program";
- av[1] = "-v123";
- av[2] = "456";
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(opti == 2);
- So(v == 3);
- So(strcmp(a, "123") == 0);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
- So(opti == 2);
- So(strcmp(av[opti], "456") == 0);
- });
-
- Convey("Attached long (=) works", {
- int opti = 1;
- char *av[3];
- int ac = 3;
- int v;
- char *a = NULL;
-
- av[0] = "program";
- av[1] = "--value=123";
- av[2] = "456";
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(opti == 2);
- So(v == 3);
- So(strcmp(a, "123") == 0);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
- So(opti == 2);
- So(strcmp(av[opti], "456") == 0);
- });
-
- Convey("Attached long (:) works", {
- int opti = 1;
- char *av[3];
- int ac = 3;
- int v;
- char *a = NULL;
-
- av[0] = "program";
- av[1] = "--value:123";
- av[2] = "456";
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(opti == 2);
- So(v == 3);
- So(strcmp(a, "123") == 0);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
- So(opti == 2);
- So(strcmp(av[opti], "456") == 0);
- });
-
- Convey("Negative bad short works", {
- int opti = 1;
- char *av[3];
- int ac = 3;
- int v;
- char *a = NULL;
-
- av[0] = "program";
- av[1] = "-Z";
- av[2] = "456";
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == NNG_EINVAL);
- So(opti == 1);
- });
-
- Convey("Negative bad long works", {
- int opti = 1;
- char *av[3];
- int ac = 3;
- int v;
- char *a = NULL;
-
- av[0] = "program";
- av[1] = "--something";
- av[2] = "456";
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == NNG_EINVAL);
- So(opti == 1);
- });
-
- Convey("Separator flag works", {
- int opti = 1;
- char *av[5];
- int ac = 5;
- int v;
- char *a = NULL;
-
- av[0] = "program";
- av[1] = "-f";
- av[2] = "-";
- av[3] = "-v";
- av[4] = "456";
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(v == 1);
- So(opti == 2);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
- So(opti == 3);
- });
-
- Convey("No options works", {
- int opti = 1;
- char *av[1];
- int ac = 1;
- int v;
- char *a = NULL;
-
- av[0] = "program";
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
- });
-
- Convey("No options (but arguments) works", {
- int opti = 1;
- char *av[2];
- int ac = 2;
- int v;
- char *a = NULL;
-
- av[0] = "program";
- av[1] = "123";
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
- So(opti == 1);
- });
- Convey("Mixed long and short works", {
- int opti = 1;
- char *av[7];
- int ac = 7;
- int v;
- char *a = NULL;
-
- av[0] = "program";
- av[1] = "--value=123";
- av[2] = "-f";
- av[3] = "--longflag";
- av[4] = "-b";
- av[5] = "-vxyz";
- av[6] = "456";
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(opti == 2);
- So(v == 3);
- So(strcmp(a, "123") == 0);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(opti == 3);
- So(v == 1);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(opti == 4);
- So(v == 2);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(opti == 5);
- So(v == 4);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == 0);
- So(opti == 6);
- So(v == 3);
- So(strcmp(a, "xyz") == 0);
- So(strcmp(av[opti], "456") == 0);
- So(nng_opts_parse(ac, av, case1, &v, &a, &opti) == -1);
- So(opti == 6);
- });
-})