@@ -36,9 +36,18 @@ fn complete_default_pair() -> Result<(), String> {
3636 let expected = json ! ( {
3737 "server" : { "server" : "[::]:8443" , "log_level" : "info" , "users" : { u. uuid. clone( ) : u. password} ,
3838 "tls" : { "hostname" : "tuic.example.com" , "alpn" : [ "h3" ] , "certificate" : "/etc/tuic/fullchain.pem" , "private_key" : "/etc/tuic/privatekey.pem" } ,
39- "backend" : { "mode" : "quinn" , "quinn" : { "congestion_control" : { "controller" : "bbr" } } } } ,
40- "client" : { "server" : "tuic.example.com:8443" , "uuid" : u. uuid, "password" : u. password, "log_level" : "info" , "reconnect" : true , "lazy" : true ,
41- "reconnect_initial_backoff" : "500ms" , "reconnect_max_backoff" : "30000ms" , "tls" : { "sni" : "tuic.example.com" , "alpn" : [ "h3" ] , "skip_cert_verify" : false } , "local" : { "server" : "127.0.0.1:1080" } }
39+ "backend" : { "mode" : "quinn" , "quinn" : { "congestion_control" : { "controller" : "bbr" , "initial_window" : 1048576 } ,
40+ "initial_mtu" : 1200 , "min_mtu" : 1200 , "gso" : true , "pmtu" : true , "send_window" : 16777216 , "receive_window" : 8388608 , "max_idle_time" : "30s" } } ,
41+ "auth_timeout" : "3s" , "stream_timeout" : "60s" ,
42+ "outbound" : { "default" : { "type" : "direct" , "ip_mode" : "v4first" , "tfo" : false } } ,
43+ "experimental" : { "drop_loopback" : true , "drop_private" : true } } ,
44+ "client" : { "server" : "tuic.example.com:8443" , "uuid" : u. uuid, "password" : u. password, "log_level" : "info" ,
45+ "udp_relay_mode" : "native" , "heartbeat" : "3s" , "gc_interval" : "3s" , "gc_lifetime" : "15s" ,
46+ "reconnect" : true , "lazy" : true ,
47+ "reconnect_initial_backoff" : "500ms" , "reconnect_max_backoff" : "30000ms" ,
48+ "tls" : { "sni" : "tuic.example.com" , "alpn" : [ "h3" ] , "skip_cert_verify" : false } ,
49+ "backend" : { "quinn" : { "congestion_control" : { "controller" : "bbr" } , "send_window" : 16777216 , "receive_window" : 8388608 } } ,
50+ "local" : { "server" : "127.0.0.1:1080" } }
4251 } ) ;
4352 assert ! ( build_configs( & s) ? == expected) ;
4453 Ok ( ( ) )
@@ -228,7 +237,7 @@ fn forwarding_arrays_and_conflicts() -> Result<(), String> {
228237}
229238
230239#[ test]
231- fn controllers_and_unsupported_client_fields ( ) -> Result < ( ) , String > {
240+ fn controllers_and_wired_client_transport ( ) -> Result < ( ) , String > {
232241 for ( controller, _) in options ( "controller" ) {
233242 let mut s = ready ( ) ?;
234243 s. controller = controller. clone ( ) ;
@@ -237,9 +246,9 @@ fn controllers_and_unsupported_client_fields() -> Result<(), String> {
237246 c[ "server" ] [ "backend" ] [ "quinn" ] [ "congestion_control" ] [ "controller" ] ,
238247 * controller
239248 ) ;
240- for key in [ "backend" , "udp_relay_mode" , "proxy" ] {
241- assert ! ( c[ "client" ] . get ( key ) . is_none ( ) ) ;
242- }
249+ assert_eq ! ( c [ "client" ] [ "udp_relay_mode" ] , "native" ) ;
250+ assert_eq ! ( c[ "client" ] [ "backend" ] [ "quinn" ] [ "congestion_control" ] [ "controller" ] , "bbr" ) ;
251+ assert ! ( c [ "client" ] . get ( "proxy" ) . is_none ( ) ) ;
243252 assert ! ( c[ "client" ] [ "tls" ] . get( "certificates" ) . is_none( ) ) ;
244253 }
245254 Ok ( ( ) )
@@ -291,3 +300,72 @@ fn form_dsl_binding_and_visibility() -> Result<(), String> {
291300 assert ! ( certificate. is_some_and( |f| !f. visible( & s) ) ) ;
292301 Ok ( ( ) )
293302}
303+
304+ fn outbound_row ( id : u64 , name : & str , kind : & str ) -> serde_json:: Value {
305+ json ! ( { "id" : id, "name" : name, "type" : kind, "ipMode" : "v4first" , "bindIpv4" : "" , "bindIpv6" : "" ,
306+ "bindDevice" : "" , "tfo" : false , "routingMarkEnabled" : false , "routingMark" : "" ,
307+ "socksAddr" : "" , "socksUsername" : "" , "socksPassword" : "" , "allowUdp" : false } )
308+ }
309+
310+ #[ test]
311+ fn server_advanced_sections_cover_dev7 ( ) -> Result < ( ) , String > {
312+ let mut s = ready ( ) ?;
313+ s. extra . insert ( "logEnabled" . into ( ) , json ! ( true ) ) ;
314+ s. extra . insert ( "logFile" . into ( ) , json ! ( "/var/log/tuic/server.log" ) ) ;
315+ s. extra . insert ( "backendMode" . into ( ) , json ! ( "quiche" ) ) ;
316+ s. extra . insert ( "dnsEnabled" . into ( ) , json ! ( true ) ) ;
317+ s. extra . insert ( "dnsMode" . into ( ) , json ! ( "custom" ) ) ;
318+ s. extra . insert (
319+ "dnsServers" . into ( ) ,
320+ json ! ( [ { "id" : 0 , "server" : "tls://1.1.1.1#cloudflare-dns.com" } ] ) ,
321+ ) ;
322+ s. extra . insert ( "geodataEnabled" . into ( ) , json ! ( true ) ) ;
323+ s. extra . insert ( "geosite" . into ( ) , json ! ( "/var/lib/tuic/geosite.dat" ) ) ;
324+ s. extra . insert ( "geoip" . into ( ) , json ! ( "/var/lib/tuic/geoip.dat" ) ) ;
325+ s. extra . insert ( "restfulEnabled" . into ( ) , json ! ( true ) ) ;
326+ s. extra . insert ( "masqueradeEnabled" . into ( ) , json ! ( true ) ) ;
327+ s. extra . insert (
328+ "acls" . into ( ) ,
329+ json ! ( [ { "id" : 0 , "addr" : "private" , "outbound" : "reject" , "ports" : "" , "hijack" : "" } ] ) ,
330+ ) ;
331+ s. extra . insert ( "rules" . into ( ) , json ! ( [ { "id" : 0 , "rule" : "MATCH,default" } ] ) ) ;
332+ s. extra . insert (
333+ "outbounds" . into ( ) ,
334+ json ! ( [ outbound_row( 0 , "default" , "direct" ) , outbound_row( 1 , "proxy" , "socks5" ) ] ) ,
335+ ) ;
336+ s. extra . get_mut ( "outbounds" ) . expect ( "outbounds" ) [ 1 ] [ "socksAddr" ] = json ! ( "127.0.0.1:1080" ) ;
337+ assert ! ( validate( & s) . is_empty( ) ) ;
338+ let c = build_configs ( & s) ?;
339+ assert_eq ! ( c[ "server" ] [ "log" ] [ "log_file" ] , "/var/log/tuic/server.log" ) ;
340+ assert_eq ! ( c[ "server" ] [ "backend" ] [ "mode" ] , "quiche" ) ;
341+ assert ! ( c[ "server" ] [ "backend" ] . get( "quinn" ) . is_none( ) ) ;
342+ assert_eq ! ( c[ "server" ] [ "backend" ] [ "quiche" ] [ "max_concurrent_bi_streams" ] , 100 ) ;
343+ assert_eq ! ( c[ "server" ] [ "dns" ] [ "servers" ] [ 0 ] , "tls://1.1.1.1#cloudflare-dns.com" ) ;
344+ assert_eq ! ( c[ "server" ] [ "geodata" ] [ "geoip" ] , "/var/lib/tuic/geoip.dat" ) ;
345+ assert_eq ! ( c[ "server" ] [ "restful" ] [ "enabled" ] , true ) ;
346+ assert_eq ! ( c[ "server" ] [ "masquerade" ] [ "enabled" ] , true ) ;
347+ assert_eq ! ( c[ "server" ] [ "acl" ] [ 0 ] [ "addr" ] , "private" ) ;
348+ assert_eq ! ( c[ "server" ] [ "rules" ] [ 0 ] , "MATCH,default" ) ;
349+ assert_eq ! ( c[ "server" ] [ "outbound" ] [ "default" ] [ "type" ] , "direct" ) ;
350+ assert_eq ! ( c[ "server" ] [ "outbound" ] [ "proxy" ] [ "addr" ] , "127.0.0.1:1080" ) ;
351+ assert ! ( c[ "server" ] [ "outbound" ] [ "proxy" ] . get( "ip_mode" ) . is_none( ) ) ;
352+ Ok ( ( ) )
353+ }
354+
355+ #[ test]
356+ fn client_transport_windows_and_0rtt ( ) -> Result < ( ) , String > {
357+ let mut s = ready ( ) ?;
358+ s. extra . insert ( "udpRelayMode" . into ( ) , json ! ( "quic" ) ) ;
359+ s. extra . insert ( "clientController" . into ( ) , json ! ( "cubic" ) ) ;
360+ s. extra . insert ( "clientSendWindow" . into ( ) , json ! ( 4194304 ) ) ;
361+ s. extra . insert ( "clientReceiveWindow" . into ( ) , json ! ( 2097152 ) ) ;
362+ s. zero_rtt = true ;
363+ assert ! ( validate( & s) . is_empty( ) ) ;
364+ let c = build_configs ( & s) ?;
365+ assert_eq ! ( c[ "client" ] [ "udp_relay_mode" ] , "quic" ) ;
366+ assert_eq ! ( c[ "client" ] [ "zero_rtt_handshake" ] , true ) ;
367+ assert_eq ! ( c[ "client" ] [ "backend" ] [ "quinn" ] [ "congestion_control" ] [ "controller" ] , "cubic" ) ;
368+ assert_eq ! ( c[ "client" ] [ "backend" ] [ "quinn" ] [ "send_window" ] , 4194304 ) ;
369+ assert_eq ! ( c[ "client" ] [ "backend" ] [ "quinn" ] [ "receive_window" ] , 2097152 ) ;
370+ Ok ( ( ) )
371+ }
0 commit comments