Skip to content

Commit 9be23c1

Browse files
authored
Merge pull request #330 from ngtcp2/add-tests
Add tests
2 parents b7f9c79 + ccfc423 commit 9be23c1

File tree

4 files changed

+243
-0
lines changed

4 files changed

+243
-0
lines changed

tests/nghttp3_conn_test.c

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ static const MunitTest tests[] = {
6363
munit_void_test(test_nghttp3_conn_stream_data_overflow),
6464
munit_void_test(test_nghttp3_conn_get_frame_payload_left),
6565
munit_void_test(test_nghttp3_conn_update_ack_offset),
66+
munit_void_test(test_nghttp3_conn_set_client_stream_priority),
6667
munit_test_end(),
6768
};
6869

@@ -319,6 +320,109 @@ static int recv_settings(nghttp3_conn *conn, const nghttp3_settings *settings,
319320
return 0;
320321
}
321322

323+
typedef struct conn_options {
324+
nghttp3_callbacks *callbacks;
325+
nghttp3_settings *settings;
326+
int64_t control_stream_id;
327+
int64_t qenc_stream_id;
328+
int64_t qdec_stream_id;
329+
void *user_data;
330+
} conn_options;
331+
332+
static void setup_default_client_with_options(nghttp3_conn **pconn,
333+
conn_options opts) {
334+
const nghttp3_mem *mem = nghttp3_mem_default();
335+
nghttp3_callbacks callbacks;
336+
nghttp3_settings settings;
337+
int rv;
338+
339+
if (opts.callbacks == NULL) {
340+
memset(&callbacks, 0, sizeof(callbacks));
341+
opts.callbacks = &callbacks;
342+
}
343+
344+
if (opts.settings == NULL) {
345+
nghttp3_settings_default(&settings);
346+
opts.settings = &settings;
347+
}
348+
349+
if (opts.control_stream_id == 0) {
350+
opts.control_stream_id = 2;
351+
}
352+
353+
if (opts.qenc_stream_id == 0) {
354+
opts.qenc_stream_id = 6;
355+
}
356+
357+
if (opts.qdec_stream_id == 0) {
358+
opts.qdec_stream_id = 10;
359+
}
360+
361+
rv = nghttp3_conn_client_new(pconn, opts.callbacks, opts.settings, mem,
362+
opts.user_data);
363+
364+
assert_int(0, ==, rv);
365+
366+
nghttp3_conn_bind_control_stream(*pconn, opts.control_stream_id);
367+
nghttp3_conn_bind_qpack_streams(*pconn, opts.qenc_stream_id,
368+
opts.qdec_stream_id);
369+
}
370+
371+
static void setup_default_client(nghttp3_conn **pconn) {
372+
conn_options opts = {0};
373+
374+
setup_default_client_with_options(pconn, opts);
375+
}
376+
377+
static void conn_write_initial_streams(nghttp3_conn *conn) {
378+
nghttp3_vec vec[256];
379+
nghttp3_ssize sveccnt;
380+
int64_t stream_id;
381+
int fin;
382+
int rv;
383+
384+
sveccnt = nghttp3_conn_writev_stream(conn, &stream_id, &fin, vec,
385+
nghttp3_arraylen(vec));
386+
387+
assert_ptrdiff(1, ==, sveccnt);
388+
assert_int64(conn->tx.ctrl->node.id, ==, stream_id);
389+
assert_false(fin);
390+
391+
rv = nghttp3_conn_add_write_offset(
392+
conn, stream_id, (size_t)nghttp3_vec_len(vec, (size_t)sveccnt));
393+
394+
assert_int(0, ==, rv);
395+
396+
sveccnt = nghttp3_conn_writev_stream(conn, &stream_id, &fin, vec,
397+
nghttp3_arraylen(vec));
398+
399+
assert_ptrdiff(1, ==, sveccnt);
400+
assert_int64(conn->tx.qdec->node.id, ==, stream_id);
401+
assert_false(fin);
402+
403+
rv = nghttp3_conn_add_write_offset(
404+
conn, stream_id, (size_t)nghttp3_vec_len(vec, (size_t)sveccnt));
405+
406+
assert_int(0, ==, rv);
407+
408+
sveccnt = nghttp3_conn_writev_stream(conn, &stream_id, &fin, vec,
409+
nghttp3_arraylen(vec));
410+
411+
assert_ptrdiff(1, ==, sveccnt);
412+
assert_int64(conn->tx.qenc->node.id, ==, stream_id);
413+
assert_false(fin);
414+
415+
rv = nghttp3_conn_add_write_offset(
416+
conn, stream_id, (size_t)nghttp3_vec_len(vec, (size_t)sveccnt));
417+
418+
assert_int(0, ==, rv);
419+
420+
sveccnt = nghttp3_conn_writev_stream(conn, &stream_id, &fin, vec,
421+
nghttp3_arraylen(vec));
422+
423+
assert_ptrdiff(0, ==, sveccnt);
424+
}
425+
322426
void test_nghttp3_conn_read_control(void) {
323427
const nghttp3_mem *mem = nghttp3_mem_default();
324428
nghttp3_conn *conn;
@@ -3846,3 +3950,59 @@ void test_nghttp3_conn_update_ack_offset(void) {
38463950

38473951
nghttp3_conn_del(conn);
38483952
}
3953+
3954+
void test_nghttp3_conn_set_client_stream_priority(void) {
3955+
nghttp3_conn *conn;
3956+
static const nghttp3_nv nva[] = {
3957+
MAKE_NV(":path", "/"),
3958+
MAKE_NV(":authority", "example.com"),
3959+
MAKE_NV(":scheme", "https"),
3960+
MAKE_NV(":method", "GET"),
3961+
};
3962+
static const uint8_t prihd[] = "u=0";
3963+
nghttp3_vec vec[256];
3964+
nghttp3_ssize sveccnt;
3965+
int64_t stream_id;
3966+
nghttp3_ssize nread;
3967+
nghttp3_frame_priority_update fr;
3968+
int fin;
3969+
int rv;
3970+
3971+
setup_default_client(&conn);
3972+
conn_write_initial_streams(conn);
3973+
3974+
rv = nghttp3_conn_submit_request(conn, 0, nva, nghttp3_arraylen(nva), NULL,
3975+
NULL);
3976+
3977+
assert_int(0, ==, rv);
3978+
3979+
rv = nghttp3_conn_set_client_stream_priority(conn, 0, prihd, strsize(prihd));
3980+
3981+
assert_int(0, ==, rv);
3982+
3983+
sveccnt = nghttp3_conn_writev_stream(conn, &stream_id, &fin, vec,
3984+
nghttp3_arraylen(vec));
3985+
3986+
assert_ptrdiff(1, ==, sveccnt);
3987+
assert_int64(2, ==, stream_id);
3988+
3989+
nread = nghttp3_decode_priority_update_frame(&fr, vec, (size_t)sveccnt);
3990+
3991+
assert_ptrdiff((nghttp3_ssize)nghttp3_vec_len(vec, (size_t)sveccnt), ==,
3992+
nread);
3993+
assert_int64(NGHTTP3_FRAME_PRIORITY_UPDATE, ==, fr.hd.type);
3994+
assert_memn_equal(prihd, strsize(prihd), fr.data, fr.datalen);
3995+
3996+
rv = nghttp3_conn_add_write_offset(
3997+
conn, stream_id, (size_t)nghttp3_vec_len(vec, (size_t)sveccnt));
3998+
3999+
assert_int(0, ==, rv);
4000+
4001+
sveccnt = nghttp3_conn_writev_stream(conn, &stream_id, &fin, vec,
4002+
nghttp3_arraylen(vec));
4003+
4004+
assert_ptrdiff(1, ==, sveccnt);
4005+
assert_int64(0, ==, stream_id);
4006+
4007+
nghttp3_conn_del(conn);
4008+
}

tests/nghttp3_conn_test.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,6 @@ munit_void_test_decl(test_nghttp3_conn_shutdown_stream_read)
6262
munit_void_test_decl(test_nghttp3_conn_stream_data_overflow)
6363
munit_void_test_decl(test_nghttp3_conn_get_frame_payload_left)
6464
munit_void_test_decl(test_nghttp3_conn_update_ack_offset)
65+
munit_void_test_decl(test_nghttp3_conn_set_client_stream_priority)
6566

6667
#endif /* !defined(NGHTTP3_CONN_TEST_H) */

tests/nghttp3_test_helper.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,63 @@ void nghttp3_write_frame_data(nghttp3_buf *dest, size_t len) {
140140
memset(dest->last, 0, len);
141141
dest->last += len;
142142
}
143+
144+
nghttp3_ssize nghttp3_decode_frame_hd(nghttp3_frame_hd *hd,
145+
const nghttp3_vec *vec, size_t veccnt) {
146+
const uint8_t *p = vec->base;
147+
size_t len = 2;
148+
size_t vlen;
149+
150+
if (veccnt == 0 || vec->len < len) {
151+
return NGHTTP3_ERR_INVALID_ARGUMENT;
152+
}
153+
154+
vlen = nghttp3_get_varintlen(p);
155+
len += vlen;
156+
if (len > vec->len) {
157+
return NGHTTP3_ERR_INVALID_ARGUMENT;
158+
}
159+
160+
p = nghttp3_get_varint(&hd->type, p);
161+
162+
vlen = nghttp3_get_varintlen(p);
163+
len += vlen;
164+
if (len > vec->len) {
165+
return NGHTTP3_ERR_INVALID_ARGUMENT;
166+
}
167+
168+
p = nghttp3_get_varint(&hd->length, p);
169+
170+
return p - vec->base;
171+
}
172+
173+
nghttp3_ssize
174+
nghttp3_decode_priority_update_frame(nghttp3_frame_priority_update *fr,
175+
const nghttp3_vec *vec, size_t veccnt) {
176+
const uint8_t *p = vec->base;
177+
size_t vlen;
178+
nghttp3_ssize hdlen;
179+
180+
hdlen = nghttp3_decode_frame_hd(&fr->hd, vec, veccnt);
181+
if (hdlen < 0) {
182+
return hdlen;
183+
}
184+
185+
if (fr->hd.length == 0 || (size_t)hdlen + (size_t)fr->hd.length > vec->len) {
186+
return NGHTTP3_ERR_INVALID_ARGUMENT;
187+
}
188+
189+
p += hdlen;
190+
191+
vlen = nghttp3_get_varintlen(p);
192+
if (vlen > (size_t)fr->hd.length) {
193+
return NGHTTP3_ERR_INVALID_ARGUMENT;
194+
}
195+
196+
p = nghttp3_get_varint(&fr->pri_elem_id, p);
197+
198+
fr->data = (uint8_t *)p;
199+
fr->datalen = (size_t)fr->hd.length - vlen;
200+
201+
return hdlen + (nghttp3_ssize)fr->hd.length;
202+
}

tests/nghttp3_test_helper.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@
4141
.valuelen = sizeof((VALUE)) - 1, \
4242
}
4343

44+
/*
45+
* strsize macro returns the length of string literal |S|.
46+
*/
47+
#define strsize(S) (sizeof(S) - 1)
48+
4449
/*
4550
* nghttp3_write_frame writes |fr| to |dest|. This function
4651
* calculates the payload length and assigns it to fr->hd.length;
@@ -71,4 +76,21 @@ void nghttp3_write_frame_qpack_dyn(nghttp3_buf *dest, nghttp3_buf *ebuf,
7176
*/
7277
void nghttp3_write_frame_data(nghttp3_buf *dest, size_t len);
7378

79+
/*
80+
* nghttp3_decode_frame_hd decodes frame header out of |vec| of length
81+
* |veccnt|. It returns the number of bytes read if it succeeds, or
82+
* negative error code.
83+
*/
84+
nghttp3_ssize nghttp3_decode_frame_hd(nghttp3_frame_hd *hd,
85+
const nghttp3_vec *vec, size_t veccnt);
86+
87+
/*
88+
* nghttp3_decode_priority_update_frame decodes PRIORITY_UPDATE frame
89+
* out of |vec| of length |veccnt|. It returns the number of bytes
90+
* read if it succeeds, or a negative error code.
91+
*/
92+
nghttp3_ssize
93+
nghttp3_decode_priority_update_frame(nghttp3_frame_priority_update *fr,
94+
const nghttp3_vec *vec, size_t veccnt);
95+
7496
#endif /* !defined(NGHTTP3_TEST_HELPER) */

0 commit comments

Comments
 (0)