Skip to content

Commit d402c17

Browse files
committed
fix: additional tests
1 parent b41a663 commit d402c17

File tree

3 files changed

+94
-29
lines changed

3 files changed

+94
-29
lines changed

Cargo.lock

Lines changed: 53 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ ppp = "1.2"
4141
[dev-dependencies]
4242
serde_test = "1.0"
4343
tracing-test = "0.1"
44+
tokio-test = "0.4"
4445

4546
[features]
4647
default = ["postgres"]

src/api/proxy.rs

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -240,16 +240,17 @@ where
240240
#[cfg(test)]
241241
mod tests {
242242
use ppp::model::{Addresses, Command, Header, Protocol, Version};
243-
use std::io::Cursor;
243+
use std::io::{Error as IoError, ErrorKind, Result as IoResult};
244244
use std::net::SocketAddr;
245245
use tokio::io::AsyncReadExt;
246+
use tokio_test::io::Builder;
246247

247-
use super::{format_header, ToProxyStream};
248+
use super::{format_header, RemoteAddr, ToProxyStream};
248249
use crate::config::ProxyProtocol;
249250

250251
#[tokio::test]
251252
async fn test_disabled() {
252-
let mut proxy_stream = Cursor::new(vec![]).source(ProxyProtocol::Disabled);
253+
let mut proxy_stream = Builder::new().build().source(ProxyProtocol::Disabled);
253254
assert!(proxy_stream.real_addr().await.unwrap().is_none());
254255
}
255256

@@ -272,25 +273,26 @@ mod tests {
272273
async fn test_header_parsing() {
273274
let mut header = ppp::to_bytes(generate_ipv4()).unwrap();
274275
header.extend_from_slice("Test".as_ref());
275-
let mut header = Cursor::new(header).source(ProxyProtocol::Enabled);
276276

277-
let actual = header.real_addr().await.unwrap().unwrap();
277+
let proxy_stream = &mut &mut header[..].source(ProxyProtocol::Enabled);
278+
279+
let actual = proxy_stream.real_addr().await.unwrap().unwrap();
278280

279281
assert_eq!(SocketAddr::from(([1, 1, 1, 1], 24034)), actual);
280282

281283
let mut actual = String::new();
282-
let size = header.read_to_string(&mut actual).await.unwrap();
284+
let size = proxy_stream.read_to_string(&mut actual).await.unwrap();
283285
assert_eq!(4, size);
284286
assert_eq!("Test", actual);
285287
}
286288

287289
#[tokio::test]
288290
async fn test_incomplete() {
289291
let header = ppp::to_bytes(generate_ipv4()).unwrap();
290-
let header = &mut &header[..10];
291-
let mut header = header.source(ProxyProtocol::Enabled);
292292

293+
let header = &mut &mut header[..10].source(ProxyProtocol::Enabled);
293294
let actual = header.real_addr().await.unwrap_err();
295+
294296
assert_eq!(
295297
format!("{}", actual),
296298
"Stream finished before end of proxy protocol header"
@@ -300,14 +302,28 @@ mod tests {
300302
#[tokio::test]
301303
async fn test_failure() {
302304
let invalid = Vec::from("invalid header");
303-
let invalid = &mut &invalid[..];
304-
305-
let mut invalid = invalid.source(ProxyProtocol::Enabled);
305+
let invalid = &mut &mut invalid[..].source(ProxyProtocol::Enabled);
306306

307307
let actual = invalid.real_addr().await.unwrap_err();
308308
assert_eq!(format!("{}", actual), "Proxy Parser Error");
309309
}
310310

311+
#[tokio::test]
312+
async fn test_io_error() {
313+
// builder needs to be dropped before stream can be used
314+
// otherwise the internal tokio arc error has 2 strong references
315+
let mut proxy_stream = {
316+
let header = ppp::to_bytes(generate_ipv4()).unwrap();
317+
let mut builder = Builder::new();
318+
builder.read(&header[..10]);
319+
builder.read_error(IoError::new(ErrorKind::Other, "Error on IO"));
320+
builder.build().source(ProxyProtocol::Enabled)
321+
};
322+
323+
let error = proxy_stream.real_addr().await.unwrap_err();
324+
assert_eq!("Error on IO", format!("{}", error));
325+
}
326+
311327
#[test]
312328
fn test_addresses() {
313329
let address = [1, 1, 1, 1, 1, 1, 1, 1];
@@ -323,4 +339,17 @@ mod tests {
323339

324340
assert!(format_header(generate_header(addresses)).is_err());
325341
}
342+
343+
#[test]
344+
fn test_remote_addr_delegation() {
345+
impl RemoteAddr for &[u8] {
346+
fn remote_addr(&self) -> IoResult<SocketAddr> {
347+
Ok(SocketAddr::from(([1, 1, 1, 1], 443)))
348+
}
349+
}
350+
351+
let proxy_stream = &mut &[].source(ProxyProtocol::Enabled);
352+
let actual = proxy_stream.remote_addr().unwrap();
353+
assert_eq!(SocketAddr::from(([1, 1, 1, 1], 443)), actual)
354+
}
326355
}

0 commit comments

Comments
 (0)