/*
- * test-ctf-writer.c
+ * test_ctf_writer.c
*
* CTF Writer test
*
- * Copyright 2013 - 2015 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ * Copyright 2013 - 2017 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include <babeltrace/ctf-writer/stream-class.h>
#include <babeltrace/ctf-ir/packet.h>
#include <babeltrace/ctf-ir/clock-class.h>
+#include <babeltrace/ctf-ir/trace.h>
#include <babeltrace/ref.h>
#include <babeltrace/ctf/events.h>
#include <babeltrace/values.h>
#include <unistd.h>
-#include <babeltrace/compat/stdlib.h>
+#include <babeltrace/compat/stdlib-internal.h>
#include <stdio.h>
-#include <sys/utsname.h>
-#include <babeltrace/compat/limits.h>
-#include <babeltrace/compat/stdio.h>
+#include <babeltrace/compat/utsname-internal.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.h>
#include "tap/tap.h"
#include <math.h>
#include <float.h>
#define DEFAULT_CLOCK_TIME 0
#define DEFAULT_CLOCK_VALUE 0
-#define NR_TESTS 602
+#define NR_TESTS 621
static int64_t current_time = 42;
return ret;
}
-static
-void validate_metadata(char *parser_path, char *metadata_path)
-{
- int ret = 0;
- char parser_output_path[] = "/tmp/parser_output_XXXXXX";
- int parser_output_fd = -1, metadata_fd = -1;
-
- if (!metadata_path) {
- ret = -1;
- goto result;
- }
-
- parser_output_fd = mkstemp(parser_output_path);
- metadata_fd = open(metadata_path, O_RDONLY);
-
- unlink(parser_output_path);
-
- if (parser_output_fd == -1 || metadata_fd == -1) {
- diag("Failed create temporary files for metadata parsing.");
- ret = -1;
- goto result;
- }
-
- pid_t pid = fork();
- if (pid) {
- int status = 0;
- waitpid(pid, &status, 0);
- ret = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
- } else {
- /* ctf-parser-test expects a metadata string on stdin. */
- ret = dup2(metadata_fd, STDIN_FILENO);
- if (ret < 0) {
- perror("# dup2 metadata_fd to STDIN");
- goto result;
- }
-
- ret = dup2(parser_output_fd, STDOUT_FILENO);
- if (ret < 0) {
- perror("# dup2 parser_output_fd to STDOUT");
- goto result;
- }
-
- ret = dup2(parser_output_fd, STDERR_FILENO);
- if (ret < 0) {
- perror("# dup2 parser_output_fd to STDERR");
- goto result;
- }
-
- execl(parser_path, "ctf-parser-test", NULL);
- perror("# Could not launch the ctf metadata parser process");
- exit(-1);
- }
-result:
- ok(ret == 0, "Metadata string is valid");
-
- if (ret && metadata_fd >= 0 && parser_output_fd >= 0) {
- char *line;
- size_t len = METADATA_LINE_SIZE;
- FILE *metadata_fp = NULL, *parser_output_fp = NULL;
-
- metadata_fp = fdopen(metadata_fd, "r");
- if (!metadata_fp) {
- perror("fdopen on metadata_fd");
- goto close_fp;
- }
- metadata_fd = -1;
-
- parser_output_fp = fdopen(parser_output_fd, "r");
- if (!parser_output_fp) {
- perror("fdopen on parser_output_fd");
- goto close_fp;
- }
- parser_output_fd = -1;
-
- line = malloc(len);
- if (!line) {
- diag("malloc failure");
- }
-
- rewind(metadata_fp);
-
- /* Output the metadata and parser output as diagnostic */
- while (bt_getline(&line, &len, metadata_fp) > 0) {
- fprintf(stderr, "# %s", line);
- }
-
- rewind(parser_output_fp);
- while (bt_getline(&line, &len, parser_output_fp) > 0) {
- fprintf(stderr, "# %s", line);
- }
-
- free(line);
-close_fp:
- if (metadata_fp) {
- if (fclose(metadata_fp)) {
- diag("fclose failure");
- }
- }
- if (parser_output_fp) {
- if (fclose(parser_output_fp)) {
- diag("fclose failure");
- }
- }
- }
-
- if (parser_output_fd >= 0) {
- if (close(parser_output_fd)) {
- diag("close error");
- }
- }
- if (metadata_fd >= 0) {
- if (close(metadata_fd)) {
- diag("close error");
- }
- }
-}
-
static
void validate_trace(char *parser_path, char *trace_path)
{
goto result;
}
- execl(parser_path, "babeltrace", trace_path, NULL);
+ execl(parser_path, parser_path, trace_path, NULL);
perror("# Could not launch the babeltrace process");
exit(-1);
}
"Add event specific context field");
ok(bt_ctf_event_class_get_context_type(NULL) == NULL,
"bt_ctf_event_class_get_context_type handles NULL correctly");
- ok(bt_ctf_event_class_get_context_type(simple_event_class) == NULL,
- "bt_ctf_event_class_get_context_type returns NULL when no event context type is set");
ok(bt_ctf_event_class_set_context_type(NULL, event_context_type) < 0,
"bt_ctf_event_class_set_context_type handles a NULL event class correctly");
"bt_ctf_stream_class_get_event_class_count handles NULL correctly");
ok(bt_ctf_stream_class_get_event_class_count(stream_class) == 1,
"bt_ctf_stream_class_get_event_class_count returns a correct number of event classes");
- ok(bt_ctf_stream_class_get_event_class(NULL, 0) == NULL,
+ ok(bt_ctf_stream_class_get_event_class_by_index(NULL, 0) == NULL,
"bt_ctf_stream_class_get_event_class handles NULL correctly");
- ok(bt_ctf_stream_class_get_event_class(stream_class, 8724) == NULL,
+ ok(bt_ctf_stream_class_get_event_class_by_index(stream_class, 8724) == NULL,
"bt_ctf_stream_class_get_event_class handles invalid indexes correctly");
- ret_event_class = bt_ctf_stream_class_get_event_class(stream_class, 0);
+ ret_event_class = bt_ctf_stream_class_get_event_class_by_index(stream_class, 0);
ok(ret_event_class == simple_event_class,
"bt_ctf_stream_class_get_event_class returns the correct event class");
bt_put(ret_event_class);
"bt_ctf_stream_class_get_event_class_by_id returns a correct event class");
bt_put(ret_event_class);
- ok(bt_ctf_stream_class_get_event_class_by_name(NULL, "some event name") == NULL,
- "bt_ctf_stream_class_get_event_class_by_name handles a NULL stream class correctly");
- ok(bt_ctf_stream_class_get_event_class_by_name(stream_class, NULL) == NULL,
- "bt_ctf_stream_class_get_event_class_by_name handles a NULL event class name correctly");
- ok(bt_ctf_stream_class_get_event_class_by_name(stream_class, "some event name") == NULL,
- "bt_ctf_stream_class_get_event_class_by_name handles non-existing event class names correctly");
- ret_event_class = bt_ctf_stream_class_get_event_class_by_name(stream_class, "Simple Event");
- ok(ret_event_class == simple_event_class,
- "bt_ctf_stream_class_get_event_class_by_name returns a correct event class");
- bt_put(ret_event_class);
-
simple_event = bt_ctf_event_create(simple_event_class);
ok(simple_event,
"Instantiate an event containing a single integer field");
"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_get_name(iter, &ret_char);
- ok(!ret && ret_char, "bt_ctf_field_type_enumeration_mapping_iterator_get_name return a mapping name");
+ 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);
assert(!ret);
iter = bt_ctf_field_enumeration_get_mappings(enum_field_unsigned);
assert(iter);
- (void) bt_ctf_field_type_enumeration_mapping_iterator_get_name(iter, &ret_char);
+ (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_enumeration_get_single_mapping_name returns the correct mapping name with an unsigned container");
+ "bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned returns the correct mapping name with an unsigned container");
ok(bt_ctf_clock_set_time(clock, current_time) == 0, "Set clock time");
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 ";
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");
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, ""),
"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(NULL, 0),
- "bt_ctf_event_class_get_attribute_name handles a NULL event class correctly");
- ok(!bt_ctf_event_class_get_attribute_name(event_class, 4),
- "bt_ctf_event_class_get_attribute_name handles a too large index correctly");
- ok(!bt_ctf_event_class_get_attribute_value(NULL, 0),
- "bt_ctf_event_class_get_attribute_value handles a NULL event class correctly");
- ok(!bt_ctf_event_class_get_attribute_value(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(event_class,
- i);
- obj = bt_ctf_event_class_get_attribute_value(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),
"bt_ctf_event_class_get_stream_class returns the correct stream class");
bt_put(ret_stream_class);
- ok(bt_ctf_event_class_get_field_count(NULL) < 0,
+ ok(bt_ctf_event_class_get_payload_type_field_count(NULL) < 0,
"bt_ctf_event_class_get_field_count handles NULL correctly");
- ok(bt_ctf_event_class_get_field_count(event_class) == 3,
+ ok(bt_ctf_event_class_get_payload_type_field_count(event_class) == 3,
"bt_ctf_event_class_get_field_count returns a correct value");
- ok(bt_ctf_event_class_get_field(NULL, &ret_string,
+ ok(bt_ctf_event_class_get_payload_type_field_by_index(NULL, &ret_string,
&ret_field_type, 0) < 0,
"bt_ctf_event_class_get_field handles a NULL event class correctly");
- ok(bt_ctf_event_class_get_field(event_class, NULL,
+ ok(bt_ctf_event_class_get_payload_type_field_by_index(event_class, NULL,
&ret_field_type, 0) == 0,
"bt_ctf_event_class_get_field handles a NULL field name correctly");
bt_put(ret_field_type);
- ok(bt_ctf_event_class_get_field(event_class, &ret_string,
+ ok(bt_ctf_event_class_get_payload_type_field_by_index(event_class, &ret_string,
NULL, 0) == 0,
"bt_ctf_event_class_get_field handles a NULL field type correctly");
- ok(bt_ctf_event_class_get_field(event_class, &ret_string,
+ ok(bt_ctf_event_class_get_payload_type_field_by_index(event_class, &ret_string,
&ret_field_type, 42) < 0,
"bt_ctf_event_class_get_field handles an invalid index correctly");
- ok(bt_ctf_event_class_get_field(event_class, &ret_string,
+ ok(bt_ctf_event_class_get_payload_type_field_by_index(event_class, &ret_string,
&ret_field_type, 0) == 0,
"bt_ctf_event_class_get_field returns a field");
ok(bt_ctf_field_type_compare(ret_field_type, uint_35_type) == 0,
/* validate e copy */
e_iter = bt_ctf_field_enumeration_get_mappings(e_copy);
- (void) bt_ctf_field_type_enumeration_mapping_iterator_get_name(e_iter,
- &str_val);
+ (void) bt_ctf_field_type_enumeration_mapping_iterator_get_signed(e_iter,
+ &str_val, NULL, NULL);
ok(str_val && !strcmp(str_val, "LABEL2"),
"bt_ctf_field_copy creates a valid enum field copy");
"bt_ctf_field_type_get_byte_order handles NULL correctly");
ok(bt_ctf_field_type_get_type_id(NULL) ==
- BT_CTF_TYPE_ID_UNKNOWN,
+ BT_CTF_FIELD_TYPE_ID_UNKNOWN,
"bt_ctf_field_type_get_type_id handles NULL correctly");
ok(bt_ctf_field_type_get_type_id(uint_12_type) ==
- BT_CTF_TYPE_ID_INTEGER,
+ BT_CTF_FIELD_TYPE_ID_INTEGER,
"bt_ctf_field_type_get_type_id returns a correct value with an integer type");
ok(bt_ctf_field_type_integer_get_base(NULL) ==
bt_ctf_field_type_sequence_create(int_16_type, "seq_len");
ok(sequence_type, "Create a sequence of int16_t type");
ok(bt_ctf_field_type_get_type_id(sequence_type) ==
- BT_CTF_TYPE_ID_SEQUENCE,
+ BT_CTF_FIELD_TYPE_ID_SEQUENCE,
"bt_ctf_field_type_get_type_id returns a correct value with a sequence type");
ok(bt_ctf_field_type_sequence_get_length_field_name(NULL) == NULL,
structure_seq_type = bt_ctf_field_type_structure_create();
ok(bt_ctf_field_type_get_type_id(structure_seq_type) ==
- BT_CTF_TYPE_ID_STRUCT,
+ BT_CTF_FIELD_TYPE_ID_STRUCT,
"bt_ctf_field_type_get_type_id returns a correct value with a structure type");
ok(structure_seq_type, "Create a structure type");
ok(bt_ctf_field_type_structure_add_field(structure_seq_type,
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,
event_class = bt_ctf_event_class_create("Simple Event");
assert(event_class);
- ok(bt_ctf_stream_class_add_event_class(stream_class, event_class),
- "two event classes with the same name cannot cohabit within the same stream class");
+ ok(bt_ctf_stream_class_add_event_class(stream_class, event_class) == 0,
+ "two event classes with the same name may cohabit within the same stream class");
bt_put(event_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);
/* 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);
ok(writer_trace, "bt_ctf_writer_get_trace() returns a trace");
writer_sc = bt_ctf_stream_class_create("writer_sc");
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();
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);
bt_put(sc);
}
+static
+void test_static_trace(void)
+{
+ struct bt_ctf_trace *trace;
+ struct bt_ctf_stream_class *stream_class;
+ struct bt_ctf_stream_class *stream_class2;
+ struct bt_ctf_stream *stream;
+ struct bt_ctf_clock_class *clock_class;
+ int ret;
+
+ trace = bt_ctf_trace_create();
+ assert(trace);
+ 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");
+ ok(stream, "bt_ctf_stream_create() succeeds with a non-static trace");
+ bt_put(stream);
+ ok(!bt_ctf_trace_is_static(trace),
+ "bt_ctf_trace_is_static() returns the expected value");
+ ok(bt_ctf_trace_set_is_static(trace) == 0,
+ "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", 1000000000);
+ assert(clock_class);
+ stream_class2 = bt_ctf_stream_class_create(NULL);
+ assert(stream_class2);
+ ok(bt_ctf_trace_add_stream_class(trace, stream_class2),
+ "bt_ctf_trace_add_stream_class() fails with a static trace");
+ ok(bt_ctf_trace_add_clock_class(trace, clock_class),
+ "bt_ctf_trace_add_clock_class() fails with a static trace");
+ ok(!bt_ctf_stream_create(stream_class, "hello2"),
+ "bt_ctf_stream_create() fails with a static trace");
+
+ bt_put(trace);
+ bt_put(stream_class);
+ bt_put(stream_class2);
+ bt_put(clock_class);
+}
+
+static
+void trace_is_static_listener(struct bt_ctf_trace *trace, void *data)
+{
+ *((int *) data) = 1;
+}
+
+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, &called1);
+ ok(ret < 0, "bt_ctf_trace_add_is_static_listener() handles NULL (trace)");
+ ret = bt_ctf_trace_add_is_static_listener(trace, NULL, &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, &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, &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, &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");
+ listener4_id = bt_ctf_trace_add_is_static_listener(trace,
+ trace_is_static_listener, &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 == 0, "\"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, &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 == 0, "\"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 == 0, "\"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 == 0, "\"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)
+{
+ struct bt_ctf_trace *trace;
+ const unsigned char uuid[] = {
+ 0x35, 0x92, 0x63, 0xab, 0xb4, 0xbe, 0x40, 0xb4,
+ 0xb2, 0x60, 0xd3, 0xf1, 0x3b, 0xb0, 0xd8, 0x59,
+ };
+ const unsigned char *ret_uuid;
+
+ trace = bt_ctf_trace_create();
+ assert(trace);
+ ok(!bt_ctf_trace_get_uuid(NULL),
+ "bt_ctf_trace_get_uuid() handles NULL");
+ ok(!bt_ctf_trace_get_uuid(trace),
+ "bt_ctf_trace_get_uuid() returns NULL initially");
+ ok(bt_ctf_trace_set_uuid(NULL, uuid),
+ "bt_ctf_trace_set_uuid() handles NULL (trace)");
+ ok(bt_ctf_trace_set_uuid(trace, NULL),
+ "bt_ctf_trace_set_uuid() handles NULL (UUID)");
+ ok(bt_ctf_trace_set_uuid(trace, uuid) == 0,
+ "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");
+
+ bt_put(trace);
+}
+
int main(int argc, char **argv)
{
char trace_path[] = "/tmp/ctfwriter_XXXXXX";
struct bt_ctf_clock_class *ret_clock_class;
struct bt_ctf_stream_class *stream_class, *ret_stream_class;
struct bt_ctf_stream *stream1;
+ struct bt_ctf_stream *stream;
const char *ret_string;
const unsigned char *ret_uuid;
unsigned char tmp_uuid[16] = { 0 };
int64_t ret_int64_t;
struct bt_value *obj;
- if (argc < 3) {
- printf("Usage: tests-ctf-writer path_to_ctf_parser_test path_to_babeltrace\n");
+ if (argc < 2) {
+ printf("Usage: tests-ctf-writer path_to_babeltrace\n");
return -1;
}
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_byte_order(trace, BT_CTF_BYTE_ORDER_BIG_ENDIAN) == 0,
+ ok(bt_ctf_trace_set_native_byte_order(trace, BT_CTF_BYTE_ORDER_BIG_ENDIAN) == 0,
"Set a trace's byte order to big endian");
- ok(bt_ctf_trace_get_byte_order(trace) == BT_CTF_BYTE_ORDER_BIG_ENDIAN,
- "bt_ctf_trace_get_byte_order returns a correct endianness");
+ ok(bt_ctf_trace_get_native_byte_order(trace) == BT_CTF_BYTE_ORDER_BIG_ENDIAN,
+ "bt_ctf_trace_get_native_byte_order returns a correct endianness");
/* Add environment context to the trace */
ret = gethostname(hostname, sizeof(hostname));
"bt_ctf_trace_get_environment_field_count returns a correct number of environment fields");
/* Test bt_ctf_trace_get_environment_field_name */
- ok(bt_ctf_trace_get_environment_field_name(NULL, 0) == NULL,
+ 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(trace, -1) == NULL,
- "bt_ctf_trace_get_environment_field_name handles an invalid index correctly (negative)");
- ok(bt_ctf_trace_get_environment_field_name(trace, 5) == NULL,
+ 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(trace, 0);
+ ret_string = bt_ctf_trace_get_environment_field_name_by_index(trace, 0);
ok(ret_string && !strcmp(ret_string, "host"),
"bt_ctf_trace_get_environment_field_name returns a correct field name");
- ret_string = bt_ctf_trace_get_environment_field_name(trace, 1);
+ ret_string = bt_ctf_trace_get_environment_field_name_by_index(trace, 1);
ok(ret_string && !strcmp(ret_string, "test_env_int_obj"),
"bt_ctf_trace_get_environment_field_name returns a correct field name");
- ret_string = bt_ctf_trace_get_environment_field_name(trace, 2);
+ ret_string = bt_ctf_trace_get_environment_field_name_by_index(trace, 2);
ok(ret_string && !strcmp(ret_string, "test_env_str_obj"),
"bt_ctf_trace_get_environment_field_name returns a correct field name");
- ret_string = bt_ctf_trace_get_environment_field_name(trace, 3);
+ ret_string = bt_ctf_trace_get_environment_field_name_by_index(trace, 3);
ok(ret_string && !strcmp(ret_string, "test_env_int"),
"bt_ctf_trace_get_environment_field_name returns a correct field name");
- ret_string = bt_ctf_trace_get_environment_field_name(trace, 4);
+ ret_string = bt_ctf_trace_get_environment_field_name_by_index(trace, 4);
ok(ret_string && !strcmp(ret_string, "test_env_str"),
"bt_ctf_trace_get_environment_field_name returns a correct field name");
/* Test bt_ctf_trace_get_environment_field_value */
- ok(bt_ctf_trace_get_environment_field_value(NULL, 0) == NULL,
+ 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(trace, -1) == NULL,
- "bt_ctf_trace_get_environment_field_value handles an invalid index correctly (negative)");
- ok(bt_ctf_trace_get_environment_field_value(trace, 5) == NULL,
+ 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(trace, 1);
+ obj = bt_ctf_trace_get_environment_field_value_by_index(trace, 1);
ret = bt_value_integer_get(obj, &ret_int64_t);
ok(!ret && ret_int64_t == 23,
"bt_ctf_trace_get_environment_field_value succeeds in getting an integer value");
BT_PUT(obj);
- obj = bt_ctf_trace_get_environment_field_value(trace, 2);
+ obj = bt_ctf_trace_get_environment_field_value_by_index(trace, 2);
ret = bt_value_string_get(obj, &ret_string);
ok(!ret && ret_string && !strcmp(ret_string, "the value"),
"bt_ctf_trace_get_environment_field_value succeeds in getting a string value");
"bt_ctf_trace_set_environment_field_integer succeeds with an existing name");
ok(bt_ctf_trace_get_environment_field_count(trace) == 5,
"bt_ctf_trace_set_environment_field_integer with an existing key does not increase the environment size");
- obj = bt_ctf_trace_get_environment_field_value(trace, 3);
+ obj = bt_ctf_trace_get_environment_field_value_by_index(trace, 3);
ret = bt_value_integer_get(obj, &ret_int64_t);
ok(!ret && ret_int64_t == 654321,
"bt_ctf_trace_get_environment_field_value successfully replaces an existing field");
stream_class);
ok(ret_field_type,
"bt_ctf_stream_class_get_event_header_type returns an event header type");
- ok(bt_ctf_field_type_get_type_id(ret_field_type) == BT_CTF_TYPE_ID_STRUCT,
+ ok(bt_ctf_field_type_get_type_id(ret_field_type) == BT_CTF_FIELD_TYPE_ID_STRUCT,
"Default event header type is a structure");
event_header_field_type =
bt_ctf_field_type_structure_get_field_type_by_name(
ok(event_header_field_type,
"Default event header type contains an \"id\" field");
ok(bt_ctf_field_type_get_type_id(
- event_header_field_type) == BT_CTF_TYPE_ID_INTEGER,
+ event_header_field_type) == BT_CTF_FIELD_TYPE_ID_INTEGER,
"Default event header \"id\" field is an integer");
bt_put(event_header_field_type);
event_header_field_type =
ok(event_header_field_type,
"Default event header type contains a \"timestamp\" field");
ok(bt_ctf_field_type_get_type_id(
- event_header_field_type) == BT_CTF_TYPE_ID_INTEGER,
+ event_header_field_type) == BT_CTF_FIELD_TYPE_ID_INTEGER,
"Default event header \"timestamp\" field is an integer");
bt_put(event_header_field_type);
bt_put(ret_field_type);
packet_header_type = bt_ctf_trace_get_packet_header_type(trace);
ok(packet_header_type,
"bt_ctf_trace_get_packet_header_type returns a packet header");
- ok(bt_ctf_field_type_get_type_id(packet_header_type) == BT_CTF_TYPE_ID_STRUCT,
+ ok(bt_ctf_field_type_get_type_id(packet_header_type) == BT_CTF_FIELD_TYPE_ID_STRUCT,
"bt_ctf_trace_get_packet_header_type returns a packet header of type struct");
ret_field_type = bt_ctf_field_type_structure_get_field_type_by_name(
packet_header_type, "magic");
packet_context_type = bt_ctf_stream_class_get_packet_context_type(stream_class);
ok(packet_context_type,
"bt_ctf_stream_class_get_packet_context_type returns a packet context type.");
- ok(bt_ctf_field_type_get_type_id(packet_context_type) == BT_CTF_TYPE_ID_STRUCT,
+ ok(bt_ctf_field_type_get_type_id(packet_context_type) == BT_CTF_FIELD_TYPE_ID_STRUCT,
"Packet context is a structure");
ok(bt_ctf_stream_class_set_packet_context_type(NULL, packet_context_type),
/* Define a stream event context containing a my_integer field. */
ok(bt_ctf_stream_class_get_event_context_type(NULL) == NULL,
"bt_ctf_stream_class_get_event_context_type handles NULL correctly");
- ok(bt_ctf_stream_class_get_event_context_type(
- stream_class) == NULL,
- "bt_ctf_stream_class_get_event_context_type returns NULL when no stream event context type was set.");
stream_event_context_type = bt_ctf_field_type_structure_create();
bt_ctf_field_type_structure_add_field(stream_event_context_type,
integer_type, "common_event_context");
/* Instantiate a stream and append events */
ret = bt_ctf_writer_add_clock(writer, clock);
assert(ret == 0);
+ ok(bt_ctf_trace_get_stream_count(trace) == 0,
+ "bt_ctf_trace_get_stream_count() succeeds and returns the correct value (0)");
stream1 = bt_ctf_writer_create_stream(writer, stream_class);
ok(stream1, "Instanciate a stream class from writer");
+ ok(bt_ctf_trace_get_stream_count(trace) == 1,
+ "bt_ctf_trace_get_stream_count() succeeds and returns the correct value (1)");
+ stream = bt_ctf_trace_get_stream_by_index(trace, 0);
+ ok(stream == stream1,
+ "bt_ctf_trace_get_stream_by_index() succeeds and returns the correct value");
+ BT_PUT(stream);
/*
* Creating a stream through a writer adds the given stream
"bt_ctf_trace_get_clock_class_count correctly handles NULL");
ok(bt_ctf_trace_get_clock_class_count(trace) == 1,
"bt_ctf_trace_get_clock_class_count returns the correct number of clocks");
- ok(!bt_ctf_trace_get_clock_class(NULL, 0),
+ 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(trace, -1),
- "bt_ctf_trace_get_clock_class correctly handles negative indexes");
- ok(!bt_ctf_trace_get_clock_class(trace, 1),
+ 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(trace, 0);
+ ret_clock_class = bt_ctf_trace_get_clock_class_by_index(trace, 0);
ok(strcmp(bt_ctf_clock_class_get_name(ret_clock_class),
bt_ctf_clock_get_name(clock)) == 0,
"bt_ctf_trace_get_clock_class returns the right clock instance");
test_custom_event_header_stream(writer, clock);
+ test_static_trace();
+
+ test_trace_is_static_listener();
+
+ test_trace_uuid();
+
metadata_string = bt_ctf_writer_get_metadata_string(writer);
ok(metadata_string, "Get metadata string");
bt_ctf_writer_flush_metadata(writer);
- validate_metadata(argv[1], metadata_path);
- validate_trace(argv[2], trace_path);
bt_put(clock);
bt_put(ret_stream_class);
free(metadata_string);
bt_put(stream_class);
- recursive_rmdir(trace_path);
+ validate_trace(argv[1], trace_path);
+
+ //recursive_rmdir(trace_path);
return 0;
}