Add tests
This commit is contained in:
parent
3785cf07ba
commit
d9893d014c
|
@ -97,6 +97,8 @@ int main(int argc _U_, char *argv[] _U_) {
|
||||||
test_nghttp2_session_recv_settings_header_table_size) ||
|
test_nghttp2_session_recv_settings_header_table_size) ||
|
||||||
!CU_add_test(pSuite, "session_recv_too_large_frame_length",
|
!CU_add_test(pSuite, "session_recv_too_large_frame_length",
|
||||||
test_nghttp2_session_recv_too_large_frame_length) ||
|
test_nghttp2_session_recv_too_large_frame_length) ||
|
||||||
|
!CU_add_test(pSuite, "session_recv_extension",
|
||||||
|
test_nghttp2_session_recv_extension) ||
|
||||||
!CU_add_test(pSuite, "session_continue", test_nghttp2_session_continue) ||
|
!CU_add_test(pSuite, "session_continue", test_nghttp2_session_continue) ||
|
||||||
!CU_add_test(pSuite, "session_add_frame",
|
!CU_add_test(pSuite, "session_add_frame",
|
||||||
test_nghttp2_session_add_frame) ||
|
test_nghttp2_session_add_frame) ||
|
||||||
|
@ -186,6 +188,7 @@ int main(int argc _U_, char *argv[] _U_) {
|
||||||
test_nghttp2_submit_shutdown_notice) ||
|
test_nghttp2_submit_shutdown_notice) ||
|
||||||
!CU_add_test(pSuite, "submit_invalid_nv",
|
!CU_add_test(pSuite, "submit_invalid_nv",
|
||||||
test_nghttp2_submit_invalid_nv) ||
|
test_nghttp2_submit_invalid_nv) ||
|
||||||
|
!CU_add_test(pSuite, "submit_extension", test_nghttp2_submit_extension) ||
|
||||||
!CU_add_test(pSuite, "session_open_stream",
|
!CU_add_test(pSuite, "session_open_stream",
|
||||||
test_nghttp2_session_open_stream) ||
|
test_nghttp2_session_open_stream) ||
|
||||||
!CU_add_test(pSuite, "session_open_stream_with_idle_stream_dep",
|
!CU_add_test(pSuite, "session_open_stream_with_idle_stream_dep",
|
||||||
|
|
|
@ -58,6 +58,7 @@ typedef struct {
|
||||||
scripted_data_feed *df;
|
scripted_data_feed *df;
|
||||||
int frame_recv_cb_called, invalid_frame_recv_cb_called;
|
int frame_recv_cb_called, invalid_frame_recv_cb_called;
|
||||||
uint8_t recv_frame_type;
|
uint8_t recv_frame_type;
|
||||||
|
nghttp2_frame_hd recv_frame_hd;
|
||||||
int frame_send_cb_called;
|
int frame_send_cb_called;
|
||||||
uint8_t sent_frame_type;
|
uint8_t sent_frame_type;
|
||||||
int frame_not_send_cb_called;
|
int frame_not_send_cb_called;
|
||||||
|
@ -77,6 +78,7 @@ typedef struct {
|
||||||
size_t data_chunk_len;
|
size_t data_chunk_len;
|
||||||
size_t padlen;
|
size_t padlen;
|
||||||
int begin_frame_cb_called;
|
int begin_frame_cb_called;
|
||||||
|
nghttp2_buf scratchbuf;
|
||||||
} my_user_data;
|
} my_user_data;
|
||||||
|
|
||||||
static const nghttp2_nv reqnv[] = {
|
static const nghttp2_nv reqnv[] = {
|
||||||
|
@ -179,6 +181,8 @@ static int on_frame_recv_callback(nghttp2_session *session _U_,
|
||||||
my_user_data *ud = (my_user_data *)user_data;
|
my_user_data *ud = (my_user_data *)user_data;
|
||||||
++ud->frame_recv_cb_called;
|
++ud->frame_recv_cb_called;
|
||||||
ud->recv_frame_type = frame->hd.type;
|
ud->recv_frame_type = frame->hd.type;
|
||||||
|
ud->recv_frame_hd = frame->hd;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -430,6 +434,55 @@ static int on_stream_close_callback(nghttp2_session *session _U_,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t pack_extension_callback(nghttp2_session *session _U_,
|
||||||
|
uint8_t *flags _U_, uint8_t *buf,
|
||||||
|
size_t len _U_,
|
||||||
|
const nghttp2_frame *frame,
|
||||||
|
void *user_data _U_) {
|
||||||
|
nghttp2_buf *p = frame->ext.payload;
|
||||||
|
|
||||||
|
memcpy(buf, p->pos, nghttp2_buf_len(p));
|
||||||
|
|
||||||
|
return (ssize_t)nghttp2_buf_len(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int on_extension_chunk_recv_callback(nghttp2_session *session _U_,
|
||||||
|
const nghttp2_frame_hd *hd _U_,
|
||||||
|
const uint8_t *data, size_t len,
|
||||||
|
void *user_data) {
|
||||||
|
my_user_data *my_data = (my_user_data *)user_data;
|
||||||
|
nghttp2_buf *buf = &my_data->scratchbuf;
|
||||||
|
|
||||||
|
buf->last = nghttp2_cpymem(buf->last, data, len);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cancel_on_extension_chunk_recv_callback(
|
||||||
|
nghttp2_session *session _U_, const nghttp2_frame_hd *hd _U_,
|
||||||
|
const uint8_t *data _U_, size_t len _U_, void *user_data _U_) {
|
||||||
|
return NGHTTP2_ERR_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int unpack_extension_callback(nghttp2_session *session _U_,
|
||||||
|
void **payload,
|
||||||
|
const nghttp2_frame_hd *hd _U_,
|
||||||
|
void *user_data) {
|
||||||
|
my_user_data *my_data = (my_user_data *)user_data;
|
||||||
|
nghttp2_buf *buf = &my_data->scratchbuf;
|
||||||
|
|
||||||
|
*payload = buf;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cancel_unpack_extension_callback(nghttp2_session *session _U_,
|
||||||
|
void **payload _U_,
|
||||||
|
const nghttp2_frame_hd *hd _U_,
|
||||||
|
void *user_data _U_) {
|
||||||
|
return NGHTTP2_ERR_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
static nghttp2_settings_entry *dup_iv(const nghttp2_settings_entry *iv,
|
static nghttp2_settings_entry *dup_iv(const nghttp2_settings_entry *iv,
|
||||||
size_t niv) {
|
size_t niv) {
|
||||||
return nghttp2_frame_iv_copy(iv, niv, nghttp2_mem_default());
|
return nghttp2_frame_iv_copy(iv, niv, nghttp2_mem_default());
|
||||||
|
@ -1707,6 +1760,81 @@ void test_nghttp2_session_recv_too_large_frame_length(void) {
|
||||||
nghttp2_session_del(session);
|
nghttp2_session_del(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_nghttp2_session_recv_extension(void) {
|
||||||
|
nghttp2_session *session;
|
||||||
|
nghttp2_session_callbacks callbacks;
|
||||||
|
my_user_data ud;
|
||||||
|
nghttp2_buf buf;
|
||||||
|
nghttp2_frame_hd hd;
|
||||||
|
nghttp2_mem *mem;
|
||||||
|
const char data[] = "Hello World!";
|
||||||
|
ssize_t rv;
|
||||||
|
|
||||||
|
mem = nghttp2_mem_default();
|
||||||
|
|
||||||
|
memset(&callbacks, 0, sizeof(nghttp2_session_callbacks));
|
||||||
|
|
||||||
|
callbacks.on_extension_chunk_recv_callback = on_extension_chunk_recv_callback;
|
||||||
|
callbacks.unpack_extension_callback = unpack_extension_callback;
|
||||||
|
callbacks.on_frame_recv_callback = on_frame_recv_callback;
|
||||||
|
|
||||||
|
nghttp2_buf_init2(&ud.scratchbuf, 4096, mem);
|
||||||
|
nghttp2_buf_init2(&buf, 4096, mem);
|
||||||
|
|
||||||
|
nghttp2_frame_hd_init(&hd, sizeof(data), 111, 0xab, 1000000007);
|
||||||
|
nghttp2_frame_pack_frame_hd(buf.last, &hd);
|
||||||
|
buf.last += NGHTTP2_FRAME_HDLEN;
|
||||||
|
buf.last = nghttp2_cpymem(buf.last, data, sizeof(data));
|
||||||
|
|
||||||
|
nghttp2_session_client_new(&session, &callbacks, &ud);
|
||||||
|
|
||||||
|
nghttp2_frame_hd_init(&ud.recv_frame_hd, 0, 0, 0, 0);
|
||||||
|
rv = nghttp2_session_mem_recv(session, buf.pos, nghttp2_buf_len(&buf));
|
||||||
|
|
||||||
|
CU_ASSERT(NGHTTP2_FRAME_HDLEN + hd.length == (size_t)rv);
|
||||||
|
CU_ASSERT(111 == ud.recv_frame_hd.type);
|
||||||
|
CU_ASSERT(0xab == ud.recv_frame_hd.flags);
|
||||||
|
CU_ASSERT(1000000007 == ud.recv_frame_hd.stream_id);
|
||||||
|
CU_ASSERT(0 == memcmp(data, ud.scratchbuf.pos, sizeof(data)));
|
||||||
|
|
||||||
|
nghttp2_session_del(session);
|
||||||
|
|
||||||
|
/* cancel in on_extension_chunk_recv_callback */
|
||||||
|
nghttp2_buf_reset(&ud.scratchbuf);
|
||||||
|
|
||||||
|
callbacks.on_extension_chunk_recv_callback =
|
||||||
|
cancel_on_extension_chunk_recv_callback;
|
||||||
|
|
||||||
|
nghttp2_session_server_new(&session, &callbacks, &ud);
|
||||||
|
|
||||||
|
ud.frame_recv_cb_called = 0;
|
||||||
|
rv = nghttp2_session_mem_recv(session, buf.pos, nghttp2_buf_len(&buf));
|
||||||
|
|
||||||
|
CU_ASSERT(NGHTTP2_FRAME_HDLEN + hd.length == (size_t)rv);
|
||||||
|
CU_ASSERT(0 == ud.frame_recv_cb_called);
|
||||||
|
|
||||||
|
nghttp2_session_del(session);
|
||||||
|
|
||||||
|
/* cancel in unpack_extension_callback */
|
||||||
|
nghttp2_buf_reset(&ud.scratchbuf);
|
||||||
|
|
||||||
|
callbacks.on_extension_chunk_recv_callback = on_extension_chunk_recv_callback;
|
||||||
|
callbacks.unpack_extension_callback = cancel_unpack_extension_callback;
|
||||||
|
|
||||||
|
nghttp2_session_server_new(&session, &callbacks, &ud);
|
||||||
|
|
||||||
|
ud.frame_recv_cb_called = 0;
|
||||||
|
rv = nghttp2_session_mem_recv(session, buf.pos, nghttp2_buf_len(&buf));
|
||||||
|
|
||||||
|
CU_ASSERT(NGHTTP2_FRAME_HDLEN + hd.length == (size_t)rv);
|
||||||
|
CU_ASSERT(0 == ud.frame_recv_cb_called);
|
||||||
|
|
||||||
|
nghttp2_session_del(session);
|
||||||
|
|
||||||
|
nghttp2_buf_free(&buf, mem);
|
||||||
|
nghttp2_buf_free(&ud.scratchbuf, mem);
|
||||||
|
}
|
||||||
|
|
||||||
void test_nghttp2_session_continue(void) {
|
void test_nghttp2_session_continue(void) {
|
||||||
nghttp2_session *session;
|
nghttp2_session *session;
|
||||||
nghttp2_session_callbacks callbacks;
|
nghttp2_session_callbacks callbacks;
|
||||||
|
@ -4691,6 +4819,67 @@ void test_nghttp2_submit_invalid_nv(void) {
|
||||||
nghttp2_session_del(session);
|
nghttp2_session_del(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_nghttp2_submit_extension(void) {
|
||||||
|
nghttp2_session *session;
|
||||||
|
nghttp2_session_callbacks callbacks;
|
||||||
|
my_user_data ud;
|
||||||
|
accumulator acc;
|
||||||
|
nghttp2_mem *mem;
|
||||||
|
const char data[] = "Hello World!";
|
||||||
|
size_t len;
|
||||||
|
int32_t stream_id;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
mem = nghttp2_mem_default();
|
||||||
|
|
||||||
|
memset(&callbacks, 0, sizeof(nghttp2_session_callbacks));
|
||||||
|
|
||||||
|
callbacks.pack_extension_callback = pack_extension_callback;
|
||||||
|
callbacks.send_callback = accumulator_send_callback;
|
||||||
|
|
||||||
|
nghttp2_buf_init2(&ud.scratchbuf, 4096, mem);
|
||||||
|
|
||||||
|
nghttp2_session_client_new(&session, &callbacks, &ud);
|
||||||
|
|
||||||
|
ud.scratchbuf.last = nghttp2_cpymem(ud.scratchbuf.last, data, sizeof(data));
|
||||||
|
ud.acc = &acc;
|
||||||
|
|
||||||
|
rv = nghttp2_submit_extension(session, 211, 0x01, 3, &ud.scratchbuf);
|
||||||
|
|
||||||
|
CU_ASSERT(0 == rv);
|
||||||
|
|
||||||
|
acc.length = 0;
|
||||||
|
|
||||||
|
rv = nghttp2_session_send(session);
|
||||||
|
|
||||||
|
CU_ASSERT(0 == rv);
|
||||||
|
CU_ASSERT(NGHTTP2_FRAME_HDLEN + sizeof(data) == acc.length);
|
||||||
|
|
||||||
|
len = nghttp2_get_uint32(acc.buf) >> 8;
|
||||||
|
|
||||||
|
CU_ASSERT(sizeof(data) == len);
|
||||||
|
CU_ASSERT(211 == acc.buf[3]);
|
||||||
|
CU_ASSERT(0x01 == acc.buf[4]);
|
||||||
|
|
||||||
|
stream_id = (int32_t)nghttp2_get_uint32(acc.buf + 5);
|
||||||
|
|
||||||
|
CU_ASSERT(3 == stream_id);
|
||||||
|
CU_ASSERT(0 == memcmp(data, &acc.buf[NGHTTP2_FRAME_HDLEN], sizeof(data)));
|
||||||
|
|
||||||
|
nghttp2_session_del(session);
|
||||||
|
|
||||||
|
/* submitting standard HTTP/2 frame is error */
|
||||||
|
nghttp2_session_server_new(&session, &callbacks, &ud);
|
||||||
|
|
||||||
|
rv = nghttp2_submit_extension(session, NGHTTP2_GOAWAY, NGHTTP2_FLAG_NONE, 0,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
CU_ASSERT(NGHTTP2_ERR_INVALID_ARGUMENT == rv);
|
||||||
|
|
||||||
|
nghttp2_session_del(session);
|
||||||
|
nghttp2_buf_free(&ud.scratchbuf, mem);
|
||||||
|
}
|
||||||
|
|
||||||
void test_nghttp2_session_open_stream(void) {
|
void test_nghttp2_session_open_stream(void) {
|
||||||
nghttp2_session *session;
|
nghttp2_session *session;
|
||||||
nghttp2_session_callbacks callbacks;
|
nghttp2_session_callbacks callbacks;
|
||||||
|
|
|
@ -38,6 +38,7 @@ void test_nghttp2_session_recv_unknown_frame(void);
|
||||||
void test_nghttp2_session_recv_unexpected_continuation(void);
|
void test_nghttp2_session_recv_unexpected_continuation(void);
|
||||||
void test_nghttp2_session_recv_settings_header_table_size(void);
|
void test_nghttp2_session_recv_settings_header_table_size(void);
|
||||||
void test_nghttp2_session_recv_too_large_frame_length(void);
|
void test_nghttp2_session_recv_too_large_frame_length(void);
|
||||||
|
void test_nghttp2_session_recv_extension(void);
|
||||||
void test_nghttp2_session_continue(void);
|
void test_nghttp2_session_continue(void);
|
||||||
void test_nghttp2_session_add_frame(void);
|
void test_nghttp2_session_add_frame(void);
|
||||||
void test_nghttp2_session_on_request_headers_received(void);
|
void test_nghttp2_session_on_request_headers_received(void);
|
||||||
|
@ -85,6 +86,7 @@ void test_nghttp2_submit_window_update(void);
|
||||||
void test_nghttp2_submit_window_update_local_window_size(void);
|
void test_nghttp2_submit_window_update_local_window_size(void);
|
||||||
void test_nghttp2_submit_shutdown_notice(void);
|
void test_nghttp2_submit_shutdown_notice(void);
|
||||||
void test_nghttp2_submit_invalid_nv(void);
|
void test_nghttp2_submit_invalid_nv(void);
|
||||||
|
void test_nghttp2_submit_extension(void);
|
||||||
void test_nghttp2_session_open_stream(void);
|
void test_nghttp2_session_open_stream(void);
|
||||||
void test_nghttp2_session_open_stream_with_idle_stream_dep(void);
|
void test_nghttp2_session_open_stream_with_idle_stream_dep(void);
|
||||||
void test_nghttp2_session_get_next_ob_item(void);
|
void test_nghttp2_session_get_next_ob_item(void);
|
||||||
|
|
Loading…
Reference in New Issue