Tests: erroneous usage of if preprocessor directive
[babeltrace.git] / tests / lib / test_ctf_writer.c
index 80e49ca47a2f665ab685c1af64a91aa6cf4a39e7..2eac697c7b17becb7c6d1f8d53c79fb1d100c288 100644 (file)
 #include <babeltrace/ref.h>
 #include <babeltrace/ctf/events.h>
 #include <babeltrace/values.h>
+#include <glib.h>
 #include <unistd.h>
 #include <babeltrace/compat/stdlib-internal.h>
 #include <stdio.h>
-#include <sys/utsname.h>
 #include <babeltrace/compat/limits-internal.h>
 #include <babeltrace/compat/stdio-internal.h>
 #include <string.h>
 #include <assert.h>
-#include <sys/wait.h>
 #include <fcntl.h>
-#include <babeltrace/compat/dirent-internal.h>
 #include "tap/tap.h"
 #include <math.h>
 #include <float.h>
@@ -51,7 +49,7 @@
 #define METADATA_LINE_SIZE 512
 #define SEQUENCE_TEST_LENGTH 10
 #define ARRAY_TEST_LENGTH 5
-#define PACKET_RESIZE_TEST_LENGTH 100000
+#define PACKET_RESIZE_TEST_DEF_LENGTH 100000
 
 #define DEFAULT_CLOCK_FREQ 1000000000
 #define DEFAULT_CLOCK_PRECISION 1
 #define DEFAULT_CLOCK_TIME 0
 #define DEFAULT_CLOCK_VALUE 0
 
-#define NR_TESTS 612
+#define NR_TESTS 623
+
+struct bt_utsname {
+       char sysname[BABELTRACE_HOST_NAME_MAX];
+       char nodename[BABELTRACE_HOST_NAME_MAX];
+       char release[BABELTRACE_HOST_NAME_MAX];
+       char version[BABELTRACE_HOST_NAME_MAX];
+       char machine[BABELTRACE_HOST_NAME_MAX];
+};
 
 static int64_t current_time = 42;
+static unsigned int packet_resize_test_length = PACKET_RESIZE_TEST_DEF_LENGTH;
 
 /* Return 1 if uuids match, zero if different. */
 static
@@ -91,83 +98,46 @@ static
 void validate_trace(char *parser_path, char *trace_path)
 {
        int ret = 0;
-       char babeltrace_output_path[] = "/tmp/babeltrace_output_XXXXXX";
-       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 = mkstemp(babeltrace_output_path);
-       unlink(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, "babeltrace", 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
@@ -320,8 +290,8 @@ void append_simple_event(struct bt_ctf_stream_class *stream_class,
        ok(bt_ctf_field_type_enumeration_add_mapping_unsigned(enum_type_unsigned,
                "event clock int float", 5, 22) == 0,
                "bt_ctf_field_type_enumeration_add_mapping_unsigned accepts enumeration mapping strings containing reserved keywords");
-       bt_ctf_field_type_enumeration_add_mapping_unsigned(enum_type_unsigned, mapping_name_test,
-               42, 42);
+       ok(bt_ctf_field_type_enumeration_add_mapping_unsigned(enum_type_unsigned, mapping_name_test,
+               42, 42) == 0, "bt_ctf_field_type_enumeration_add_mapping_unsigned accepts single-value ranges");
        ok(bt_ctf_field_type_enumeration_add_mapping_unsigned(enum_type_unsigned, mapping_name_test,
                43, 51) == 0, "bt_ctf_field_type_enumeration_add_mapping_unsigned accepts duplicate mapping names");
        ok(bt_ctf_field_type_enumeration_add_mapping_unsigned(enum_type_unsigned, "something",
@@ -470,6 +440,7 @@ void append_simple_event(struct bt_ctf_stream_class *stream_class,
        ok(iter, "bt_ctf_field_enumeration_get_mappings returns an iterator to matching mappings");
        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);
        ok(!strcmp(ret_char, mapping_name_negative_test),
                "bt_ctf_field_enumeration_get_single_mapping_name returns the correct mapping name with an signed container");
        ret = bt_ctf_event_set_payload(simple_event, "enum_field", enum_field);
@@ -585,17 +556,7 @@ static
 void append_complex_event(struct bt_ctf_stream_class *stream_class,
                struct bt_ctf_stream *stream, struct bt_ctf_clock *clock)
 {
-       struct event_class_attrs_counts {
-               int id;
-               int name;
-               int loglevel;
-               int modelemfuri;
-               int unknown;
-       } attrs_count;
-
        int i;
-       int ret;
-       int64_t int64_value;
        struct event_class_attrs_counts ;
        const char *complex_test_event_string = "Complex Test Event";
        const char *test_string_1 = "Test ";
@@ -637,7 +598,6 @@ void append_complex_event(struct bt_ctf_stream_class *stream_class,
        struct bt_ctf_event_class *ret_event_class;
        struct bt_ctf_field *packet_context, *packet_context_field;
        struct bt_ctf_field_type_enumeration_mapping_iterator *iter = NULL;
-       struct bt_value *obj;
 
        ok(bt_ctf_field_type_set_alignment(int_16_type, 0),
                "bt_ctf_field_type_set_alignment handles 0-alignment correctly");
@@ -782,8 +742,6 @@ void append_complex_event(struct bt_ctf_stream_class *stream_class,
                inner_structure_type, "inner_structure"),
                "Add inner_structure field to complex structure");
 
-       ok(bt_ctf_event_class_create("clock") == NULL,
-               "Reject creation of an event class with an illegal name");
        event_class = bt_ctf_event_class_create(complex_test_event_string);
        ok(event_class, "Create an event class");
        ok(bt_ctf_event_class_add_field(event_class, uint_35_type, ""),
@@ -819,115 +777,32 @@ void append_complex_event(struct bt_ctf_stream_class *stream_class,
                "bt_ctf_event_class_get_id returns the correct value");
 
        /* Test event class attributes */
-       obj = bt_value_integer_create_init(15);
-       assert(obj);
-       ok(bt_ctf_event_class_set_attribute(NULL, "id", obj),
-               "bt_ctf_event_class_set_attribute handles a NULL event class correctly");
-       ok(bt_ctf_event_class_set_attribute(event_class, NULL, obj),
-               "bt_ctf_event_class_set_attribute handles a NULL name correctly");
-       ok(bt_ctf_event_class_set_attribute(event_class, "id", NULL),
-               "bt_ctf_event_class_set_attribute handles a NULL value correctly");
-       assert(!bt_value_integer_set(obj, -3));
-       ok(bt_ctf_event_class_set_attribute(event_class, "id", obj),
-               "bt_ctf_event_class_set_attribute fails with a negative \"id\" attribute");
-       assert(!bt_value_integer_set(obj, 11));
-       ret = bt_ctf_event_class_set_attribute(event_class, "id", obj);
-       ok(!ret && bt_ctf_event_class_get_id(event_class) == 11,
-               "bt_ctf_event_class_set_attribute succeeds in replacing the existing \"id\" attribute");
-       ret = bt_ctf_event_class_set_attribute(event_class, "name", obj);
-       ret &= bt_ctf_event_class_set_attribute(event_class, "model.emf.uri", obj);
-       ok(ret,
-               "bt_ctf_event_class_set_attribute cannot set \"name\" or \"model.emf.uri\" to an integer value");
-       BT_PUT(obj);
-
-       obj = bt_value_integer_create_init(5);
-       assert(obj);
-       ok(!bt_ctf_event_class_set_attribute(event_class, "loglevel", obj),
-               "bt_ctf_event_class_set_attribute succeeds in setting the \"loglevel\" attribute");
-       BT_PUT(obj);
-       ok(!bt_ctf_event_class_get_attribute_value_by_name(NULL, "loglevel"),
-               "bt_ctf_event_class_get_attribute_value_by_name handles a NULL event class correctly");
-       ok(!bt_ctf_event_class_get_attribute_value_by_name(event_class, NULL),
-               "bt_ctf_event_class_get_attribute_value_by_name handles a NULL name correctly");
-       ok(!bt_ctf_event_class_get_attribute_value_by_name(event_class, "meow"),
-               "bt_ctf_event_class_get_attribute_value_by_name fails with a non-existing attribute name");
-       obj = bt_ctf_event_class_get_attribute_value_by_name(event_class,
-               "loglevel");
-       int64_value = 0;
-       ret = bt_value_integer_get(obj, &int64_value);
-       ok(obj && !ret && int64_value == 5,
-               "bt_ctf_event_class_get_attribute_value_by_name returns the correct value");
-       BT_PUT(obj);
-
-       obj = bt_value_string_create_init("nu name");
-       assert(obj);
-       assert(!bt_ctf_event_class_set_attribute(event_class, "name", obj));
-       ret_string = bt_ctf_event_class_get_name(event_class);
-       ok(!strcmp(ret_string, "nu name"),
-               "bt_ctf_event_class_set_attribute succeeds in replacing the existing \"name\" attribute");
-       ret = bt_ctf_event_class_set_attribute(event_class, "id", obj);
-       ret &= bt_ctf_event_class_set_attribute(event_class, "loglevel", obj);
-       ok(ret,
-               "bt_ctf_event_class_set_attribute cannot set \"id\" or \"loglevel\" to a string value");
-       BT_PUT(obj);
-       obj = bt_value_string_create_init("http://kernel.org/");
-       assert(obj);
-       assert(!bt_ctf_event_class_set_attribute(event_class, "model.emf.uri", obj));
-       BT_PUT(obj);
-
-       ok(bt_ctf_event_class_get_attribute_count(NULL),
-               "bt_ctf_event_class_get_attribute_count handles a NULL event class");
-       ok(bt_ctf_event_class_get_attribute_count(event_class) == 4,
-               "bt_ctf_event_class_get_attribute_count returns the correct count");
-       ok(!bt_ctf_event_class_get_attribute_name_by_index(NULL, 0),
-               "bt_ctf_event_class_get_attribute_name handles a NULL event class correctly");
-       ok(!bt_ctf_event_class_get_attribute_name_by_index(event_class, 4),
-               "bt_ctf_event_class_get_attribute_name handles a too large index correctly");
-       ok(!bt_ctf_event_class_get_attribute_value_by_index(NULL, 0),
-               "bt_ctf_event_class_get_attribute_value handles a NULL event class correctly");
-       ok(!bt_ctf_event_class_get_attribute_value_by_index(event_class, 4),
-               "bt_ctf_event_class_get_attribute_value handles a too large index correctly");
-
-       memset(&attrs_count, 0, sizeof(attrs_count));
-
-       for (i = 0; i < 4; ++i) {
-               ret_string = bt_ctf_event_class_get_attribute_name_by_index(
-                       event_class, i);
-               obj = bt_ctf_event_class_get_attribute_value_by_index(
-                       event_class, i);
-               assert(ret_string && obj);
-
-               if (!strcmp(ret_string, "id")) {
-                       attrs_count.id++;
-                       ok(bt_value_is_integer(obj),
-                               "bt_ctf_event_class_get_attribute_value returns the correct type (\"%s\")",
-                               ret_string);
-               } else if (!strcmp(ret_string, "name")) {
-                       attrs_count.name++;
-                       ok(bt_value_is_string(obj),
-                               "bt_ctf_event_class_get_attribute_value returns the correct type (\"%s\")",
-                               ret_string);
-               } else if (!strcmp(ret_string, "loglevel")) {
-                       attrs_count.loglevel++;
-                       ok(bt_value_is_integer(obj),
-                               "bt_ctf_event_class_get_attribute_value returns the correct type (\"%s\")",
-                               ret_string);
-               } else if (!strcmp(ret_string, "model.emf.uri")) {
-                       attrs_count.modelemfuri++;
-                       ok(bt_value_is_string(obj),
-                               "bt_ctf_event_class_get_attribute_value returns the correct type (\"%s\")",
-                               ret_string);
-               } else {
-                       attrs_count.unknown++;
-               }
-
-               BT_PUT(obj);
-       }
-
-       ok(attrs_count.unknown == 0, "event class has no unknown attributes");
-       ok(attrs_count.id == 1 && attrs_count.name == 1 &&
-               attrs_count.loglevel == 1 && attrs_count.modelemfuri == 1,
-               "event class has one instance of each known attribute");
+       ok(bt_ctf_event_class_get_log_level(event_class) == BT_CTF_EVENT_CLASS_LOG_LEVEL_UNSPECIFIED,
+               "event class has the expected initial log level");
+       ok(!bt_ctf_event_class_get_emf_uri(event_class),
+               "as expected, event class has no initial EMF URI");
+       ok(bt_ctf_event_class_set_log_level(NULL, BT_CTF_EVENT_CLASS_LOG_LEVEL_INFO),
+               "bt_ctf_event_class_set_log_level handles a NULL event class correctly");
+       ok(bt_ctf_event_class_set_log_level(event_class, BT_CTF_EVENT_CLASS_LOG_LEVEL_UNKNOWN),
+               "bt_ctf_event_class_set_log_level handles an unknown log level correctly");
+       ok(!bt_ctf_event_class_set_log_level(event_class, BT_CTF_EVENT_CLASS_LOG_LEVEL_INFO),
+               "bt_ctf_event_class_set_log_level succeeds with a valid log level");
+       ok(bt_ctf_event_class_get_log_level(NULL) == BT_CTF_EVENT_CLASS_LOG_LEVEL_UNKNOWN,
+               "bt_ctf_event_class_get_log_level handles a NULL event class correctly");
+       ok(bt_ctf_event_class_get_log_level(event_class) == BT_CTF_EVENT_CLASS_LOG_LEVEL_INFO,
+               "bt_ctf_event_class_get_log_level returns the expected log level");
+       ok(bt_ctf_event_class_set_emf_uri(NULL, "http://diamon.org/babeltrace/"),
+               "bt_ctf_event_class_set_emf_uri handles a NULL event class correctly");
+       ok(!bt_ctf_event_class_set_emf_uri(event_class, "http://diamon.org/babeltrace/"),
+               "bt_ctf_event_class_set_emf_uri succeeds with a valid EMF URI");
+       ok(!bt_ctf_event_class_get_emf_uri(NULL),
+               "bt_ctf_event_class_get_emf_uri handles a NULL event class correctly");
+       ok(strcmp(bt_ctf_event_class_get_emf_uri(event_class), "http://diamon.org/babeltrace/") == 0,
+               "bt_ctf_event_class_get_emf_uri returns the expected EMF URI");
+       ok(!bt_ctf_event_class_set_emf_uri(event_class, NULL),
+               "bt_ctf_event_class_set_emf_uri succeeds with NULL (to reset)");
+       ok(!bt_ctf_event_class_get_emf_uri(event_class),
+               "as expected, event class has no EMF URI after reset");
 
        /* Add event class to the stream class */
        ok(bt_ctf_stream_class_add_event_class(stream_class, NULL),
@@ -2067,7 +1942,7 @@ void packet_resize_test(struct bt_ctf_stream_class *stream_class,
                "bt_ctf_event_get_payload_by_index handles an invalid index correctly");
        bt_put(event);
 
-       for (i = 0; i < PACKET_RESIZE_TEST_LENGTH; i++) {
+       for (i = 0; i < packet_resize_test_length; i++) {
                event = bt_ctf_event_create(event_class);
                struct bt_ctf_field *integer =
                        bt_ctf_field_create(ep_field_1_type);
@@ -2102,7 +1977,7 @@ void packet_resize_test(struct bt_ctf_stream_class *stream_class,
                }
        }
 
-       events_appended = !!(i == PACKET_RESIZE_TEST_LENGTH);
+       events_appended = !!(i == packet_resize_test_length);
        ok(bt_ctf_stream_get_discarded_events_count(NULL, &ret_uint64) < 0,
                "bt_ctf_stream_get_discarded_events_count handles a NULL stream correctly");
        ok(bt_ctf_stream_get_discarded_events_count(stream, NULL) < 0,
@@ -2165,6 +2040,11 @@ void test_empty_stream(struct bt_ctf_writer *writer)
                goto end;
        }
 
+       ret = bt_ctf_stream_class_set_packet_context_type(stream_class, NULL);
+       assert(ret == 0);
+       ret = bt_ctf_stream_class_set_event_header_type(stream_class, NULL);
+       assert(ret == 0);
+
        ok(bt_ctf_stream_class_get_trace(NULL) == NULL,
                "bt_ctf_stream_class_get_trace handles NULL correctly");
        ok(bt_ctf_stream_class_get_trace(stream_class) == NULL,
@@ -2493,7 +2373,7 @@ void append_existing_event_class(struct bt_ctf_stream_class *stream_class)
 
        event_class = bt_ctf_event_class_create("different name, ok");
        assert(event_class);
-       assert(!bt_ctf_event_class_set_id(event_class, 11));
+       assert(!bt_ctf_event_class_set_id(event_class, 13));
        ok(bt_ctf_stream_class_add_event_class(stream_class, event_class),
                "two event classes with the same ID cannot cohabit within the same stream class");
        bt_put(event_class);
@@ -2521,7 +2401,7 @@ static
 void test_create_writer_vs_non_writer_mode(void)
 {
        int ret;
-       char trace_path[] = "/tmp/ctfwriter_XXXXXX";
+       gchar *trace_path;
        const char *writer_stream_name = "writer stream instance";
        struct bt_ctf_writer *writer = NULL;
        struct bt_ctf_trace *writer_trace = NULL;
@@ -2544,6 +2424,7 @@ void test_create_writer_vs_non_writer_mode(void)
        struct bt_ctf_packet *packet = NULL;
        struct bt_ctf_packet *packet2 = NULL;
 
+       trace_path = g_build_filename(g_get_tmp_dir(), "ctfwriter_XXXXXX", NULL);
        if (!bt_mkdtemp(trace_path)) {
                perror("# perror");
        }
@@ -2555,6 +2436,10 @@ void test_create_writer_vs_non_writer_mode(void)
        /* Create writer, writer stream class, stream, and clock */
        writer = bt_ctf_writer_create(trace_path);
        assert(writer);
+       writer_clock = bt_ctf_clock_create("writer_clock");
+       assert(writer_clock);
+       ret = bt_ctf_writer_add_clock(writer, writer_clock);
+       assert(!ret);
        ret = bt_ctf_writer_set_byte_order(writer, BT_CTF_BYTE_ORDER_LITTLE_ENDIAN);
        assert(!ret);
        writer_trace = bt_ctf_writer_get_trace(writer);
@@ -2564,34 +2449,32 @@ void test_create_writer_vs_non_writer_mode(void)
        ret = bt_ctf_stream_class_set_event_header_type(writer_sc,
                empty_struct_ft);
        assert(!ret);
+       ret = bt_ctf_stream_class_set_clock(writer_sc, writer_clock);
+       assert(!ret);
        ret = bt_ctf_trace_add_stream_class(writer_trace, writer_sc);
        assert(!ret);
        writer_stream = bt_ctf_stream_create(writer_sc, writer_stream_name);
        assert(writer_stream);
        ok(!strcmp(bt_ctf_stream_get_name(writer_stream), writer_stream_name),
                "bt_ctf_stream_get_name() returns the stream's name");
-       writer_clock = bt_ctf_clock_create("writer_clock");
-       assert(writer_clock);
-       ret = bt_ctf_writer_add_clock(writer, writer_clock);
-       assert(!ret);
 
        /* Create non-writer trace, stream class, stream, and clock */
        non_writer_trace = bt_ctf_trace_create();
        assert(non_writer_trace);
-       ret = bt_ctf_trace_set_native_byte_order(non_writer_trace,
-               BT_CTF_BYTE_ORDER_LITTLE_ENDIAN);
-       assert(!ret);
        non_writer_sc = bt_ctf_stream_class_create("nonwriter_sc");
        assert(non_writer_sc);
        ret = bt_ctf_stream_class_set_event_header_type(non_writer_sc,
                empty_struct_ft);
        assert(!ret);
+       ret = bt_ctf_stream_class_set_packet_context_type(non_writer_sc, NULL);
+       assert(!ret);
        ret = bt_ctf_trace_add_stream_class(non_writer_trace, non_writer_sc);
        assert(!ret);
        non_writer_stream = bt_ctf_stream_create(non_writer_sc, NULL);
        assert(non_writer_stream);
        non_writer_clock_class =
-               bt_ctf_clock_class_create("non_writer_clock_class");
+               bt_ctf_clock_class_create("non_writer_clock_class",
+                       1000000000);
        assert(non_writer_clock_class);
        ret = bt_ctf_trace_add_clock_class(non_writer_trace,
                non_writer_clock_class);
@@ -2711,6 +2594,7 @@ void test_create_writer_vs_non_writer_mode(void)
        bt_put(packet);
        bt_put(packet2);
        recursive_rmdir(trace_path);
+       g_free(trace_path);
 }
 
 static
@@ -2773,11 +2657,10 @@ void test_static_trace(void)
 
        trace = bt_ctf_trace_create();
        assert(trace);
-       ret = bt_ctf_trace_set_native_byte_order(trace,
-               BT_CTF_BYTE_ORDER_LITTLE_ENDIAN);
-       assert(ret == 0);
        stream_class = bt_ctf_stream_class_create(NULL);
        assert(stream_class);
+       ret = bt_ctf_stream_class_set_packet_context_type(stream_class, NULL);
+       assert(ret == 0);
        ret = bt_ctf_trace_add_stream_class(trace, stream_class);
        assert(ret == 0);
        stream = bt_ctf_stream_create(stream_class, "hello");
@@ -2789,7 +2672,7 @@ void test_static_trace(void)
                "bt_ctf_trace_set_is_static() succeeds");
        ok(bt_ctf_trace_is_static(trace),
                "bt_ctf_trace_is_static() returns the expected value");
-       clock_class = bt_ctf_clock_class_create("yes");
+       clock_class = bt_ctf_clock_class_create("yes", 1000000000);
        assert(clock_class);
        stream_class2 = bt_ctf_stream_class_create(NULL);
        assert(stream_class2);
@@ -2806,6 +2689,86 @@ void test_static_trace(void)
        bt_put(clock_class);
 }
 
+static
+void trace_is_static_listener(struct bt_ctf_trace *trace, void *data)
+{
+       *((int *) data) |= 1;
+}
+
+static
+void trace_listener_removed(struct bt_ctf_trace *trace, void *data)
+{
+       *((int *) data) |= 2;
+}
+
+static
+void test_trace_is_static_listener(void)
+{
+       struct bt_ctf_trace *trace;
+       int ret;
+       int called1 = 0;
+       int called2 = 0;
+       int called3 = 0;
+       int called4 = 0;
+       int listener1_id;
+       int listener2_id;
+       int listener3_id;
+       int listener4_id;
+
+       trace = bt_ctf_trace_create();
+       assert(trace);
+       ret = bt_ctf_trace_add_is_static_listener(NULL,
+               trace_is_static_listener, trace_listener_removed, &called1);
+       ok(ret < 0, "bt_ctf_trace_add_is_static_listener() handles NULL (trace)");
+       ret = bt_ctf_trace_add_is_static_listener(trace, NULL,
+               trace_listener_removed, &called1);
+       ok(ret < 0, "bt_ctf_trace_add_is_static_listener() handles NULL (listener)");
+       listener1_id = bt_ctf_trace_add_is_static_listener(trace,
+               trace_is_static_listener, trace_listener_removed, &called1);
+       ok(listener1_id >= 0, "bt_ctf_trace_add_is_static_listener() succeeds (1)");
+       listener2_id = bt_ctf_trace_add_is_static_listener(trace,
+               trace_is_static_listener, trace_listener_removed, &called2);
+       ok(listener2_id >= 0, "bt_ctf_trace_add_is_static_listener() succeeds (2)");
+       listener3_id = bt_ctf_trace_add_is_static_listener(trace,
+               trace_is_static_listener, trace_listener_removed, &called3);
+       ok(listener3_id >= 0, "bt_ctf_trace_add_is_static_listener() succeeds (3)");
+       ret = bt_ctf_trace_remove_is_static_listener(NULL, 0);
+       ok(ret < 0, "bt_ctf_trace_remove_is_static_listener() handles NULL (trace)");
+       ret = bt_ctf_trace_remove_is_static_listener(trace, -2);
+       ok(ret < 0, "bt_ctf_trace_remove_is_static_listener() handles invalid ID (negative)");
+       ret = bt_ctf_trace_remove_is_static_listener(trace, 77);
+       ok(ret < 0, "bt_ctf_trace_remove_is_static_listener() handles invalid ID (non existing)");
+       ret = bt_ctf_trace_remove_is_static_listener(trace, listener2_id);
+       ok(ret == 0, "bt_ctf_trace_remove_is_static_listener() succeeds");
+       ok(called2 == 2, "bt_ctf_trace_remove_is_static_listener() calls the remove listener");
+       listener4_id = bt_ctf_trace_add_is_static_listener(trace,
+               trace_is_static_listener, NULL, &called4);
+       ok(listener4_id >= 0, "bt_ctf_trace_add_is_static_listener() succeeds (4)");
+       ok(called1 == 0, "\"trace is static\" listener not called before the trace is made static (1)");
+       ok(called2 == 2, "\"trace is static\" listener not called before the trace is made static (2)");
+       ok(called3 == 0, "\"trace is static\" listener not called before the trace is made static (3)");
+       ok(called4 == 0, "\"trace is static\" listener not called before the trace is made static (4)");
+       ret = bt_ctf_trace_set_is_static(trace);
+       assert(ret == 0);
+       ret = bt_ctf_trace_add_is_static_listener(trace,
+               trace_is_static_listener, trace_listener_removed, &called1);
+       ok(ret < 0,
+               "bt_ctf_trace_add_is_static_listener() fails when the trace is static");
+       ok(called1 == 1, "\"trace is static\" listener called when the trace is made static (1)");
+       ok(called2 == 2, "\"trace is static\" listener not called when the trace is made static (2)");
+       ok(called3 == 1, "\"trace is static\" listener called when the trace is made static (3)");
+       ok(called4 == 1, "\"trace is static\" listener called when the trace is made static (4)");
+       called1 = 0;
+       called2 = 0;
+       called3 = 0;
+       called4 = 0;
+       bt_put(trace);
+       ok(called1 == 2, "\"trace is static\" listener not called after the trace is put (1)");
+       ok(called2 == 0, "\"trace is static\" listener not called after the trace is put (2)");
+       ok(called3 == 2, "\"trace is static\" listener not called after the trace is put (3)");
+       ok(called4 == 0, "\"trace is static\" listener not called after the trace is put (4)");
+}
+
 static
 void test_trace_uuid(void)
 {
@@ -2830,6 +2793,7 @@ void test_trace_uuid(void)
                "bt_ctf_trace_set_uuid() succeeds with a valid UUID");
        ret_uuid = bt_ctf_trace_get_uuid(trace);
        ok(ret_uuid, "bt_ctf_trace_get_uuid() returns a UUID");
+       assert(ret_uuid);
        ok(memcmp(uuid, ret_uuid, 16) == 0,
                "bt_ctf_trace_get_uuid() returns the expected UUID");
 
@@ -2838,14 +2802,15 @@ void test_trace_uuid(void)
 
 int main(int argc, char **argv)
 {
-       char trace_path[] = "/tmp/ctfwriter_XXXXXX";
-       char metadata_path[sizeof(trace_path) + 9];
+       const char *env_resize_length;
+       gchar *trace_path;
+       gchar *metadata_path;
        const char *clock_name = "test_clock";
        const char *clock_description = "This is a test clock";
        const char *returned_clock_name;
        const char *returned_clock_description;
        const uint64_t frequency = 1123456789;
-       const int64_t offset_s = 1351530929945824323;
+       const int64_t offset_s = 13515309;
        const int64_t offset = 1234567;
        int64_t get_offset_s,
                get_offset;
@@ -2853,8 +2818,8 @@ int main(int argc, char **argv)
        const int is_absolute = 0xFF;
        char *metadata_string;
        struct bt_ctf_writer *writer;
-       struct utsname name;
-       char hostname[BABELTRACE_HOST_NAME_MAX];
+       struct bt_utsname name = {"GNU/Linux", "testhost", "4.4.0-87-generic",
+               "#110-Ubuntu SMP Tue Jul 18 12:55:35 UTC 2017", "x86_64"};
        struct bt_ctf_clock *clock, *ret_clock;
        struct bt_ctf_clock_class *ret_clock_class;
        struct bt_ctf_stream_class *stream_class, *ret_stream_class;
@@ -2882,14 +2847,20 @@ int main(int argc, char **argv)
                return -1;
        }
 
+       env_resize_length = getenv("PACKET_RESIZE_TEST_LENGTH");
+       if (env_resize_length) {
+               packet_resize_test_length =
+                       (unsigned int) atoi(env_resize_length);
+       }
+
        plan_tests(NR_TESTS);
 
+       trace_path = g_build_filename(g_get_tmp_dir(), "ctfwriter_XXXXXX", NULL);
        if (!bt_mkdtemp(trace_path)) {
                perror("# perror");
        }
 
-       strcpy(metadata_path, trace_path);
-       strcat(metadata_path + sizeof(trace_path) - 1, "/metadata");
+       metadata_path = g_build_filename(trace_path, "metadata", NULL);
 
        writer = bt_ctf_writer_create(trace_path);
        ok(writer, "bt_ctf_create succeeds in creating trace with path");
@@ -2897,6 +2868,10 @@ int main(int argc, char **argv)
        ok(!bt_ctf_writer_get_trace(NULL),
                "bt_ctf_writer_get_trace correctly handles NULL");
        trace = bt_ctf_writer_get_trace(writer);
+       ok(bt_ctf_trace_set_native_byte_order(trace, BT_CTF_BYTE_ORDER_NATIVE),
+               "Cannot set a trace's byte order to BT_CTF_BYTE_ORDER_NATIVE");
+       ok(bt_ctf_trace_set_native_byte_order(trace, BT_CTF_BYTE_ORDER_UNSPECIFIED),
+               "Cannot set a trace's byte order to BT_CTF_BYTE_ORDER_UNSPECIFIED");
        ok(trace,
                "bt_ctf_writer_get_trace returns a bt_ctf_trace object");
        ok(bt_ctf_trace_set_native_byte_order(trace, BT_CTF_BYTE_ORDER_BIG_ENDIAN) == 0,
@@ -2905,13 +2880,9 @@ int main(int argc, char **argv)
                "bt_ctf_trace_get_native_byte_order returns a correct endianness");
 
        /* Add environment context to the trace */
-       ret = gethostname(hostname, sizeof(hostname));
-       if (ret < 0) {
-               return ret;
-       }
-       ok(bt_ctf_writer_add_environment_field(writer, "host", hostname) == 0,
+       ok(bt_ctf_writer_add_environment_field(writer, "host", name.nodename) == 0,
                "Add host (%s) environment field to writer instance",
-               hostname);
+               name.nodename);
        ok(bt_ctf_writer_add_environment_field(NULL, "test_field",
                "test_value"),
                "bt_ctf_writer_add_environment_field error with NULL writer");
@@ -2974,8 +2945,6 @@ int main(int argc, char **argv)
        /* Test bt_ctf_trace_get_environment_field_name */
        ok(bt_ctf_trace_get_environment_field_name_by_index(NULL, 0) == NULL,
                "bt_ctf_trace_get_environment_field_name handles a NULL trace correctly");
-       ok(bt_ctf_trace_get_environment_field_name_by_index(trace, -1) == NULL,
-               "bt_ctf_trace_get_environment_field_name handles an invalid index correctly (negative)");
        ok(bt_ctf_trace_get_environment_field_name_by_index(trace, 5) == NULL,
                "bt_ctf_trace_get_environment_field_name handles an invalid index correctly (too large)");
        ret_string = bt_ctf_trace_get_environment_field_name_by_index(trace, 0);
@@ -2997,8 +2966,6 @@ int main(int argc, char **argv)
        /* Test bt_ctf_trace_get_environment_field_value */
        ok(bt_ctf_trace_get_environment_field_value_by_index(NULL, 0) == NULL,
                "bt_ctf_trace_get_environment_field_value handles a NULL trace correctly");
-       ok(bt_ctf_trace_get_environment_field_value_by_index(trace, -1) == NULL,
-               "bt_ctf_trace_get_environment_field_value handles an invalid index correctly (negative)");
        ok(bt_ctf_trace_get_environment_field_value_by_index(trace, 5) == NULL,
                "bt_ctf_trace_get_environment_field_value handles an invalid index correctly (too large)");
        obj = bt_ctf_trace_get_environment_field_value_by_index(trace, 1);
@@ -3039,12 +3006,6 @@ int main(int argc, char **argv)
                "bt_ctf_trace_get_environment_field_value successfully replaces an existing field");
        BT_PUT(obj);
 
-       /* On Solaris, uname() can return any positive value on success */
-       if (uname(&name) < 0) {
-               perror("uname");
-               return -1;
-       }
-
        ok(bt_ctf_writer_add_environment_field(writer, "sysname", name.sysname)
                == 0, "Add sysname (%s) environment field to writer instance",
                name.sysname);
@@ -3356,8 +3317,6 @@ int main(int argc, char **argv)
                "bt_ctf_trace_get_clock_class_count returns the correct number of clocks");
        ok(!bt_ctf_trace_get_clock_class_by_index(NULL, 0),
                "bt_ctf_trace_get_clock_class correctly handles NULL");
-       ok(!bt_ctf_trace_get_clock_class_by_index(trace, -1),
-               "bt_ctf_trace_get_clock_class correctly handles negative indexes");
        ok(!bt_ctf_trace_get_clock_class_by_index(trace, 1),
                "bt_ctf_trace_get_clock_class correctly handles out of bound accesses");
        ret_clock_class = bt_ctf_trace_get_clock_class_by_index(trace, 0);
@@ -3488,6 +3447,8 @@ int main(int argc, char **argv)
 
        test_static_trace();
 
+       test_trace_is_static_listener();
+
        test_trace_uuid();
 
        metadata_string = bt_ctf_writer_get_metadata_string(writer);
@@ -3514,6 +3475,9 @@ int main(int argc, char **argv)
 
        validate_trace(argv[1], trace_path);
 
-       //recursive_rmdir(trace_path);
+       recursive_rmdir(trace_path);
+       g_free(trace_path);
+       g_free(metadata_path);
+
        return 0;
 }
This page took 0.031898 seconds and 4 git commands to generate.