Repository: qpid-dispatch Updated Branches: refs/heads/master 456f618d8 -> 6a783b07f
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/src/router_core/router_core.c ---------------------------------------------------------------------- diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c index 07b7035..89d8960 100644 --- a/src/router_core/router_core.c +++ b/src/router_core/router_core.c @@ -136,13 +136,13 @@ qdr_field_t *qdr_field(const char *text) DEQ_INSERT_TAIL(field->buffers, buf); } - field->iterator = qd_field_iterator_buffer(DEQ_HEAD(field->buffers), 0, ilength); + field->iterator = qd_iterator_buffer(DEQ_HEAD(field->buffers), 0, ilength, ITER_VIEW_ALL); return field; } -qdr_field_t *qdr_field_from_iter(qd_field_iterator_t *iter) +qdr_field_t *qdr_field_from_iter(qd_iterator_t *iter) { if (!iter) return 0; @@ -153,24 +153,24 @@ qdr_field_t *qdr_field_from_iter(qd_field_iterator_t *iter) int length; ZERO(field); - qd_field_iterator_reset(iter); - remaining = qd_field_iterator_remaining(iter); + qd_iterator_reset(iter); + remaining = qd_iterator_remaining(iter); length = remaining; while (remaining) { buf = qd_buffer(); size_t cap = qd_buffer_capacity(buf); - int copied = qd_field_iterator_ncopy(iter, qd_buffer_cursor(buf), cap); + int copied = qd_iterator_ncopy(iter, qd_buffer_cursor(buf), cap); qd_buffer_insert(buf, copied); DEQ_INSERT_TAIL(field->buffers, buf); - remaining = qd_field_iterator_remaining(iter); + remaining = qd_iterator_remaining(iter); } - field->iterator = qd_field_iterator_buffer(DEQ_HEAD(field->buffers), 0, length); + field->iterator = qd_iterator_buffer(DEQ_HEAD(field->buffers), 0, length, ITER_VIEW_ALL); return field; } -qd_field_iterator_t *qdr_field_iterator(qdr_field_t *field) +qd_iterator_t *qdr_field_iterator(qdr_field_t *field) { if (!field) return 0; @@ -182,7 +182,7 @@ qd_field_iterator_t *qdr_field_iterator(qdr_field_t *field) void qdr_field_free(qdr_field_t *field) { if (field) { - qd_field_iterator_free(field->iterator); + qd_iterator_free(field->iterator); qd_buffer_list_free_buffers(&field->buffers); free_qdr_field_t(field); } @@ -194,7 +194,7 @@ char *qdr_field_copy(qdr_field_t *field) if (!field || !field->iterator) return 0; - return (char*) qd_field_iterator_copy(field->iterator); + return (char*) qd_iterator_copy(field->iterator); } @@ -230,12 +230,12 @@ qdr_address_t *qdr_address_CT(qdr_core_t *core, qd_address_treatment_t treatment qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const char *address, qd_address_treatment_t treatment) { - char addr_string[1000]; - qdr_address_t *addr = 0; - qd_field_iterator_t *iter = 0; + char addr_string[1000]; + qdr_address_t *addr = 0; + qd_iterator_t *iter = 0; snprintf(addr_string, sizeof(addr_string), "%c%s", aclass, address); - iter = qd_address_iterator_string(addr_string, ITER_VIEW_ALL); + iter = qd_iterator_string(addr_string, ITER_VIEW_ALL); qd_hash_retrieve(core->addr_hash, iter, (void**) &addr); if (!addr) { @@ -246,7 +246,7 @@ qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const cha addr->block_deletion = true; addr->local = (aclass == 'L'); } - qd_field_iterator_free(iter); + qd_iterator_free(iter); return addr; } http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/src/router_core/router_core_private.h ---------------------------------------------------------------------- diff --git a/src/router_core/router_core_private.h b/src/router_core/router_core_private.h index f8e702f..24c76b9 100644 --- a/src/router_core/router_core_private.h +++ b/src/router_core/router_core_private.h @@ -56,13 +56,13 @@ typedef enum { * and out of the router-core thread. */ typedef struct { - qd_buffer_list_t buffers; - qd_field_iterator_t *iterator; + qd_buffer_list_t buffers; + qd_iterator_t *iterator; } qdr_field_t; qdr_field_t *qdr_field(const char *string); -qdr_field_t *qdr_field_from_iter(qd_field_iterator_t *iter); -qd_field_iterator_t *qdr_field_iterator(qdr_field_t *field); +qdr_field_t *qdr_field_from_iter(qd_iterator_t *iter); +qd_iterator_t *qdr_field_iterator(qdr_field_t *field); void qdr_field_free(qdr_field_t *field); char *qdr_field_copy(qdr_field_t *field); @@ -208,8 +208,8 @@ struct qdr_delivery_t { qdr_link_t *link; qdr_delivery_t *peer; qd_message_t *msg; - qd_field_iterator_t *to_addr; - qd_field_iterator_t *origin; + qd_iterator_t *to_addr; + qd_iterator_t *origin; uint64_t disposition; bool settled; bool presettled; @@ -624,8 +624,8 @@ void qdr_check_addr_CT(qdr_core_t *core, qdr_address_t *addr, bool was_local); qdr_delivery_t *qdr_forward_new_delivery_CT(qdr_core_t *core, qdr_delivery_t *peer, qdr_link_t *link, qd_message_t *msg); void qdr_forward_deliver_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery_t *dlv); void qdr_connection_activate_CT(qdr_core_t *core, qdr_connection_t *conn); -qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_iterator_t *iter, int *in_phase, int *out_phase); -qd_address_treatment_t qdr_treatment_for_address_hash_CT(qdr_core_t *core, qd_field_iterator_t *iter); +qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_iterator_t *iter, int *in_phase, int *out_phase); +qd_address_treatment_t qdr_treatment_for_address_hash_CT(qdr_core_t *core, qd_iterator_t *iter); void qdr_connection_enqueue_work_CT(qdr_core_t *core, qdr_connection_t *conn, http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/src/router_core/terminus.c ---------------------------------------------------------------------- diff --git a/src/router_core/terminus.c b/src/router_core/terminus.c index 4dbba75..114d736 100644 --- a/src/router_core/terminus.c +++ b/src/router_core/terminus.c @@ -87,8 +87,8 @@ void qdr_terminus_copy(qdr_terminus_t *from, pn_terminus_t *to) return; if (from->address) { - qd_address_iterator_reset_view(from->address->iterator, ITER_VIEW_ALL); - unsigned char *addr = qd_field_iterator_copy(from->address->iterator); + qd_iterator_reset_view(from->address->iterator, ITER_VIEW_ALL); + unsigned char *addr = qd_iterator_copy(from->address->iterator); pn_terminus_set_address(to, (char*) addr); free(addr); } @@ -146,7 +146,7 @@ void qdr_terminus_set_address(qdr_terminus_t *term, const char *addr) } -qd_field_iterator_t *qdr_terminus_get_address(qdr_terminus_t *term) +qd_iterator_t *qdr_terminus_get_address(qdr_terminus_t *term) { if (qdr_terminus_is_anonymous(term)) return 0; @@ -155,7 +155,7 @@ qd_field_iterator_t *qdr_terminus_get_address(qdr_terminus_t *term) } -qd_field_iterator_t *qdr_terminus_dnp_address(qdr_terminus_t *term) +qd_iterator_t *qdr_terminus_dnp_address(qdr_terminus_t *term) { pn_data_t *props = term->properties; @@ -169,7 +169,7 @@ qd_field_iterator_t *qdr_terminus_dnp_address(qdr_terminus_t *term) if (pn_data_next(props)) { pn_bytes_t val = pn_data_get_string(props); if (val.start && *val.start != '\0') - return qd_field_iterator_binary(val.start, val.size); + return qd_iterator_binary(val.start, val.size, ITER_VIEW_ALL); } } } http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/src/router_core/transfer.c ---------------------------------------------------------------------- diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c index 00ec719..0ef54f1 100644 --- a/src/router_core/transfer.c +++ b/src/router_core/transfer.c @@ -37,7 +37,7 @@ static void qdr_update_delivery_CT(qdr_core_t *core, qdr_action_t *action, bool // Interface Functions //================================================================================== -qdr_delivery_t *qdr_link_deliver(qdr_link_t *link, qd_message_t *msg, qd_field_iterator_t *ingress, +qdr_delivery_t *qdr_link_deliver(qdr_link_t *link, qd_message_t *msg, qd_iterator_t *ingress, bool settled, qd_bitmask_t *link_exclusion) { qdr_action_t *action = qdr_action(qdr_link_deliver_CT, "link_deliver"); @@ -60,7 +60,7 @@ qdr_delivery_t *qdr_link_deliver(qdr_link_t *link, qd_message_t *msg, qd_field_i qdr_delivery_t *qdr_link_deliver_to(qdr_link_t *link, qd_message_t *msg, - qd_field_iterator_t *ingress, qd_field_iterator_t *addr, + qd_iterator_t *ingress, qd_iterator_t *addr, bool settled, qd_bitmask_t *link_exclusion) { qdr_action_t *action = qdr_action(qdr_link_deliver_CT, "link_deliver"); @@ -196,7 +196,7 @@ void qdr_link_check_credit(qdr_core_t *core, qdr_link_t *link) } -void qdr_send_to1(qdr_core_t *core, qd_message_t *msg, qd_field_iterator_t *addr, bool exclude_inprocess, bool control) +void qdr_send_to1(qdr_core_t *core, qd_message_t *msg, qd_iterator_t *addr, bool exclude_inprocess, bool control) { qdr_action_t *action = qdr_action(qdr_send_to_CT, "send_to"); action->args.io.address = qdr_field_from_iter(addr); @@ -278,7 +278,7 @@ static void qdr_delivery_decref_internal(qdr_delivery_t *delivery, bool lock_hel qd_message_free(delivery->msg); if (delivery->to_addr) - qd_field_iterator_free(delivery->to_addr); + qd_iterator_free(delivery->to_addr); if (delivery->tracking_addr) { int link_bit = conn->mask_bit; @@ -640,7 +640,7 @@ static void qdr_send_to_CT(qdr_core_t *core, qdr_action_t *action, bool discard) if (!discard) { qdr_address_t *addr = 0; - qd_address_iterator_reset_view(addr_field->iterator, ITER_VIEW_ADDRESS_HASH); + qd_iterator_reset_view(addr_field->iterator, ITER_VIEW_ADDRESS_HASH); qd_hash_retrieve(core->addr_hash, addr_field->iterator, (void**) &addr); if (addr) { // http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/src/router_node.c ---------------------------------------------------------------------- diff --git a/src/router_node.c b/src/router_node.c index 0944989..d35ea3f 100644 --- a/src/router_node.c +++ b/src/router_node.c @@ -87,13 +87,13 @@ static int AMQP_writable_conn_handler(void *type_context, qd_connection_t *conn, } -static qd_field_iterator_t *router_annotate_message(qd_router_t *router, - qd_parsed_field_t *in_ma, - qd_message_t *msg, - qd_bitmask_t **link_exclusions, - bool strip_inbound_annotations) +static qd_iterator_t *router_annotate_message(qd_router_t *router, + qd_parsed_field_t *in_ma, + qd_message_t *msg, + qd_bitmask_t **link_exclusions, + bool strip_inbound_annotations) { - qd_field_iterator_t *ingress_iter = 0; + qd_iterator_t *ingress_iter = 0; qd_parsed_field_t *trace = 0; qd_parsed_field_t *ingress = 0; @@ -110,17 +110,17 @@ static qd_field_iterator_t *router_annotate_message(qd_router_t *router, qd_parsed_field_t *sub = qd_parse_sub_key(in_ma, idx); if (!sub) continue; - qd_field_iterator_t *iter = qd_parse_raw(sub); + qd_iterator_t *iter = qd_parse_raw(sub); if (!iter) continue; - if (qd_field_iterator_equal(iter, (unsigned char*) QD_MA_TRACE)) { + if (qd_iterator_equal(iter, (unsigned char*) QD_MA_TRACE)) { trace = qd_parse_sub_value(in_ma, idx); - } else if (qd_field_iterator_equal(iter, (unsigned char*) QD_MA_INGRESS)) { + } else if (qd_iterator_equal(iter, (unsigned char*) QD_MA_INGRESS)) { ingress = qd_parse_sub_value(in_ma, idx); - } else if (qd_field_iterator_equal(iter, (unsigned char*) QD_MA_TO)) { + } else if (qd_iterator_equal(iter, (unsigned char*) QD_MA_TO)) { to = qd_parse_sub_value(in_ma, idx); - } else if (qd_field_iterator_equal(iter, (unsigned char*) QD_MA_PHASE)) { + } else if (qd_iterator_equal(iter, (unsigned char*) QD_MA_PHASE)) { phase = qd_parse_sub_value(in_ma, idx); } done = trace && ingress && to && phase; @@ -149,8 +149,8 @@ static qd_field_iterator_t *router_annotate_message(qd_router_t *router, uint32_t idx = 0; qd_parsed_field_t *trace_item = qd_parse_sub_value(trace, idx); while (trace_item) { - qd_field_iterator_t *iter = qd_parse_raw(trace_item); - qd_address_iterator_reset_view(iter, ITER_VIEW_ALL); + qd_iterator_t *iter = qd_parse_raw(trace_item); + qd_iterator_reset_view(iter, ITER_VIEW_ALL); qd_compose_insert_string_iterator(trace_field, iter); idx++; trace_item = qd_parse_sub_value(trace, idx); @@ -289,33 +289,33 @@ static void AMQP_rx_handler(void* context, qd_link_t *link, pn_delivery_t *pnd) if (valid_message) { if (check_user) { // This connection must not allow proxied user_id - qd_field_iterator_t *userid_iter = qd_message_field_iterator(msg, QD_FIELD_USER_ID); + qd_iterator_t *userid_iter = qd_message_field_iterator(msg, QD_FIELD_USER_ID); if (userid_iter) { // The user_id property has been specified - if (qd_field_iterator_remaining(userid_iter) > 0) { + if (qd_iterator_remaining(userid_iter) > 0) { // user_id property in message is not blank - if (!qd_field_iterator_equal(userid_iter, (const unsigned char *)conn->user_id)) { + if (!qd_iterator_equal(userid_iter, (const unsigned char *)conn->user_id)) { // This message is rejected: attempted user proxy is disallowed qd_log(router->log_source, QD_LOG_DEBUG, "Message rejected due to user_id proxy violation. User:%s", conn->user_id); pn_link_flow(pn_link, 1); pn_delivery_update(pnd, PN_REJECTED); pn_delivery_settle(pnd); qd_message_free(msg); - qd_field_iterator_free(userid_iter); + qd_iterator_free(userid_iter); return; } } - qd_field_iterator_free(userid_iter); + qd_iterator_free(userid_iter); } } qd_parsed_field_t *in_ma = qd_message_message_annotations(msg); qd_bitmask_t *link_exclusions; bool strip = qdr_link_strip_annotations_in(rlink); - qd_field_iterator_t *ingress_iter = router_annotate_message(router, in_ma, msg, &link_exclusions, strip); + qd_iterator_t *ingress_iter = router_annotate_message(router, in_ma, msg, &link_exclusions, strip); if (anonymous_link) { - qd_field_iterator_t *addr_iter = 0; + qd_iterator_t *addr_iter = 0; int phase = 0; // @@ -324,7 +324,7 @@ static void AMQP_rx_handler(void* context, qd_link_t *link, pn_delivery_t *pnd) if (in_ma) { qd_parsed_field_t *ma_to = qd_parse_value_by_key(in_ma, QD_MA_TO); if (ma_to) { - addr_iter = qd_field_iterator_dup(qd_parse_raw(ma_to)); + addr_iter = qd_iterator_dup(qd_parse_raw(ma_to)); phase = qd_message_get_phase_annotation(msg); } } @@ -336,9 +336,9 @@ static void AMQP_rx_handler(void* context, qd_link_t *link, pn_delivery_t *pnd) addr_iter = qd_message_field_iterator(msg, QD_FIELD_TO); if (addr_iter) { - qd_address_iterator_reset_view(addr_iter, ITER_VIEW_ADDRESS_HASH); + qd_iterator_reset_view(addr_iter, ITER_VIEW_ADDRESS_HASH); if (phase > 0) - qd_address_iterator_set_phase(addr_iter, '0' + (char) phase); + qd_iterator_annotate_phase(addr_iter, '0' + (char) phase); delivery = qdr_link_deliver_to(rlink, msg, ingress_iter, addr_iter, pn_delivery_settled(pnd), link_exclusions); } @@ -695,7 +695,7 @@ qd_router_t *qd_router(qd_dispatch_t *qd, qd_router_mode_t mode, const char *are // Inform the field iterator module of this router's id and area. The field iterator // uses this to offload some of the address-processing load from the router. // - qd_field_iterator_set_address(area, id); + qd_iterator_set_address(area, id); // // Seed the random number generator http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/src/trace_mask.c ---------------------------------------------------------------------- diff --git a/src/trace_mask.c b/src/trace_mask.c index e1acff5..7fc9882 100644 --- a/src/trace_mask.c +++ b/src/trace_mask.c @@ -67,7 +67,7 @@ void qd_tracemask_free(qd_tracemask_t *tm) void qd_tracemask_add_router(qd_tracemask_t *tm, const char *address, int maskbit) { - qd_field_iterator_t *iter = qd_address_iterator_string(address, ITER_VIEW_ADDRESS_HASH); + qd_iterator_t *iter = qd_iterator_string(address, ITER_VIEW_ADDRESS_HASH); sys_rwlock_wrlock(tm->lock); assert(maskbit < qd_bitmask_width() && tm->router_by_mask_bit[maskbit] == 0); if (maskbit < qd_bitmask_width() && tm->router_by_mask_bit[maskbit] == 0) { @@ -78,7 +78,7 @@ void qd_tracemask_add_router(qd_tracemask_t *tm, const char *address, int maskbi tm->router_by_mask_bit[maskbit] = router; } sys_rwlock_unlock(tm->lock); - qd_field_iterator_free(iter); + qd_iterator_free(iter); } @@ -133,8 +133,8 @@ qd_bitmask_t *qd_tracemask_create(qd_tracemask_t *tm, qd_parsed_field_t *traceli qd_parsed_field_t *item = qd_parse_sub_value(tracelist, idx); qdtm_router_t *router = 0; while (item) { - qd_field_iterator_t *iter = qd_parse_raw(item); - qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_HASH); + qd_iterator_t *iter = qd_parse_raw(item); + qd_iterator_reset_view(iter, ITER_VIEW_NODE_HASH); qd_hash_retrieve(tm->hash, iter, (void*) &router); if (router && router->link_maskbit >= 0) qd_bitmask_set_bit(bm, router->link_maskbit); http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/tests/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6bc0e74..d70ccbc 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -27,7 +27,6 @@ include_directories( ## set(unit_test_SOURCES compose_test.c - parse_test.c policy_test.c run_unit_tests.c server_test.c @@ -43,6 +42,7 @@ target_link_libraries(unit_tests qpid-dispatch) set(unit_test_size_SOURCES field_test.c + parse_test.c message_test.c buffer_test.c run_unit_tests_size.c http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/tests/field_test.c ---------------------------------------------------------------------- diff --git a/tests/field_test.c b/tests/field_test.c index bc93a27..82e512b 100644 --- a/tests/field_test.c +++ b/tests/field_test.c @@ -55,27 +55,19 @@ static void release_buffer_chain(qd_buffer_list_t *chain) static char* test_view_global_dns(void *context) { - qd_field_iterator_t *iter = qd_address_iterator_string("amqp://host/global/sub", ITER_VIEW_ALL); - if (!qd_field_iterator_equal(iter, (unsigned char*) "amqp://host/global/sub")) + qd_iterator_t *iter = qd_iterator_string("amqp://host/global/sub", ITER_VIEW_ALL); + if (!qd_iterator_equal(iter, (unsigned char*) "amqp://host/global/sub")) return "ITER_VIEW_ALL failed"; - qd_address_iterator_reset_view(iter, ITER_VIEW_NO_HOST); - if (!qd_field_iterator_equal(iter, (unsigned char*) "global/sub")) - return "ITER_VIEW_NO_HOST failed"; + qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_NO_HOST); + if (!qd_iterator_equal(iter, (unsigned char*) "global/sub")) + return "ITER_VIEW_ADDRESS_NO_HOST failed"; - qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_ID); - if (!qd_field_iterator_equal(iter, (unsigned char*) "global")) - return "ITER_VIEW_NODE_ID failed"; - - qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_SPECIFIC); - if (!qd_field_iterator_equal(iter, (unsigned char*) "sub")) - return "ITER_VIEW_NODE_SPECIFIC failed"; - - qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH); - if (!qd_field_iterator_equal(iter, (unsigned char*) "M0global/sub")) + qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH); + if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub")) return "ITER_VIEW_ADDRESS_HASH failed"; - qd_field_iterator_free(iter); + qd_iterator_free(iter); return 0; } @@ -83,27 +75,19 @@ static char* test_view_global_dns(void *context) static char* test_view_global_non_dns(void *context) { - qd_field_iterator_t *iter = qd_address_iterator_string("amqp:/global/sub", ITER_VIEW_ALL); - if (!qd_field_iterator_equal(iter, (unsigned char*) "amqp:/global/sub")) + qd_iterator_t *iter = qd_iterator_string("amqp:/global/sub", ITER_VIEW_ALL); + if (!qd_iterator_equal(iter, (unsigned char*) "amqp:/global/sub")) return "ITER_VIEW_ALL failed"; - qd_address_iterator_reset_view(iter, ITER_VIEW_NO_HOST); - if (!qd_field_iterator_equal(iter, (unsigned char*) "global/sub")) - return "ITER_VIEW_NO_HOST failed"; - - qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_ID); - if (!qd_field_iterator_equal(iter, (unsigned char*) "global")) - return "ITER_VIEW_NODE_ID failed"; + qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_NO_HOST); + if (!qd_iterator_equal(iter, (unsigned char*) "global/sub")) + return "ITER_VIEW_ADDRESS_NO_HOST failed"; - qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_SPECIFIC); - if (!qd_field_iterator_equal(iter, (unsigned char*) "sub")) - return "ITER_VIEW_NODE_SPECIFIC failed"; - - qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH); - if (!qd_field_iterator_equal(iter, (unsigned char*) "M0global/sub")) + qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH); + if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub")) return "ITER_VIEW_ADDRESS_HASH failed"; - qd_field_iterator_free(iter); + qd_iterator_free(iter); return 0; } @@ -111,27 +95,19 @@ static char* test_view_global_non_dns(void *context) static char* test_view_global_no_host(void *context) { - qd_field_iterator_t *iter = qd_address_iterator_string("global/sub", ITER_VIEW_ALL); - if (!qd_field_iterator_equal(iter, (unsigned char*) "global/sub")) + qd_iterator_t *iter = qd_iterator_string("global/sub", ITER_VIEW_ALL); + if (!qd_iterator_equal(iter, (unsigned char*) "global/sub")) return "ITER_VIEW_ALL failed"; - qd_address_iterator_reset_view(iter, ITER_VIEW_NO_HOST); - if (!qd_field_iterator_equal(iter, (unsigned char*) "global/sub")) - return "ITER_VIEW_NO_HOST failed"; - - qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_ID); - if (!qd_field_iterator_equal(iter, (unsigned char*) "global")) - return "ITER_VIEW_NODE_ID failed"; - - qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_SPECIFIC); - if (!qd_field_iterator_equal(iter, (unsigned char*) "sub")) - return "ITER_VIEW_NODE_SPECIFIC failed"; + qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_NO_HOST); + if (!qd_iterator_equal(iter, (unsigned char*) "global/sub")) + return "ITER_VIEW_ADDRESS_NO_HOST failed"; - qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH); - if (!qd_field_iterator_equal(iter, (unsigned char*) "M0global/sub")) + qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH); + if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub")) return "ITER_VIEW_ADDRESS_HASH failed"; - qd_field_iterator_free(iter); + qd_iterator_free(iter); return 0; } @@ -139,38 +115,102 @@ static char* test_view_global_no_host(void *context) static char* test_view_global_no_host_slash(void *context) { - qd_field_iterator_t *iter = qd_address_iterator_string("/global/sub", ITER_VIEW_ALL); - if (!qd_field_iterator_equal(iter, (unsigned char*) "/global/sub")) + qd_iterator_t *iter = qd_iterator_string("/global/sub", ITER_VIEW_ALL); + if (!qd_iterator_equal(iter, (unsigned char*) "/global/sub")) return "ITER_VIEW_ALL failed"; - qd_address_iterator_reset_view(iter, ITER_VIEW_NO_HOST); - if (!qd_field_iterator_equal(iter, (unsigned char*) "global/sub")) - return "ITER_VIEW_NO_HOST failed"; + qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_NO_HOST); + if (!qd_iterator_equal(iter, (unsigned char*) "global/sub")) + return "ITER_VIEW_ADDRESS_NO_HOST failed"; - qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_ID); - if (!qd_field_iterator_equal(iter, (unsigned char*) "global")) - return "ITER_VIEW_NODE_ID failed"; + qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH); + if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub")) + return "ITER_VIEW_ADDRESS_HASH failed"; - qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_SPECIFIC); - if (!qd_field_iterator_equal(iter, (unsigned char*) "sub")) - return "ITER_VIEW_NODE_SPECIFIC failed"; + qd_iterator_free(iter); - qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH); - if (!qd_field_iterator_equal(iter, (unsigned char*) "M0global/sub")) - return "ITER_VIEW_ADDRESS_HASH failed"; + return 0; +} - qd_field_iterator_free(iter); +static char *test_trim(void *context) +{ + qd_iterator_t *iter = qd_iterator_string("testing.trim", ITER_VIEW_ALL); + + qd_iterator_trim_view(iter, 7); + if (!qd_iterator_equal(iter, (unsigned char*) "testing")) + return "Trim on ITER_VIEW_ALL failed (1)"; + + qd_iterator_reset_view(iter, ITER_VIEW_ALL); + if (!qd_iterator_equal(iter, (unsigned char*) "testing.trim")) + return "Trim on ITER_VIEW_ALL failed (2)"; + + qd_iterator_advance(iter, 4); + qd_iterator_trim_view(iter, 5); + if (!qd_iterator_equal(iter, (unsigned char*) "ing.t")) + return "Trim on ITER_VIEW_ALL failed (3)"; + + qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH); + qd_iterator_trim_view(iter, 9); + if (!qd_iterator_equal(iter, (unsigned char*) "M0testing")) + return "Trim on ITER_VIEW_ADDRESS_HASH failed"; + + qd_iterator_reset(iter); + qd_iterator_annotate_space(iter, "my_space.", 9); + qd_iterator_trim_view(iter, 18); + if (!qd_iterator_equal(iter, (unsigned char*) "M0my_space.testing")) + return "Trim on ITER_VIEW_ADDRESS_HASH (with space 1) failed"; + + qd_iterator_reset(iter); + qd_iterator_trim_view(iter, 10); + if (!qd_iterator_equal(iter, (unsigned char*) "M0my_space")) + return "Trim on ITER_VIEW_ADDRESS_HASH (in space 1) failed"; + + qd_iterator_reset(iter); + qd_iterator_trim_view(iter, 2); + if (!qd_iterator_equal(iter, (unsigned char*) "M0")) + return "Trim on ITER_VIEW_ADDRESS_HASH (in annotation 1) failed"; + + qd_iterator_reset(iter); + qd_iterator_trim_view(iter, 1); + if (!qd_iterator_equal(iter, (unsigned char*) "M")) + return "Trim on ITER_VIEW_ADDRESS_HASH (in annotation 2) failed"; + + qd_iterator_free(iter); return 0; } -static char* view_address_hash(void *context, qd_field_iterator_t *iter, +static char *test_sub_iterator(void *context) +{ + qd_iterator_t *iter = qd_iterator_string("test_sub_iterator", ITER_VIEW_ALL); + qd_iterator_t *sub1 = qd_iterator_sub(iter, qd_iterator_remaining(iter)); + qd_iterator_advance(iter, 5); + qd_iterator_t *sub2 = qd_iterator_sub(iter, qd_iterator_remaining(iter)); + qd_iterator_t *sub3 = qd_iterator_sub(iter, 3); + + if (!qd_iterator_equal(sub1, (unsigned char*) "test_sub_iterator")) + return "Sub Iterator failed - 1"; + if (!qd_iterator_equal(sub2, (unsigned char*) "sub_iterator")) + return "Sub Iterator failed - 2"; + if (!qd_iterator_equal(sub3, (unsigned char*) "sub")) + return "Sub Iterator failed - 3"; + + qd_iterator_free(iter); + qd_iterator_free(sub1); + qd_iterator_free(sub2); + qd_iterator_free(sub3); + + return 0; +} + + +static char* view_address_hash(void *context, qd_iterator_t *iter, const char *addr, const char *view) { - qd_address_iterator_set_phase(iter, '1'); - if (!qd_field_iterator_equal(iter, (unsigned char*) view)) { - char *got = (char*) qd_field_iterator_copy(iter); + qd_iterator_annotate_phase(iter, '1'); + if (!qd_iterator_equal(iter, (unsigned char*) view)) { + char *got = (char*) qd_iterator_copy(iter); snprintf(fail_text, FAIL_TEXT_SIZE, "Addr '%s' failed. Expected '%s', got '%s'", addr, view, got); return fail_text; @@ -219,9 +259,9 @@ static char* test_view_address_hash(void *context) int idx; for (idx = 0; cases[idx].addr; idx++) { - qd_field_iterator_t *iter = qd_address_iterator_string(cases[idx].addr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_t *iter = qd_iterator_string(cases[idx].addr, ITER_VIEW_ADDRESS_HASH); char *ret = view_address_hash(context, iter, cases[idx].addr, cases[idx].view); - qd_field_iterator_free(iter); + qd_iterator_free(iter); if (ret) return ret; } @@ -229,9 +269,9 @@ static char* test_view_address_hash(void *context) qd_buffer_list_t chain; DEQ_INIT(chain); build_buffer_chain(&chain, cases[idx].addr, 3); - qd_field_iterator_t *iter = qd_address_iterator_buffer(DEQ_HEAD(chain), 0, - strlen(cases[idx].addr), - ITER_VIEW_ADDRESS_HASH); + qd_iterator_t *iter = qd_iterator_buffer(DEQ_HEAD(chain), 0, + strlen(cases[idx].addr), + ITER_VIEW_ADDRESS_HASH); char *ret = view_address_hash(context, iter, cases[idx].addr, cases[idx].view); release_buffer_chain(&chain); if (ret) return ret; @@ -253,15 +293,47 @@ static char* test_view_address_hash_override(void *context) int idx; for (idx = 0; cases[idx].addr; idx++) { - qd_field_iterator_t *iter = qd_address_iterator_string(cases[idx].addr, ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(iter, 'C'); - if (!qd_field_iterator_equal(iter, (unsigned char*) cases[idx].view)) { - char *got = (char*) qd_field_iterator_copy(iter); + qd_iterator_t *iter = qd_iterator_string(cases[idx].addr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(iter, 'C'); + if (!qd_iterator_equal(iter, (unsigned char*) cases[idx].view)) { + char *got = (char*) qd_iterator_copy(iter); snprintf(fail_text, FAIL_TEXT_SIZE, "Addr '%s' failed. Expected '%s', got '%s'", cases[idx].addr, cases[idx].view, got); return fail_text; } - qd_field_iterator_free(iter); + qd_iterator_free(iter); + } + + return 0; +} + + +static char* test_view_address_with_space(void *context) +{ + struct {const char *addr; const char *view;} cases[] = { + {"amqp:/link-target", "M0test.vhost.link-target"}, + {"amqp:/domain/link-target", "M0test.vhost.domain/link-target"}, + {"domain/link-target", "M0test.vhost.domain/link-target"}, + {"bbc79fb3-e1fd-4a08-92b2-9a2de232b558", "M0test.vhost.bbc79fb3-e1fd-4a08-92b2-9a2de232b558"}, + {0, 0} + }; + int idx; + + for (idx = 0; cases[idx].addr; idx++) { + qd_iterator_t *iter = qd_iterator_string(cases[idx].addr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_space(iter, "test.vhost.", 11); + if (!qd_iterator_equal(iter, (unsigned char*) cases[idx].view)) { + char *got = (char*) qd_iterator_copy(iter); + snprintf(fail_text, FAIL_TEXT_SIZE, "Addr '%s' failed. Expected '%s', got '%s'", + cases[idx].addr, cases[idx].view, got); + return fail_text; + } + if (qd_iterator_length(iter) != strlen(cases[idx].view)) { + snprintf(fail_text, FAIL_TEXT_SIZE, "Addr '%s' failed. Length %d, iter_length returned %d", + cases[idx].addr, (int) strlen(cases[idx].view), (int) qd_iterator_length(iter)); + return fail_text; + } + qd_iterator_free(iter); } return 0; @@ -279,56 +351,55 @@ static char* test_view_node_hash(void *context) int idx; for (idx = 0; cases[idx].addr; idx++) { - qd_field_iterator_t *iter = qd_address_iterator_string(cases[idx].addr, ITER_VIEW_NODE_HASH); - if (!qd_field_iterator_equal(iter, (unsigned char*) cases[idx].view)) { - char *got = (char*) qd_field_iterator_copy(iter); + qd_iterator_t *iter = qd_iterator_string(cases[idx].addr, ITER_VIEW_NODE_HASH); + if (!qd_iterator_equal(iter, (unsigned char*) cases[idx].view)) { + char *got = (char*) qd_iterator_copy(iter); snprintf(fail_text, FAIL_TEXT_SIZE, "Addr '%s' failed. Expected '%s', got '%s'", cases[idx].addr, cases[idx].view, got); return fail_text; - qd_field_iterator_free(iter); + qd_iterator_free(iter); } - qd_field_iterator_free(iter); + qd_iterator_free(iter); } return 0; } static char *field_advance_test(void *context, - qd_field_iterator_t *iter, + qd_iterator_t *iter, const unsigned char *template, int increment) { const unsigned char *original = template; while (*template) { - // since qd_field_iterator_equal() resets the iterator to its original + // since qd_iterator_equal() resets the iterator to its original // view, we need to snapshot the iterator at the current point: - qd_field_iterator_t *raw = qd_field_iterator_sub(iter, - qd_field_iterator_remaining(iter)); - if (!qd_field_iterator_equal(raw, (unsigned char*) template)) { + qd_iterator_t *raw = qd_iterator_sub(iter, qd_iterator_remaining(iter)); + if (!qd_iterator_equal(raw, (unsigned char*) template)) { snprintf(fail_text, FAIL_TEXT_SIZE, "Field advance failed. Expected '%s'", (char *)template ); return fail_text; } - qd_field_iterator_advance(iter, increment); + qd_iterator_advance(iter, increment); template += increment; - qd_field_iterator_free(raw); + qd_iterator_free(raw); } - if (!qd_field_iterator_end(iter)) + if (!qd_iterator_end(iter)) return "Field advance to end failed"; - qd_field_iterator_reset(iter); - if (!qd_field_iterator_equal(iter, (unsigned char*) original)) + qd_iterator_reset(iter); + if (!qd_iterator_equal(iter, (unsigned char*) original)) return "Field advance reset failed"; // try something stupid: - qd_field_iterator_advance(iter, strlen((const char*)original) + 84); + qd_iterator_advance(iter, strlen((const char*)original) + 84); // expect no more data - if (qd_field_iterator_octet(iter) || !qd_field_iterator_end(iter)) + if (qd_iterator_octet(iter) || !qd_iterator_end(iter)) return "Field over advance failed"; - qd_field_iterator_free(iter); + qd_iterator_free(iter); return 0; } @@ -337,7 +408,7 @@ static char *field_advance_test(void *context, static char* test_field_advance_string(void *context) { const char *template = "abcdefghijklmnopqrstuvwxyz"; - qd_field_iterator_t *iter = qd_field_iterator_string(template); + qd_iterator_t *iter = qd_iterator_string(template, ITER_VIEW_ALL); return field_advance_test(context, iter, (const unsigned char*)template, 2); } @@ -349,7 +420,7 @@ static char* test_field_advance_buffer(void *context) DEQ_INIT(chain); const unsigned char *template = (unsigned char *)"AAABBB"; build_buffer_chain(&chain, (const char *)template, 3); - qd_field_iterator_t *iter = qd_field_iterator_buffer(DEQ_HEAD(chain), 0, 6); + qd_iterator_t *iter = qd_iterator_buffer(DEQ_HEAD(chain), 0, 6, ITER_VIEW_ALL); char *ret = field_advance_test(context, iter, template, 1); release_buffer_chain(&chain); return ret; @@ -358,8 +429,8 @@ static char* test_field_advance_buffer(void *context) static char *test_qd_hash_retrieve_prefix_separator(void *context) { qd_hash_t *hash = qd_hash(10, 32, 0); - qd_field_iterator_t *iter = qd_address_iterator_string("policy.org.apache", ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(iter, 'C'); + qd_iterator_t *iter = qd_iterator_string("policy.org.apache", ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(iter, 'C'); // Insert that hash qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0); @@ -370,15 +441,15 @@ static char *test_qd_hash_retrieve_prefix_separator(void *context) const char *taddr = "policy.org.apache.dev"; - qd_field_iterator_t *address_iter = qd_address_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(address_iter, 'C'); + qd_iterator_t *address_iter = qd_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(address_iter, 'C'); qd_address_t *addr; qd_hash_retrieve_prefix(hash, address_iter, (void*) &addr); - qd_field_iterator_free(iter); - qd_field_iterator_free(address_iter); + qd_iterator_free(iter); + qd_iterator_free(address_iter); if(addr) return 0; @@ -391,8 +462,8 @@ static char *test_qd_hash_retrieve_prefix(void *context) { qd_hash_t *hash = qd_hash(10, 32, 0); - qd_field_iterator_t *iter = qd_address_iterator_string("policy", ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(iter, 'C'); + qd_iterator_t *iter = qd_iterator_string("policy", ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(iter, 'C'); // Insert that hash qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0); @@ -403,15 +474,15 @@ static char *test_qd_hash_retrieve_prefix(void *context) const char *taddr = "policy.org.apache.dev"; - qd_field_iterator_t *address_iter = qd_address_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(address_iter, 'C'); + qd_iterator_t *address_iter = qd_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(address_iter, 'C'); qd_address_t *addr; qd_hash_retrieve_prefix(hash, address_iter, (void*) &addr); - qd_field_iterator_free(iter); - qd_field_iterator_free(address_iter); + qd_iterator_free(iter); + qd_iterator_free(address_iter); if(addr) return 0; @@ -425,8 +496,8 @@ static char *test_qd_hash_retrieve_prefix_no_match(void *context) qd_hash_t *hash = qd_hash(10, 32, 0); // No 'y' in policy. There should be no match. - qd_field_iterator_t *iter = qd_address_iterator_string("polic", ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(iter, 'C'); + qd_iterator_t *iter = qd_iterator_string("polic", ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(iter, 'C'); // Insert that hash qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0); @@ -437,15 +508,15 @@ static char *test_qd_hash_retrieve_prefix_no_match(void *context) const char *taddr = "policy.org.apache.dev"; - qd_field_iterator_t *address_iter = qd_address_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(address_iter, 'C'); + qd_iterator_t *address_iter = qd_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(address_iter, 'C'); qd_address_t *addr; qd_hash_retrieve_prefix(hash, address_iter, (void*) &addr); - qd_field_iterator_free(iter); - qd_field_iterator_free(address_iter); + qd_iterator_free(iter); + qd_iterator_free(address_iter); if(addr) return "test_qd_hash_retrieve_prefix_no_match() failed"; @@ -459,8 +530,8 @@ static char *test_qd_hash_retrieve_prefix_no_match_separator(void *context) qd_hash_t *hash = qd_hash(10, 32, 0); // No 'y' in policy. There should be no match. - qd_field_iterator_t *iter = qd_address_iterator_string("policy.org.apach", ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(iter, 'C'); + qd_iterator_t *iter = qd_iterator_string("policy.org.apach", ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(iter, 'C'); // Insert that hash qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0); @@ -471,15 +542,15 @@ static char *test_qd_hash_retrieve_prefix_no_match_separator(void *context) const char *taddr = "policy.org.apache.dev"; - qd_field_iterator_t *address_iter = qd_address_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(address_iter, 'C'); + qd_iterator_t *address_iter = qd_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(address_iter, 'C'); qd_address_t *addr; qd_hash_retrieve_prefix(hash, address_iter, (void*) &addr); - qd_field_iterator_free(iter); - qd_field_iterator_free(address_iter); + qd_iterator_free(iter); + qd_iterator_free(address_iter); if(addr) return "test_qd_hash_retrieve_prefix_no_match_separator() failed"; @@ -490,8 +561,8 @@ static char *test_qd_hash_retrieve_prefix_no_match_separator(void *context) static char *test_qd_hash_retrieve_prefix_separator_exact_match(void *context) { qd_hash_t *hash = qd_hash(10, 32, 0); - qd_field_iterator_t *iter = qd_address_iterator_string("policy", ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(iter, 'C'); + qd_iterator_t *iter = qd_iterator_string("policy", ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(iter, 'C'); // Insert that hash qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0); @@ -502,15 +573,15 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match(void *context) const char *taddr = "policy"; - qd_field_iterator_t *address_iter = qd_address_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(address_iter, 'C'); + qd_iterator_t *address_iter = qd_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(address_iter, 'C'); qd_address_t *addr; qd_hash_retrieve_prefix(hash, address_iter, (void*) &addr); - qd_field_iterator_free(iter); - qd_field_iterator_free(address_iter); + qd_iterator_free(iter); + qd_iterator_free(address_iter); if(addr) return 0; @@ -521,8 +592,8 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match(void *context) static char *test_qd_hash_retrieve_prefix_separator_exact_match_1(void *context) { qd_hash_t *hash = qd_hash(10, 32, 0); - qd_field_iterator_t *iter = qd_address_iterator_string("policy.apache.org", ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(iter, 'C'); + qd_iterator_t *iter = qd_iterator_string("policy.apache.org", ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(iter, 'C'); // Insert that hash qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0); @@ -533,15 +604,15 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_1(void *context) const char *taddr = "policy.apache.org"; - qd_field_iterator_t *address_iter = qd_address_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(address_iter, 'C'); + qd_iterator_t *address_iter = qd_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(address_iter, 'C'); qd_address_t *addr; qd_hash_retrieve_prefix(hash, address_iter, (void*) &addr); - qd_field_iterator_free(iter); - qd_field_iterator_free(address_iter); + qd_iterator_free(iter); + qd_iterator_free(address_iter); if(addr) return 0; @@ -555,8 +626,8 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_slashes(void *co qd_hash_t *hash = qd_hash(10, 32, 0); // Use slashes. slashes are not treated as separators, they are just part of the literal string. - qd_field_iterator_t *iter = qd_address_iterator_string("policy/apache/org", ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(iter, 'C'); + qd_iterator_t *iter = qd_iterator_string("policy/apache/org", ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(iter, 'C'); // Insert that hash qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0); @@ -567,15 +638,15 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_slashes(void *co const char *taddr = "policy/apache/org"; - qd_field_iterator_t *address_iter = qd_address_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(address_iter, 'C'); + qd_iterator_t *address_iter = qd_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(address_iter, 'C'); qd_address_t *addr; qd_hash_retrieve_prefix(hash, address_iter, (void*) &addr); - qd_field_iterator_free(iter); - qd_field_iterator_free(address_iter); + qd_iterator_free(iter); + qd_iterator_free(address_iter); if(addr) return 0; @@ -587,8 +658,8 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_slashes(void *co static char *test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end(void *context) { qd_hash_t *hash = qd_hash(10, 32, 0); - qd_field_iterator_t *iter = qd_address_iterator_string("policy", ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(iter, 'C'); + qd_iterator_t *iter = qd_iterator_string("policy", ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(iter, 'C'); // Insert that hash qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0); @@ -599,15 +670,15 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end(void const char *taddr = "policy."; - qd_field_iterator_t *address_iter = qd_address_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(address_iter, 'C'); + qd_iterator_t *address_iter = qd_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(address_iter, 'C'); qd_address_t *addr; qd_hash_retrieve_prefix(hash, address_iter, (void*) &addr); - qd_field_iterator_free(iter); - qd_field_iterator_free(address_iter); + qd_iterator_free(iter); + qd_iterator_free(address_iter); if(addr) return 0; @@ -619,8 +690,8 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end(void static char *test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end_1(void *context) { qd_hash_t *hash = qd_hash(10, 32, 0); - qd_field_iterator_t *iter = qd_address_iterator_string("policy.apache", ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(iter, 'C'); + qd_iterator_t *iter = qd_iterator_string("policy.apache", ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(iter, 'C'); // Insert that hash qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0); @@ -631,15 +702,15 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end_1(voi const char *taddr = "policy.apache."; - qd_field_iterator_t *address_iter = qd_address_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); - qd_address_iterator_override_prefix(address_iter, 'C'); + qd_iterator_t *address_iter = qd_iterator_string(taddr, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_prefix(address_iter, 'C'); qd_address_t *addr; qd_hash_retrieve_prefix(hash, address_iter, (void*) &addr); - qd_field_iterator_free(iter); - qd_field_iterator_free(address_iter); + qd_iterator_free(iter); + qd_iterator_free(address_iter); if(addr) return 0; @@ -690,9 +761,79 @@ static char *test_prefix_hash(void *context) // Insert the entries into the hash table // while (entries[idx]) { - qd_field_iterator_t *iter = qd_address_iterator_string(entries[idx], ITER_VIEW_ADDRESS_HASH); + qd_iterator_t *iter = qd_iterator_string(entries[idx], ITER_VIEW_ADDRESS_HASH); + qd_hash_insert(hash, iter, (void*) (idx + 1), 0); + qd_iterator_free(iter); + idx++; + } + + // + // Test the patterns + // + idx = 0; + while (patterns[idx].pattern) { + qd_iterator_t *iter = qd_iterator_string(patterns[idx].pattern, ITER_VIEW_ADDRESS_HASH); + void *ptr; + qd_hash_retrieve_prefix(hash, iter, &ptr); + int position = (int) ((long) ptr); + position--; + if (position != patterns[idx].entry) { + snprintf(error, 200, "Pattern: '%s', expected %d, got %d", + patterns[idx].pattern, patterns[idx].entry, position); + return error; + } + idx++; + } + + return 0; +} + + +static char *test_prefix_hash_with_space(void *context) +{ + static char error[200]; + char *entries[] = {"space.an_entry_with_no_separators", // 0 + "space.dot.separated.pattern.one", // 1 + "space.dot.separated.pattern.two", // 2 + "space.dot.separated.", // 3 + "space.dot", // 4 + "space.slash", // 5 + "space.slash/delimited", // 6 + "space.slash/delimited/first", // 7 + "space.slash/delimited/second", // 8 + "space.mixed.set/of/delimiters.one", // 9 + "space.mixed.set/of/delimiters.two", // 10 + "space.mixed.set/of/delimiters/three", // 11 + "space.mixed.set", // 12 + 0}; + struct { char* pattern; int entry; } patterns[] = {{"an_entry_with_no_separators", 0}, + {"dot.separated.pattern.one", 1}, + {"dot.separated.pattern.two", 2}, + {"dot.separated.pattern.three", 3}, + {"dot.separated.other.pattern", 3}, + {"dot.differentiated/other", 4}, + {"slash/other", 5}, + {"slash/delimited/first", 7}, + {"slash/delimited/second", 8}, + {"slash/delimited/third", 6}, + {"mixed.other", -1}, + {"mixed.set/other", 12}, + {"mixed.set/of/delimiters.one/queue", 9}, + {"mixed.set/of/delimiters.one.queue", 9}, + {"mixed.set.of/delimiters.one.queue", 12}, + {"other.thing.entirely", -1}, + {0, 0}}; + + qd_hash_t *hash = qd_hash(10, 32, 0); + long idx = 0; + + // + // Insert the entries into the hash table + // + while (entries[idx]) { + qd_iterator_t *iter = qd_iterator_string(entries[idx], ITER_VIEW_ADDRESS_HASH); qd_hash_insert(hash, iter, (void*) (idx + 1), 0); - qd_field_iterator_free(iter); + qd_iterator_free(iter); idx++; } @@ -701,7 +842,8 @@ static char *test_prefix_hash(void *context) // idx = 0; while (patterns[idx].pattern) { - qd_field_iterator_t *iter = qd_address_iterator_string(patterns[idx].pattern, ITER_VIEW_ADDRESS_HASH); + qd_iterator_t *iter = qd_iterator_string(patterns[idx].pattern, ITER_VIEW_ADDRESS_HASH); + qd_iterator_annotate_space(iter, "space.", 6); void *ptr; qd_hash_retrieve_prefix(hash, iter, &ptr); int position = (int) ((long) ptr); @@ -722,14 +864,17 @@ int field_tests(void) { int result = 0; - qd_field_iterator_set_address("my-area", "my-router"); + qd_iterator_set_address("my-area", "my-router"); TEST_CASE(test_view_global_dns, 0); TEST_CASE(test_view_global_non_dns, 0); TEST_CASE(test_view_global_no_host, 0); TEST_CASE(test_view_global_no_host_slash, 0); + TEST_CASE(test_trim, 0); + TEST_CASE(test_sub_iterator, 0); TEST_CASE(test_view_address_hash, 0); TEST_CASE(test_view_address_hash_override, 0); + TEST_CASE(test_view_address_with_space, 0); TEST_CASE(test_view_node_hash, 0); TEST_CASE(test_field_advance_string, 0); TEST_CASE(test_field_advance_buffer, 0); @@ -743,6 +888,7 @@ int field_tests(void) TEST_CASE(test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end, 0); TEST_CASE(test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end_1, 0); TEST_CASE(test_prefix_hash, 0); + TEST_CASE(test_prefix_hash_with_space, 0); return result; } http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/tests/message_test.c ---------------------------------------------------------------------- diff --git a/tests/message_test.c b/tests/message_test.c index 7984d87..8d2d3be 100644 --- a/tests/message_test.c +++ b/tests/message_test.c @@ -101,12 +101,12 @@ static char* test_receive_from_messenger(void *context) int valid = qd_message_check(msg, QD_DEPTH_ALL); if (!valid) return "qd_message_check returns 'invalid'"; - qd_field_iterator_t *iter = qd_message_field_iterator(msg, QD_FIELD_TO); + qd_iterator_t *iter = qd_message_field_iterator(msg, QD_FIELD_TO); if (iter == 0) return "Expected an iterator for the 'to' field"; - if (!qd_field_iterator_equal(iter, (unsigned char*) "test_addr_1")) + if (!qd_iterator_equal(iter, (unsigned char*) "test_addr_1")) return "Mismatched 'to' field contents"; - qd_field_iterator_free(iter); + qd_iterator_free(iter); ssize_t test_len = qd_message_field_length(msg, QD_FIELD_TO); if (test_len != 11) return "Incorrect field length"; @@ -152,29 +152,29 @@ static char* test_message_properties(void *context) set_content(content, size); - qd_field_iterator_t *iter = qd_message_field_iterator(msg, QD_FIELD_CORRELATION_ID); + qd_iterator_t *iter = qd_message_field_iterator(msg, QD_FIELD_CORRELATION_ID); if (!iter) return "Expected iterator for the 'correlation-id' field"; - if (qd_field_iterator_length(iter) != 13) return "Bad length for correlation-id"; - if (!qd_field_iterator_equal(iter, (const unsigned char *)"correlationId")) + if (qd_iterator_length(iter) != 13) return "Bad length for correlation-id"; + if (!qd_iterator_equal(iter, (const unsigned char *)"correlationId")) return "Invalid correlation-id"; - qd_field_iterator_free(iter); + qd_iterator_free(iter); iter = qd_message_field_iterator(msg, QD_FIELD_SUBJECT); if (!iter) return "Expected iterator for the 'subject' field"; - if (!qd_field_iterator_equal(iter, (const unsigned char *)subject)) + if (!qd_iterator_equal(iter, (const unsigned char *)subject)) return "Bad value for subject"; - qd_field_iterator_free(iter); + qd_iterator_free(iter); iter = qd_message_field_iterator(msg, QD_FIELD_MESSAGE_ID); if (!iter) return "Expected iterator for the 'message-id' field"; - if (qd_field_iterator_length(iter) != 9) return "Bad length for message-id"; - if (!qd_field_iterator_equal(iter, (const unsigned char *)"messageId")) + if (qd_iterator_length(iter) != 9) return "Bad length for message-id"; + if (!qd_iterator_equal(iter, (const unsigned char *)"messageId")) return "Invalid message-id"; - qd_field_iterator_free(iter); + qd_iterator_free(iter); iter = qd_message_field_iterator(msg, QD_FIELD_TO); if (iter) return "Expected no iterator for the 'to' field"; - qd_field_iterator_free(iter); + qd_iterator_free(iter); qd_message_free(msg); http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/tests/parse_test.c ---------------------------------------------------------------------- diff --git a/tests/parse_test.c b/tests/parse_test.c index ec7d74a..6cde698 100644 --- a/tests/parse_test.c +++ b/tests/parse_test.c @@ -67,13 +67,13 @@ static char *test_parser_fixed_scalars(void *context) static char error[1024]; while (fs_vectors[idx].data) { - qd_field_iterator_t *field = qd_field_iterator_binary(fs_vectors[idx].data, - fs_vectors[idx].length); + qd_iterator_t *field = qd_iterator_binary(fs_vectors[idx].data, + fs_vectors[idx].length, ITER_VIEW_ALL); qd_parsed_field_t *parsed = qd_parse(field); - qd_field_iterator_t *typed_iter = qd_parse_typed(parsed); + qd_iterator_t *typed_iter = qd_parse_typed(parsed); - int length = qd_field_iterator_length(typed_iter); + int length = qd_iterator_length(typed_iter); if (length != fs_vectors[idx].length) return "Length of typed iterator does not match actual length"; @@ -110,7 +110,7 @@ static char *test_parser_fixed_scalars(void *context) } idx++; - qd_field_iterator_free(field); + qd_iterator_free(field); qd_parse_free(parsed); } @@ -118,6 +118,82 @@ static char *test_parser_fixed_scalars(void *context) } +static char *test_map(void *context) +{ + static char error[1000]; + const char *data = + "\xd1\x00\x00\x00\x2d\x00\x00\x00\x06" // map32, 6 items + "\xa3\x05\x66irst\xa1\x0evalue_of_first" // (23) "first":"value_of_first" + "\xa3\x06second\x52\x20" // (10) "second":32 + "\xa3\x05third\x41"; // (8) "third":true + int data_len = 50; + + qd_iterator_t *data_iter = qd_iterator_binary(data, data_len, ITER_VIEW_ALL); + qd_parsed_field_t *field = qd_parse(data_iter); + if (!qd_parse_ok(field)) { + snprintf(error, 1000, "Parse failed: %s", qd_parse_error(field)); + return error; + } + + if (!qd_parse_is_map(field)) + return "Expected field to be a map"; + + uint32_t count = qd_parse_sub_count(field); + if (count != 3) { + snprintf(error, 1000, "Expected sub-count==3, got %"PRIu32, count); + return error; + } + + qd_parsed_field_t *key_field = qd_parse_sub_key(field, 0); + qd_iterator_t *key_iter = qd_parse_raw(key_field); + qd_iterator_t *typed_iter = qd_parse_typed(key_field); + if (!qd_iterator_equal(key_iter, (unsigned char*) "first")) { + snprintf(error, 1000, "First key: expected 'first', got '%s'", qd_iterator_copy(key_iter)); + return error; + } + if (!qd_iterator_equal(typed_iter, (unsigned char*) "\xa3\x05\x66irst")) + return "Incorrect typed iterator on first-key"; + + qd_parsed_field_t *val_field = qd_parse_sub_value(field, 0); + qd_iterator_t *val_iter = qd_parse_raw(val_field); + typed_iter = qd_parse_typed(val_field); + if (!qd_iterator_equal(val_iter, (unsigned char*) "value_of_first")) { + snprintf(error, 1000, "First value: expected 'value_of_first', got '%s'", qd_iterator_copy(val_iter)); + return error; + } + if (!qd_iterator_equal(typed_iter, (unsigned char*) "\xa1\x0evalue_of_first")) + return "Incorrect typed iterator on first-key"; + + key_field = qd_parse_sub_key(field, 1); + key_iter = qd_parse_raw(key_field); + if (!qd_iterator_equal(key_iter, (unsigned char*) "second")) { + snprintf(error, 1000, "Second key: expected 'second', got '%s'", qd_iterator_copy(key_iter)); + return error; + } + + val_field = qd_parse_sub_value(field, 1); + if (qd_parse_as_uint(val_field) != 32) { + snprintf(error, 1000, "Second value: expected 32, got %"PRIu32, qd_parse_as_uint(val_field)); + return error; + } + + key_field = qd_parse_sub_key(field, 2); + key_iter = qd_parse_raw(key_field); + if (!qd_iterator_equal(key_iter, (unsigned char*) "third")) { + snprintf(error, 1000, "Third key: expected 'third', got '%s'", qd_iterator_copy(key_iter)); + return error; + } + + val_field = qd_parse_sub_value(field, 2); + if (!qd_parse_as_bool(val_field)) { + snprintf(error, 1000, "Third value: expected true"); + return error; + } + + return 0; +} + + struct err_vector_t { const char *data; int length; @@ -142,8 +218,8 @@ static char *test_parser_errors(void *context) static char error[1024]; while (err_vectors[idx].data) { - qd_field_iterator_t *field = qd_field_iterator_binary(err_vectors[idx].data, - err_vectors[idx].length); + qd_iterator_t *field = qd_iterator_binary(err_vectors[idx].data, + err_vectors[idx].length, ITER_VIEW_ALL); qd_parsed_field_t *parsed = qd_parse(field); if (qd_parse_ok(parsed)) { sprintf(error, "(%d) Unexpected Parse Success", idx); @@ -155,7 +231,7 @@ static char *test_parser_errors(void *context) return error; } qd_parse_free(parsed); - qd_field_iterator_free(field); + qd_iterator_free(field); idx++; } @@ -170,7 +246,7 @@ static char *test_tracemask(void *context) qd_buffer_list_t list; static char error[1024]; - qd_field_iterator_set_address("0", "ROUTER"); + qd_iterator_set_address("0", "ROUTER"); qd_tracemask_add_router(tm, "amqp:/_topo/0/Router.A", 0); qd_tracemask_add_router(tm, "amqp:/_topo/0/Router.B", 1); @@ -200,8 +276,8 @@ static char *test_tracemask(void *context) buf = DEQ_NEXT(buf); } - qd_field_iterator_t *iter = qd_address_iterator_buffer(DEQ_HEAD(list), 0, length, ITER_VIEW_ALL); - qd_parsed_field_t *pf = qd_parse(iter); + qd_iterator_t *iter = qd_iterator_buffer(DEQ_HEAD(list), 0, length, ITER_VIEW_ALL); + qd_parsed_field_t *pf = qd_parse(iter); bm = qd_tracemask_create(tm, pf); if (qd_bitmask_cardinality(bm) != 3) { @@ -247,6 +323,7 @@ int parse_tests() int result = 0; TEST_CASE(test_parser_fixed_scalars, 0); + TEST_CASE(test_map, 0); TEST_CASE(test_parser_errors, 0); TEST_CASE(test_tracemask, 0); http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/tests/run_unit_tests.c ---------------------------------------------------------------------- diff --git a/tests/run_unit_tests.c b/tests/run_unit_tests.c index 7a8b1d4..173fc38 100644 --- a/tests/run_unit_tests.c +++ b/tests/run_unit_tests.c @@ -27,7 +27,6 @@ int tool_tests(void); int timer_tests(void); int alloc_tests(void); int server_tests(qd_dispatch_t *qd); -int parse_tests(void); int compose_tests(void); int policy_tests(void); @@ -56,7 +55,6 @@ int main(int argc, char** argv) result += timer_tests(); result += server_tests(qd); result += tool_tests(); - result += parse_tests(); result += compose_tests(); #if USE_MEMORY_POOL result += alloc_tests(); http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6a783b07/tests/run_unit_tests_size.c ---------------------------------------------------------------------- diff --git a/tests/run_unit_tests_size.c b/tests/run_unit_tests_size.c index 67ab404..42fcd23 100644 --- a/tests/run_unit_tests_size.c +++ b/tests/run_unit_tests_size.c @@ -22,6 +22,7 @@ int message_tests(); int field_tests(); +int parse_tests(); int buffer_tests(); int main(int argc, char** argv) @@ -40,6 +41,7 @@ int main(int argc, char** argv) int result = 0; result += message_tests(); result += field_tests(); + result += parse_tests(); result += buffer_tests(); qd_alloc_finalize(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
