CleanroomEnvironment

Struct CleanroomEnvironment 

Source
pub struct CleanroomEnvironment { /* private fields */ }
Expand description

Simple environment wrapper around existing infrastructure

Implementations§

Source§

impl CleanroomEnvironment

Source

pub async fn new() -> Result<Self>

Create a new cleanroom environment with default configuration

Source

pub async fn with_config(config: Option<CleanroomConfig>) -> Result<Self>

Create a new cleanroom environment with optional configuration

§Arguments
  • config - Optional CleanroomConfig. If None, uses default settings. If Some, uses configured default_image for test containers.
§Returns
  • Result<Self> - CleanroomEnvironment instance
§Errors
  • Returns error if backend initialization fails (e.g., invalid image)
Source

pub async fn execute_test<F, T>( &self, _test_name: &str, test_fn: F, ) -> Result<T>
where F: FnOnce() -> Result<T>,

Execute a test with OTel tracing and COMPLETE attribute emission

This method implements the FULL schema-compliant telemetry emission that Weaver validation requires. Every attribute in test_execution.yaml MUST be emitted here.

Source

pub async fn get_metrics(&self) -> Result<SimpleMetrics>

Get current metrics

Source

pub async fn enable_tracing(&self) -> Result<()>

Enable tracing for this environment

Source

pub async fn enable_metrics(&self) -> Result<()>

Enable metrics collection for this environment

Source

pub async fn get_traces(&self) -> Result<Vec<String>>

Get traces from this environment

Source

pub async fn get_container_reuse_stats(&self) -> (u32, u32)

Get container reuse statistics

Source

pub async fn has_container(&self, name: &str) -> bool

Check if a container with the given name has been created in this session

Source

pub async fn register_service( &self, plugin: Box<dyn ServicePlugin>, ) -> Result<()>

Register a service plugin

Source

pub async fn start_service(&self, service_name: &str) -> Result<ServiceHandle>

Start a service by name

Source

pub async fn stop_service(&self, handle_id: &str) -> Result<()>

Stop a service by handle ID

Source

pub async fn execute_command_with_output( &self, _handle: &ServiceHandle, command_args: &[String], ) -> Result<Output>

Execute a command in a default test container and return full output

§Arguments
  • _handle - Service handle (unused - executes in default container)
  • command_args - Command and arguments to execute
§Returns
  • Result<std::process::Output> - Command output with stdout, stderr, and exit status
Source

pub async fn services(&self) -> RwLockReadGuard<'_, ServiceRegistry>

Get service registry (read-only access)

Source

pub async fn register_container<T: Send + Sync + 'static>( &self, name: String, container: T, ) -> Result<()>

Register a container for reuse

Source

pub async fn get_or_create_container<F, T>( &self, name: &str, factory: F, ) -> Result<T>
where F: FnOnce() -> Result<T>, T: Send + Sync + Clone + 'static,

Get or create container with reuse pattern

This method implements true container reuse by storing and returning the actual container instances, providing the promised 10-50x performance improvement.

Source

pub async fn check_health(&self) -> HashMap<String, HealthStatus>

Check health of all services

Source

pub async fn get_service_logs( &self, service_id: &str, lines: usize, ) -> Result<Vec<String>>

Get service logs

Source

pub fn session_id(&self) -> Uuid

Get session ID

Source

pub fn backend(&self) -> &dyn Backend

Get backend

Source

pub async fn execute_in_service( &self, service_handle: &ServiceHandle, command: &[String], ) -> Result<ExecutionResult>

Execute a command in a specific service container

This method enables service-specific command execution, allowing test steps to target specific service containers (e.g., nginx, postgres) instead of always using the default test container.

§Arguments
  • service_handle - Handle to the service container
  • command - Command and arguments to execute
§Returns
  • Result<ExecutionResult> - Command output with stdout, stderr, and exit status
§Errors
  • Returns error if service container_id is missing from metadata
  • Returns error if command execution fails
§Backend API Design

This method implements proper REST-like semantics:

  • Resource identification: service_handle.id uniquely identifies the target
  • Idempotent operations: Same command can be executed multiple times
  • Clear error responses: Detailed error messages for debugging
  • Proper status codes: Exit codes map to HTTP-like status semantics
Source

pub async fn execute_in_container( &self, container_name: &str, command: &[String], workdir: Option<&str>, env: Option<&HashMap<String, String>>, ) -> Result<ExecutionResult>

Execute a command in a container with proper error handling and observability Core Team Compliance: Async for I/O operations, proper error handling, no unwrap/expect

This method creates a fresh container for each command execution, which is appropriate for testing scenarios where isolation is more important than performance.

Trait Implementations§

Source§

impl Debug for CleanroomEnvironment

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CleanroomEnvironment

Source§

fn default() -> Self

WARNING: TEST-ONLY IMPLEMENTATION

This Default implementation is ONLY for test code and WILL panic if Docker is unavailable. NEVER use CleanroomEnvironment::default() in production code.

§Production Usage

Use one of these methods instead:

  • CleanroomEnvironment::new().await - For default configuration with proper error handling
  • CleanroomEnvironment::with_config(config).await - For custom configuration
§Panics

Panics if Docker is not available or if the default backend cannot be initialized. This is intentional to ensure tests fail fast when Docker is missing.

§Test-Only Rationale

The Default trait cannot be async and cannot return Result, making proper error handling impossible. Therefore, this implementation is explicitly marked as test-only and is allowed to panic since test failures are acceptable when Docker is unavailable.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Fake for T

Source§

fn fake<U>(&self) -> U
where Self: FakeBase<U>,

Source§

fn fake_with_rng<U, R>(&self, rng: &mut R) -> U
where R: Rng + ?Sized, Self: FakeBase<U>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> IntoResult<T> for T

Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<G1, G2> Within<G2> for G1
where G2: Contains<G1>,

Source§

fn is_within(&self, b: &G2) -> bool

Source§

impl<T> ErasedDestructor for T
where T: 'static,