strest 0.1.10

Blazing-fast async HTTP load tester in Rust - lock-free design, real-time stats, distributed runs, and optional chart exports for high-load API testing.
Documentation
use super::*;
use crate::domain::run::{LoadMode, ProtocolKind};

#[derive(Clone)]
struct FakeAdapter;

impl ProtocolAdapter for FakeAdapter {
    fn protocol(&self) -> ProtocolKind {
        ProtocolKind::Http
    }

    fn display_name(&self) -> &'static str {
        "fake-http"
    }

    fn executes_traffic(&self) -> bool {
        true
    }

    fn supports_stateful_connections(&self) -> bool {
        true
    }

    fn supported_load_modes(&self) -> &'static [LoadMode] {
        &[
            LoadMode::Arrival,
            LoadMode::Step,
            LoadMode::Ramp,
            LoadMode::Jitter,
            LoadMode::Burst,
            LoadMode::Soak,
        ]
    }
}

impl TransportAdapter for FakeAdapter {}

#[test]
fn builtins_register_http_as_executable() {
    let registry = ProtocolRegistry::with_builtins();
    assert!(registry.adapter(ProtocolKind::Http).is_some());
    assert!(registry.supports_execution(ProtocolKind::Http));
    assert!(registry.supports_load_mode(ProtocolKind::Http, LoadMode::Soak));
}

#[test]
fn builtins_mark_websocket_as_executable() {
    let registry = ProtocolRegistry::with_builtins();
    assert!(registry.adapter(ProtocolKind::Websocket).is_some());
    assert!(registry.supports_execution(ProtocolKind::Websocket));
}

#[test]
fn builtins_mark_grpc_unary_as_executable() {
    let registry = ProtocolRegistry::with_builtins();
    assert!(registry.adapter(ProtocolKind::GrpcUnary).is_some());
    assert!(registry.supports_execution(ProtocolKind::GrpcUnary));
}

#[test]
fn builtins_mark_grpc_streaming_as_executable() {
    let registry = ProtocolRegistry::with_builtins();
    assert!(registry.adapter(ProtocolKind::GrpcStreaming).is_some());
    assert!(registry.supports_execution(ProtocolKind::GrpcStreaming));
}

#[test]
fn builtins_mark_quic_as_executable() {
    let registry = ProtocolRegistry::with_builtins();
    assert!(registry.adapter(ProtocolKind::Quic).is_some());
    assert!(registry.supports_execution(ProtocolKind::Quic));
}

#[test]
fn builtins_mark_mqtt_as_executable() {
    let registry = ProtocolRegistry::with_builtins();
    assert!(registry.adapter(ProtocolKind::Mqtt).is_some());
    assert!(registry.supports_execution(ProtocolKind::Mqtt));
}

#[test]
fn builtins_mark_enet_as_executable() {
    let registry = ProtocolRegistry::with_builtins();
    assert!(registry.adapter(ProtocolKind::Enet).is_some());
    assert!(registry.supports_execution(ProtocolKind::Enet));
}

#[test]
fn builtins_mark_kcp_as_executable() {
    let registry = ProtocolRegistry::with_builtins();
    assert!(registry.adapter(ProtocolKind::Kcp).is_some());
    assert!(registry.supports_execution(ProtocolKind::Kcp));
}

#[test]
fn builtins_mark_raknet_as_executable() {
    let registry = ProtocolRegistry::with_builtins();
    assert!(registry.adapter(ProtocolKind::Raknet).is_some());
    assert!(registry.supports_execution(ProtocolKind::Raknet));
}

#[test]
fn duplicate_registration_is_rejected() {
    let mut registry = ProtocolRegistry::with_builtins();
    let second = registry.register_adapter(FakeAdapter);
    assert!(second.is_err());
}

#[test]
fn example_adapters_are_registerable() {
    let mut registry = ProtocolRegistry::with_builtins();
    let game = examples::GameUdpPlugin;
    let chat = examples::ChatWebSocketPlugin;
    let mqtt = examples::TelemetryMqttPlugin;

    assert!(registry.register_adapter(game).is_err());
    assert!(registry.register_adapter(chat).is_err());
    assert!(registry.register_adapter(mqtt).is_err());
}