X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=tests%2Flib%2Ftest_ctf_writer.c;h=9d92aa61c1d9b70db1d8b1c3a328a0b616e11af3;hb=a046cf3cdf5682791b87221bfc7c13c80e96df00;hp=22a7c3e6b44e18630d57199bd46e90b5dc646648;hpb=d74f316bb0394cc2b19c6779809ee7570089ffe0;p=babeltrace.git diff --git a/tests/lib/test_ctf_writer.c b/tests/lib/test_ctf_writer.c index 22a7c3e6..9d92aa61 100644 --- a/tests/lib/test_ctf_writer.c +++ b/tests/lib/test_ctf_writer.c @@ -25,7 +25,8 @@ #include #include #include -#include +#include +#include #include #include #include @@ -43,7 +44,7 @@ #include "tap/tap.h" #include #include -#include +#include "common.h" #define METADATA_LINE_SIZE 512 #define SEQUENCE_TEST_LENGTH 10 @@ -58,11 +59,12 @@ #define DEFAULT_CLOCK_TIME 0 #define DEFAULT_CLOCK_VALUE 0 -#define NR_TESTS 584 +#define NR_TESTS 606 static int64_t current_time = 42; /* Return 1 if uuids match, zero if different. */ +static int uuid_match(const unsigned char *uuid_a, const unsigned char *uuid_b) { int ret = 0; @@ -83,6 +85,7 @@ end: return ret; } +static void validate_metadata(char *parser_path, char *metadata_path) { int ret = 0; @@ -199,6 +202,7 @@ close_fp: } } +static void validate_trace(char *parser_path, char *trace_path) { int ret = 0; @@ -281,6 +285,7 @@ close_fp: } } +static void append_simple_event(struct bt_ctf_stream_class *stream_class, struct bt_ctf_stream *stream, struct bt_ctf_clock *clock) { @@ -488,7 +493,8 @@ void append_simple_event(struct bt_ctf_stream_class *stream_class, "bt_ctf_event_class_get_context_type returns the appropriate type"); bt_put(returned_type); - bt_ctf_stream_class_add_event_class(stream_class, simple_event_class); + ok(!bt_ctf_stream_class_add_event_class(stream_class, simple_event_class), + "Adding simple event class to stream class"); /* * bt_ctf_stream_class_add_event_class() copies the field types @@ -697,6 +703,7 @@ void append_simple_event(struct bt_ctf_stream_class *stream_class, bt_put(ep_enum_field_unsigned_type); } +static void append_complex_event(struct bt_ctf_stream_class *stream_class, struct bt_ctf_stream *stream, struct bt_ctf_clock *clock) { @@ -1277,8 +1284,9 @@ void append_complex_event(struct bt_ctf_stream_class *stream_class, bt_put(event); } -static void field_copy_tests_validate_same_type(struct bt_ctf_field *field, - struct bt_ctf_field_type *expected_type, const char *name) +static +void field_copy_tests_validate_same_type(struct bt_ctf_field *field, + struct bt_ctf_field_type *expected_type, const char *name) { struct bt_ctf_field_type *copy_type; @@ -1288,13 +1296,15 @@ static void field_copy_tests_validate_same_type(struct bt_ctf_field *field, bt_put(copy_type); } -static void field_copy_tests_validate_diff_ptrs(struct bt_ctf_field *field_a, - struct bt_ctf_field *field_b, const char *name) +static +void field_copy_tests_validate_diff_ptrs(struct bt_ctf_field *field_a, + struct bt_ctf_field *field_b, const char *name) { ok(field_a != field_b, "bt_ctf_field_copy creates different pointers (%s)", name); } +static void field_copy_tests() { struct bt_ctf_field_type *len_type = NULL; @@ -1804,6 +1814,7 @@ void field_copy_tests() bt_put(strct_copy); } +static void type_field_tests() { struct bt_ctf_field *uint_12; @@ -2086,6 +2097,7 @@ void type_field_tests() bt_put(returned_type); } +static void packet_resize_test(struct bt_ctf_stream_class *stream_class, struct bt_ctf_stream *stream, struct bt_ctf_clock *clock) { @@ -2227,6 +2239,7 @@ end: bt_put(ep_type); } +static void test_empty_stream(struct bt_ctf_writer *writer) { int ret = 0; @@ -2272,6 +2285,7 @@ end: bt_put(stream_class); } +static void test_custom_event_header_stream(struct bt_ctf_writer *writer) { int i, ret; @@ -2477,6 +2491,7 @@ end: bt_put(event_header_type); } +static void test_instanciate_event_before_stream(struct bt_ctf_writer *writer) { int ret = 0; @@ -2593,6 +2608,7 @@ end: bt_put(clock); } +static void append_existing_event_class(struct bt_ctf_stream_class *stream_class) { struct bt_ctf_event_class *event_class; @@ -2611,6 +2627,293 @@ void append_existing_event_class(struct bt_ctf_stream_class *stream_class) bt_put(event_class); } +static +void test_trace_stream_class_clock(void) +{ + struct bt_ctf_trace *trace = NULL; + struct bt_ctf_stream_class *sc1 = NULL; + struct bt_ctf_stream_class *sc2 = NULL; + struct bt_ctf_clock *sc1_clock = NULL; + struct bt_ctf_clock *sc2_clock = NULL; + const char *clock_name = "hello"; + + trace = bt_ctf_trace_create(); + assert(trace); + sc1 = bt_ctf_stream_class_create(NULL); + assert(sc1); + sc2 = bt_ctf_stream_class_create(NULL); + assert(sc2); + sc1_clock = bt_ctf_clock_create(clock_name); + assert(sc1_clock); + sc2_clock = bt_ctf_clock_create(clock_name); + assert(sc2_clock); + + ok(!bt_ctf_stream_class_set_clock(sc1, sc1_clock), + "bt_ctf_stream_class_set_clock() succeeds for sc1"); + ok(!bt_ctf_stream_class_set_clock(sc2, sc2_clock), + "bt_ctf_stream_class_set_clock() succeeds for sc2"); + ok(!bt_ctf_trace_add_stream_class(trace, sc1), + "bt_ctf_trace_add_stream_class() succeeds with sc1"); + ok(bt_ctf_trace_add_stream_class(trace, sc2), + "bt_ctf_trace_add_stream_class() fails with sc2 (different clock, same name)"); + + BT_PUT(trace); + BT_PUT(sc1); + BT_PUT(sc2); + BT_PUT(sc1_clock); + BT_PUT(sc2_clock); +} + +static +struct bt_ctf_event_class *create_minimal_event_class(void) +{ + struct bt_ctf_event_class *ec = NULL; + struct bt_ctf_field_type *int_ft = NULL; + int ret; + + int_ft = bt_ctf_field_type_integer_create(23); + assert(int_ft); + ec = bt_ctf_event_class_create("minimal"); + assert(ec); + ret = bt_ctf_event_class_add_field(ec, int_ft, "field"); + assert(!ret); + BT_PUT(int_ft); + + return ec; +} + +static +void test_create_writer_vs_non_writer_mode(void) +{ + int ret; + char trace_path[] = "/tmp/ctfwriter_XXXXXX"; + const char *writer_stream_name = "writer stream instance"; + struct bt_ctf_writer *writer = NULL; + struct bt_ctf_trace *writer_trace = NULL; + struct bt_ctf_stream_class *writer_sc = NULL; + struct bt_ctf_stream *writer_stream = NULL; + struct bt_ctf_stream *writer_stream2 = NULL; + struct bt_ctf_stream *packet_stream = NULL; + struct bt_ctf_trace *non_writer_trace = NULL; + struct bt_ctf_stream_class *non_writer_sc = NULL; + struct bt_ctf_stream *non_writer_stream = NULL; + struct bt_ctf_stream *non_writer_stream2 = NULL; + struct bt_ctf_event_class *writer_ec = NULL; + struct bt_ctf_event_class *non_writer_ec = NULL; + struct bt_ctf_event *event = NULL; + struct bt_ctf_event *event2 = NULL; + struct bt_ctf_field_type *empty_struct_ft = NULL; + struct bt_ctf_field *int_field = NULL; + struct bt_ctf_clock *writer_clock = NULL; + struct bt_ctf_clock *non_writer_clock = NULL; + struct bt_ctf_packet *packet = NULL; + struct bt_ctf_packet *packet2 = NULL; + + if (!bt_mkdtemp(trace_path)) { + perror("# perror"); + } + + /* Create empty structure field type (event header) */ + empty_struct_ft = bt_ctf_field_type_structure_create(); + assert(empty_struct_ft); + + /* Create writer, writer stream class, stream, and clock */ + writer = bt_ctf_writer_create(trace_path); + assert(writer); + 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"); + assert(writer_sc); + ret = bt_ctf_stream_class_set_event_header_type(writer_sc, + empty_struct_ft); + 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_trace_add_clock(writer_trace, writer_clock); + assert(!ret); + + /* Create non-writer trace, stream class, stream, and clock */ + non_writer_trace = bt_ctf_trace_create(); + assert(non_writer_trace); + 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_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 = bt_ctf_clock_create("non_writer_clock"); + assert(non_writer_clock); + ret = bt_ctf_trace_add_clock(non_writer_trace, non_writer_clock); + assert(!ret); + + /* Create event class and event */ + writer_ec = create_minimal_event_class(); + assert(writer_ec); + ret = bt_ctf_stream_class_add_event_class(writer_sc, writer_ec); + assert(!ret); + event = bt_ctf_event_create(writer_ec); + assert(event); + int_field = bt_ctf_event_get_payload_by_index(event, 0); + assert(int_field); + bt_ctf_field_unsigned_integer_set_value(int_field, 17); + + /* + * Verify non-writer stream: it should be impossible to append + * an event to it. + */ + ok(bt_ctf_stream_append_event(non_writer_stream, event), + "bt_ctf_stream_append_event() fails with a non-writer stream"); + + /* + * Verify writer stream: it should be possible to append an + * event to it. + */ + ok(!bt_ctf_stream_append_event(writer_stream, event), + "bt_ctf_stream_append_event() succeeds with a writer stream"); + + /* + * Verify that it's possible to get and set the value of a + * writer mode clock. + */ + ok (!bt_ctf_clock_set_value(writer_clock, 1000), + "bt_ctf_clock_set_value() succeeds with a writer mode clock"); + ok (bt_ctf_clock_get_value(writer_clock) == 1000, + "bt_ctf_clock_get_value() succeeds with a writer mode clock"); + + /* + * Verify that it's impossible to get and set the value of a + * non-writer mode clock. + */ + ok (bt_ctf_clock_set_value(non_writer_clock, 1000), + "bt_ctf_clock_set_value() fails with a non-writer mode clock"); + ok (bt_ctf_clock_get_value(non_writer_clock) == -1ULL, + "bt_ctf_clock_get_value() fails with a non-writer mode clock"); + + /* + * It should be possible to create a packet from a non-writer + * stream, but not from a writer stream. + */ + packet = bt_ctf_packet_create(writer_stream); + ok(!packet, "bt_ctf_packet_create() fails with a writer stream"); + packet = bt_ctf_packet_create(non_writer_stream); + ok(packet, "bt_ctf_packet_create() succeeds with a non-writer stream"); + packet_stream = bt_ctf_packet_get_stream(packet); + ok(packet_stream == non_writer_stream, + "bt_ctf_packet_get_stream() returns the correct stream"); + + /* + * It should not be possible to append an event associated to + * a stream to a different stream. + */ + writer_stream2 = bt_ctf_stream_create(writer_sc, "zoo"); + assert(writer_stream2); + ok(bt_ctf_stream_append_event(writer_stream2, event), + "bt_ctf_stream_append_event() fails with an event associated to another stream"); + + /* + * It should not be possible to set the packet of an event + * associated to a given stream to a packet associated with + * a different stream. + */ + ok(bt_ctf_event_set_packet(event, packet), + "bt_ctf_event_set_packet() fails with a packet not sharing the event's stream"); + + /* + * It should be possible to set the packet of a fresh event, as + * long as the originating stream classes are the same. + */ + event2 = bt_ctf_event_create(writer_ec); + assert(event2); + ok(bt_ctf_event_set_packet(event2, packet), + "bt_ctf_event_set_packet() fails when the event's and the packet's stream class differ"); + non_writer_ec = create_minimal_event_class(); + assert(non_writer_ec); + ret = bt_ctf_stream_class_add_event_class(non_writer_sc, non_writer_ec); + assert(!ret); + BT_PUT(event2); + event2 = bt_ctf_event_create(non_writer_ec); + assert(event2); + ok(!bt_ctf_event_set_packet(event2, packet), + "bt_ctf_event_set_packet() succeeds when the event's and the packet's stream class are the same"); + + /* + * It should be possible to set a packet created from the same + * stream to an event with an existing packet. + */ + packet2 = bt_ctf_packet_create(non_writer_stream); + assert(packet2); + ok(!bt_ctf_event_set_packet(event2, packet2), + "bt_ctf_event_set_packet() succeeds when the event's current packet has the same stream"); + BT_PUT(packet2); + + /* + * It should not be possible to set a packet created from a + * different stream to an event with an existing packet. + */ + non_writer_stream2 = bt_ctf_stream_create(non_writer_sc, "rj45"); + assert(non_writer_stream2); + packet2 = bt_ctf_packet_create(non_writer_stream); + assert(packet2); + ok(!bt_ctf_event_set_packet(event2, packet2), + "bt_ctf_event_set_packet() fails when the event's current packet does not have the same stream"); + + bt_put(writer); + bt_put(writer_trace); + bt_put(writer_sc); + bt_put(writer_stream); + bt_put(writer_stream2); + bt_put(non_writer_trace); + bt_put(non_writer_sc); + bt_put(non_writer_stream); + bt_put(non_writer_stream2); + bt_put(packet_stream); + bt_put(writer_ec); + bt_put(non_writer_ec); + bt_put(event); + bt_put(event2); + bt_put(int_field); + bt_put(empty_struct_ft); + bt_put(writer_clock); + bt_put(non_writer_clock); + bt_put(packet); + bt_put(packet2); + recursive_rmdir(trace_path); +} + +static +void test_clock_utils(void) +{ + int ret; + struct bt_ctf_clock *clock = NULL; + + clock = bt_ctf_clock_create("water"); + assert(clock); + ret = bt_ctf_clock_set_offset_s(clock, 1234); + assert(!ret); + ret = bt_ctf_clock_set_offset(clock, 1000); + assert(!ret); + ret = bt_ctf_clock_set_frequency(clock, 1000000000); + assert(!ret); + ok(bt_ctf_clock_ns_from_value(clock, 4321) == 1234000005321ULL, + "bt_ctf_clock_ns_from_value() returns the correct value with a 1 GHz frequency"); + ret = bt_ctf_clock_set_frequency(clock, 1534); + assert(!ret); + ok(bt_ctf_clock_ns_from_value(clock, 4321) == + (uint64_t) 1237468709256.845, + "bt_ctf_clock_ns_from_value() returns the correct value with a non-1 GHz frequency"); + + BT_PUT(clock); +} + int main(int argc, char **argv) { char trace_path[] = "/tmp/ctfwriter_XXXXXX"; @@ -2918,38 +3221,6 @@ int main(int argc, char **argv) ok(get_time >= current_time - 1 && get_time <= current_time + 1, "bt_ctf_clock_get_time returns the correct time once it is set"); - ok(bt_ctf_writer_add_clock(writer, clock) == 0, - "Add clock to writer instance"); - ok(bt_ctf_writer_add_clock(writer, clock), - "Verify a clock can't be added twice to a writer instance"); - - ok(bt_ctf_trace_get_clock_count(NULL) < 0, - "bt_ctf_trace_get_clock_count correctly handles NULL"); - ok(bt_ctf_trace_get_clock_count(trace) == 1, - "bt_ctf_trace_get_clock_count returns the correct number of clocks"); - ok(!bt_ctf_trace_get_clock(NULL, 0), - "bt_ctf_trace_get_clock correctly handles NULL"); - ok(!bt_ctf_trace_get_clock(trace, -1), - "bt_ctf_trace_get_clock correctly handles negative indexes"); - ok(!bt_ctf_trace_get_clock(trace, 1), - "bt_ctf_trace_get_clock correctly handles out of bound accesses"); - ret_clock = bt_ctf_trace_get_clock(trace, 0); - ok(ret_clock == clock, - "bt_ctf_trace_get_clock returns the right clock instance"); - bt_put(ret_clock); - ok(!bt_ctf_trace_get_clock_by_name(trace, NULL), - "bt_ctf_trace_get_clock_by_name correctly handles NULL (trace)"); - ok(!bt_ctf_trace_get_clock_by_name(NULL, clock_name), - "bt_ctf_trace_get_clock_by_name correctly handles NULL (clock name)"); - ok(!bt_ctf_trace_get_clock_by_name(NULL, NULL), - "bt_ctf_trace_get_clock_by_name correctly handles NULL (both)"); - ret_clock = bt_ctf_trace_get_clock_by_name(trace, clock_name); - ok(ret_clock == clock, - "bt_ctf_trace_get_clock_by_name returns the right clock instance"); - bt_put(ret_clock); - ok(!bt_ctf_trace_get_clock_by_name(trace, "random"), - "bt_ctf_trace_get_clock_by_name fails when the requested clock doesn't exist"); - ok(!bt_ctf_clock_get_name(NULL), "bt_ctf_clock_get_name correctly handles NULL"); ok(!bt_ctf_clock_get_description(NULL), @@ -3003,7 +3274,7 @@ int main(int argc, char **argv) ok(bt_ctf_clock_set_uuid(clock, NULL) < 0, "bt_ctf_clock_set_uuid correctly handles a NULL UUID"); ok(bt_ctf_clock_set_uuid(clock, tmp_uuid) == 0, - "bt_ctf_clock_set_uuid sets a new uuid succesfully"); + "bt_ctf_clock_set_uuid sets a new uuid successfully"); ret_uuid = bt_ctf_clock_get_uuid(clock); ok(ret_uuid, "bt_ctf_clock_get_uuid returns a UUID after setting a new one"); @@ -3170,6 +3441,38 @@ int main(int argc, char **argv) stream1 = bt_ctf_writer_create_stream(writer, stream_class); ok(stream1, "Instanciate a stream class from writer"); + /* + * Creating a stream through a writer adds the given stream + * class to the writer's trace, thus registering the stream + * class's clock to the trace. + */ + ok(bt_ctf_trace_get_clock_count(NULL) < 0, + "bt_ctf_trace_get_clock_count correctly handles NULL"); + ok(bt_ctf_trace_get_clock_count(trace) == 1, + "bt_ctf_trace_get_clock_count returns the correct number of clocks"); + ok(!bt_ctf_trace_get_clock(NULL, 0), + "bt_ctf_trace_get_clock correctly handles NULL"); + ok(!bt_ctf_trace_get_clock(trace, -1), + "bt_ctf_trace_get_clock correctly handles negative indexes"); + ok(!bt_ctf_trace_get_clock(trace, 1), + "bt_ctf_trace_get_clock correctly handles out of bound accesses"); + ret_clock = bt_ctf_trace_get_clock(trace, 0); + ok(ret_clock == clock, + "bt_ctf_trace_get_clock returns the right clock instance"); + bt_put(ret_clock); + ok(!bt_ctf_trace_get_clock_by_name(trace, NULL), + "bt_ctf_trace_get_clock_by_name correctly handles NULL (trace)"); + ok(!bt_ctf_trace_get_clock_by_name(NULL, clock_name), + "bt_ctf_trace_get_clock_by_name correctly handles NULL (clock name)"); + ok(!bt_ctf_trace_get_clock_by_name(NULL, NULL), + "bt_ctf_trace_get_clock_by_name correctly handles NULL (both)"); + ret_clock = bt_ctf_trace_get_clock_by_name(trace, clock_name); + ok(ret_clock == clock, + "bt_ctf_trace_get_clock_by_name returns the right clock instance"); + bt_put(ret_clock); + ok(!bt_ctf_trace_get_clock_by_name(trace, "random"), + "bt_ctf_trace_get_clock_by_name fails when the requested clock doesn't exist"); + ok(bt_ctf_stream_get_class(NULL) == NULL, "bt_ctf_stream_get_class correctly handles NULL"); ret_stream_class = bt_ctf_stream_get_class(stream1); @@ -3257,6 +3560,12 @@ int main(int argc, char **argv) ok(bt_ctf_writer_add_environment_field(writer, "new_field", "test") == 0, "Add environment field to writer after stream creation"); + test_clock_utils(); + + test_trace_stream_class_clock(); + + test_create_writer_vs_non_writer_mode(); + test_instanciate_event_before_stream(writer); append_simple_event(stream_class, stream1, clock); @@ -3295,33 +3604,6 @@ int main(int argc, char **argv) free(metadata_string); bt_put(stream_class); - /* Remove all trace files and delete temporary trace directory */ - DIR *trace_dir = opendir(trace_path); - if (!trace_dir) { - perror("# opendir"); - return -1; - } - - struct dirent *entry; - while ((entry = readdir(trace_dir))) { - struct stat st; - char filename[PATH_MAX]; - - if (snprintf(filename, sizeof(filename), "%s/%s", - trace_path, entry->d_name) <= 0) { - continue; - } - - if (stat(entry->d_name, &st)) { - continue; - } - - if (S_ISREG(st.st_mode)) { - unlinkat(bt_dirfd(trace_dir), entry->d_name, 0); - } - } - - rmdir(trace_path); - closedir(trace_dir); + recursive_rmdir(trace_path); return 0; }