Enumeration mapping iterator's initial position is inconsistent
[babeltrace.git] / tests / lib / test_ctf_writer.c
index bf1ff958e0bd53bb726f9d9939e579a93ea60e90..d45953d3823a98096e6f526c63575df79936aa92 100644 (file)
@@ -40,7 +40,6 @@
 #include <babeltrace/compat/stdio-internal.h>
 #include <string.h>
 #include <assert.h>
-#include <sys/wait.h>
 #include <fcntl.h>
 #include "tap/tap.h"
 #include <math.h>
@@ -99,85 +98,46 @@ static
 void validate_trace(char *parser_path, char *trace_path)
 {
        int ret = 0;
-       gchar *babeltrace_output_path;
-       int babeltrace_output_fd = -1;
+       gchar *standard_error = NULL;
+       gint exit_status;
+       char *argv[] = {parser_path, trace_path, NULL};
 
-       if (!trace_path) {
+       if (!parser_path || !trace_path) {
                ret = -1;
                goto result;
        }
 
-       babeltrace_output_fd = g_file_open_tmp("babeltrace_output_XXXXXX",
-                       &babeltrace_output_path, NULL);
-       unlink(babeltrace_output_path);
-       g_free(babeltrace_output_path);
-
-       if (babeltrace_output_fd == -1) {
-               diag("Failed to create a temporary file for trace parsing.");
+       if (!g_spawn_sync(NULL,
+                       argv,
+                       NULL,
+                       G_SPAWN_STDOUT_TO_DEV_NULL,
+                       NULL,
+                       NULL,
+                       NULL,
+                       &standard_error,
+                       &exit_status,
+                       NULL)) {
+               diag("Failed to spawn babeltrace.");
                ret = -1;
                goto result;
        }
 
-       pid_t pid = fork();
-       if (pid) {
-               int status = 0;
-               waitpid(pid, &status, 0);
-               ret = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
-       } else {
-               ret = dup2(babeltrace_output_fd, STDOUT_FILENO);
-               if (ret < 0) {
-                       perror("# dup2 babeltrace_output_fd to STDOUT");
-                       goto result;
-               }
-
-               ret = dup2(babeltrace_output_fd, STDERR_FILENO);
-               if (ret < 0) {
-                       perror("# dup2 babeltrace_output_fd to STDERR");
-                       goto result;
-               }
+       /* Replace by g_spawn_check_exit_status when we require glib >= 2.34 */
+#ifdef G_OS_UNIX
+       ret = WIFEXITED(exit_status) ? WEXITSTATUS(exit_status) : -1;
+#else
+       ret = exit_status;
+#endif
 
-               execl(parser_path, parser_path, trace_path, NULL);
-               perror("# Could not launch the babeltrace process");
-               exit(-1);
+       if (ret != 0) {
+               diag("Babeltrace returned an error.");
+               diag_multiline(standard_error);
+               goto result;
        }
+
 result:
        ok(ret == 0, "Babeltrace could read the resulting trace");
-
-       if (ret && babeltrace_output_fd >= 0) {
-               char *line;
-               size_t len = METADATA_LINE_SIZE;
-               FILE *babeltrace_output_fp = NULL;
-
-               babeltrace_output_fp = fdopen(babeltrace_output_fd, "r");
-               if (!babeltrace_output_fp) {
-                       perror("fdopen on babeltrace_output_fd");
-                       goto close_fp;
-               }
-               babeltrace_output_fd = -1;
-
-               line = malloc(len);
-               if (!line) {
-                       diag("malloc error");
-               }
-               rewind(babeltrace_output_fp);
-               while (bt_getline(&line, &len, babeltrace_output_fp) > 0) {
-                       diag("%s", line);
-               }
-
-               free(line);
-close_fp:
-               if (babeltrace_output_fp) {
-                       if (fclose(babeltrace_output_fp)) {
-                               diag("fclose error");
-                       }
-               }
-       }
-
-       if (babeltrace_output_fd >= 0) {
-               if (close(babeltrace_output_fd)) {
-                       diag("close error");
-               }
-       }
+       g_free(standard_error);
 }
 
 static
@@ -287,11 +247,14 @@ void append_simple_event(struct bt_ctf_stream_class *stream_class,
        ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_signed_value handles a NULL field type correctly");
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_signed_value(enum_type, -4200000);
-       ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_signed_value rejects non-mapped values");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(iter && ret, "bt_ctf_field_type_enumeration_find_mappings_by_signed_value rejects non-mapped values");
+       BT_PUT(iter);
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_signed_value(enum_type, 3);
        ok(iter != NULL, "bt_ctf_field_type_enumeration_find_mappings_by_signed_value succeeds with mapped value");
-       ok(bt_ctf_field_type_enumeration_mapping_iterator_get_signed(iter, NULL, NULL, NULL) == 0,
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(!ret && bt_ctf_field_type_enumeration_mapping_iterator_get_signed(iter, NULL, NULL, NULL) == 0,
                "bt_ctf_field_type_enumeration_mapping_iterator_get_signed handles mapped values correctly");
        BT_PUT(iter);
 
@@ -478,6 +441,8 @@ void append_simple_event(struct bt_ctf_stream_class *stream_class,
                "Set signed enumeration container value");
        iter = bt_ctf_field_enumeration_get_mappings(enum_field);
        ok(iter, "bt_ctf_field_enumeration_get_mappings returns an iterator to matching mappings");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(!ret, "bt_ctf_field_enumeration_get_mappings returned a non-empty match");
        ret = bt_ctf_field_type_enumeration_mapping_iterator_get_signed(iter, &ret_char, NULL, NULL);
        ok(!ret && ret_char, "bt_ctf_field_type_enumeration_mapping_iterator_get_signed return a mapping name");
        assert(ret_char);
@@ -499,6 +464,8 @@ void append_simple_event(struct bt_ctf_stream_class *stream_class,
        assert(!ret);
        iter = bt_ctf_field_enumeration_get_mappings(enum_field_unsigned);
        assert(iter);
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       assert(!ret);
        (void) bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned(iter, &ret_char, NULL, NULL);
        ok(ret_char && !strcmp(ret_char, mapping_name_test),
                "bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned returns the correct mapping name with an unsigned container");
@@ -596,7 +563,7 @@ static
 void append_complex_event(struct bt_ctf_stream_class *stream_class,
                struct bt_ctf_stream *stream, struct bt_ctf_clock *clock)
 {
-       int i;
+       int i, ret;
        struct event_class_attrs_counts ;
        const char *complex_test_event_string = "Complex Test Event";
        const char *test_string_1 = "Test ";
@@ -692,25 +659,31 @@ void append_complex_event(struct bt_ctf_stream_class *stream_class,
        ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_name handles a NULL field type correctly");
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_name(enum_variant_type, "INT16_TYPE");
-       ok(iter != NULL, "bt_ctf_field_type_enumeration_find_mappings_by_name handles an existing mapping correctly");
+       ok(iter != NULL, "bt_ctf_field_type_enumeration_find_mappings_by_name returns a non-NULL iterator");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(!ret, "bt_ctf_field_type_enumeration_find_mappings_by_name handles an existing mapping correctly");
        ok(bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned(iter, NULL, NULL, NULL) == 0,
                "bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned handles mapped values correctly");
        BT_PUT(iter);
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_name(enum_variant_type, NULL);
-       ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_name handles a NULL name correctly");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(iter && ret, "bt_ctf_field_type_enumeration_find_mappings_by_name handles a NULL name correctly");
+       BT_PUT(iter);
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value(NULL, 1);
        ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value handles a NULL field type correctly");
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value(enum_variant_type, -42);
-       ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value handles invalid values correctly");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(iter && ret, "bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value handles invalid values correctly");
        ok(bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned(iter, NULL, NULL, NULL) != 0,
                "bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned handles invalid values correctly");
        BT_PUT(iter);
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value(enum_variant_type, 5);
-       ok(iter != NULL, "bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value handles valid values correctly");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(iter != NULL && !ret, "bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value handles valid values correctly");
        ok(bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned(iter, NULL, NULL, NULL) == 0,
                "bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned handles valid values correctly");
        BT_PUT(iter);
@@ -1504,6 +1477,7 @@ void field_copy_tests()
 
        /* validate e copy */
        e_iter = bt_ctf_field_enumeration_get_mappings(e_copy);
+       (void) bt_ctf_field_type_enumeration_mapping_iterator_next(e_iter);
        (void) bt_ctf_field_type_enumeration_mapping_iterator_get_signed(e_iter,
                &str_val, NULL, NULL);
        ok(str_val && !strcmp(str_val, "LABEL2"),
This page took 0.025667 seconds and 4 git commands to generate.