X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=tests%2Flib%2Ftest_ctf_ir_ref.c;h=c5ad8fcbe71185d635b151474e0442937424cb52;hb=25583cd07e351a64d645978905be94227355f0e5;hp=c658fad2f332f4536e098e3166058cbc34fa5d16;hpb=6271743ccf6433db5b60d2db12105645bf79e937;p=babeltrace.git diff --git a/tests/lib/test_ctf_ir_ref.c b/tests/lib/test_ctf_ir_ref.c index c658fad2..c5ad8fcb 100644 --- a/tests/lib/test_ctf_ir_ref.c +++ b/tests/lib/test_ctf_ir_ref.c @@ -20,22 +20,36 @@ */ #include "tap/tap.h" -#include -#include #include -#include +#include +#include #include -#include -#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include #include -#include -#include +#include +#include +#include "common.h" #define NR_TESTS 41 struct user { + struct bt_trace *tc; + struct bt_stream_class *sc; + struct bt_event_class *ec; + struct bt_stream *stream; + struct bt_event *event; +}; + +struct writer_user { struct bt_ctf_writer *writer; struct bt_ctf_trace *tc; struct bt_ctf_stream_class *sc; @@ -44,7 +58,7 @@ struct user { struct bt_ctf_event *event; }; -const char *user_names[] = { +const char *writer_user_names[] = { "writer", "trace", "stream class", @@ -53,7 +67,8 @@ const char *user_names[] = { "event", }; -static const size_t USER_NR_ELEMENTS = sizeof(struct user) / sizeof(void *); +static const size_t WRITER_USER_NR_ELEMENTS = + sizeof(struct writer_user) / sizeof(void *); /** * Returns a structure containing the following fields: @@ -61,7 +76,61 @@ static const size_t USER_NR_ELEMENTS = sizeof(struct user) / sizeof(void *); * - uint16_t payload_16; * - uint32_t payload_32; */ -static struct bt_ctf_field_type *create_integer_struct(void) +static struct bt_field_type *create_integer_struct(void) +{ + int ret; + struct bt_field_type *structure = NULL; + struct bt_field_type *ui8 = NULL, *ui16 = NULL, *ui32 = NULL; + + structure = bt_field_type_structure_create(); + if (!structure) { + goto error; + } + + ui8 = bt_field_type_integer_create(8); + if (!ui8) { + diag("Failed to create uint8_t type"); + goto error; + } + ret = bt_field_type_structure_add_field(structure, ui8, + "payload_8"); + if (ret) { + diag("Failed to add uint8_t to structure"); + goto error; + } + ui16 = bt_field_type_integer_create(16); + if (!ui16) { + diag("Failed to create uint16_t type"); + goto error; + } + ret = bt_field_type_structure_add_field(structure, ui16, + "payload_16"); + if (ret) { + diag("Failed to add uint16_t to structure"); + goto error; + } + ui32 = bt_field_type_integer_create(32); + if (!ui32) { + diag("Failed to create uint32_t type"); + goto error; + } + ret = bt_field_type_structure_add_field(structure, ui32, + "payload_32"); + if (ret) { + diag("Failed to add uint32_t to structure"); + goto error; + } +end: + BT_PUT(ui8); + BT_PUT(ui16); + BT_PUT(ui32); + return structure; +error: + BT_PUT(structure); + goto end; +} + +static struct bt_ctf_field_type *create_writer_integer_struct(void) { int ret; struct bt_ctf_field_type *structure = NULL; @@ -121,14 +190,14 @@ error: * - uint16_t payload_16; * - uint32_t payload_32; */ -static struct bt_ctf_event_class *create_simple_event(const char *name) +static struct bt_event_class *create_simple_event(const char *name) { int ret; - struct bt_ctf_event_class *event = NULL; - struct bt_ctf_field_type *payload = NULL; + struct bt_event_class *event = NULL; + struct bt_field_type *payload = NULL; - assert(name); - event = bt_ctf_event_class_create(name); + BT_ASSERT(name); + event = bt_event_class_create(name); if (!event) { diag("Failed to create simple event"); goto error; @@ -140,7 +209,7 @@ static struct bt_ctf_event_class *create_simple_event(const char *name) goto error; } - ret = bt_ctf_event_class_set_payload_type(event, payload); + ret = bt_event_class_set_payload_field_type(event, payload); if (ret) { diag("Failed to set simple event payload"); goto error; @@ -163,39 +232,39 @@ error: * - uint16_t payload_16; * - uint32_t payload_32; */ -static struct bt_ctf_event_class *create_complex_event(const char *name) +static struct bt_event_class *create_complex_event(const char *name) { int ret; - struct bt_ctf_event_class *event = NULL; - struct bt_ctf_field_type *inner = NULL, *outer = NULL; + struct bt_event_class *event = NULL; + struct bt_field_type *inner = NULL, *outer = NULL; - assert(name); - event = bt_ctf_event_class_create(name); + BT_ASSERT(name); + event = bt_event_class_create(name); if (!event) { diag("Failed to create complex event"); goto error; } - outer = create_integer_struct(); + outer = create_integer_struct(); if (!outer) { diag("Failed to initialize integer structure"); goto error; } - inner = create_integer_struct(); + inner = create_integer_struct(); if (!inner) { diag("Failed to initialize integer structure"); goto error; } - ret = bt_ctf_field_type_structure_add_field(outer, inner, - "payload_struct"); + ret = bt_field_type_structure_add_field(outer, inner, + "payload_struct"); if (ret) { diag("Failed to add inner structure to outer structure"); goto error; } - ret = bt_ctf_event_class_set_payload_type(event, outer); + ret = bt_event_class_set_payload_field_type(event, outer); if (ret) { diag("Failed to set complex event payload"); goto error; @@ -209,24 +278,68 @@ error: goto end;; } -static struct bt_ctf_stream_class *create_sc1(void) +static void set_stream_class_field_types( + struct bt_stream_class *stream_class) { + struct bt_field_type *packet_context_type; + struct bt_field_type *event_header_type; + struct bt_field_type *ft; int ret; - struct bt_ctf_event_class *ec1 = NULL, *ec2 = NULL; - struct bt_ctf_stream_class *sc1 = NULL, *ret_stream = NULL; - sc1 = bt_ctf_stream_class_create("sc1"); + packet_context_type = bt_field_type_structure_create(); + BT_ASSERT(packet_context_type); + ft = bt_field_type_integer_create(32); + BT_ASSERT(ft); + ret = bt_field_type_structure_add_field(packet_context_type, + ft, "packet_size"); + BT_ASSERT(ret == 0); + bt_put(ft); + ft = bt_field_type_integer_create(32); + BT_ASSERT(ft); + ret = bt_field_type_structure_add_field(packet_context_type, + ft, "content_size"); + BT_ASSERT(ret == 0); + bt_put(ft); + + event_header_type = bt_field_type_structure_create(); + BT_ASSERT(event_header_type); + ft = bt_field_type_integer_create(32); + BT_ASSERT(ft); + ret = bt_field_type_structure_add_field(event_header_type, + ft, "id"); + BT_ASSERT(ret == 0); + bt_put(ft); + + ret = bt_stream_class_set_packet_context_field_type(stream_class, + packet_context_type); + BT_ASSERT(ret == 0); + ret = bt_stream_class_set_event_header_field_type(stream_class, + event_header_type); + BT_ASSERT(ret == 0); + + bt_put(packet_context_type); + bt_put(event_header_type); +} + +static struct bt_stream_class *create_sc1(void) +{ + int ret; + struct bt_event_class *ec1 = NULL, *ec2 = NULL; + struct bt_stream_class *sc1 = NULL, *ret_stream = NULL; + + sc1 = bt_stream_class_create("sc1"); if (!sc1) { diag("Failed to create Stream Class"); goto error; } + set_stream_class_field_types(sc1); ec1 = create_complex_event("ec1"); if (!ec1) { diag("Failed to create complex event EC1"); goto error; } - ret = bt_ctf_stream_class_add_event_class(sc1, ec1); + ret = bt_stream_class_add_event_class(sc1, ec1); if (ret) { diag("Failed to add EC1 to SC1"); goto error; @@ -237,17 +350,17 @@ static struct bt_ctf_stream_class *create_sc1(void) diag("Failed to create simple event EC2"); goto error; } - ret = bt_ctf_stream_class_add_event_class(sc1, ec2); + ret = bt_stream_class_add_event_class(sc1, ec2); if (ret) { diag("Failed to add EC1 to SC1"); goto error; } - ret_stream = bt_ctf_event_class_get_stream_class(ec1); + ret_stream = bt_event_class_get_stream_class(ec1); ok(ret_stream == sc1, "Get parent stream SC1 from EC1"); BT_PUT(ret_stream); - ret_stream = bt_ctf_event_class_get_stream_class(ec2); + ret_stream = bt_event_class_get_stream_class(ec2); ok(ret_stream == sc1, "Get parent stream SC1 from EC2"); end: BT_PUT(ret_stream); @@ -256,33 +369,34 @@ end: return sc1; error: BT_PUT(sc1); - goto end; + goto end; } -static struct bt_ctf_stream_class *create_sc2(void) +static struct bt_stream_class *create_sc2(void) { int ret; - struct bt_ctf_event_class *ec3 = NULL; - struct bt_ctf_stream_class *sc2 = NULL, *ret_stream = NULL; + struct bt_event_class *ec3 = NULL; + struct bt_stream_class *sc2 = NULL, *ret_stream = NULL; - sc2 = bt_ctf_stream_class_create("sc2"); + sc2 = bt_stream_class_create("sc2"); if (!sc2) { diag("Failed to create Stream Class"); goto error; } + set_stream_class_field_types(sc2); ec3 = create_simple_event("ec3"); if (!ec3) { diag("Failed to create simple event EC3"); goto error; } - ret = bt_ctf_stream_class_add_event_class(sc2, ec3); + ret = bt_stream_class_add_event_class(sc2, ec3); if (ret) { diag("Failed to add EC3 to SC2"); goto error; } - ret_stream = bt_ctf_event_class_get_stream_class(ec3); + ret_stream = bt_event_class_get_stream_class(ec3); ok(ret_stream == sc2, "Get parent stream SC2 from EC3"); end: BT_PUT(ret_stream); @@ -290,27 +404,50 @@ end: return sc2; error: BT_PUT(sc2); - goto end; + goto end; } -static struct bt_ctf_trace *create_tc1(void) +static void set_trace_packet_header(struct bt_trace *trace) { + struct bt_field_type *packet_header_type; + struct bt_field_type *ft; int ret; - struct bt_ctf_trace *tc1 = NULL; - struct bt_ctf_stream_class *sc1 = NULL, *sc2 = NULL; - tc1 = bt_ctf_trace_create(); + packet_header_type = bt_field_type_structure_create(); + BT_ASSERT(packet_header_type); + ft = bt_field_type_integer_create(32); + BT_ASSERT(ft); + ret = bt_field_type_structure_add_field(packet_header_type, + ft, "stream_id"); + BT_ASSERT(ret == 0); + bt_put(ft); + + ret = bt_trace_set_packet_header_field_type(trace, + packet_header_type); + BT_ASSERT(ret == 0); + + bt_put(packet_header_type); +} + +static struct bt_trace *create_tc1(void) +{ + int ret; + struct bt_trace *tc1 = NULL; + struct bt_stream_class *sc1 = NULL, *sc2 = NULL; + + tc1 = bt_trace_create(); if (!tc1) { - diag("bt_ctf_trace_create returned NULL"); + diag("bt_trace_create returned NULL"); goto error; } + set_trace_packet_header(tc1); sc1 = create_sc1(); ok(sc1, "Create SC1"); if (!sc1) { goto error; } - ret = bt_ctf_trace_add_stream_class(tc1, sc1); + ret = bt_trace_add_stream_class(tc1, sc1); ok(!ret, "Add SC1 to TC1"); if (ret) { goto error; @@ -321,7 +458,7 @@ static struct bt_ctf_trace *create_tc1(void) if (!sc2) { goto error; } - ret = bt_ctf_trace_add_stream_class(tc1, sc2); + ret = bt_trace_add_stream_class(tc1, sc2); ok(!ret, "Add SC2 to TC1"); if (ret) { goto error; @@ -332,23 +469,23 @@ end: return tc1; error: BT_PUT(tc1); - goto end; + goto end; } -static void init_weak_refs(struct bt_ctf_trace *tc, - struct bt_ctf_trace **tc1, - struct bt_ctf_stream_class **sc1, - struct bt_ctf_stream_class **sc2, - struct bt_ctf_event_class **ec1, - struct bt_ctf_event_class **ec2, - struct bt_ctf_event_class **ec3) +static void init_weak_refs(struct bt_trace *tc, + struct bt_trace **tc1, + struct bt_stream_class **sc1, + struct bt_stream_class **sc2, + struct bt_event_class **ec1, + struct bt_event_class **ec2, + struct bt_event_class **ec3) { *tc1 = tc; - *sc1 = bt_ctf_trace_get_stream_class(tc, 0); - *sc2 = bt_ctf_trace_get_stream_class(tc, 1); - *ec1 = bt_ctf_stream_class_get_event_class(*sc1, 0); - *ec2 = bt_ctf_stream_class_get_event_class(*sc1, 1); - *ec3 = bt_ctf_stream_class_get_event_class(*sc2, 0); + *sc1 = bt_trace_get_stream_class_by_index(tc, 0); + *sc2 = bt_trace_get_stream_class_by_index(tc, 1); + *ec1 = bt_stream_class_get_event_class_by_index(*sc1, 0); + *ec2 = bt_stream_class_get_event_class_by_index(*sc1, 1); + *ec3 = bt_stream_class_get_event_class_by_index(*sc2, 0); bt_put(*sc1); bt_put(*sc2); bt_put(*ec1); @@ -365,15 +502,15 @@ static void test_example_scenario(void) * counts without affecting them by taking "real" references to the * objects. */ - struct bt_ctf_trace *tc1 = NULL, *weak_tc1 = NULL; - struct bt_ctf_stream_class *weak_sc1 = NULL, *weak_sc2 = NULL; - struct bt_ctf_event_class *weak_ec1 = NULL, *weak_ec2 = NULL, + struct bt_trace *tc1 = NULL, *weak_tc1 = NULL; + struct bt_stream_class *weak_sc1 = NULL, *weak_sc2 = NULL; + struct bt_event_class *weak_ec1 = NULL, *weak_ec2 = NULL, *weak_ec3 = NULL; struct user user_a = { 0 }, user_b = { 0 }, user_c = { 0 }; /* The only reference which exists at this point is on TC1. */ tc1 = create_tc1(); - ok(tc1, "Initialize trace"); + ok(tc1, "Initialize trace"); if (!tc1) { return; } @@ -398,7 +535,7 @@ static void test_example_scenario(void) "TC1 reference count is 1"); /* User A acquires a reference to SC2 from TC1. */ - user_a.sc = bt_ctf_trace_get_stream_class(user_a.tc, 1); + user_a.sc = bt_trace_get_stream_class_by_index(user_a.tc, 1); ok(user_a.sc, "User A acquires SC2 from TC1"); ok(bt_object_get_ref_count(weak_tc1) == 2, "TC1 reference count is 2"); @@ -406,7 +543,7 @@ static void test_example_scenario(void) "SC2 reference count is 1"); /* User A acquires a reference to EC3 from SC2. */ - user_a.ec = bt_ctf_stream_class_get_event_class(user_a.sc, 0); + user_a.ec = bt_stream_class_get_event_class_by_index(user_a.sc, 0); ok(user_a.ec, "User A acquires EC3 from SC2"); ok(bt_object_get_ref_count(weak_tc1) == 2, "TC1 reference count is 2"); @@ -431,7 +568,7 @@ static void test_example_scenario(void) /* User A releases its reference to TC1. */ diag("User A releases TC1"); - BT_PUT(user_a.tc); + BT_PUT(user_a.tc); /* * We keep the pointer to TC1 around to validate its reference * count. @@ -453,7 +590,7 @@ static void test_example_scenario(void) /* User C acquires a reference to EC1. */ diag("User C acquires a reference to EC1"); - user_c.ec = bt_ctf_stream_class_get_event_class(user_b.sc, 0); + user_c.ec = bt_stream_class_get_event_class_by_index(user_b.sc, 0); ok(bt_object_get_ref_count(weak_ec1) == 1, "EC1 reference count is 1"); ok(bt_object_get_ref_count(weak_sc1) == 2, @@ -496,61 +633,67 @@ static void test_example_scenario(void) BT_PUT(user_c.ec); } -static void create_user_full(struct user *user) +static void create_writer_user_full(struct writer_user *user) { - char trace_path[] = "/tmp/ctfwriter_XXXXXX"; + gchar *trace_path; struct bt_ctf_field_type *ft; struct bt_ctf_field *field; struct bt_ctf_clock *clock; int ret; + trace_path = g_build_filename(g_get_tmp_dir(), "ctfwriter_XXXXXX", NULL); if (!bt_mkdtemp(trace_path)) { perror("# perror"); } user->writer = bt_ctf_writer_create(trace_path); - assert(user->writer); + BT_ASSERT(user->writer); + ret = bt_ctf_writer_set_byte_order(user->writer, + BT_CTF_BYTE_ORDER_LITTLE_ENDIAN); + BT_ASSERT(ret == 0); user->tc = bt_ctf_writer_get_trace(user->writer); - assert(user->tc); + BT_ASSERT(user->tc); user->sc = bt_ctf_stream_class_create("sc"); - assert(user->sc); + BT_ASSERT(user->sc); clock = bt_ctf_clock_create("the_clock"); - assert(clock); + BT_ASSERT(clock); + ret = bt_ctf_writer_add_clock(user->writer, clock); + BT_ASSERT(!ret); ret = bt_ctf_stream_class_set_clock(user->sc, clock); - assert(!ret); - ret = bt_ctf_clock_set_value(clock, 23); - assert(!ret); + BT_ASSERT(!ret); BT_PUT(clock); user->stream = bt_ctf_writer_create_stream(user->writer, user->sc); - assert(user->stream); + BT_ASSERT(user->stream); user->ec = bt_ctf_event_class_create("ec"); - assert(user->ec); - ft = create_integer_struct(); - assert(ft); - ret = bt_ctf_event_class_set_payload_type(user->ec, ft); + BT_ASSERT(user->ec); + ft = create_writer_integer_struct(); + BT_ASSERT(ft); + ret = bt_ctf_event_class_set_payload_field_type(user->ec, ft); BT_PUT(ft); - assert(!ret); + BT_ASSERT(!ret); ret = bt_ctf_stream_class_add_event_class(user->sc, user->ec); - assert(!ret); + BT_ASSERT(!ret); user->event = bt_ctf_event_create(user->ec); - assert(user->event); + BT_ASSERT(user->event); field = bt_ctf_event_get_payload(user->event, "payload_8"); - assert(field); - ret = bt_ctf_field_unsigned_integer_set_value(field, 10); - assert(!ret); + BT_ASSERT(field); + ret = bt_ctf_field_integer_unsigned_set_value(field, 10); + BT_ASSERT(!ret); BT_PUT(field); field = bt_ctf_event_get_payload(user->event, "payload_16"); - assert(field); - ret = bt_ctf_field_unsigned_integer_set_value(field, 20); - assert(!ret); + BT_ASSERT(field); + ret = bt_ctf_field_integer_unsigned_set_value(field, 20); + BT_ASSERT(!ret); BT_PUT(field); field = bt_ctf_event_get_payload(user->event, "payload_32"); - assert(field); - ret = bt_ctf_field_unsigned_integer_set_value(field, 30); - assert(!ret); + BT_ASSERT(field); + ret = bt_ctf_field_integer_unsigned_set_value(field, 30); + BT_ASSERT(!ret); BT_PUT(field); ret = bt_ctf_stream_append_event(user->stream, user->event); - assert(!ret); + BT_ASSERT(!ret); + recursive_rmdir(trace_path); + g_free(trace_path); } static void test_put_order_swap(size_t *array, size_t a, size_t b) @@ -564,16 +707,16 @@ static void test_put_order_swap(size_t *array, size_t a, size_t b) static void test_put_order_put_objects(size_t *array, size_t size) { size_t i; - struct user user = { 0 }; - void** objects = (void *) &user; + struct writer_user user = { 0 }; + void **objects = (void *) &user; - create_user_full(&user); + create_writer_user_full(&user); printf("# "); for (i = 0; i < size; ++i) { - void* obj = objects[array[i]]; + void *obj = objects[array[i]]; - printf("%s", user_names[array[i]]); + printf("%s", writer_user_names[array[i]]); BT_PUT(obj); if (i < size - 1) { @@ -604,14 +747,15 @@ static void test_put_order_permute(size_t *array, int k, size_t size) static void test_put_order(void) { size_t i; - size_t array[USER_NR_ELEMENTS]; + size_t array[WRITER_USER_NR_ELEMENTS]; /* Initialize array of indexes */ - for (i = 0; i < USER_NR_ELEMENTS; ++i) { + for (i = 0; i < WRITER_USER_NR_ELEMENTS; ++i) { array[i] = i; } - test_put_order_permute(array, USER_NR_ELEMENTS, USER_NR_ELEMENTS); + test_put_order_permute(array, WRITER_USER_NR_ELEMENTS, + WRITER_USER_NR_ELEMENTS); } /** @@ -625,7 +769,7 @@ static void test_put_order(void) */ int main(int argc, char **argv) { - /* Initialize tap harness before any tests */ + /* Initialize tap harness before any tests */ plan_tests(NR_TESTS); test_example_scenario();