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;
    }
}
Exemple #5
0
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;
}