diff mbox series

[ovs-dev,v4] tests: Add some tests for byteq module.

Message ID 20231005142833.728406-1-jamestiotio@gmail.com
State Changes Requested, archived
Headers show
Series [ovs-dev,v4] tests: Add some tests for byteq module. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

James Raphael Tiovalen Oct. 5, 2023, 2:28 p.m. UTC
This commit adds a non-exhaustive list of tests for some of the
functions declared in `lib/byteq`.

These unit tests have been executed via `make check` and they
successfully passed.

Signed-off-by: James Raphael Tiovalen <jamestiotio@gmail.com>
---
Revisions:

v1 -> v2: Incorporate Mike's suggestions.
v2 -> v3: Add Eelco's suggestions to alphabetically order includes and
          indicate skipped tests.
v3 -> v4: Fix checkpatch error and warning.
---
 tests/automake.mk  |   1 +
 tests/library.at   |  13 ++++
 tests/test-byteq.c | 160 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 174 insertions(+)
 create mode 100644 tests/test-byteq.c

Comments

Simon Horman Oct. 6, 2023, 9:32 a.m. UTC | #1
On Thu, Oct 05, 2023 at 10:28:33PM +0800, James Raphael Tiovalen wrote:
> This commit adds a non-exhaustive list of tests for some of the
> functions declared in `lib/byteq`.
> 
> These unit tests have been executed via `make check` and they
> successfully passed.
> 
> Signed-off-by: James Raphael Tiovalen <jamestiotio@gmail.com>

Acked-by: Simon Horman <horms@ovn.org>
Eelco Chaudron Oct. 6, 2023, 12:11 p.m. UTC | #2
On 5 Oct 2023, at 16:28, James Raphael Tiovalen wrote:

> This commit adds a non-exhaustive list of tests for some of the
> functions declared in `lib/byteq`.
>
> These unit tests have been executed via `make check` and they
> successfully passed.
>
> Signed-off-by: James Raphael Tiovalen <jamestiotio@gmail.com>

Hi James, thanks for the updated patch. Find some comments below.

Cheers,

Eelco

> ---
> Revisions:
>
> v1 -> v2: Incorporate Mike's suggestions.
> v2 -> v3: Add Eelco's suggestions to alphabetically order includes and
>           indicate skipped tests.
> v3 -> v4: Fix checkpatch error and warning.
> ---
>  tests/automake.mk  |   1 +
>  tests/library.at   |  13 ++++
>  tests/test-byteq.c | 160 +++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 174 insertions(+)
>  create mode 100644 tests/test-byteq.c
>
> diff --git a/tests/automake.mk b/tests/automake.mk
> index 720c94449..f8a925012 100644
> --- a/tests/automake.mk
> +++ b/tests/automake.mk
> @@ -455,6 +455,7 @@ tests_ovstest_SOURCES = \
>  	tests/test-barrier.c \
>  	tests/test-bundle.c \
>  	tests/test-byte-order.c \
> +	tests/test-byteq.c \
>  	tests/test-classifier.c \
>  	tests/test-ccmap.c \
>  	tests/test-cmap.c \
> diff --git a/tests/library.at b/tests/library.at
> index 164ae789d..ea714ae9c 100644
> --- a/tests/library.at
> +++ b/tests/library.at
> @@ -88,6 +88,19 @@ AT_KEYWORDS([byte order])
>  AT_CHECK([ovstest test-byte-order])
>  AT_CLEANUP
>
> +AT_SETUP([byteq operations])

See also below, but we should not refer to platform types in test names, so we should probablt split it up in general, and read-write.
So something like:

AT_SETUP(byteq - basic)

Or somehting like common, or general. I have no real preference.

> +AT_KEYWORDS([byteq])
> +AT_CHECK([ovstest test-byteq regular], [0], [...


> +])
> +AT_CLEANUP
> +
> +AT_SETUP([byteq operations only on non-Windows platforms])

See above, something like:

AT_SETUP(byteq - write_read)


> +AT_KEYWORDS([byteq])
> +AT_SKIP_IF([test "$IS_WIN32" = "yes"])
> +AT_CHECK([ovstest test-byteq non-windows], [0], [.
> +])
> +AT_CLEANUP
> +
>  AT_SETUP([random number generator])
>  AT_CHECK([ovstest test-random], [0], [dnl
>  average=7fa2014f
> diff --git a/tests/test-byteq.c b/tests/test-byteq.c
> new file mode 100644
> index 000000000..26e6129bd
> --- /dev/null
> +++ b/tests/test-byteq.c
> @@ -0,0 +1,160 @@
> +/*
> + * Copyright (C) 2023 Hewlett Packard Enterprise Development LP
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at:
> + *
> + *     http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +
> +#include <config.h>
> +#undef NDEBUG
> +#include <stdint.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <sys/types.h>
> +#include <unistd.h>
> +#include "byteq.h"
> +#include "ovstest.h"
> +#include "util.h"
> +
> +static void test_byteq_main(int argc, char *argv[]);
> +static void test_byteq_put_get(void);
> +static void test_byteq_putn_get(void);
> +static void test_byteq_put_string(void);
> +static void test_byteq_write_read(void);
> +
> +#define SIZE 256
> +
> +static void
> +test_byteq_put_get(void)
> +{
> +    struct byteq bq;
> +    uint8_t buffer[SIZE];
> +    const char *input = "Open vSwitch";
> +    const int input_len = strlen(input);
> +
> +    byteq_init(&bq, buffer, SIZE);
> +    for (int i = 0; i < input_len; i++) {
> +        byteq_put(&bq, input[i]);
> +    }
> +    for (int i = 0; i < input_len; i++) {
> +        ovs_assert(byteq_get(&bq) == input[i]);
> +    }
> +}
> +
> +static void
> +test_byteq_putn_get(void)
> +{
> +    struct byteq bq;
> +    uint8_t buffer[SIZE];
> +    const char *input = "Open vSwitch";
> +    const int input_len = strlen(input);
> +
> +    byteq_init(&bq, buffer, SIZE);
> +    byteq_putn(&bq, input, input_len);
> +    for (int i = 0; i < input_len; i++) {
> +        ovs_assert(byteq_get(&bq) == input[i]);
> +    }
> +}
> +
> +static void
> +test_byteq_put_string(void)
> +{
> +    struct byteq bq;
> +    uint8_t buffer[SIZE];
> +    const char *input = "Open vSwitch";
> +    const int input_len = strlen(input);
> +
> +    byteq_init(&bq, buffer, SIZE);
> +    byteq_put_string(&bq, input);
> +    for (int i = 0; i < input_len; i++) {
> +        ovs_assert(byteq_get(&bq) == input[i]);
> +    }
> +}
> +
> +static void
> +test_byteq_write_read(void)
> +{
> +#ifndef _WIN32
> +    int fd[2];
> +    pid_t childpid;
> +    int rc;
> +    struct byteq bq;
> +    uint8_t buffer[SIZE];
> +    const char *input = "Open vSwitch";
> +    const int input_len = strlen(input);
> +
> +    byteq_init(&bq, buffer, SIZE);
> +    byteq_put_string(&bq, input);
> +
> +    rc = pipe(fd);
> +    ovs_assert(rc == 0);
> +
> +    /* Flush stdout */
> +    fflush(stdout);
> +
> +    childpid = fork();
> +    ovs_assert(childpid != -1);
> +    if (childpid == 0) {
> +        /* Child process closes stdout */
> +        close(STDOUT_FILENO);
> +        /* Child process closes up input side of pipe */
> +        close(fd[0]);
> +        rc = byteq_write(&bq, fd[1]);
> +        ovs_assert(rc == 0);
> +        exit(0);
> +    } else {
> +        /* Parent process closes up output side of pipe */
> +        close(fd[1]);
> +        rc = byteq_read(&bq, fd[0]);
> +        ovs_assert(rc == EOF);
> +        for (int i = 0; i < input_len; i++) {
> +            ovs_assert(byteq_get(&bq) == input[i]);
> +        }
> +    }
> +#endif /* _WIN32 */
> +}
> +
> +static void
> +run_test(void (*function)(void))
> +{
> +    function();
> +    printf(".");
> +}
> +
> +static void
> +test_byteq_main(int argc, char *argv[])
> +{
> +    if (argc != 2) {
> +        ovs_fatal(0, "exactly one argument required\n"
> +                     "the argument must be one of the following:\n"
> +                     "\tregular\n"
> +                     "\tnon-windows\n");
> +    }
> +
> +    /* Check whether to run only non-Windows tests or not. */
> +    if (strcmp(argv[1], "non-windows") == 0) {
> +        run_test(test_byteq_write_read);
> +        printf("\n");
> +    } else if (strcmp(argv[1], "regular") == 0) {

Guess nameing here should match the tests, i.e. basic and write_read.

> +        run_test(test_byteq_put_get);
> +        run_test(test_byteq_putn_get);
> +        run_test(test_byteq_put_string);
> +        printf("\n");
> +    } else {
> +        ovs_fatal(0, "invalid argument\n"
> +                     "the argument must be one of the following:\n"
> +                     "\tregular\n"
> +                     "\tnon-windows\n");
> +    }
> +}
> +
> +OVSTEST_REGISTER("test-byteq", test_byteq_main);
> -- 
> 2.42.0
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
diff mbox series

Patch

diff --git a/tests/automake.mk b/tests/automake.mk
index 720c94449..f8a925012 100644
--- a/tests/automake.mk
+++ b/tests/automake.mk
@@ -455,6 +455,7 @@  tests_ovstest_SOURCES = \
 	tests/test-barrier.c \
 	tests/test-bundle.c \
 	tests/test-byte-order.c \
+	tests/test-byteq.c \
 	tests/test-classifier.c \
 	tests/test-ccmap.c \
 	tests/test-cmap.c \
diff --git a/tests/library.at b/tests/library.at
index 164ae789d..ea714ae9c 100644
--- a/tests/library.at
+++ b/tests/library.at
@@ -88,6 +88,19 @@  AT_KEYWORDS([byte order])
 AT_CHECK([ovstest test-byte-order])
 AT_CLEANUP
 
+AT_SETUP([byteq operations])
+AT_KEYWORDS([byteq])
+AT_CHECK([ovstest test-byteq regular], [0], [...
+])
+AT_CLEANUP
+
+AT_SETUP([byteq operations only on non-Windows platforms])
+AT_KEYWORDS([byteq])
+AT_SKIP_IF([test "$IS_WIN32" = "yes"])
+AT_CHECK([ovstest test-byteq non-windows], [0], [.
+])
+AT_CLEANUP
+
 AT_SETUP([random number generator])
 AT_CHECK([ovstest test-random], [0], [dnl
 average=7fa2014f
diff --git a/tests/test-byteq.c b/tests/test-byteq.c
new file mode 100644
index 000000000..26e6129bd
--- /dev/null
+++ b/tests/test-byteq.c
@@ -0,0 +1,160 @@ 
+/*
+ * Copyright (C) 2023 Hewlett Packard Enterprise Development LP
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <config.h>
+#undef NDEBUG
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "byteq.h"
+#include "ovstest.h"
+#include "util.h"
+
+static void test_byteq_main(int argc, char *argv[]);
+static void test_byteq_put_get(void);
+static void test_byteq_putn_get(void);
+static void test_byteq_put_string(void);
+static void test_byteq_write_read(void);
+
+#define SIZE 256
+
+static void
+test_byteq_put_get(void)
+{
+    struct byteq bq;
+    uint8_t buffer[SIZE];
+    const char *input = "Open vSwitch";
+    const int input_len = strlen(input);
+
+    byteq_init(&bq, buffer, SIZE);
+    for (int i = 0; i < input_len; i++) {
+        byteq_put(&bq, input[i]);
+    }
+    for (int i = 0; i < input_len; i++) {
+        ovs_assert(byteq_get(&bq) == input[i]);
+    }
+}
+
+static void
+test_byteq_putn_get(void)
+{
+    struct byteq bq;
+    uint8_t buffer[SIZE];
+    const char *input = "Open vSwitch";
+    const int input_len = strlen(input);
+
+    byteq_init(&bq, buffer, SIZE);
+    byteq_putn(&bq, input, input_len);
+    for (int i = 0; i < input_len; i++) {
+        ovs_assert(byteq_get(&bq) == input[i]);
+    }
+}
+
+static void
+test_byteq_put_string(void)
+{
+    struct byteq bq;
+    uint8_t buffer[SIZE];
+    const char *input = "Open vSwitch";
+    const int input_len = strlen(input);
+
+    byteq_init(&bq, buffer, SIZE);
+    byteq_put_string(&bq, input);
+    for (int i = 0; i < input_len; i++) {
+        ovs_assert(byteq_get(&bq) == input[i]);
+    }
+}
+
+static void
+test_byteq_write_read(void)
+{
+#ifndef _WIN32
+    int fd[2];
+    pid_t childpid;
+    int rc;
+    struct byteq bq;
+    uint8_t buffer[SIZE];
+    const char *input = "Open vSwitch";
+    const int input_len = strlen(input);
+
+    byteq_init(&bq, buffer, SIZE);
+    byteq_put_string(&bq, input);
+
+    rc = pipe(fd);
+    ovs_assert(rc == 0);
+
+    /* Flush stdout */
+    fflush(stdout);
+
+    childpid = fork();
+    ovs_assert(childpid != -1);
+    if (childpid == 0) {
+        /* Child process closes stdout */
+        close(STDOUT_FILENO);
+        /* Child process closes up input side of pipe */
+        close(fd[0]);
+        rc = byteq_write(&bq, fd[1]);
+        ovs_assert(rc == 0);
+        exit(0);
+    } else {
+        /* Parent process closes up output side of pipe */
+        close(fd[1]);
+        rc = byteq_read(&bq, fd[0]);
+        ovs_assert(rc == EOF);
+        for (int i = 0; i < input_len; i++) {
+            ovs_assert(byteq_get(&bq) == input[i]);
+        }
+    }
+#endif /* _WIN32 */
+}
+
+static void
+run_test(void (*function)(void))
+{
+    function();
+    printf(".");
+}
+
+static void
+test_byteq_main(int argc, char *argv[])
+{
+    if (argc != 2) {
+        ovs_fatal(0, "exactly one argument required\n"
+                     "the argument must be one of the following:\n"
+                     "\tregular\n"
+                     "\tnon-windows\n");
+    }
+
+    /* Check whether to run only non-Windows tests or not. */
+    if (strcmp(argv[1], "non-windows") == 0) {
+        run_test(test_byteq_write_read);
+        printf("\n");
+    } else if (strcmp(argv[1], "regular") == 0) {
+        run_test(test_byteq_put_get);
+        run_test(test_byteq_putn_get);
+        run_test(test_byteq_put_string);
+        printf("\n");
+    } else {
+        ovs_fatal(0, "invalid argument\n"
+                     "the argument must be one of the following:\n"
+                     "\tregular\n"
+                     "\tnon-windows\n");
+    }
+}
+
+OVSTEST_REGISTER("test-byteq", test_byteq_main);