Struct libcnb_test::ContainerContext
source · pub struct ContainerContext {
pub container_name: String,
/* private fields */
}
Expand description
Context of a launched container.
Fields§
§container_name: String
The randomly generated name of this container.
Implementations§
source§impl ContainerContext
impl ContainerContext
sourcepub fn logs_now(&self) -> LogOutput
pub fn logs_now(&self) -> LogOutput
Gets the container’s log output until the current point in time.
Note: This method will only return logs until the current point in time. It will not block until the container stops. Since the output of this method depends on timing, directly asserting on its contents might result in flaky tests.
See: logs_wait
for a blocking alternative.
§Example
use libcnb_test::{assert_contains, assert_empty, BuildConfig, ContainerConfig, TestRunner};
TestRunner::default().build(
BuildConfig::new("heroku/builder:22", "tests/fixtures/app"),
|context| {
// ...
context.start_container(ContainerConfig::new(), |container| {
let log_output_until_now = container.logs_now();
assert_empty!(log_output_until_now.stderr);
assert_contains!(log_output_until_now.stdout, "Expected output");
});
},
);
§Panics
Panics if there was an error retrieving the logs from the container.
sourcepub fn logs_wait(&self) -> LogOutput
pub fn logs_wait(&self) -> LogOutput
Gets the container’s log output until the container stops.
Note: This method will block until the container stops. If the container never stops by itself, your test will hang indefinitely. This is common when the container hosts an HTTP service.
See: logs_now
for a non-blocking alternative.
§Example
use libcnb_test::{assert_contains, assert_empty, BuildConfig, ContainerConfig, TestRunner};
TestRunner::default().build(
BuildConfig::new("heroku/builder:22", "tests/fixtures/app"),
|context| {
// ...
context.start_container(ContainerConfig::new(), |container| {
let all_log_output = container.logs_wait();
assert_empty!(all_log_output.stderr);
assert_contains!(all_log_output.stdout, "Expected output");
});
},
);
§Panics
Panics if there was an error retrieving the logs from the container.
sourcepub fn address_for_port(&self, port: u16) -> SocketAddr
pub fn address_for_port(&self, port: u16) -> SocketAddr
Returns the local address of an exposed container port.
§Example
use libcnb_test::{BuildConfig, ContainerConfig, TestRunner};
TestRunner::default().build(
BuildConfig::new("heroku/builder:22", "tests/fixtures/app"),
|context| {
// ...
context.start_container(
ContainerConfig::new()
.env("PORT", "12345")
.expose_port(12345),
|container| {
let address_on_host = container.address_for_port(12345);
// ...
},
);
},
);
§Panics
Will panic if there was an error obtaining the container port mapping, or the specified port
was not exposed using ContainerConfig::expose_port
.
sourcepub fn shell_exec(&self, command: impl AsRef<str>) -> LogOutput
pub fn shell_exec(&self, command: impl AsRef<str>) -> LogOutput
Executes a shell command inside an already running container.
§Example
use libcnb_test::{assert_contains, BuildConfig, ContainerConfig, TestRunner};
TestRunner::default().build(
BuildConfig::new("heroku/builder:22", "tests/fixtures/app"),
|context| {
// ...
context.start_container(ContainerConfig::new(), |container| {
let log_output = container.shell_exec("ps");
assert_contains!(log_output.stdout, "gunicorn");
});
},
);
§Panics
Panics if it was not possible to exec into the container, or if the command exited with a non-zero exit code.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for ContainerContext
impl RefUnwindSafe for ContainerContext
impl Send for ContainerContext
impl Sync for ContainerContext
impl Unpin for ContainerContext
impl UnwindSafe for ContainerContext
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more