Skip to content

Commit 4e763bc

Browse files
committed
chore: made port dynamic
1 parent 3dce142 commit 4e763bc

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

Diff for: src/lib.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use actix_web::{dev::Server, web, App, HttpRequest, HttpResponse, HttpServer, Responder};
2+
use std::net::TcpListener;
23

34
async fn greet(req: HttpRequest) -> impl Responder {
45
let name = req.match_info().get("name").unwrap_or("world");
@@ -9,14 +10,14 @@ async fn health_check() -> impl Responder {
910
HttpResponse::Ok()
1011
}
1112

12-
pub fn run() -> Result<Server, std::io::Error> {
13+
pub fn run(listener: TcpListener) -> Result<Server, std::io::Error> {
1314
let server = HttpServer::new(|| {
1415
App::new()
1516
.route("/", web::get().to(greet))
1617
.route("/{name}", web::get().to(greet))
1718
.route("/health_check", web::get().to(health_check))
1819
})
19-
.bind(("127.0.0.1", 8080))?
20+
.listen(listener)?
2021
.run();
2122
Ok(server)
2223
}

Diff for: src/main.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
use robust_rust::run;
2+
use std::net::TcpListener;
23

34
#[tokio::main]
45
async fn main() -> std::io::Result<()> {
5-
run()?.await
6+
let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind random port");
7+
let port = listener.local_addr().unwrap().port();
8+
let endpoint = format!("Server running at http://127.0.0.1:{}", port);
9+
println!("{}", endpoint);
10+
run(listener)?.await
611
}

Diff for: tests/health_check.rs

+14-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
use reqwest::Client;
22
use robust_rust::run;
3+
use std::net::TcpListener;
34

45
#[tokio::test]
56
async fn health_check_works() {
67
// Arrange
7-
spawn_app();
8+
let address = spawn_app();
89
// We need to bring in `reqwest`
910
// to perform HTTP requests against our
1011
let client = Client::new();
1112
// Act
1213
let response = client
13-
.get("http://127.0.0.1:8080/health_check")
14+
.get(&format!("{}/health_check", &address))
1415
.send()
1516
.await
1617
.expect("Failed to execute request.");
@@ -19,10 +20,18 @@ async fn health_check_works() {
1920
assert_eq!(Some(19), response.content_length());
2021
}
2122

22-
2323
#[allow(clippy::let_underscore_future)]
24-
fn spawn_app() {
25-
let server = run().expect("Failed to bind address");
24+
fn spawn_app() -> String {
25+
let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind random port");
26+
27+
// Retrieve the port assigned to us by the OS
28+
let port = listener.local_addr().unwrap().port();
29+
30+
// Launch our application as a background task
31+
let server = run(listener).expect("Failed to bind address");
2632

2733
let _ = tokio::spawn(server);
34+
35+
// Return the application address to the caller!
36+
format!("http://127.0.0.1:{}", port)
2837
}

0 commit comments

Comments
 (0)