mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-09 12:28:19 -04:00
Unit tests for evbuffer callback manipulation
svn:r1090
This commit is contained in:
parent
2e50658d8d
commit
e3e1153109
@ -253,7 +253,7 @@ test_evbuffer_reference(void *ptr)
|
||||
evbuffer_validate(src);
|
||||
evbuffer_validate(dst);
|
||||
|
||||
tt_int_op(reference_cb_called);
|
||||
tt_int_op(reference_cb_called, ==, 1);
|
||||
|
||||
tt_assert(!memcmp(evbuffer_pullup(dst, strlen(data)),
|
||||
data, strlen(data)));
|
||||
@ -507,12 +507,84 @@ end:
|
||||
evbuffer_free(buf);
|
||||
}
|
||||
|
||||
static void
|
||||
log_change_callback(struct evbuffer *buffer, size_t old_len, size_t new_len,
|
||||
void *arg)
|
||||
{
|
||||
struct evbuffer *out = arg;
|
||||
evbuffer_add_printf(out, "%lu->%lu; ", (unsigned long)old_len,
|
||||
(unsigned long)new_len);
|
||||
}
|
||||
static void
|
||||
self_draining_callback(struct evbuffer *evbuffer, size_t old_len,
|
||||
size_t new_len, void *arg)
|
||||
{
|
||||
if (new_len > old_len)
|
||||
evbuffer_drain(evbuffer, new_len);
|
||||
}
|
||||
|
||||
static void
|
||||
test_evbuffer_callbacks(void *ptr)
|
||||
{
|
||||
struct evbuffer *buf = evbuffer_new();
|
||||
struct evbuffer *buf_out1 = evbuffer_new();
|
||||
struct evbuffer *buf_out2 = evbuffer_new();
|
||||
struct evbuffer_cb_entry *cb1, *cb2;
|
||||
|
||||
cb1 = evbuffer_add_cb(buf, log_change_callback, buf_out1);
|
||||
cb2 = evbuffer_add_cb(buf, log_change_callback, buf_out2);
|
||||
|
||||
/* Let's run through adding and deleting some stuff from the buffer
|
||||
* and turning the callbacks on and off and removing them. The callback
|
||||
* adds a summary of length changes to buf_out1/buf_out2 when called. */
|
||||
/* size: 0-> 36. */
|
||||
evbuffer_add_printf(buf, "The %d magic words are spotty pudding", 2);
|
||||
evbuffer_cb_set_flags(buf, cb2, 0);
|
||||
evbuffer_drain(buf, 10); /*36->26*/
|
||||
evbuffer_prepend(buf, "Hello", 5);/*26->31*/
|
||||
evbuffer_cb_set_flags(buf, cb2, EVBUFFER_CB_ENABLED);
|
||||
evbuffer_add_reference(buf, "Goodbye", 7, NULL, NULL); /*31->38*/
|
||||
evbuffer_remove_cb_entry(buf, cb1);
|
||||
evbuffer_drain(buf, EVBUFFER_LENGTH(buf)); /*38->0*/;
|
||||
tt_assert(-1 == evbuffer_remove_cb(buf, log_change_callback, NULL));
|
||||
evbuffer_add(buf, "X", 1); /* 0->1 */
|
||||
tt_assert(!evbuffer_remove_cb(buf, log_change_callback, buf_out2));
|
||||
|
||||
tt_str_op(evbuffer_pullup(buf_out1, -1), ==,
|
||||
"0->36; 36->26; 26->31; 31->38; ");
|
||||
tt_str_op(evbuffer_pullup(buf_out2, -1), ==,
|
||||
"0->36; 31->38; 38->0; 0->1; ");
|
||||
evbuffer_drain(buf_out1, EVBUFFER_LENGTH(buf_out1));
|
||||
evbuffer_drain(buf_out2, EVBUFFER_LENGTH(buf_out2));
|
||||
|
||||
/* Let's test the obsolete buffer_setcb function too. */
|
||||
cb1 = evbuffer_add_cb(buf, log_change_callback, buf_out1);
|
||||
cb2 = evbuffer_add_cb(buf, log_change_callback, buf_out2);
|
||||
evbuffer_setcb(buf, self_draining_callback, NULL);
|
||||
evbuffer_add_printf(buf, "This should get drained right away.");
|
||||
tt_uint_op(EVBUFFER_LENGTH(buf), ==, 0);
|
||||
tt_uint_op(EVBUFFER_LENGTH(buf_out1), ==, 0);
|
||||
tt_uint_op(EVBUFFER_LENGTH(buf_out2), ==, 0);
|
||||
evbuffer_setcb(buf, NULL, NULL);
|
||||
evbuffer_add_printf(buf, "This will not.");
|
||||
tt_str_op(evbuffer_pullup(buf, -1), ==, "This will not.");
|
||||
|
||||
end:
|
||||
if (buf)
|
||||
evbuffer_free(buf);
|
||||
if (buf_out1)
|
||||
evbuffer_free(buf_out1);
|
||||
if (buf_out2)
|
||||
evbuffer_free(buf_out2);
|
||||
}
|
||||
|
||||
struct testcase_t evbuffer_testcases[] = {
|
||||
{ "evbuffer", test_evbuffer, 0, NULL, NULL },
|
||||
{ "reference", test_evbuffer_reference, 0, NULL, NULL },
|
||||
{ "iterative", test_evbuffer_iterative, 0, NULL, NULL },
|
||||
{ "readln", test_evbuffer_readln, 0, NULL, NULL },
|
||||
{ "find", test_evbuffer_find, 0, NULL, NULL },
|
||||
{ "callbacks", test_evbuffer_callbacks, 0, NULL, NULL },
|
||||
|
||||
END_OF_TESTCASES
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user