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; }
// get the link route by either name or id static qdr_link_route_t *_find_link_route_CT(qdr_connection_t *conn, qd_iterator_t *name, qd_iterator_t *identity) { qdr_link_route_t *lr = NULL; // if both id and name provided, prefer id // if (identity) { char buf[64]; uint64_t id = 0; assert(qd_iterator_length(identity) < sizeof(buf)); qd_iterator_strncpy(identity, buf, sizeof(buf)); if (sscanf(buf, "%"SCNu64, &id) != 1) { return NULL; } lr = DEQ_HEAD(conn->conn_link_routes); while (lr) { if (id == lr->identity) break; lr = DEQ_NEXT(lr); } } else if (name) { lr = DEQ_HEAD(conn->conn_link_routes); while (lr) { if (qd_iterator_equal(name, (unsigned char *)lr->name)) break; lr = DEQ_NEXT(lr); } } return lr; }
unsigned char *qd_iterator_copy(qd_iterator_t *iter) { if (!iter) return 0; int length = qd_iterator_length(iter); unsigned char *copy = malloc(length+1); int i = qd_iterator_ncopy(iter, copy, length+1); copy[i] = '\0'; return copy; }
void qd_iterator_trim_view(qd_iterator_t *iter, int length) { if (!iter) return; iter->view_start_pointer = iter->view_pointer; int view_length = qd_iterator_length(iter); if (view_length > length) { if (iter->annotation_length > length) { iter->annotation_length = length; iter->annotation_remaining = length; iter->view_start_pointer.remaining = 0; } else iter->view_start_pointer.remaining -= view_length - length; iter->view_pointer = iter->view_start_pointer; } }
static char *test_parser_fixed_scalars(void *context) { int idx = 0; qd_iterator_t *field = NULL; qd_parsed_field_t *parsed = NULL; static char error[1024]; error[0] = 0; while (fs_vectors[idx].data) { field = qd_iterator_binary(fs_vectors[idx].data, fs_vectors[idx].length, ITER_VIEW_ALL); parsed = qd_parse(field); qd_iterator_t *typed_iter = qd_parse_typed(parsed); int length = qd_iterator_length(typed_iter); if (length != fs_vectors[idx].length) { strcpy(error, "Length of typed iterator does not match actual length"); break; } if (!qd_parse_ok(parsed)) { strcpy(error, "Unexpected Parse Error"); break; } if (qd_parse_tag(parsed) != fs_vectors[idx].expected_tag) { sprintf(error, "(%d) Tag: Expected %02x, Got %02x", idx, fs_vectors[idx].expected_tag, qd_parse_tag(parsed)); break; } if (fs_vectors[idx].check_uint && qd_parse_as_uint(parsed) != fs_vectors[idx].expected_ulong) { sprintf(error, "(%d) UINT: Expected %"PRIx64", Got %"PRIx32, idx, fs_vectors[idx].expected_ulong, qd_parse_as_uint(parsed)); break; } if (fs_vectors[idx].check_ulong && qd_parse_as_ulong(parsed) != fs_vectors[idx].expected_ulong) { sprintf(error, "(%d) ULONG: Expected %"PRIx64", Got %"PRIx64, idx, fs_vectors[idx].expected_ulong, qd_parse_as_ulong(parsed)); break; } if (fs_vectors[idx].check_int && qd_parse_as_int(parsed) != fs_vectors[idx].expected_long) { sprintf(error, "(%d) INT: Expected %"PRIx64", Got %"PRIx32, idx, fs_vectors[idx].expected_long, qd_parse_as_int(parsed)); break; } if (fs_vectors[idx].check_long && qd_parse_as_long(parsed) != fs_vectors[idx].expected_long) { sprintf(error, "(%d) LONG: Expected %"PRIx64", Got %"PRIx64, idx, fs_vectors[idx].expected_long, qd_parse_as_long(parsed)); break; } idx++; qd_iterator_free(field); field = 0; qd_parse_free(parsed); parsed = 0; } qd_iterator_free(field); qd_parse_free(parsed); return *error ? error : 0; }