X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=tests%2Flib%2Ftest_ctf_writer.c;h=5f173aff32287a69e6958c3b73b29e98616a874d;hb=55eb4a0471fded5edce486a0596dffb488124da7;hp=a2fbd2e4a3fbd1544f5b7f39eb30441d5391f18f;hpb=b71d729878967a4c0fb839fdea8d034cf90a1d1f;p=babeltrace.git diff --git a/tests/lib/test_ctf_writer.c b/tests/lib/test_ctf_writer.c index a2fbd2e4..5f173aff 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 590 +#define NR_TESTS 605 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) { @@ -697,6 +702,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 +1283,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 +1295,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 +1813,7 @@ void field_copy_tests() bt_put(strct_copy); } +static void type_field_tests() { struct bt_ctf_field *uint_12; @@ -2086,6 +2096,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 +2238,7 @@ end: bt_put(ep_type); } +static void test_empty_stream(struct bt_ctf_writer *writer) { int ret = 0; @@ -2272,6 +2284,7 @@ end: bt_put(stream_class); } +static void test_custom_event_header_stream(struct bt_ctf_writer *writer) { int i, ret; @@ -2477,6 +2490,7 @@ end: bt_put(event_header_type); } +static void test_instanciate_event_before_stream(struct bt_ctf_writer *writer) { int ret = 0; @@ -2593,6 +2607,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 +2626,7 @@ 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; @@ -2666,7 +2682,7 @@ struct bt_ctf_event_class *create_minimal_event_class(void) } static -void test_create_writer_stream_from_stream_class(void) +void test_create_writer_vs_non_writer_mode(void) { int ret; char trace_path[] = "/tmp/ctfwriter_XXXXXX"; @@ -2675,13 +2691,22 @@ void test_create_writer_stream_from_stream_class(void) 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_event_class *ec = 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"); @@ -2691,7 +2716,7 @@ void test_create_writer_stream_from_stream_class(void) empty_struct_ft = bt_ctf_field_type_structure_create(); assert(empty_struct_ft); - /* Create writer, writer stream class, and writer stream */ + /* 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); @@ -2707,8 +2732,12 @@ void test_create_writer_stream_from_stream_class(void) 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, and stream */ + /* 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"); @@ -2720,13 +2749,17 @@ void test_create_writer_stream_from_stream_class(void) 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 */ - ec = create_minimal_event_class(); - assert(ec); - ret = bt_ctf_stream_class_add_event_class(writer_sc, ec); + 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(ec); + event = bt_ctf_event_create(writer_ec); assert(event); int_field = bt_ctf_event_get_payload_by_index(event, 0); assert(int_field); @@ -2746,17 +2779,138 @@ void test_create_writer_stream_from_stream_class(void) ok(!bt_ctf_stream_append_event(writer_stream, event), "bt_ctf_stream_append_event() succeeds with a writer stream"); - BT_PUT(writer); - BT_PUT(writer_trace); - BT_PUT(writer_sc); - BT_PUT(writer_stream); - BT_PUT(non_writer_trace); - BT_PUT(non_writer_sc); - BT_PUT(non_writer_stream); - BT_PUT(ec); - BT_PUT(event); - BT_PUT(int_field); - BT_PUT(empty_struct_ft); + /* + * 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) @@ -3119,7 +3273,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"); @@ -3405,9 +3559,11 @@ 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_stream_from_stream_class(); + test_create_writer_vs_non_writer_mode(); test_instanciate_event_before_stream(writer); @@ -3447,33 +3603,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; }