#![cfg(feature = "blocking")]
use std::net::{Ipv6Addr, TcpListener};
use testcontainers::{
core::{IntoContainerPort, WaitFor},
runners::{SyncBuilder, SyncRunner},
GenericBuildableImage,
};
#[test]
fn test_ipv4_ipv6_host_ports() -> anyhow::Result<()> {
let _ = pretty_env_logger::try_init();
let image = GenericBuildableImage::new("simple_web_server", "latest")
.with_file(
std::fs::canonicalize("../testimages/simple_web_server").unwrap(),
".",
)
.build_image()
.unwrap()
.with_wait_for(WaitFor::message_on_stdout("server is ready"))
.with_wait_for(WaitFor::seconds(1));
let first_container = image.clone().start()?;
let first_ipv4_port = first_container.get_host_port_ipv4(80.tcp())?;
let first_ipv6_port = first_container.get_host_port_ipv6(80.tcp())?;
assert_eq!(
"foo",
reqwest::blocking::get(format!("http://127.0.0.1:{first_ipv4_port}"))?.text()?,
);
assert_eq!(
"foo",
reqwest::blocking::get(format!("http://[::1]:{first_ipv6_port}"))?.text()?,
);
let mut sockets = Vec::new();
for port in first_ipv6_port + 1..first_ipv6_port + 9 {
if let Ok(socket) = TcpListener::bind((Ipv6Addr::LOCALHOST, port)) {
sockets.push(socket);
}
}
let second_container = image.start()?;
let second_ipv4_port = second_container.get_host_port_ipv4(80.tcp())?;
let second_ipv6_port = second_container.get_host_port_ipv6(80.tcp())?;
assert_eq!(
"foo",
reqwest::blocking::get(format!("http://127.0.0.1:{second_ipv4_port}"))?.text()?,
);
assert_eq!(
"foo",
reqwest::blocking::get(format!("http://[::1]:{second_ipv6_port}"))?.text()?,
);
Ok(())
}