mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-11 13:24:43 -04:00
Add more unit tests for evbuffer_expand
This commit is contained in:
parent
06a4443abe
commit
8c83e99579
4
buffer.c
4
buffer.c
@ -1550,6 +1550,10 @@ evbuffer_expand_singlechain(struct evbuffer *buf, size_t datlen)
|
|||||||
ASSERT_EVBUFFER_LOCKED(buf);
|
ASSERT_EVBUFFER_LOCKED(buf);
|
||||||
|
|
||||||
chainp = buf->last_with_datap;
|
chainp = buf->last_with_datap;
|
||||||
|
|
||||||
|
/* XXX If *chainp is no longer writeable, but has enough space in its
|
||||||
|
* misalign, this might be a bad idea: we could still use *chainp, not
|
||||||
|
* (*chainp)->next. */
|
||||||
if (*chainp && CHAIN_SPACE_LEN(*chainp) == 0)
|
if (*chainp && CHAIN_SPACE_LEN(*chainp) == 0)
|
||||||
chainp = &(*chainp)->next;
|
chainp = &(*chainp)->next;
|
||||||
|
|
||||||
|
@ -453,6 +453,80 @@ end:
|
|||||||
evbuffer_free(buf);
|
evbuffer_free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_evbuffer_expand(void *ptr)
|
||||||
|
{
|
||||||
|
char data[4096];
|
||||||
|
struct evbuffer *buf;
|
||||||
|
size_t a,w,u;
|
||||||
|
void *buffer;
|
||||||
|
|
||||||
|
memset(data, 'X', sizeof(data));
|
||||||
|
|
||||||
|
/* Make sure that expand() works on an empty buffer */
|
||||||
|
buf = evbuffer_new();
|
||||||
|
tt_int_op(evbuffer_expand(buf, 20000), ==, 0);
|
||||||
|
evbuffer_validate(buf);
|
||||||
|
a=w=u=0;
|
||||||
|
evbuffer_get_waste(buf, &a,&w,&u);
|
||||||
|
tt_assert(w == 0);
|
||||||
|
tt_assert(u == 0);
|
||||||
|
tt_assert(a >= 20000);
|
||||||
|
tt_assert(buf->first);
|
||||||
|
tt_assert(buf->first == buf->last);
|
||||||
|
tt_assert(buf->first->off == 0);
|
||||||
|
tt_assert(buf->first->buffer_len >= 20000);
|
||||||
|
|
||||||
|
/* Make sure that expand() works as a no-op when there's enough
|
||||||
|
* contiguous space already. */
|
||||||
|
buffer = buf->first->buffer;
|
||||||
|
evbuffer_add(buf, data, 1024);
|
||||||
|
tt_int_op(evbuffer_expand(buf, 1024), ==, 0);
|
||||||
|
tt_assert(buf->first->buffer == buffer);
|
||||||
|
evbuffer_validate(buf);
|
||||||
|
evbuffer_free(buf);
|
||||||
|
|
||||||
|
/* Make sure that expand() can work by moving misaligned data
|
||||||
|
* when it makes sense to do so. */
|
||||||
|
buf = evbuffer_new();
|
||||||
|
evbuffer_add(buf, data, 400);
|
||||||
|
{
|
||||||
|
int n = buf->first->buffer_len - buf->first->off - 1;
|
||||||
|
tt_assert(n < sizeof(data));
|
||||||
|
evbuffer_add(buf, data, n);
|
||||||
|
}
|
||||||
|
tt_assert(buf->first == buf->last);
|
||||||
|
tt_assert(buf->first->off == buf->first->buffer_len - 1);
|
||||||
|
evbuffer_drain(buf, buf->first->off - 1);
|
||||||
|
tt_assert(1 == evbuffer_get_length(buf));
|
||||||
|
tt_assert(buf->first->misalign > 0);
|
||||||
|
tt_assert(buf->first->off == 1);
|
||||||
|
buffer = buf->first->buffer;
|
||||||
|
tt_assert(evbuffer_expand(buf, 40) == 0);
|
||||||
|
tt_assert(buf->first == buf->last);
|
||||||
|
tt_assert(buf->first->off == 1);
|
||||||
|
tt_assert(buf->first->buffer == buffer);
|
||||||
|
tt_assert(buf->first->misalign == 0);
|
||||||
|
evbuffer_validate(buf);
|
||||||
|
evbuffer_free(buf);
|
||||||
|
|
||||||
|
/* add, expand, pull-up: This used to crash libevent. */
|
||||||
|
buf = evbuffer_new();
|
||||||
|
|
||||||
|
evbuffer_add(buf, data, sizeof(data));
|
||||||
|
evbuffer_add(buf, data, sizeof(data));
|
||||||
|
evbuffer_add(buf, data, sizeof(data));
|
||||||
|
|
||||||
|
evbuffer_validate(buf);
|
||||||
|
evbuffer_expand(buf, 1024);
|
||||||
|
evbuffer_validate(buf);
|
||||||
|
evbuffer_pullup(buf, -1);
|
||||||
|
evbuffer_validate(buf);
|
||||||
|
|
||||||
|
end:
|
||||||
|
evbuffer_free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int reference_cb_called;
|
static int reference_cb_called;
|
||||||
static void
|
static void
|
||||||
@ -1449,6 +1523,7 @@ struct testcase_t evbuffer_testcases[] = {
|
|||||||
{ "reserve_many", test_evbuffer_reserve_many, 0, NULL, NULL },
|
{ "reserve_many", test_evbuffer_reserve_many, 0, NULL, NULL },
|
||||||
{ "reserve_many2", test_evbuffer_reserve_many, 0, &nil_setup, (void*)"add" },
|
{ "reserve_many2", test_evbuffer_reserve_many, 0, &nil_setup, (void*)"add" },
|
||||||
{ "reserve_many3", test_evbuffer_reserve_many, 0, &nil_setup, (void*)"fill" },
|
{ "reserve_many3", test_evbuffer_reserve_many, 0, &nil_setup, (void*)"fill" },
|
||||||
|
{ "expand", test_evbuffer_expand, 0, NULL, NULL },
|
||||||
{ "reference", test_evbuffer_reference, 0, NULL, NULL },
|
{ "reference", test_evbuffer_reference, 0, NULL, NULL },
|
||||||
{ "iterative", test_evbuffer_iterative, 0, NULL, NULL },
|
{ "iterative", test_evbuffer_iterative, 0, NULL, NULL },
|
||||||
{ "readln", test_evbuffer_readln, TT_NO_LOGS, &basic_setup, NULL },
|
{ "readln", test_evbuffer_readln, TT_NO_LOGS, &basic_setup, NULL },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user