Files
h2/tests/h2-support/src/prelude.rs

138 lines
3.5 KiB
Rust

// Re-export H2 crate
pub use h2;
pub use h2::client;
pub use h2::ext::Protocol;
pub use h2::frame::StreamId;
pub use h2::server;
pub use h2::*;
// Re-export mock
pub use super::mock::{self, idle_ms};
// Re-export frames helpers
pub use super::frames;
// Re-export utility mod
pub use super::util;
// Re-export some type defines
pub use super::{Codec, SendFrame};
// Re-export macros
pub use super::{
assert_closed, assert_data, assert_default_settings, assert_go_away, assert_headers,
assert_ping, assert_settings, poll_err, poll_frame, raw_codec,
};
pub use super::assert::assert_frame_eq;
// Re-export useful crates
pub use tokio_test::io as mock_io;
pub use {bytes, futures, http, tokio::io as tokio_io, tracing, tracing_subscriber};
// Re-export primary future types
pub use futures::{Future, Sink, Stream};
// And our Future extensions
pub use super::future_ext::TestFuture;
// Our client_ext helpers
pub use super::client_ext::SendRequestExt;
// Re-export HTTP types
pub use http::{uri, HeaderMap, Method, Request, Response, StatusCode, Version};
pub use bytes::{Buf, BufMut, Bytes, BytesMut};
pub use tokio::io::{AsyncRead, AsyncWrite};
pub use std::thread;
pub use std::time::Duration;
pub static MAGIC_PREFACE: &[u8] = b"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n";
// ===== Everything under here shouldn't be used =====
// TODO: work on deleting this code
use futures::future;
pub use futures::future::poll_fn;
use futures::future::Either::*;
use std::pin::Pin;
pub trait MockH2 {
fn handshake(&mut self) -> &mut Self;
fn handshake_read_settings(&mut self, settings: &[u8]) -> &mut Self;
}
impl MockH2 for tokio_test::io::Builder {
fn handshake(&mut self) -> &mut Self {
self.handshake_read_settings(frames::SETTINGS)
}
fn handshake_read_settings(&mut self, settings: &[u8]) -> &mut Self {
self.write(MAGIC_PREFACE)
// Settings frame
.write(frames::SETTINGS)
.read(settings)
.read(frames::SETTINGS_ACK)
}
}
pub trait ClientExt {
fn run<'a, F: Future + Unpin + 'a>(
&'a mut self,
f: F,
) -> Pin<Box<dyn Future<Output = F::Output> + 'a>>;
}
impl<T, B> ClientExt for client::Connection<T, B>
where
T: AsyncRead + AsyncWrite + Unpin + 'static,
B: Buf + Unpin + 'static,
{
fn run<'a, F: Future + Unpin + 'a>(
&'a mut self,
f: F,
) -> Pin<Box<dyn Future<Output = F::Output> + 'a>> {
let res = future::select(self, f);
Box::pin(async {
match res.await {
Left((Ok(_), b)) => {
// Connection is done...
b.await
}
Right((v, _)) => return v,
Left((Err(e), _)) => panic!("err: {:?}", e),
}
})
}
}
pub fn build_large_headers() -> Vec<(&'static str, String)> {
vec![
("one", "hello".to_string()),
("two", build_large_string('2', 4 * 1024)),
("three", "three".to_string()),
("four", build_large_string('4', 4 * 1024)),
("five", "five".to_string()),
("six", build_large_string('6', 4 * 1024)),
("seven", "seven".to_string()),
("eight", build_large_string('8', 4 * 1024)),
("nine", "nine".to_string()),
("ten", build_large_string('0', 4 * 1024)),
("eleven", build_large_string('1', 32 * 1024)),
]
}
fn build_large_string(ch: char, len: usize) -> String {
let mut ret = String::new();
for _ in 0..len {
ret.push(ch);
}
ret
}