Skip to content

Commit

Permalink
Refactor test server to prepare for more tests (#90)
Browse files Browse the repository at this point in the history
* Rename xwt-echo-test-server to xwt-test-server

* Adjust CI for the new test server name

* Refactor the test server to allow for more test scenarios
  • Loading branch information
MOZGIII authored Feb 4, 2024
1 parent 7664073 commit 89cc16a
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 78 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/code.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@ jobs:
buildEnvScript: ${{ matrix.plan.platform.buildEnvScript }}
timeout-minutes: 10

- name: Build and run the test echo server
- name: Build and run the test server
run: |
cargo build --bin xwt-test-echo-server
cargo run --bin xwt-test-echo-server &
cargo build --bin xwt-test-server
cargo run --bin xwt-test-server &
if: ${{ matrix.plan.mode.needsEchoServer }}

- name: Run cargo ${{ matrix.plan.mode.cargoCommand }}
Expand Down
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
[package]
name = "xwt-test-echo-server"
name = "xwt-test-server"
version = "0.2.0"
edition = "2021"
resolver = "2"
license = "MIT"
description = """
The echo server to use for xwt testing.
The server to use for xwt testing.
Not intended to be wasm-compatible.
"""
repository = "https://github.com/MOZGIII/xwt"
autobins = false

[[bin]]
name = "xwt-test-echo-server"
name = "xwt-test-server"
path = "src/main.rs"
required-features = ["bin"]

Expand Down
Original file line number Diff line number Diff line change
@@ -1,76 +1,10 @@
//! The implementation of the echo server to use for xwt testing.
//! Not intended to be wasm-compatible.
#![allow(missing_docs)]
#![cfg(not(target_family = "wasm"))]
//! The implementation of the echo server.
use std::sync::Arc;

#[derive(Default)]
pub struct EndpointParams {
pub addr: Option<std::net::SocketAddr>,
pub cert: Option<wtransport::tls::Certificate>,
}

pub async fn endpoint(
params: EndpointParams,
) -> Result<wtransport::Endpoint<wtransport::endpoint::endpoint_side::Server>, std::io::Error> {
let EndpointParams { addr, cert } = params;

let cert = cert.unwrap_or_else(|| {
wtransport::tls::Certificate::new(vec![xwt_test_assets::CERT], xwt_test_assets::KEY)
.unwrap()
});

match cert.certificates().first() {
Some(cert) => {
let sha256_fingerpint = xwt_cert_utils::fingerprint::sha256(cert);
tracing::info!(message = "using tls certificate", %sha256_fingerpint);
}
None => tracing::info!(message = "not using tls certificate"),
};

let server_config =
wtransport::ServerConfig::builder()
.with_bind_address(addr.unwrap_or(std::net::SocketAddr::V4(
std::net::SocketAddrV4::new(std::net::Ipv4Addr::new(127, 0, 0, 1), 0),
)))
.with_certificate(cert)
.build();

let endpoint = wtransport::Endpoint::server(server_config)?;

Ok(endpoint)
}

pub async fn serve_endpoint(
endpoint: wtransport::Endpoint<wtransport::endpoint::endpoint_side::Server>,
) -> Result<std::convert::Infallible, std::io::Error> {
let bind_addr = endpoint.local_addr()?;
tracing::info!(message = "serving endpoint", %bind_addr);

loop {
let incoming_session = endpoint.accept().await;
tokio::spawn(async move {
if let Err(error) = serve_incoming_session(incoming_session).await {
tracing::error!(message = "error while serving incoming session", %error);
}
});
}
}

pub async fn serve_incoming_session(
incoming_session: wtransport::endpoint::IncomingSession,
pub async fn serve_session_request(
session_request: wtransport::endpoint::SessionRequest,
) -> Result<(), wtransport::error::ConnectionError> {
tracing::info!(message = "got an incoming session");
let session_request = incoming_session.await?;

if session_request.path() != "/echo" {
tracing::info!(message = "rejecting incoming session due to path mismatch");
session_request.not_found().await;
return Ok(());
}

tracing::info!(message = "accepting incoming session");
let connection = session_request.accept().await?;

Expand Down
81 changes: 81 additions & 0 deletions crates/xwt-test-server/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
//! The implementation of the echo server to use for xwt testing.
//! Not intended to be wasm-compatible.
#![allow(missing_docs)]
#![cfg(not(target_family = "wasm"))]

pub mod echo;

#[derive(Default)]
pub struct EndpointParams {
pub addr: Option<std::net::SocketAddr>,
pub cert: Option<wtransport::tls::Certificate>,
}

pub async fn endpoint(
params: EndpointParams,
) -> Result<wtransport::Endpoint<wtransport::endpoint::endpoint_side::Server>, std::io::Error> {
let EndpointParams { addr, cert } = params;

let cert = cert.unwrap_or_else(|| {
wtransport::tls::Certificate::new(vec![xwt_test_assets::CERT], xwt_test_assets::KEY)
.unwrap()
});

match cert.certificates().first() {
Some(cert) => {
let sha256_fingerpint = xwt_cert_utils::fingerprint::sha256(cert);
tracing::info!(message = "using tls certificate", %sha256_fingerpint);
}
None => tracing::info!(message = "not using tls certificate"),
};

let server_config =
wtransport::ServerConfig::builder()
.with_bind_address(addr.unwrap_or(std::net::SocketAddr::V4(
std::net::SocketAddrV4::new(std::net::Ipv4Addr::new(127, 0, 0, 1), 0),
)))
.with_certificate(cert)
.build();

let endpoint = wtransport::Endpoint::server(server_config)?;

Ok(endpoint)
}

pub async fn serve_endpoint(
endpoint: wtransport::Endpoint<wtransport::endpoint::endpoint_side::Server>,
) -> Result<std::convert::Infallible, std::io::Error> {
let bind_addr = endpoint.local_addr()?;
tracing::info!(message = "serving endpoint", %bind_addr);

loop {
let incoming_session = endpoint.accept().await;
tokio::spawn(async move {
if let Err(error) = serve_incoming_session(incoming_session).await {
tracing::error!(message = "error while serving incoming session", %error);
}
});
}
}

pub async fn serve_incoming_session(
incoming_session: wtransport::endpoint::IncomingSession,
) -> Result<(), wtransport::error::ConnectionError> {
tracing::info!(message = "got an incoming session");
let session_request = incoming_session.await?;

let path = session_request.path();

match path {
"/echo" => {
tracing::info!(message = "invoking echo handler");
self::echo::serve_session_request(session_request).await
}
_ => {
tracing::info!(message = "rejecting incoming session due to path mismatch");
session_request.not_found().await;
Ok(())
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ async fn main() -> color_eyre::eyre::Result<()> {
color_eyre::install()?;

let addr = envfury::or_parse("ADDR", "127.0.0.1:8080")?;
let endpoint = xwt_test_echo_server::endpoint(xwt_test_echo_server::EndpointParams {
let endpoint = xwt_test_server::endpoint(xwt_test_server::EndpointParams {
addr: Some(addr),
cert: None,
})
.await?;
xwt_test_echo_server::serve_endpoint(endpoint).await?;
xwt_test_server::serve_endpoint(endpoint).await?;

Ok(())
}
Expand Down

0 comments on commit 89cc16a

Please sign in to comment.