Skip to main content

TestContext

Struct TestContext 

Source
pub struct TestContext {
    pub config: Config,
    pub services: Services,
    pub environment: AnyEnvironmentState,
    pub keep_env: bool,
    /* private fields */
}
Expand description

Main test context combining configuration and services

Fields§

§config: Config§services: Services§environment: AnyEnvironmentState

The complete environment configuration containing instance name, SSH keys, and paths. Stored as AnyEnvironmentState to track the actual current state throughout the deployment lifecycle (Created → Provisioning → Provisioned → Configuring → Configured, etc.)

§keep_env: bool

Whether to keep the deployment environment after completion.

When false, the environment will be automatically cleaned up (destroyed) after the test process completes. When true, the environment will be left running for manual inspection or debugging.

Implementations§

Source§

impl TestContext

Source

pub fn from_environment( keep_env: bool, environment: Environment, context_type: TestContextType, ) -> Result<Self, TestContextError>

Creates a new test environment from an Environment entity

This method provides a simplified interface that accepts an Environment entity containing all the necessary configuration, rather than individual parameters.

Important: This method does NOT initialize the environment. You must call .init() on the returned TestContext to complete the setup.

§Arguments
  • keep_env - Whether to keep the environment after tests complete
  • environment - The Environment entity containing instance name, SSH keys, and paths
  • context_type - The type of test environment (Container or VirtualMachine)
§Returns

A TestContext that requires .init() to be called before use.

§Errors

Returns an error if:

  • Input validation fails (empty or invalid templates directory)
  • Current directory cannot be determined
  • Temporary directory creation fails
  • SSH key setup fails
§Examples
use torrust_tracker_deployer_lib::domain::{Environment, EnvironmentName};
use torrust_tracker_deployer_lib::domain::provider::{LxdConfig, ProviderConfig};
use torrust_tracker_deployer_lib::domain::ProfileName;
use torrust_tracker_deployer_lib::shared::Username;
use torrust_tracker_deployer_lib::adapters::ssh::SshCredentials;
use torrust_tracker_deployer_lib::testing::e2e::context::{TestContext, TestContextType};
use std::path::PathBuf;
use tempfile::TempDir;
use chrono::{TimeZone, Utc};

// Use temporary directory to avoid creating real directories
let temp_dir = TempDir::new()?;
let temp_path = temp_dir.path();

let env_name = EnvironmentName::new("test-example".to_string())?;
let ssh_username = Username::new("torrust".to_string())?;
let ssh_credentials = SshCredentials::new(
    temp_path.join("testing_rsa"),
    temp_path.join("testing_rsa.pub"),
    ssh_username,
);
let provider_config = ProviderConfig::Lxd(LxdConfig {
    profile_name: ProfileName::new(format!("lxd-{}", env_name.as_str())).unwrap(),
});
let created_at = Utc.with_ymd_and_hms(2025, 1, 1, 0, 0, 0).unwrap();
let environment = Environment::new(env_name, provider_config, ssh_credentials, 22, created_at);

let test_context = TestContext::from_environment(
    false,
    environment,
    TestContextType::Container,
)?.init()?;
Source

pub fn init(self) -> Result<Self, TestContextError>

Initializes the test environment by preparing templates and logging setup

This method performs the final environment setup with side effects. It must be called explicitly after creating a TestContext to complete the setup.

§Errors

Returns an error if:

  • Template preparation fails
  • Environment persistence fails
Source

pub fn temp_dir_path(&self) -> Option<&Path>

Gets the temporary directory path for logging or debugging purposes

Source

pub fn update_from_provisioned( &mut self, provisioned_env: Environment<Provisioned>, )

Updates the test context environment from a provisioned environment

This method updates the internal environment state after provisioning completes, ensuring the TestContext maintains the latest and accurate environment state.

§Arguments
  • provisioned_env - The provisioned environment returned by ProvisionCommandHandler
§Examples
// After provisioning succeeds, update the test context
test_context.update_from_provisioned(provisioned_env);
Source

pub fn update_from_configured( &mut self, configured_env: Environment<Configured>, )

Updates the test context environment from a configured environment

This method updates the internal environment state after configuration completes, ensuring the TestContext maintains the latest and accurate environment state.

§Arguments
  • configured_env - The configured environment returned by ConfigureCommandHandler
§Examples
// After configuration succeeds, update the test context
test_context.update_from_configured(configured_env);
Source

pub fn update_from_destroyed(&mut self, destroyed_env: Environment<Destroyed>)

Updates the test context environment from a destroyed environment

This method updates the internal environment state after destruction completes, ensuring the TestContext maintains the latest and accurate environment state.

§Arguments
  • destroyed_env - The destroyed environment returned by DestroyCommandHandler
§Examples
// After destruction succeeds, update the test context
test_context.update_from_destroyed(destroyed_env);
Source

pub fn create_repository(&self) -> Arc<dyn EnvironmentRepository>

Creates a repository for the current environment

This is a convenience method that creates an EnvironmentRepository configured for this test context’s environment. The repository is created using the repository factory with the environment’s data directory.

§Returns

An Arc<dyn EnvironmentRepository> that can be used to persist and load environment state for this test context.

§Examples
let repository = test_context.create_repository();
// Use repository for state persistence...

Trait Implementations§

Source§

impl Debug for TestContext

Source§

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

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

impl Drop for TestContext

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> IntoResult<T> for T

Source§

type Err = !

Source§

fn into_result(self) -> Result<T, <T as IntoResult<T>>::Err>

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: Sized + 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: Sized + 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 = !

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

fn try_from(value: U) -> Result<T, !>

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