From fbb8a934ca5c4371c9d9f82180343942bd820459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Kr=C3=BCger?= Date: Wed, 6 Nov 2024 12:05:00 +0100 Subject: [PATCH] feat(quinn-proto): Support & test `wasm32-unknown-unknown` target --- .cargo/config.toml | 2 + .github/workflows/rust.yml | 42 +++++++++++++++++++ Cargo.toml | 4 ++ quinn-proto/Cargo.toml | 9 ++++ quinn-proto/src/cid_generator.rs | 3 +- quinn-proto/src/config.rs | 5 +-- quinn-proto/src/congestion.rs | 2 +- .../src/congestion/bbr/bw_estimation.rs | 2 +- quinn-proto/src/congestion/bbr/mod.rs | 2 +- quinn-proto/src/congestion/cubic.rs | 4 +- quinn-proto/src/congestion/new_reno.rs | 2 +- quinn-proto/src/connection/ack_frequency.rs | 2 +- quinn-proto/src/connection/cid_state.rs | 7 +--- quinn-proto/src/connection/mod.rs | 5 +-- quinn-proto/src/connection/mtud.rs | 6 +-- quinn-proto/src/connection/pacing.rs | 2 +- quinn-proto/src/connection/packet_builder.rs | 4 +- quinn-proto/src/connection/packet_crypto.rs | 2 +- quinn-proto/src/connection/paths.rs | 4 +- quinn-proto/src/connection/spaces.rs | 3 +- quinn-proto/src/connection/stats.rs | 3 +- quinn-proto/src/connection/timer.rs | 2 +- quinn-proto/src/endpoint.rs | 5 +-- quinn-proto/src/lib.rs | 7 +++- quinn-proto/src/shared.rs | 4 +- quinn-proto/src/tests/mod.rs | 19 ++++++++- quinn-proto/src/tests/util.rs | 12 +++--- quinn-proto/src/token.rs | 9 ++-- 28 files changed, 122 insertions(+), 51 deletions(-) create mode 100644 .cargo/config.toml diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000000..10762f94ca --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.wasm32-unknown-unknown] +runner = "wasm-bindgen-test-runner" diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 96cf37f6a9..aaa98dd033 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -69,6 +69,48 @@ jobs: - run: RUST_BACKTRACE=1 cargo test --manifest-path quinn-proto/Cargo.toml --no-default-features --features rustls-aws-lc-rs-fips - run: RUST_BACKTRACE=1 cargo test --manifest-path quinn/Cargo.toml --no-default-features --features rustls-aws-lc-rs-fips,runtime-tokio + wasm_test: + name: test wasm32-unknown-unknown + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Install stable toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Add wasm target + run: rustup target add wasm32-unknown-unknown + + - name: Install nodejs v20 + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Setup `wasm-tools` + uses: bytecodealliance/actions/wasm-tools/setup@v1 + + - name: Install cargo binstall + uses: cargo-bins/cargo-binstall@main + + - name: Use working `cc` version 1.1.31 + run: cargo update -p cc --precise 1.1.31 + + - name: build wasm32 tests (quinn-proto) + run: cargo test -p quinn-proto --target wasm32-unknown-unknown --no-run + + # If the Wasm file contains any 'import "env"' declarations, then + # some non-Wasm-compatible code made it into the final code. + - name: Check for 'import "env"' in Wasm + run: | + ! wasm-tools print --skeleton target/wasm32-unknown-unknown/debug/deps/quinn_proto-2e33942766a5ec36.wasm | grep 'import "env"' + + - name: Install wasm-bindgen-test-runner + run: cargo binstall wasm-bindgen-cli --locked --no-confirm + + - name: wasm32 test (quinn-proto) + run: cargo test -p quinn-proto --target wasm32-unknown-unknown + msrv: runs-on: ubuntu-latest steps: diff --git a/Cargo.toml b/Cargo.toml index d9dc1cde74..7bce36d042 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ clap = { version = "4", features = ["derive"] } crc = "3" directories-next = "2" futures-io = "0.3.19" +getrandom = { version = "0.2", default-features = false } hdrhistogram = { version = "7.2", default-features = false } hex-literal = "0.4" lazy_static = "1" @@ -36,6 +37,7 @@ ring = "0.17" rustc-hash = "2" rustls = { version = "0.23.5", default-features = false, features = ["std"] } rustls-pemfile = "2" +rustls-pki-types = "1.7" rustls-platform-verifier = "0.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1" @@ -49,6 +51,8 @@ tracing = { version = "0.1.10", default-features = false, features = ["std"] } tracing-futures = { version = "0.2.0", default-features = false, features = ["std-future"] } tracing-subscriber = { version = "0.3.0", default-features = false, features = ["env-filter", "fmt", "ansi", "time", "local-time"] } url = "2" +wasm-bindgen-test = { version = "0.3.45" } +web-time = "1" windows-sys = { version = "0.59", features = ["Win32_Foundation", "Win32_System_IO", "Win32_Networking_WinSock"] } [profile.bench] diff --git a/quinn-proto/Cargo.toml b/quinn-proto/Cargo.toml index 37afb7dcd6..69527ce4cf 100644 --- a/quinn-proto/Cargo.toml +++ b/quinn-proto/Cargo.toml @@ -45,12 +45,21 @@ thiserror = { workspace = true } tinyvec = { workspace = true, features = ["alloc"] } tracing = { workspace = true } +# Feature flags & dependencies for wasm +# wasm-bindgen is assumed for a wasm*-*-unknown target +[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies] +ring = { workspace = true, features = ["wasm32_unknown_unknown_js"] } +getrandom = { workspace = true, features = ["js"] } +rustls-pki-types = { workspace = true, features = ["web"] } # only added as dependency to enforce the `web` feature for this target +web-time = { workspace = true } + [dev-dependencies] assert_matches = { workspace = true } hex-literal = { workspace = true } rcgen = { workspace = true } tracing-subscriber = { workspace = true } lazy_static = "1" +wasm-bindgen-test = { workspace = true } [lints.rust] # https://rust-fuzz.github.io/book/cargo-fuzz/guide.html#cfgfuzzing diff --git a/quinn-proto/src/cid_generator.rs b/quinn-proto/src/cid_generator.rs index c59fb4102f..fc737eae70 100644 --- a/quinn-proto/src/cid_generator.rs +++ b/quinn-proto/src/cid_generator.rs @@ -1,8 +1,9 @@ -use std::{hash::Hasher, time::Duration}; +use std::hash::Hasher; use rand::{Rng, RngCore}; use crate::shared::ConnectionId; +use crate::Duration; use crate::MAX_CID_SIZE; /// Generates connection IDs for incoming connections diff --git a/quinn-proto/src/config.rs b/quinn-proto/src/config.rs index f0377721a2..571f998dda 100644 --- a/quinn-proto/src/config.rs +++ b/quinn-proto/src/config.rs @@ -3,7 +3,6 @@ use std::{ net::{SocketAddrV4, SocketAddrV6}, num::TryFromIntError, sync::Arc, - time::Duration, }; #[cfg(any(feature = "rustls-aws-lc-rs", feature = "rustls-ring"))] @@ -19,8 +18,8 @@ use crate::{ congestion, crypto::{self, HandshakeTokenKey, HmacKey}, shared::ConnectionId, - RandomConnectionIdGenerator, VarInt, VarIntBoundsExceeded, DEFAULT_SUPPORTED_VERSIONS, - INITIAL_MTU, MAX_CID_SIZE, MAX_UDP_PAYLOAD, + Duration, RandomConnectionIdGenerator, VarInt, VarIntBoundsExceeded, + DEFAULT_SUPPORTED_VERSIONS, INITIAL_MTU, MAX_CID_SIZE, MAX_UDP_PAYLOAD, }; /// Parameters governing the core QUIC state machine diff --git a/quinn-proto/src/congestion.rs b/quinn-proto/src/congestion.rs index fac6e80e51..d949b00e06 100644 --- a/quinn-proto/src/congestion.rs +++ b/quinn-proto/src/congestion.rs @@ -1,9 +1,9 @@ //! Logic for controlling the rate at which data is sent use crate::connection::RttEstimator; +use crate::Instant; use std::any::Any; use std::sync::Arc; -use std::time::Instant; mod bbr; mod cubic; diff --git a/quinn-proto/src/congestion/bbr/bw_estimation.rs b/quinn-proto/src/congestion/bbr/bw_estimation.rs index 479e241208..8796f45729 100644 --- a/quinn-proto/src/congestion/bbr/bw_estimation.rs +++ b/quinn-proto/src/congestion/bbr/bw_estimation.rs @@ -1,7 +1,7 @@ use std::fmt::{Debug, Display, Formatter}; -use std::time::{Duration, Instant}; use super::min_max::MinMax; +use crate::{Duration, Instant}; #[derive(Clone, Debug)] pub(crate) struct BandwidthEstimation { diff --git a/quinn-proto/src/congestion/bbr/mod.rs b/quinn-proto/src/congestion/bbr/mod.rs index a522f0b0f9..13f613cd04 100644 --- a/quinn-proto/src/congestion/bbr/mod.rs +++ b/quinn-proto/src/congestion/bbr/mod.rs @@ -1,13 +1,13 @@ use std::any::Any; use std::fmt::Debug; use std::sync::Arc; -use std::time::{Duration, Instant}; use rand::{Rng, SeedableRng}; use crate::congestion::bbr::bw_estimation::BandwidthEstimation; use crate::congestion::bbr::min_max::MinMax; use crate::connection::RttEstimator; +use crate::{Duration, Instant}; use super::{Controller, ControllerFactory, BASE_DATAGRAM_SIZE}; diff --git a/quinn-proto/src/congestion/cubic.rs b/quinn-proto/src/congestion/cubic.rs index 1df9ac4d7e..e29a2c24df 100644 --- a/quinn-proto/src/congestion/cubic.rs +++ b/quinn-proto/src/congestion/cubic.rs @@ -1,10 +1,10 @@ use std::any::Any; +use std::cmp; use std::sync::Arc; -use std::time::{Duration, Instant}; use super::{Controller, ControllerFactory, BASE_DATAGRAM_SIZE}; use crate::connection::RttEstimator; -use std::cmp; +use crate::{Duration, Instant}; /// CUBIC Constants. /// diff --git a/quinn-proto/src/congestion/new_reno.rs b/quinn-proto/src/congestion/new_reno.rs index 6b3596a62e..2eeb995150 100644 --- a/quinn-proto/src/congestion/new_reno.rs +++ b/quinn-proto/src/congestion/new_reno.rs @@ -1,9 +1,9 @@ use std::any::Any; use std::sync::Arc; -use std::time::Instant; use super::{Controller, ControllerFactory, BASE_DATAGRAM_SIZE}; use crate::connection::RttEstimator; +use crate::Instant; /// A simple, standard congestion controller #[derive(Debug, Clone)] diff --git a/quinn-proto/src/connection/ack_frequency.rs b/quinn-proto/src/connection/ack_frequency.rs index 14fdcdc960..94b6805fbc 100644 --- a/quinn-proto/src/connection/ack_frequency.rs +++ b/quinn-proto/src/connection/ack_frequency.rs @@ -1,8 +1,8 @@ use crate::connection::spaces::PendingAcks; use crate::frame::AckFrequency; use crate::transport_parameters::TransportParameters; +use crate::Duration; use crate::{AckFrequencyConfig, TransportError, VarInt, TIMER_GRANULARITY}; -use std::time::Duration; /// State associated to ACK frequency pub(super) struct AckFrequencyState { diff --git a/quinn-proto/src/connection/cid_state.rs b/quinn-proto/src/connection/cid_state.rs index abf577ae77..31b279c3b0 100644 --- a/quinn-proto/src/connection/cid_state.rs +++ b/quinn-proto/src/connection/cid_state.rs @@ -1,13 +1,10 @@ //! Maintain the state of local connection IDs -use std::{ - collections::VecDeque, - time::{Duration, Instant}, -}; +use std::collections::VecDeque; use rustc_hash::FxHashSet; use tracing::{debug, trace}; -use crate::{shared::IssuedCid, TransportError}; +use crate::{shared::IssuedCid, Duration, Instant, TransportError}; /// Local connection ID management pub(super) struct CidState { diff --git a/quinn-proto/src/connection/mod.rs b/quinn-proto/src/connection/mod.rs index f0a206c49a..aec38d2a13 100644 --- a/quinn-proto/src/connection/mod.rs +++ b/quinn-proto/src/connection/mod.rs @@ -5,7 +5,6 @@ use std::{ fmt, io, mem, net::{IpAddr, SocketAddr}, sync::Arc, - time::{Duration, Instant}, }; use bytes::{Bytes, BytesMut}; @@ -33,8 +32,8 @@ use crate::{ }, token::ResetToken, transport_parameters::TransportParameters, - Dir, EndpointConfig, Frame, Side, StreamId, Transmit, TransportError, TransportErrorCode, - VarInt, MAX_STREAM_COUNT, MIN_INITIAL_SIZE, TIMER_GRANULARITY, + Dir, Duration, EndpointConfig, Frame, Instant, Side, StreamId, Transmit, TransportError, + TransportErrorCode, VarInt, MAX_STREAM_COUNT, MIN_INITIAL_SIZE, TIMER_GRANULARITY, }; mod ack_frequency; diff --git a/quinn-proto/src/connection/mtud.rs b/quinn-proto/src/connection/mtud.rs index 3fe8dc0b7b..bb9e1265a2 100644 --- a/quinn-proto/src/connection/mtud.rs +++ b/quinn-proto/src/connection/mtud.rs @@ -1,5 +1,5 @@ -use crate::{packet::SpaceId, MtuDiscoveryConfig, MAX_UDP_PAYLOAD}; -use std::{cmp, time::Instant}; +use crate::{packet::SpaceId, Instant, MtuDiscoveryConfig, MAX_UDP_PAYLOAD}; +use std::cmp; use tracing::trace; /// Implements Datagram Packetization Layer Path Maximum Transmission Unit Discovery @@ -510,9 +510,9 @@ const BLACK_HOLE_THRESHOLD: usize = 3; mod tests { use super::*; use crate::packet::SpaceId; + use crate::Duration; use crate::MAX_UDP_PAYLOAD; use assert_matches::assert_matches; - use std::time::Duration; fn default_mtud() -> MtuDiscovery { let config = MtuDiscoveryConfig::default(); diff --git a/quinn-proto/src/connection/pacing.rs b/quinn-proto/src/connection/pacing.rs index b0efb58790..0e7df523ab 100644 --- a/quinn-proto/src/connection/pacing.rs +++ b/quinn-proto/src/connection/pacing.rs @@ -1,6 +1,6 @@ //! Pacing of packet transmissions. -use std::time::{Duration, Instant}; +use crate::{Duration, Instant}; use tracing::warn; diff --git a/quinn-proto/src/connection/packet_builder.rs b/quinn-proto/src/connection/packet_builder.rs index a29ff448ef..85ec6b2ded 100644 --- a/quinn-proto/src/connection/packet_builder.rs +++ b/quinn-proto/src/connection/packet_builder.rs @@ -1,4 +1,4 @@ -use std::{cmp, time::Instant}; +use std::cmp; use bytes::Bytes; use rand::Rng; @@ -8,7 +8,7 @@ use super::{spaces::SentPacket, Connection, SentFrames}; use crate::{ frame::{self, Close}, packet::{Header, InitialHeader, LongType, PacketNumber, PartialEncode, SpaceId, FIXED_BIT}, - ConnectionId, TransportError, TransportErrorCode, INITIAL_MTU, + ConnectionId, Instant, TransportError, TransportErrorCode, INITIAL_MTU, }; pub(super) struct PacketBuilder { diff --git a/quinn-proto/src/connection/packet_crypto.rs b/quinn-proto/src/connection/packet_crypto.rs index 450ce1d52e..ffb98ea8ad 100644 --- a/quinn-proto/src/connection/packet_crypto.rs +++ b/quinn-proto/src/connection/packet_crypto.rs @@ -1,10 +1,10 @@ -use std::time::Instant; use tracing::{debug, trace}; use crate::connection::spaces::PacketSpace; use crate::crypto::{HeaderKey, KeyPair, PacketKey}; use crate::packet::{Packet, PartialDecode, SpaceId}; use crate::token::ResetToken; +use crate::Instant; use crate::{TransportError, RESET_TOKEN_SIZE}; /// Removes header protection of a packet, or returns `None` if the packet was dropped diff --git a/quinn-proto/src/connection/paths.rs b/quinn-proto/src/connection/paths.rs index 5b2bc9b5de..9a7db06eae 100644 --- a/quinn-proto/src/connection/paths.rs +++ b/quinn-proto/src/connection/paths.rs @@ -1,4 +1,4 @@ -use std::{cmp, net::SocketAddr, time::Duration, time::Instant}; +use std::{cmp, net::SocketAddr}; use tracing::trace; @@ -7,7 +7,7 @@ use super::{ pacing::Pacer, spaces::{PacketSpace, SentPacket}, }; -use crate::{congestion, packet::SpaceId, TransportConfig, TIMER_GRANULARITY}; +use crate::{congestion, packet::SpaceId, Duration, Instant, TransportConfig, TIMER_GRANULARITY}; /// Description of a particular network path pub(super) struct PathData { diff --git a/quinn-proto/src/connection/spaces.rs b/quinn-proto/src/connection/spaces.rs index 3f999c886e..a04fbd3d7a 100644 --- a/quinn-proto/src/connection/spaces.rs +++ b/quinn-proto/src/connection/spaces.rs @@ -3,7 +3,6 @@ use std::{ collections::{BTreeMap, VecDeque}, mem, ops::{Bound, Index, IndexMut}, - time::{Duration, Instant}, }; use rand::Rng; @@ -13,7 +12,7 @@ use tracing::trace; use super::assembler::Assembler; use crate::{ connection::StreamsState, crypto::Keys, frame, packet::SpaceId, range_set::ArrayRangeSet, - shared::IssuedCid, Dir, StreamId, TransportError, VarInt, + shared::IssuedCid, Dir, Duration, Instant, StreamId, TransportError, VarInt, }; pub(super) struct PacketSpace { diff --git a/quinn-proto/src/connection/stats.rs b/quinn-proto/src/connection/stats.rs index fc19c63043..9ddb42d1a0 100644 --- a/quinn-proto/src/connection/stats.rs +++ b/quinn-proto/src/connection/stats.rs @@ -1,7 +1,6 @@ //! Connection statistics -use crate::{frame::Frame, Dir}; -use std::time::Duration; +use crate::{frame::Frame, Dir, Duration}; /// Statistics about UDP datagrams transmitted or received on a connection #[derive(Default, Debug, Copy, Clone)] diff --git a/quinn-proto/src/connection/timer.rs b/quinn-proto/src/connection/timer.rs index a7491cd3b9..1bf67e0232 100644 --- a/quinn-proto/src/connection/timer.rs +++ b/quinn-proto/src/connection/timer.rs @@ -1,4 +1,4 @@ -use std::time::Instant; +use crate::Instant; #[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq)] pub(crate) enum Timer { diff --git a/quinn-proto/src/endpoint.rs b/quinn-proto/src/endpoint.rs index 93e4196362..6210aafe91 100644 --- a/quinn-proto/src/endpoint.rs +++ b/quinn-proto/src/endpoint.rs @@ -5,7 +5,6 @@ use std::{ net::{IpAddr, SocketAddr}, ops::{Index, IndexMut}, sync::Arc, - time::{Instant, SystemTime}, }; use bytes::{BufMut, Bytes, BytesMut}; @@ -32,8 +31,8 @@ use crate::{ }, token::TokenDecodeError, transport_parameters::{PreferredAddress, TransportParameters}, - ResetToken, RetryToken, Side, Transmit, TransportConfig, TransportError, INITIAL_MTU, - MAX_CID_SIZE, MIN_INITIAL_SIZE, RESET_TOKEN_SIZE, + Instant, ResetToken, RetryToken, Side, SystemTime, Transmit, TransportConfig, TransportError, + INITIAL_MTU, MAX_CID_SIZE, MIN_INITIAL_SIZE, RESET_TOKEN_SIZE, }; /// The main entry point to the library diff --git a/quinn-proto/src/lib.rs b/quinn-proto/src/lib.rs index ad9d937a36..458b826bbc 100644 --- a/quinn-proto/src/lib.rs +++ b/quinn-proto/src/lib.rs @@ -24,7 +24,6 @@ use std::{ fmt, net::{IpAddr, SocketAddr}, ops, - time::Duration, }; mod cid_queue; @@ -89,6 +88,12 @@ use token::{ResetToken, RetryToken}; #[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; +// Deal with time +#[cfg(not(all(target_family = "wasm", target_os = "unknown")))] +pub(crate) use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH}; +#[cfg(all(target_family = "wasm", target_os = "unknown"))] +pub(crate) use web_time::{Duration, Instant, SystemTime, UNIX_EPOCH}; + #[doc(hidden)] #[cfg(fuzzing)] pub mod fuzzing { diff --git a/quinn-proto/src/shared.rs b/quinn-proto/src/shared.rs index 05ffe8caf0..8f377f0a1f 100644 --- a/quinn-proto/src/shared.rs +++ b/quinn-proto/src/shared.rs @@ -1,8 +1,8 @@ -use std::{fmt, net::SocketAddr, time::Instant}; +use std::{fmt, net::SocketAddr}; use bytes::{Buf, BufMut, BytesMut}; -use crate::{coding::BufExt, packet::PartialDecode, ResetToken, MAX_CID_SIZE}; +use crate::{coding::BufExt, packet::PartialDecode, Instant, ResetToken, MAX_CID_SIZE}; /// Events sent from an Endpoint to a Connection #[derive(Debug)] diff --git a/quinn-proto/src/tests/mod.rs b/quinn-proto/src/tests/mod.rs index def70cdb7f..46caa23938 100644 --- a/quinn-proto/src/tests/mod.rs +++ b/quinn-proto/src/tests/mod.rs @@ -3,7 +3,6 @@ use std::{ mem, net::{Ipv4Addr, Ipv6Addr, SocketAddr}, sync::Arc, - time::{Duration, Instant}, }; use assert_matches::assert_matches; @@ -31,10 +30,19 @@ use crate::{ crypto::rustls::QuicServerConfig, frame::FrameStruct, transport_parameters::TransportParameters, + Duration, Instant, }; mod util; use util::*; +#[cfg(all(target_family = "wasm", target_os = "unknown"))] +use wasm_bindgen_test::wasm_bindgen_test as test; + +// Enable this if you want to run these tests in the browser. +// Unfortunately it's either-or: Enable this and you can run in the browser, disable to run in nodejs. +// #[cfg(all(target_family = "wasm", target_os = "unknown"))] +// wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); + #[test] fn version_negotiate_server() { let _guard = subscribe(); @@ -256,6 +264,7 @@ fn client_stateless_reset() { } /// Verify that stateless resets are rate-limited + #[test] fn stateless_reset_limit() { let _guard = subscribe(); @@ -1764,6 +1773,7 @@ fn stop_during_finish() { } // Ensure we can recover from loss of tail packets when the congestion window is full + #[test] fn congested_tail_loss() { let _guard = subscribe(); @@ -2015,6 +2025,7 @@ fn finish_retransmit() { /// Ensures that exchanging data on a client-initiated bidirectional stream works past the initial /// stream window. + #[test] fn repeated_request_response() { let _guard = subscribe(); @@ -2064,6 +2075,7 @@ fn repeated_request_response() { } /// Ensures that the client sends an anti-deadlock probe after an incomplete server's first flight + #[test] fn handshake_anti_deadlock_probe() { let _guard = subscribe(); @@ -2096,6 +2108,7 @@ fn handshake_anti_deadlock_probe() { /// Ensures that the server can respond with 3 initial packets during the handshake /// before the anti-amplification limit kicks in when MTUs are similar. + #[test] fn server_can_send_3_inital_packets() { let _guard = subscribe(); @@ -2649,6 +2662,7 @@ fn setup_ack_frequency_test(max_ack_delay: Duration) -> (Pair, ConnectionHandle, } /// Verify that max ACK delay is counted from the first ACK-eliciting packet + #[test] fn ack_frequency_ack_delayed_from_first_of_flight() { let _guard = subscribe(); @@ -2960,6 +2974,7 @@ fn stream_chunks(mut recv: RecvStream) -> Vec { /// Verify that an endpoint which receives but does not send ACK-eliciting data still receives ACKs /// occasionally. This is not required for conformance, but makes loss detection more responsive and /// reduces receiver memory use. + #[test] fn pure_sender_voluntarily_acks() { let _guard = subscribe(); @@ -3120,6 +3135,7 @@ fn gso_truncation() { /// Verify that a large application datagram is sent successfully when an ACK frame too large to fit /// alongside it is also queued, in exactly 2 UDP datagrams. + #[test] fn large_datagram_with_acks() { let _guard = subscribe(); @@ -3149,6 +3165,7 @@ fn large_datagram_with_acks() { /// Verify that an ACK prompted by receipt of many non-ACK-eliciting packets is sent alongside /// outgoing application datagrams too large to coexist in the same packet with it. + #[test] fn voluntary_ack_with_large_datagrams() { let _guard = subscribe(); diff --git a/quinn-proto/src/tests/util.rs b/quinn-proto/src/tests/util.rs index b293057edc..8cb47d30fe 100644 --- a/quinn-proto/src/tests/util.rs +++ b/quinn-proto/src/tests/util.rs @@ -8,7 +8,6 @@ use std::{ ops::RangeFrom, str, sync::{Arc, Mutex}, - time::{Duration, Instant}, }; use assert_matches::assert_matches; @@ -23,6 +22,7 @@ use tracing::{info_span, trace}; use super::crypto::rustls::{configured_provider, QuicClientConfig, QuicServerConfig}; use super::*; +use crate::{Duration, Instant}; pub(super) const DEFAULT_MTU: usize = 1452; @@ -539,11 +539,13 @@ impl ::std::ops::DerefMut for TestEndpoint { } pub(super) fn subscribe() -> tracing::subscriber::DefaultGuard { - let sub = tracing_subscriber::FmtSubscriber::builder() + let builder = tracing_subscriber::FmtSubscriber::builder() .with_max_level(tracing::Level::TRACE) - .with_writer(|| TestWriter) - .finish(); - tracing::subscriber::set_default(sub) + .with_writer(|| TestWriter); + // tracing uses std::time to trace time, which panics in wasm. + #[cfg(all(target_family = "wasm", target_os = "unknown"))] + let builder = builder.without_time(); + tracing::subscriber::set_default(builder.finish()) } struct TestWriter; diff --git a/quinn-proto/src/token.rs b/quinn-proto/src/token.rs index 4fa6032951..d4de5200c7 100644 --- a/quinn-proto/src/token.rs +++ b/quinn-proto/src/token.rs @@ -1,7 +1,6 @@ use std::{ fmt, io, net::{IpAddr, SocketAddr}, - time::{Duration, SystemTime, UNIX_EPOCH}, }; use bytes::{Buf, BufMut}; @@ -10,7 +9,7 @@ use crate::{ coding::{BufExt, BufMutExt}, crypto::{CryptoError, HandshakeTokenKey, HmacKey}, shared::ConnectionId, - RESET_TOKEN_SIZE, + Duration, SystemTime, RESET_TOKEN_SIZE, UNIX_EPOCH, }; pub(crate) struct RetryToken { @@ -176,12 +175,10 @@ mod test { use super::*; use crate::cid_generator::{ConnectionIdGenerator, RandomConnectionIdGenerator}; use crate::MAX_CID_SIZE; + use crate::{Duration, UNIX_EPOCH}; use rand::RngCore; - use std::{ - net::Ipv6Addr, - time::{Duration, UNIX_EPOCH}, - }; + use std::net::Ipv6Addr; let rng = &mut rand::thread_rng();