diff --git a/tests/main.c b/tests/main.c index f4890f08..e4f4900f 100644 --- a/tests/main.c +++ b/tests/main.c @@ -383,6 +383,8 @@ int main(int argc _U_, char *argv[] _U_) { !CU_add_test(pSuite, "hd_no_index", test_nghttp2_hd_no_index) || !CU_add_test(pSuite, "hd_deflate_bound", test_nghttp2_hd_deflate_bound) || !CU_add_test(pSuite, "hd_public_api", test_nghttp2_hd_public_api) || + !CU_add_test(pSuite, "hd_deflate_hd_vec", + test_nghttp2_hd_deflate_hd_vec) || !CU_add_test(pSuite, "hd_decode_length", test_nghttp2_hd_decode_length) || !CU_add_test(pSuite, "hd_huff_encode", test_nghttp2_hd_huff_encode) || !CU_add_test(pSuite, "adjust_local_window_size", diff --git a/tests/nghttp2_hd_test.c b/tests/nghttp2_hd_test.c index 3d8ab83b..0e74d752 100644 --- a/tests/nghttp2_hd_test.c +++ b/tests/nghttp2_hd_test.c @@ -1265,6 +1265,57 @@ void test_nghttp2_hd_public_api(void) { nghttp2_hd_deflate_del(deflater); } +void test_nghttp2_hd_deflate_hd_vec(void) { + nghttp2_hd_deflater *deflater; + nghttp2_hd_inflater *inflater; + nghttp2_nv nva[] = { + MAKE_NV(":method", "PUT"), MAKE_NV(":scheme", "https"), + MAKE_NV(":authority", "localhost:3000"), + MAKE_NV(":path", "/usr/foo/alpha/bravo"), + MAKE_NV("content-type", "image/png"), + MAKE_NV("content-length", "1000000007"), + }; + uint8_t buf[4096]; + ssize_t blocklen; + nghttp2_mem *mem; + uint8_t *bufsin[2]; + size_t buflens[2] = {0}; + size_t buflen; + nghttp2_bufs bufs; + nva_out out; + + mem = nghttp2_mem_default(); + + nva_out_init(&out); + + nghttp2_hd_deflate_new(&deflater, 4096); + nghttp2_hd_inflate_new(&inflater); + + buflen = nghttp2_hd_deflate_bound(deflater, nva, ARRLEN(nva)); + + bufsin[0] = &buf[0]; + bufsin[1] = &buf[buflen / 2]; + + blocklen = nghttp2_hd_deflate_hd_vec(deflater, bufsin, ARRLEN(bufsin), + buflen / 2, buflens, nva, ARRLEN(nva)); + + CU_ASSERT(blocklen > 0); + + nghttp2_bufs_wrap_init(&bufs, buf, (size_t)blocklen, mem); + bufs.head->buf.last += blocklen; + + CU_ASSERT(blocklen == inflate_hd(inflater, &out, &bufs, 0, mem)); + + CU_ASSERT(ARRLEN(nva) == out.nvlen); + assert_nv_equal(nva, out.nva, ARRLEN(nva), mem); + + nghttp2_bufs_wrap_free(&bufs); + + nghttp2_hd_inflate_del(inflater); + nghttp2_hd_deflate_del(deflater); + nva_out_reset(&out, mem); +} + static size_t encode_length(uint8_t *buf, uint64_t n, size_t prefix) { size_t k = (size_t)((1 << prefix) - 1); size_t len = 0; diff --git a/tests/nghttp2_hd_test.h b/tests/nghttp2_hd_test.h index bf28282c..ab5fcae6 100644 --- a/tests/nghttp2_hd_test.h +++ b/tests/nghttp2_hd_test.h @@ -47,6 +47,7 @@ void test_nghttp2_hd_deflate_inflate(void); void test_nghttp2_hd_no_index(void); void test_nghttp2_hd_deflate_bound(void); void test_nghttp2_hd_public_api(void); +void test_nghttp2_hd_deflate_hd_vec(void); void test_nghttp2_hd_decode_length(void); void test_nghttp2_hd_huff_encode(void);