void test_ListenerTask_GrowReadBuf_should_grow_the_listeners_read_buffer(void)
{
    l->read_buf = calloc(100, sizeof(uint8_t));
    TEST_ASSERT(l->read_buf);
    l->read_buf_size = 100;

    TEST_ASSERT_TRUE(ListenerTask_GrowReadBuf(l, 200));
    TEST_ASSERT_EQUAL(200, l->read_buf_size);
    TEST_ASSERT(l->read_buf);
    memset(&l->read_buf[0], 0xFF, 200);  // write to notify valgrind

    free(l->read_buf);
}
void test_ListenerTask_GrowReadBuf_should_expose_failures(void)
{
    l->read_buf = calloc(100, sizeof(uint8_t));
    uint8_t *orig_read_buf = l->read_buf;
    TEST_ASSERT(l->read_buf);
    l->read_buf_size = 100;

    // force realloc failure
    TEST_ASSERT_FALSE(ListenerTask_GrowReadBuf(l, (size_t)-1));
    TEST_ASSERT_EQUAL(100, l->read_buf_size);
    TEST_ASSERT_EQUAL(orig_read_buf, l->read_buf);
    free(l->read_buf);
}
Example #3
0
static bool sink_socket_read(struct bus *b,
                             listener *l, connection_info *ci, ssize_t size) {
    BUS_LOG_SNPRINTF(b, 3, LOG_LISTENER, b->udata, 64,
                     "read %zd bytes, calling sink CB", size);

#if DUMP_READ
    printf("\n");
    for (int i = 0; i < size; i++) {
        if (i > 0 && (i & 15) == 0) {
            printf("\n");
        }
        printf("%02x ", l->read_buf[i]);
    }
    printf("\n\n");
#endif

    bus_sink_cb_res_t sres = b->sink_cb(l->read_buf, size, ci->udata);
    if (sres.full_msg_buffer) {
        BUS_LOG(b, 3, LOG_LISTENER, "calling unpack CB", b->udata);
        bus_unpack_cb_res_t ures = b->unpack_cb(sres.full_msg_buffer, ci->udata);
        BUS_LOG_SNPRINTF(b, 3, LOG_LISTENER, b->udata, 64,
                         "process_unpacked_message: ok? %d, seq_id:%lld",
                         ures.ok, (long long)ures.u.success.seq_id);
        process_unpacked_message(l, ci, ures);
    }

    ci->to_read_size = sres.next_read;

    BUS_LOG_SNPRINTF(b, 3, LOG_LISTENER, b->udata, 64,
                     "expecting next read to have %zd bytes", ci->to_read_size);

    /* Grow read buffer if necessary. */
    if (ci->to_read_size > l->read_buf_size) {
        if (!ListenerTask_GrowReadBuf(l, ci->to_read_size)) {
            BUS_LOG_SNPRINTF(b, 3, LOG_MEMORY, b->udata, 128,
                             "Read buffer realloc failure for %p (%zd to %zd)",
                             l->read_buf, l->read_buf_size, ci->to_read_size);
            BUS_ASSERT(b, b->udata, false);
        }
    }
    return true;
}