diff options
author | Fedor Indutny <fedor@indutny.com> | 2016-06-03 13:59:37 -0400 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2016-06-03 13:59:37 -0400 |
commit | 88ffbdbebace7624f934e91c97731f18f3f8ee03 (patch) | |
tree | 18183f3e21aa2551a675bf201c9f2621484501c2 /test/src/test-close.c | |
parent | 1d9649b1ae65b2b119b01a376f5c232982af1b89 (diff) | |
download | uv_link_t-88ffbdbebace7624f934e91c97731f18f3f8ee03.tar.gz |
test: add test for close protection
Diffstat (limited to 'test/src/test-close.c')
-rw-r--r-- | test/src/test-close.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/test/src/test-close.c b/test/src/test-close.c new file mode 100644 index 0000000..bbbaf26 --- /dev/null +++ b/test/src/test-close.c @@ -0,0 +1,68 @@ +#include <sys/socket.h> +#include <unistd.h> + +#include "test-common.h" + +static uv_link_observer_t a; +static uv_link_observer_t b; +static uv_link_observer_t c; + +static int b_reads; +static int c_reads; +static int close_cb_called; + +static void c_close_cb(uv_link_t* l) { + close_cb_called++; +} + + +static void b_read_cb(uv_link_observer_t* o, ssize_t nread, const uv_buf_t* d) { + b_reads |= 1 << nread; + if (nread == 2) { + CHECK_EQ(a.close_depth, 0, "depth check"); + CHECK_EQ(b.close_depth, 2, "depth check"); + CHECK_EQ(c.close_depth, 1, "depth check"); + uv_link_close((uv_link_t*) &c, c_close_cb); + } else { + CHECK_EQ(a.close_depth, 0, "depth check"); + CHECK_EQ(b.close_depth, 1, "depth check"); + CHECK_EQ(c.close_depth, 0, "depth check"); + } +} + + +static void c_read_cb(uv_link_observer_t* o, ssize_t nread, const uv_buf_t* d) { + uv_buf_t tmp; + + CHECK(nread > 0, "c_read_cb nread"); + + c_reads |= 1 << nread; + if (nread == 1) { + uv_link_propagate_alloc_cb((uv_link_t*) &a, nread + 1, &tmp); + uv_link_propagate_read_cb((uv_link_t*) &a, nread + 1, &tmp); + } +} + + +TEST_IMPL(close_depth) { + uv_buf_t tmp; + + CHECK_EQ(uv_link_observer_init(&a), 0, "uv_link_observer_init()"); + CHECK_EQ(uv_link_observer_init(&b), 0, "uv_link_observer_init()"); + CHECK_EQ(uv_link_observer_init(&c), 0, "uv_link_observer_init()"); + + CHECK_EQ(uv_link_chain((uv_link_t*) &a, (uv_link_t*) &b), 0, + "uv_link_observer_chain()"); + CHECK_EQ(uv_link_chain((uv_link_t*) &b, (uv_link_t*) &c), 0, + "uv_link_observer_chain()"); + + b.observer_read_cb = b_read_cb; + c.observer_read_cb = c_read_cb; + + uv_link_propagate_alloc_cb((uv_link_t*) &a, 1, &tmp); + uv_link_propagate_read_cb((uv_link_t*) &a, 1, &tmp); + + CHECK_EQ(close_cb_called, 1, "close_cb must be called"); + CHECK_EQ(b_reads, 6, "b read_cb must be called"); + CHECK_EQ(c_reads, 2, "c read_cb must be called"); +} |