Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: add test for parallel stream transmission #354

Merged
merged 5 commits into from
Feb 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 13 additions & 4 deletions gm-quic/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,22 @@ env_logger = { workspace = true }
rustls = { workspace = true, features = ["ring"] }
url = { workspace = true }
log = { workspace = true }
tokio = { features = ["fs"], workspace = true }
tokio = { features = ["fs", "io-std"], workspace = true }

[dev-dependencies.tracing-subscriber]
workspace = true
features = ["fmt", "ansi", "env-filter", "time", "tracing-log"]

[[example]]
name = "http_client"
path = "examples/http/client.rs"

[[example]]
name = "client"
name = "http_server"
path = "examples/http/server.rs"

[[example]]
name = "connection"
name = "echo_server"

[[example]]
name = "server"
name = "echo_client"
38 changes: 0 additions & 38 deletions gm-quic/examples/connection.rs

This file was deleted.

67 changes: 67 additions & 0 deletions gm-quic/examples/echo_client.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
use std::{io, net::SocketAddr};

use clap::Parser;
use gm_quic::ToCertificate;
use rustls::RootCertStore;
use tokio::io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt};
use tracing::info;

#[derive(clap::Parser)]
struct Opt {
#[arg(long)]
server: SocketAddr,
}

#[tokio::main(flavor = "current_thread")]
pub async fn main() -> io::Result<()> {
tracing_subscriber::fmt().init();

let server_addr = Opt::parse().server;

let mut roots = RootCertStore::empty();
roots.add_parsable_certificates(include_bytes!("keychain/localhost/ca.cert").to_certificate());

let client = gm_quic::QuicClient::builder()
.with_root_certificates(roots)
.without_cert()
.with_parameters(client_stream_unlimited_parameters())
.build();

let connection = client.connect("localhost", server_addr)?;

let mut stdin = tokio::io::BufReader::new(tokio::io::stdin());
let mut stdout = tokio::io::stdout();

loop {
let (sid, (mut reader, mut writer)) = connection.open_bi_stream().await?.unwrap();

info!(%sid, "opened bidi stream");
stdout.write_all(b">").await?;
stdout.flush().await?;

let mut line = String::new();
stdin.read_line(&mut line).await?;
let line = line.trim();

writer.write_all(line.as_bytes()).await?;
writer.shutdown().await?;

info!("wait for server to echo");
let mut echo = String::new();
reader.read_to_string(&mut echo).await?;
info!("server echoed: `{echo}`");
}
}

fn client_stream_unlimited_parameters() -> gm_quic::ClientParameters {
let mut params = gm_quic::ClientParameters::default();

params.set_initial_max_streams_bidi(100);
params.set_initial_max_streams_uni(100);
params.set_initial_max_data((1u32 << 20).into());
params.set_initial_max_stream_data_uni((1u32 << 20).into());
params.set_initial_max_stream_data_bidi_local((1u32 << 20).into());
params.set_initial_max_stream_data_bidi_remote((1u32 << 20).into());

params
}
79 changes: 79 additions & 0 deletions gm-quic/examples/echo_server.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
use std::{io, net::SocketAddr, sync::Arc};

use clap::Parser;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tracing::{info, info_span, Instrument};

#[derive(clap::Parser)]
struct Opt {
#[arg(long, default_value = "0.0.0.0:0")]
bind: SocketAddr,
}

#[tokio::main(flavor = "current_thread")]
#[allow(unused)]
pub async fn main() -> io::Result<()> {
tracing_subscriber::fmt().init();

let server = gm_quic::QuicServer::builder()
.without_cert_verifier()
.with_single_cert(
include_bytes!("keychain/localhost/server.cert"),
include_bytes!("keychain/localhost/server.key"),
)
.with_parameters(server_stream_unlimited_parameters())
.listen(Opt::parse().bind)?;

info!("listening on {:?}", server.addresses());

launch(server).await?;

Ok(())
}

pub fn server_stream_unlimited_parameters() -> gm_quic::ServerParameters {
let mut params = gm_quic::ServerParameters::default();

params.set_initial_max_streams_bidi(100);
params.set_initial_max_streams_uni(100);
params.set_initial_max_data((1u32 << 20).into());
params.set_initial_max_stream_data_uni((1u32 << 20).into());
params.set_initial_max_stream_data_bidi_local((1u32 << 20).into());
params.set_initial_max_stream_data_bidi_remote((1u32 << 20).into());

params
}

#[tracing::instrument(name = "server_listen", skip(server), ret)]
pub async fn launch(server: Arc<gm_quic::QuicServer>) -> io::Result<()> {
#[tracing::instrument(name = "server_listen", skip(conn), ret)]
async fn handle_connection(conn: Arc<gm_quic::Connection>, from: SocketAddr) -> io::Result<()> {
loop {
let (sid, (reader, writer)) = conn.accept_bi_stream().await?.unwrap();
tokio::spawn(
handle_stream(reader, writer).instrument(info_span!("handle_stream",%sid)),
);
}
}

async fn handle_stream(
mut reader: gm_quic::StreamReader,
mut writer: gm_quic::StreamWriter,
) -> io::Result<()> {
let mut message = String::new();
reader.read_to_string(&mut message).await?;
tracing::info!("fully received message");

writer.write_all(message.as_bytes()).await?;
writer.shutdown().await?;
tracing::info!("successfully echoed message");

io::Result::Ok(())
}

loop {
let (connection, pathway) = server.accept().await?;
tracing::info!(source = ?pathway.remote(), "accepted new connection");
tokio::spawn(handle_connection(connection, *pathway.remote()));
}
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
27 changes: 27 additions & 0 deletions gm-quic/examples/keychain/localhost/ca.cert
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-----BEGIN CERTIFICATE-----
MIIElzCCAn+gAwIBAgIBezANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtoeXBl
cml1bSBDQTAeFw0yMjEyMDkxMjE4MjlaFw0zMjEyMDYxMjE4MjlaMCgxJjAkBgNV
BAMMHWh5cGVyaXVtIGxldmVsIDIgaW50ZXJtZWRpYXRlMIIBojANBgkqhkiG9w0B
AQEFAAOCAY8AMIIBigKCAYEAybHNAaZLlx0h5uHoGrIddBT/BB/LxBj19Y0EwDUb
fQrn2PkUTMK9hnAxCCcQkguATLUCVbzlBJTSeZokhXxKFo/neb+DF/zOQqtCa6m/
CJjIdlRTEFqkugHwUA+9sEtaZyPyG8yoXbSrIVU9S8IpkE5vNSgHlhN9/sDoWpC1
HFwnndkJmxsxsPFdxoGKWfCQG1XF61cOuW7pM4ULu/2CzbbKxJj0gSFO9y5i/DBT
hfpP98JAUgcC4XaMDSgXB/WypV4FtviAJlxP0iRNdEEsLCuRfPpQUWVt7L4URy+f
DypO4gSBdvb9B3Hsbk07jjCPKzEtM38ChP9JYr6b+js8JjyqcE6IE6imWGnEgUYH
vpIA6CVtjWy52sbhYCMBtslyVK3+cNiwYaojdVRRh2LNbGNMSLVIfUnvUKhf1wfL
ZISTmcxhdlncCZQ6k9R8kEMoS97z3JVcglNN4vPSjeWMgzezV3Ik02K8V4iXdXVs
uGpb4aWl2WUGTr4lEmZLl9DLAgMBAAGjXjBcMB0GA1UdDgQWBBTlNAOcjh+/1t/p
D6jps1COvUbbHjAgBgNVHSUBAf8EFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYD
VR0TBAUwAwEB/zALBgNVHQ8EBAMCAf4wDQYJKoZIhvcNAQELBQADggIBAEy+HUqU
9BOsi/++mIBZTGd/MyBmQMJGOgN+JK5WK8UM2WLvyAh+qfYkqEKTPExxw2bhg4Di
xF4/SQM74Ao12rnowOTrDt7DCFhy9kEVa0CwLvi82wH5nPykqwWeFFQOaH5LDtbR
X4z5Ap2eTWVzgH/Xb+nozywoaOJ7ASJUspF4G9DmhEGyXY5Gme5PDNrLVQ7yxvXz
t7yWNcZPkTLqGB1VefzTLQxw59JNfrYDzLupYIOohE4AgTjuVyMTyrot3+Z8SDDA
oJJRSa8g75zcn18FpetWpQHzs4c46Lz9saz8EqWzSxlLIBfSsKYfWmDdwLZdGKDZ
i1Aie7Xjw4rn8Su2267KZH3nJPY+djToAHjBPZUzI9FRPonyHUy0RfR2ikv/ustb
/1x+y9Fi8Pksd3kBEE4D4+Kr9lssKvYfOo3YxGR35k/lrAPsh7d3Nj7m6+i/k+4c
lzOLwl4uWnTCMWBbGid7K819GQozUs6k3Pp1EHTJsrmalEOGPtZjv/YRZi8p+uAG
RAMjnfAceyK9BtiJVtMKQMImoNL7fc6bxRnlg0tpH9aLadAlmIaF938jIFUETnKc
OiKRXdDI/NQywnz6IBh6Ynfk6QUZEPFJAfI4+Gh4U+fd422WbexlZdQVO87k7aXx
Rl9Y9NlLzyng+ffQJDamZ0ZeV7E0FhwHp1J4
-----END CERTIFICATE-----
23 changes: 23 additions & 0 deletions gm-quic/examples/keychain/localhost/server.cert
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIID4DCCAkigAwIBAgICAcgwDQYJKoZIhvcNAQELBQAwKDEmMCQGA1UEAwwdaHlw
ZXJpdW0gbGV2ZWwgMiBpbnRlcm1lZGlhdGUwHhcNMjIxMjA5MTIxODI5WhcNMjgw
NTMxMTIxODI5WjAZMRcwFQYDVQQDDA50ZXN0c2VydmVyLmNvbTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBALJodPnjQfmx0layvFNIh5e3gujDcGmYgHKh
k1c7MSUV8rqdHX9m2bIahylqxdso1zYdS1FhKDnEtnmySOliVE7CdfzOn6to5pQ2
U4hsXY4Qr62mymtB4PlnQZFrNrslExl7969CigKhwFvlcZt5FRKkxKOGzNEchXnu
4qw1l7oX4DMjxfueG6pmh85KOWbJ7Ac27JSLQAfzSO0ungb5QSvnj/LBeeEsC46t
EUTgmVkoqosR9WIWyzdBWs/jpq0ukfkFbqqCnPbCmC0it+T13eNlSxVjp66A4z6/
Ch6UipqzrQ2I0HiEZCngt8zEPdXs2wiQ809QsJaTw3Ka6bnrcYUCAwEAAaOBojCB
nzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDAdBgNVHQ4EFgQUkmfaWEIBizru
MK5I9r5GP23GFU4wPgYDVR0jBDcwNYAU5TQDnI4fv9bf6Q+o6bNQjr1G2x6hGqQY
MBYxFDASBgNVBAMMC2h5cGVyaXVtIENBggF7MCMGA1UdEQQcMBqCDWh5cGVyaXVt
LnRlY2iCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAYEAJBdWWnx156TxtAhL
qtqAXF/9GhJPJFODi9i+vwPuILY9zuw5+Ad6X0hWf3Fe4+OJapUunxW4ic6WCr5N
xBggM+bEfPa7XoQz0HP1vzJMhM71BMNUABB/m65FW9AamRAI/HD5mtxTEJMquS6q
A7Oh3eC/0Szx06/cYt+8Pptk6ts3VQI8QohqOJkGki4/fpP724CFeRnIdvFpqjGh
Ne9nPG46Wyg0Du9NiyCY5FRPbqIpZHzc+v6SrC17iJQtiOS3d3LGnrmDyBl2sHTc
UEtN6egqN85izzD9CZatq7wkjTytX97I8rpfRbX/DY//Yayxvwj4FUcqaYms1G6S
i1OoGjphtkZG2InBuxcCn5pHgezoDPfSx+Ek5DMeEOlmIEEmSX9LJ2IGFtIdVYf7
+meg1KIg0kCwpTYaw6wo3n98R4LkX9kWk3c7xPqTNHn/C78h4PeLDtu4DYGAur6o
Rm3gGIU0MFy/DmTh3kMpZTX4hRvr83pRE6xOmjchSq88cysw
-----END CERTIFICATE-----
28 changes: 28 additions & 0 deletions gm-quic/examples/keychain/localhost/server.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyaHT540H5sdJW
srxTSIeXt4Low3BpmIByoZNXOzElFfK6nR1/ZtmyGocpasXbKNc2HUtRYSg5xLZ5
skjpYlROwnX8zp+raOaUNlOIbF2OEK+tpsprQeD5Z0GRaza7JRMZe/evQooCocBb
5XGbeRUSpMSjhszRHIV57uKsNZe6F+AzI8X7nhuqZofOSjlmyewHNuyUi0AH80jt
Lp4G+UEr54/ywXnhLAuOrRFE4JlZKKqLEfViFss3QVrP46atLpH5BW6qgpz2wpgt
Irfk9d3jZUsVY6eugOM+vwoelIqas60NiNB4hGQp4LfMxD3V7NsIkPNPULCWk8Ny
mum563GFAgMBAAECggEAPLpZtwWoW3owAtrsR90UaoxIvzpndUo3zs04/iRj4h/K
c8MvW0KDL6DgCTUTDDqmpwDptlW//4n6IwqQzwBtejGvP9KFfy9B7YlgfbuFTOpZ
Il733/KYxcxkAT/hbWp9Sdtsv/eCSssMUzuSpD1e8u2rEY69ASEYPh0Wg0/qyajt
DkHf5sTpCcjLwDvDYLHQHUjACIJWy8imZHBd0gbdGM9MsTQrqltkPNpGRrw3c09t
aZAYo0gY1LKHp51FMM7oSO58wQUQk0cmK+a6N2B4x2BZTn/9Cpn/CRqieHp6pDK1
gnVavOYEZv1IcbINR5LVC8amXgO0bs8wnyRjQy+zAQKBgQDk55H8k0ueMIXt3EMC
baqIae5RPjISYrZ2Doln/IhuH1vcBhvpAgKbwGjl0wPMIZJPea8B5+bYe7AK5GhU
O6JOya3gc2zAuGJPmkoyEm5bIj6uVc4OhYg0PjZdpSROqCmB0fverQ8alDNggVX9
Z2OB9j+yL69FQqPGnS4q0jSc8QKBgQDHhrRfaRff3F0eObvkhsPZgNBfSC7dJ0lg
SKYx7Y9cHln5DFsOP8xQ6QtxnlwQp1+hm/MnCIYDwOZR9fucdf/VS6HaU+Q4mJ/L
3dc2kenJclKgEQwIZhRAnbta9g28oNE081vE1H4KOixoD5c1cT5V65QztloDJUI0
wzCV33at1QKBgQCyUauqZVytGQPcbpBNHf2RU2RyKc97/yZBBcYJGfN2RjubRa8M
b6J0jwmosB/vL9/4xcSN6Ygt8P0NHy4fIG2qjvZDOefoojsD5CAUrcMGf8DwsqtZ
KLEYcbaMcQ+9rsbW+SwLJinz/KuhbF/+jkI4hgrM1tTlUaqgGOZUOXj/IQKBgQCs
4xDZ94NDa3uYXCht/UQo7FAhr7dD0+3lqy2u54yoIniNr2Ia97b/iN9spO5bU9wu
eaX4dY9CI1yvOji6Oxjh5jYpqzV+wOj9yozX8Rklf5UOs5a8lE8KKmKUj84ZWzPL
8O7cn89S51NhG9lG6og8BPQW1vQp85fphhRMWSRJvQKBgEbocQ4oOmnZ5Jc4XVEW
UwYWDXPzTwUOy68KnsZV5kpFlzyG8k285dviBNhvRXOfQbluWKmtMKQ0QCSCgAwl
xEGjDZZuC2pI0UwirHJH/lZJAqkUlG/Zoaxx59wRmtgtlbU+XOt5Bso+2nNFSVhj
ZKlEebz4g3izdS8yaPgWkbwc
-----END PRIVATE KEY-----
6 changes: 3 additions & 3 deletions gm-quic/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ impl QuicClient {
QuicClientBuilder {
bind_interfaces: Arc::new(DashMap::new()),
reuse_interfaces: false,
reuse_connection: true,
reuse_connection: false,
enable_happy_eyepballs: false,
prefer_versions: vec![1],
defer_idle_timeout: Duration::MAX,
Expand All @@ -92,7 +92,7 @@ impl QuicClient {
QuicClientBuilder {
bind_interfaces: Arc::new(DashMap::new()),
reuse_interfaces: false,
reuse_connection: true,
reuse_connection: false,
enable_happy_eyepballs: false,
prefer_versions: vec![1],
defer_idle_timeout: Duration::MAX,
Expand All @@ -113,7 +113,7 @@ impl QuicClient {
QuicClientBuilder {
bind_interfaces: Arc::new(DashMap::new()),
reuse_interfaces: false,
reuse_connection: true,
reuse_connection: false,
enable_happy_eyepballs: false,
prefer_versions: vec![1],
defer_idle_timeout: Duration::MAX,
Expand Down
3 changes: 3 additions & 0 deletions gm-quic/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,14 @@ pub use crate::{
client::{QuicClient, QuicClientBuilder},
interfaces::Interfaces,
server::{QuicServer, QuicServerBuilder, QuicServerSniBuilder},
util::{ToCertificate, ToPrivateKey},
};

mod client;
mod interfaces;
mod server;
#[cfg(test)]
pub mod tests;
mod util;

pub mod prelude {
Expand Down
Loading
Loading