X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=tests%2Flib%2Ftest_trace_ir_ref.c;h=3f31c6ac6a62d967e42cce096ddb95dc8587769c;hp=380fbe562ca855ef4759caea40552865cef7d51e;hb=fd2dab402396cbd7860d14be0384eb87d2a1d71a;hpb=c8bbf8219235d1e8a9e04dc7b641210e6c93c02c diff --git a/tests/lib/test_trace_ir_ref.c b/tests/lib/test_trace_ir_ref.c index 380fbe56..3f31c6ac 100644 --- a/tests/lib/test_trace_ir_ref.c +++ b/tests/lib/test_trace_ir_ref.c @@ -19,21 +19,31 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include #include "tap/tap.h" -#include -#include -#include -#include +#include +#include "lib/object.h" +#include "compat/stdlib.h" +#include "common/assert.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "common.h" #define NR_TESTS 37 -struct user { - struct bt_private_trace *tc; - struct bt_private_stream_class *sc; - struct bt_private_event_class *ec; - struct bt_private_stream *stream; - struct bt_private_event *event; +struct bt_user { + bt_trace_class *tc; + bt_stream_class *sc; + bt_event_class *ec; + bt_stream *stream; + bt_event *event; }; struct writer_user { @@ -63,35 +73,35 @@ static const size_t WRITER_USER_NR_ELEMENTS = * - uint16_t payload_16; * - uint32_t payload_32; */ -static struct bt_private_field_class *create_integer_struct(void) +static bt_field_class *create_integer_struct(bt_trace_class *trace_class) { int ret; - struct bt_private_field_class *structure = NULL; - struct bt_private_field_class *ui8 = NULL, *ui16 = NULL, *ui32 = NULL; + bt_field_class *structure = NULL; + bt_field_class *ui8 = NULL, *ui16 = NULL, *ui32 = NULL; - structure = bt_private_field_class_structure_create(); + structure = bt_field_class_structure_create(trace_class); BT_ASSERT(structure); - ui8 = bt_private_field_class_unsigned_integer_create(); + ui8 = bt_field_class_integer_unsigned_create(trace_class); BT_ASSERT(ui8); - bt_private_field_class_integer_set_field_value_range(ui8, 8); - ret = bt_private_field_class_structure_append_member(structure, + bt_field_class_integer_set_field_value_range(ui8, 8); + ret = bt_field_class_structure_append_member(structure, "payload_8", ui8); BT_ASSERT(ret == 0); - ui16 = bt_private_field_class_unsigned_integer_create(); + ui16 = bt_field_class_integer_unsigned_create(trace_class); BT_ASSERT(ui16); - bt_private_field_class_integer_set_field_value_range(ui16, 16); - ret = bt_private_field_class_structure_append_member(structure, + bt_field_class_integer_set_field_value_range(ui16, 16); + ret = bt_field_class_structure_append_member(structure, "payload_16", ui16); BT_ASSERT(ret == 0); - ui32 = bt_private_field_class_unsigned_integer_create(); + ui32 = bt_field_class_integer_unsigned_create(trace_class); BT_ASSERT(ui32); - bt_private_field_class_integer_set_field_value_range(ui32, 32); - ret = bt_private_field_class_structure_append_member(structure, + bt_field_class_integer_set_field_value_range(ui32, 32); + ret = bt_field_class_structure_append_member(structure, "payload_32", ui32); BT_ASSERT(ret == 0); - BT_OBJECT_PUT_REF_AND_RESET(ui8); - BT_OBJECT_PUT_REF_AND_RESET(ui16); - BT_OBJECT_PUT_REF_AND_RESET(ui32); + BT_FIELD_CLASS_PUT_REF_AND_RESET(ui8); + BT_FIELD_CLASS_PUT_REF_AND_RESET(ui16); + BT_FIELD_CLASS_PUT_REF_AND_RESET(ui32); return structure; } @@ -130,23 +140,23 @@ static struct bt_ctf_field_type *create_writer_integer_struct(void) * - uint16_t payload_16; * - uint32_t payload_32; */ -static struct bt_private_event_class *create_simple_event( - struct bt_private_stream_class *sc, const char *name) +static bt_event_class *create_simple_event( + bt_stream_class *sc, const char *name) { int ret; - struct bt_private_event_class *event = NULL; - struct bt_private_field_class *payload = NULL; + bt_event_class *event = NULL; + bt_field_class *payload = NULL; BT_ASSERT(name); - event = bt_private_event_class_create(sc); + event = bt_event_class_create(sc); BT_ASSERT(event); - ret = bt_private_event_class_set_name(event, name); + ret = bt_event_class_set_name(event, name); BT_ASSERT(ret == 0); - payload = create_integer_struct(); + payload = create_integer_struct(bt_stream_class_borrow_trace_class(sc)); BT_ASSERT(payload); - ret = bt_private_event_class_set_payload_field_class(event, payload); + ret = bt_event_class_set_payload_field_class(event, payload); BT_ASSERT(ret == 0); - BT_OBJECT_PUT_REF_AND_RESET(payload); + BT_FIELD_CLASS_PUT_REF_AND_RESET(payload); return event; } @@ -160,169 +170,102 @@ static struct bt_private_event_class *create_simple_event( * - uint16_t payload_16; * - uint32_t payload_32; */ -static struct bt_private_event_class *create_complex_event( - struct bt_private_stream_class *sc, +static bt_event_class *create_complex_event(bt_stream_class *sc, const char *name) { int ret; - struct bt_private_event_class *event = NULL; - struct bt_private_field_class *inner = NULL, *outer = NULL; + bt_event_class *event = NULL; + bt_field_class *inner = NULL, *outer = NULL; + bt_trace_class *trace_class = bt_stream_class_borrow_trace_class(sc); BT_ASSERT(name); - event = bt_private_event_class_create(sc); + event = bt_event_class_create(sc); BT_ASSERT(event); - ret = bt_private_event_class_set_name(event, name); + ret = bt_event_class_set_name(event, name); BT_ASSERT(ret == 0); - outer = create_integer_struct(); + outer = create_integer_struct(trace_class); BT_ASSERT(outer); - inner = create_integer_struct(); + inner = create_integer_struct(trace_class); BT_ASSERT(inner); - ret = bt_private_field_class_structure_append_member(outer, + ret = bt_field_class_structure_append_member(outer, "payload_struct", inner); BT_ASSERT(ret == 0); - ret = bt_private_event_class_set_payload_field_class(event, outer); + ret = bt_event_class_set_payload_field_class(event, outer); BT_ASSERT(ret == 0); - BT_OBJECT_PUT_REF_AND_RESET(inner); - BT_OBJECT_PUT_REF_AND_RESET(outer); + BT_FIELD_CLASS_PUT_REF_AND_RESET(inner); + BT_FIELD_CLASS_PUT_REF_AND_RESET(outer); return event; } -static void set_stream_class_field_classes( - struct bt_private_stream_class *stream_class) -{ - struct bt_private_field_class *packet_context_type; - struct bt_private_field_class *event_header_type; - struct bt_private_field_class *fc; - int ret; - - packet_context_type = bt_private_field_class_structure_create(); - BT_ASSERT(packet_context_type); - fc = bt_private_field_class_unsigned_integer_create(); - BT_ASSERT(fc); - bt_private_field_class_integer_set_field_value_range(fc, 32); - ret = bt_private_field_class_structure_append_member(packet_context_type, - "packet_size", fc); - BT_ASSERT(ret == 0); - bt_object_put_ref(fc); - fc = bt_private_field_class_unsigned_integer_create(); - BT_ASSERT(fc); - bt_private_field_class_integer_set_field_value_range(fc, 32); - ret = bt_private_field_class_structure_append_member(packet_context_type, - "content_size", fc); - BT_ASSERT(ret == 0); - bt_object_put_ref(fc); - event_header_type = bt_private_field_class_structure_create(); - BT_ASSERT(event_header_type); - fc = bt_private_field_class_unsigned_integer_create(); - BT_ASSERT(fc); - bt_private_field_class_integer_set_field_value_range(fc, 32); - ret = bt_private_field_class_structure_append_member(event_header_type, - "id", fc); - BT_ASSERT(ret == 0); - bt_object_put_ref(fc); - ret = bt_private_stream_class_set_packet_context_field_class( - stream_class, packet_context_type); - BT_ASSERT(ret == 0); - ret = bt_private_stream_class_set_event_header_field_class( - stream_class, event_header_type); - BT_ASSERT(ret == 0); - bt_object_put_ref(packet_context_type); - bt_object_put_ref(event_header_type); -} - -static void create_sc1(struct bt_private_trace *trace) +static void create_sc1(bt_trace_class *trace_class) { int ret; - struct bt_private_event_class *ec1 = NULL, *ec2 = NULL; - struct bt_private_stream_class *sc1 = NULL, *ret_stream = NULL; + bt_event_class *ec1 = NULL, *ec2 = NULL; + bt_stream_class *sc1 = NULL, *ret_stream = NULL; - sc1 = bt_private_stream_class_create(trace); + sc1 = bt_stream_class_create(trace_class); BT_ASSERT(sc1); - ret = bt_private_stream_class_set_name(sc1, "sc1"); + ret = bt_stream_class_set_name(sc1, "sc1"); BT_ASSERT(ret == 0); - set_stream_class_field_classes(sc1); ec1 = create_complex_event(sc1, "ec1"); BT_ASSERT(ec1); ec2 = create_simple_event(sc1, "ec2"); BT_ASSERT(ec2); - ret_stream = bt_private_event_class_borrow_stream_class(ec1); + ret_stream = bt_event_class_borrow_stream_class(ec1); ok(ret_stream == sc1, "Borrow parent stream SC1 from EC1"); - ret_stream = bt_private_event_class_borrow_stream_class(ec2); + ret_stream = bt_event_class_borrow_stream_class(ec2); ok(ret_stream == sc1, "Borrow parent stream SC1 from EC2"); - BT_OBJECT_PUT_REF_AND_RESET(ec1); - BT_OBJECT_PUT_REF_AND_RESET(ec2); - BT_OBJECT_PUT_REF_AND_RESET(sc1); + BT_EVENT_CLASS_PUT_REF_AND_RESET(ec1); + BT_EVENT_CLASS_PUT_REF_AND_RESET(ec2); + BT_STREAM_CLASS_PUT_REF_AND_RESET(sc1); } -static void create_sc2(struct bt_private_trace *trace) +static void create_sc2(bt_trace_class *trace_class) { int ret; - struct bt_private_event_class *ec3 = NULL; - struct bt_private_stream_class *sc2 = NULL, *ret_stream = NULL; + bt_event_class *ec3 = NULL; + bt_stream_class *sc2 = NULL, *ret_stream = NULL; - sc2 = bt_private_stream_class_create(trace); + sc2 = bt_stream_class_create(trace_class); BT_ASSERT(sc2); - ret = bt_private_stream_class_set_name(sc2, "sc2"); + ret = bt_stream_class_set_name(sc2, "sc2"); BT_ASSERT(ret == 0); - set_stream_class_field_classes(sc2); ec3 = create_simple_event(sc2, "ec3"); - ret_stream = bt_private_event_class_borrow_stream_class(ec3); + ret_stream = bt_event_class_borrow_stream_class(ec3); ok(ret_stream == sc2, "Borrow parent stream SC2 from EC3"); - BT_OBJECT_PUT_REF_AND_RESET(ec3); - BT_OBJECT_PUT_REF_AND_RESET(sc2); + BT_EVENT_CLASS_PUT_REF_AND_RESET(ec3); + BT_STREAM_CLASS_PUT_REF_AND_RESET(sc2); } -static void set_trace_packet_header(struct bt_private_trace *trace) +static bt_trace_class *create_tc1(bt_self_component_source *self_comp) { - struct bt_private_field_class *packet_header_type; - struct bt_private_field_class *fc; - int ret; + bt_trace_class *tc1 = NULL; - packet_header_type = bt_private_field_class_structure_create(); - BT_ASSERT(packet_header_type); - fc = bt_private_field_class_unsigned_integer_create(); - BT_ASSERT(fc); - bt_private_field_class_integer_set_field_value_range(fc, 32); - ret = bt_private_field_class_structure_append_member(packet_header_type, - "stream_id", fc); - BT_ASSERT(ret == 0); - bt_object_put_ref(fc); - ret = bt_private_trace_set_packet_header_field_class(trace, - packet_header_type); - BT_ASSERT(ret == 0); - - bt_object_put_ref(packet_header_type); -} - -static struct bt_private_trace *create_tc1(void) -{ - struct bt_private_trace *tc1 = NULL; - - tc1 = bt_private_trace_create(); + tc1 = bt_trace_class_create( + bt_self_component_source_as_self_component(self_comp)); BT_ASSERT(tc1); - set_trace_packet_header(tc1); create_sc1(tc1); create_sc2(tc1); return tc1; } -static void init_weak_refs(struct bt_private_trace *tc, - struct bt_private_trace **tc1, - struct bt_private_stream_class **sc1, - struct bt_private_stream_class **sc2, - struct bt_private_event_class **ec1, - struct bt_private_event_class **ec2, - struct bt_private_event_class **ec3) +static void init_weak_refs(bt_trace_class *tc, + bt_trace_class **tc1, + bt_stream_class **sc1, + bt_stream_class **sc2, + bt_event_class **ec1, + bt_event_class **ec2, + bt_event_class **ec3) { *tc1 = tc; - *sc1 = bt_private_trace_borrow_stream_class_by_index(tc, 0); - *sc2 = bt_private_trace_borrow_stream_class_by_index(tc, 1); - *ec1 = bt_private_stream_class_borrow_event_class_by_index(*sc1, 0); - *ec2 = bt_private_stream_class_borrow_event_class_by_index(*sc1, 1); - *ec3 = bt_private_stream_class_borrow_event_class_by_index(*sc2, 0); + *sc1 = bt_trace_class_borrow_stream_class_by_index(tc, 0); + *sc2 = bt_trace_class_borrow_stream_class_by_index(tc, 1); + *ec1 = bt_stream_class_borrow_event_class_by_index(*sc1, 0); + *ec2 = bt_stream_class_borrow_event_class_by_index(*sc1, 1); + *ec3 = bt_stream_class_borrow_event_class_by_index(*sc2, 0); } -static void test_example_scenario(void) +static void test_example_scenario(bt_self_component_source *self_comp) { /* * Weak pointers to trace IR objects are to be used very @@ -331,14 +274,14 @@ static void test_example_scenario(void) * of expected reference counts without affecting them by taking * "real" references to the objects. */ - struct bt_private_trace *tc1 = NULL, *weak_tc1 = NULL; - struct bt_private_stream_class *weak_sc1 = NULL, *weak_sc2 = NULL; - struct bt_private_event_class *weak_ec1 = NULL, *weak_ec2 = NULL, + bt_trace_class *tc1 = NULL, *weak_tc1 = NULL; + bt_stream_class *weak_sc1 = NULL, *weak_sc2 = NULL; + bt_event_class *weak_ec1 = NULL, *weak_ec2 = NULL, *weak_ec3 = NULL; - struct user user_a = { 0 }, user_b = { 0 }, user_c = { 0 }; + struct bt_user user_a = { 0 }, user_b = { 0 }, user_c = { 0 }; /* The only reference which exists at this point is on TC1. */ - tc1 = create_tc1(); + tc1 = create_tc1(self_comp); ok(tc1, "Initialize trace"); BT_ASSERT(tc1); init_weak_refs(tc1, &weak_tc1, &weak_sc1, &weak_sc2, &weak_ec1, @@ -360,9 +303,9 @@ static void test_example_scenario(void) "TC1 reference count is 1"); /* User A acquires a reference to SC2 from TC1. */ - user_a.sc = bt_object_get_ref( - bt_private_trace_borrow_stream_class_by_index( - user_a.tc, 1)); + user_a.sc = bt_trace_class_borrow_stream_class_by_index( + user_a.tc, 1); + bt_stream_class_get_ref(user_a.sc); ok(user_a.sc, "User A acquires SC2 from TC1"); ok(bt_object_get_ref_count((void *) weak_tc1) == 2, "TC1 reference count is 2"); @@ -370,9 +313,9 @@ static void test_example_scenario(void) "SC2 reference count is 1"); /* User A acquires a reference to EC3 from SC2. */ - user_a.ec = bt_object_get_ref( - bt_private_stream_class_borrow_event_class_by_index( - user_a.sc, 0)); + user_a.ec = bt_stream_class_borrow_event_class_by_index( + user_a.sc, 0); + bt_event_class_get_ref(user_a.ec); ok(user_a.ec, "User A acquires EC3 from SC2"); ok(bt_object_get_ref_count((void *) weak_tc1) == 2, "TC1 reference count is 2"); @@ -383,7 +326,7 @@ static void test_example_scenario(void) /* User A releases its reference to SC2. */ diag("User A releases SC2"); - BT_OBJECT_PUT_REF_AND_RESET(user_a.sc); + BT_STREAM_CLASS_PUT_REF_AND_RESET(user_a.sc); /* * We keep the pointer to SC2 around to validate its reference * count. @@ -397,7 +340,7 @@ static void test_example_scenario(void) /* User A releases its reference to TC1. */ diag("User A releases TC1"); - BT_OBJECT_PUT_REF_AND_RESET(user_a.tc); + BT_TRACE_CLASS_PUT_REF_AND_RESET(user_a.tc); /* * We keep the pointer to TC1 around to validate its reference * count. @@ -411,7 +354,8 @@ static void test_example_scenario(void) /* User B acquires a reference to SC1. */ diag("User B acquires a reference to SC1"); - user_b.sc = bt_object_get_ref(weak_sc1); + user_b.sc = weak_sc1; + bt_stream_class_get_ref(user_b.sc); ok(bt_object_get_ref_count((void *) weak_tc1) == 2, "TC1 reference count is 2"); ok(bt_object_get_ref_count((void *) weak_sc1) == 1, @@ -419,9 +363,9 @@ 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_object_get_ref( - bt_private_stream_class_borrow_event_class_by_index( - user_b.sc, 0)); + user_c.ec = bt_stream_class_borrow_event_class_by_index( + user_b.sc, 0); + bt_event_class_get_ref(user_c.ec); ok(bt_object_get_ref_count((void *) weak_ec1) == 1, "EC1 reference count is 1"); ok(bt_object_get_ref_count((void *) weak_sc1) == 2, @@ -429,7 +373,7 @@ static void test_example_scenario(void) /* User A releases its reference on EC3. */ diag("User A releases its reference on EC3"); - BT_OBJECT_PUT_REF_AND_RESET(user_a.ec); + BT_EVENT_CLASS_PUT_REF_AND_RESET(user_a.ec); ok(bt_object_get_ref_count((void *) weak_ec3) == 0, "EC3 reference count is 1"); ok(bt_object_get_ref_count((void *) weak_sc2) == 0, @@ -439,7 +383,7 @@ static void test_example_scenario(void) /* User B releases its reference on SC1. */ diag("User B releases its reference on SC1"); - BT_OBJECT_PUT_REF_AND_RESET(user_b.sc); + BT_STREAM_CLASS_PUT_REF_AND_RESET(user_b.sc); ok(bt_object_get_ref_count((void *) weak_sc1) == 1, "SC1 reference count is 1"); @@ -461,7 +405,49 @@ static void test_example_scenario(void) "EC3 reference count is 0"); /* Reclaim last reference held by User C. */ - BT_OBJECT_PUT_REF_AND_RESET(user_c.ec); + BT_EVENT_CLASS_PUT_REF_AND_RESET(user_c.ec); +} + +static +bt_component_class_initialize_method_status src_init( + bt_self_component_source *self_comp, + bt_self_component_source_configuration *config, + const bt_value *params, void *init_method_data) +{ + test_example_scenario(self_comp); + return BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; +} + +static +bt_message_iterator_class_next_method_status src_iter_next( + bt_self_message_iterator *self_iterator, + bt_message_array_const msgs, uint64_t capacity, + uint64_t *count) +{ + return BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR; +} + +static void test_example_scenario_in_graph(void) +{ + bt_message_iterator_class *msg_iter_cls; + bt_component_class_source *comp_cls; + bt_graph *graph; + int ret; + + msg_iter_cls = bt_message_iterator_class_create(src_iter_next); + BT_ASSERT(msg_iter_cls); + + comp_cls = bt_component_class_source_create("src", msg_iter_cls); + BT_ASSERT(comp_cls); + ret = bt_component_class_source_set_initialize_method(comp_cls, src_init); + BT_ASSERT(ret == 0); + graph = bt_graph_create(0); + ret = bt_graph_add_source_component(graph, comp_cls, "src-comp", + NULL, BT_LOGGING_LEVEL_NONE, NULL); + BT_ASSERT(ret == 0); + bt_graph_put_ref(graph); + bt_component_class_source_put_ref(comp_cls); + bt_message_iterator_class_put_ref(msg_iter_cls); } static void create_writer_user_full(struct writer_user *user) @@ -603,7 +589,7 @@ int main(int argc, char **argv) /* Initialize tap harness before any tests */ plan_tests(NR_TESTS); - test_example_scenario(); + test_example_scenario_in_graph(); test_put_order(); return exit_status();