@@ -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+
322426void 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+ }
0 commit comments