# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # Standalone crate — the empty [workspace] table prevents Cargo from # treating this as part of the root workspace, avoiding Dockerfile # and Cargo.lock coupling. [workspace] [package] name = "openshell-e2e" description = "End-to-end tests for the OpenShell CLI" version = "0.1.0" edition = "2024" rust-version = "1.90" license = "Apache-2.0" publish = false [features] e2e = [] # Selects tests that rely on `host.openshell.internal` (the sandbox's stable # alias to the host running test fixtures). docker, podman, and vm wire the # alias unconditionally; the kube driver only does so when the chart's # `server.hostGatewayIP` is set, so `e2e-kubernetes` does NOT imply this and # the helm wrapper opts in explicitly when it has resolved an IP. e2e-host-gateway = ["e2e"] e2e-local-container-driver = ["e2e"] e2e-docker = ["e2e", "e2e-host-gateway", "e2e-local-container-driver"] e2e-gpu = ["e2e"] e2e-docker-gpu = ["e2e-docker", "e2e-gpu"] e2e-kubernetes = ["e2e"] e2e-podman = ["e2e", "e2e-host-gateway", "e2e-local-container-driver"] e2e-podman-gpu = ["e2e-podman", "e2e-gpu"] e2e-vm = ["e2e", "e2e-host-gateway"] [[test]] name = "custom_image" path = "tests/custom_image.rs" required-features = ["e2e-docker"] [[test]] name = "docker_preflight" path = "tests/docker_preflight.rs" required-features = ["e2e-docker"] [[test]] name = "driver_config_volume" path = "tests/driver_config_volume.rs" required-features = ["e2e-local-container-driver"] [[test]] name = "gateway_resume" path = "tests/gateway_resume.rs" required-features = ["e2e-docker"] [[test]] name = "local_driver_token_restart" path = "tests/local_driver_token_restart.rs" required-features = ["e2e"] [[test]] name = "podman_gateway_resume" path = "tests/podman_gateway_resume.rs" required-features = ["e2e-podman"] [[test]] name = "vm_gateway_resume" path = "tests/vm_gateway_resume.rs" required-features = ["e2e-vm"] [[test]] name = "readyz_health" path = "tests/readyz_health.rs" required-features = ["e2e-kubernetes"] [[test]] name = "websocket_conformance" path = "tests/websocket_conformance.rs" required-features = ["e2e-host-gateway"] [[test]] name = "user_namespaces" path = "tests/user_namespaces.rs" required-features = ["e2e-kubernetes"] [[test]] name = "host_gateway_alias" path = "tests/host_gateway_alias.rs" required-features = ["e2e-host-gateway"] [[test]] name = "forward_proxy_l7_bypass" path = "tests/forward_proxy_l7_bypass.rs" required-features = ["e2e-host-gateway"] [[test]] name = "forward_proxy_graphql_l7" path = "tests/forward_proxy_graphql_l7.rs" required-features = ["e2e-host-gateway"] [[test]] name = "forward_proxy_jsonrpc_l7" path = "tests/forward_proxy_jsonrpc_l7.rs" required-features = ["e2e-host-gateway"] [[test]] name = "workspace_lifecycle" path = "tests/workspace_lifecycle.rs" required-features = ["e2e"] [[test]] name = "gpu" path = "tests/gpu.rs" required-features = ["e2e-gpu"] [dependencies] base64 = "0.22" bollard = "0.20" bytes = "1" futures-util = "0.3" http-body-util = "0.1" hyper = { version = "1", features = ["client", "http1"] } hyper-util = { version = "0.1", features = ["tokio"] } prost = "0.14" tokio = { version = "1.43", features = ["full"] } tempfile = "3" sha1 = "0.10" sha2 = "0.10" hex = "0.4" rand = "0.9" serde = { version = "1", features = ["derive"] } serde_json = "1" serde_yml = "0.0.12" [dev-dependencies] serial_test = "3" [lints.rust] unsafe_code = "warn" rust_2018_idioms = { level = "warn", priority = -1 } [lints.clippy] all = { level = "warn", priority = -1 } pedantic = { level = "warn", priority = -1 } module_name_repetitions = "allow" must_use_candidate = "allow" missing_errors_doc = "allow" missing_panics_doc = "allow"