diff options
author | Nick Mathewson <nickm@torproject.org> | 2011-06-06 15:11:28 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2011-06-06 15:11:28 -0400 |
commit | 4461f1a096621db8b24edafac409e0f05072d35a (patch) | |
tree | 00fac3c75ee8b9f1c3d3d1f7d72c452bb465e545 /test | |
parent | 60c1426f2c16ffe1e4e14b4779e335d824f64aee (diff) | |
download | libevent-4461f1a096621db8b24edafac409e0f05072d35a.tar.gz |
Fix incorrect results from evbuffer_search_eol(EOL_LF)
Our evbuffer_strchr() function [which was only used for
search_eol(EOL_LF) could give incorrect results if it found its answer
in the first chunk but didn't start searching from the front of the
chunk.
Also, this patch adds unit tests for evbuffer_search_eol, particularly
in those cases that evbuffer_readln() tests didn't exercise.
Diffstat (limited to 'test')
-rw-r--r-- | test/regress_buffer.c | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/test/regress_buffer.c b/test/regress_buffer.c index 327210b0..4deaef57 100644 --- a/test/regress_buffer.c +++ b/test/regress_buffer.c @@ -881,7 +881,6 @@ test_evbuffer_readln(void *ptr) free(cp); cp = NULL; evbuffer_validate(evb); - test_ok = 1; end: evbuffer_free(evb); evbuffer_free(evb_tmp); @@ -889,6 +888,57 @@ test_evbuffer_readln(void *ptr) } static void +test_evbuffer_search_eol(void *ptr) +{ + struct evbuffer *buf = evbuffer_new(); + struct evbuffer_ptr ptr1, ptr2; + const char *s; + size_t eol_len; + + s = "string! \r\n\r\nx\n"; + evbuffer_add(buf, s, strlen(s)); + eol_len = -1; + ptr1 = evbuffer_search_eol(buf, NULL, &eol_len, EVBUFFER_EOL_CRLF); + tt_int_op(ptr1.pos, ==, 8); + tt_int_op(eol_len, ==, 2); + + eol_len = -1; + ptr2 = evbuffer_search_eol(buf, &ptr1, &eol_len, EVBUFFER_EOL_CRLF); + tt_int_op(ptr2.pos, ==, 8); + tt_int_op(eol_len, ==, 2); + + evbuffer_ptr_set(buf, &ptr1, 1, EVBUFFER_PTR_ADD); + eol_len = -1; + ptr2 = evbuffer_search_eol(buf, &ptr1, &eol_len, EVBUFFER_EOL_CRLF); + tt_int_op(ptr2.pos, ==, 9); + tt_int_op(eol_len, ==, 1); + + eol_len = -1; + ptr2 = evbuffer_search_eol(buf, &ptr1, &eol_len, EVBUFFER_EOL_CRLF_STRICT); + tt_int_op(ptr2.pos, ==, 10); + tt_int_op(eol_len, ==, 2); + + eol_len = -1; + ptr1 = evbuffer_search_eol(buf, NULL, &eol_len, EVBUFFER_EOL_LF); + tt_int_op(ptr1.pos, ==, 9); + tt_int_op(eol_len, ==, 1); + + eol_len = -1; + ptr2 = evbuffer_search_eol(buf, &ptr1, &eol_len, EVBUFFER_EOL_LF); + tt_int_op(ptr2.pos, ==, 9); + tt_int_op(eol_len, ==, 1); + + evbuffer_ptr_set(buf, &ptr1, 1, EVBUFFER_PTR_ADD); + eol_len = -1; + ptr2 = evbuffer_search_eol(buf, &ptr1, &eol_len, EVBUFFER_EOL_LF); + tt_int_op(ptr2.pos, ==, 11); + tt_int_op(eol_len, ==, 1); + +end: + evbuffer_free(buf); +} + +static void test_evbuffer_iterative(void *ptr) { struct evbuffer *buf = evbuffer_new(); @@ -1074,6 +1124,7 @@ test_evbuffer_search(void *ptr) pos = evbuffer_search_range(buf, "ack", 3, NULL, &end); tt_int_op(pos.pos, ==, -1); + end: if (buf) evbuffer_free(buf); @@ -1548,6 +1599,7 @@ struct testcase_t evbuffer_testcases[] = { { "reference", test_evbuffer_reference, 0, NULL, NULL }, { "iterative", test_evbuffer_iterative, 0, NULL, NULL }, { "readln", test_evbuffer_readln, TT_NO_LOGS, &basic_setup, NULL }, + { "search_eol", test_evbuffer_search_eol, 0, NULL, NULL }, { "find", test_evbuffer_find, 0, NULL, NULL }, { "ptr_set", test_evbuffer_ptr_set, 0, NULL, NULL }, { "search", test_evbuffer_search, 0, NULL, NULL }, |