Skip to content

Commit

Permalink
feat(jstzd): launch jstzd server with cli
Browse files Browse the repository at this point in the history
  • Loading branch information
huancheng-trili committed Nov 26, 2024
1 parent d054009 commit 88f7064
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 26 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ pretty_assertions = "1.4.1"
proptest = "1.1"
rand = "0.8"
regex = "1"
reqwest = { version = "0.11.24", features = ["json"] }
reqwest = { version = "0.11.24", features = ["json", "blocking"] }
reqwest-eventsource = "0.5.0"
rust-embed = { version = "8.5.0", features = ["interpolate-folder-path"] }
rustyline = "14.0.0"
Expand Down
34 changes: 30 additions & 4 deletions crates/jstzd/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ mod config;
pub mod docker;
pub mod task;

use crate::task::{
jstzd::{JstzdConfig, JstzdServer},
utils::retry,
};
pub use config::BOOTSTRAP_CONTRACT_NAMES;
use std::process::exit;

Expand All @@ -12,10 +16,7 @@ pub const JSTZ_NATIVE_BRIDGE_ADDRESS: &str = "KT1GFiPkkTjd14oHe6MrBPiRh5djzRkVWc
/// The `main` function for running jstzd
pub async fn main(config_path: &Option<String>) {
match config::build_config(config_path).await {
Ok((_port, _config)) => {
// TODO: run JstzdServer here
println!("ready");
}
Ok((port, config)) => run(port, config).await,
Err(e) => {
match config_path {
Some(p) => eprintln!("failed to build config from {}: {:?}", p, e),
Expand All @@ -25,3 +26,28 @@ pub async fn main(config_path: &Option<String>) {
}
}
}

async fn run(port: u16, config: JstzdConfig) {
let mut server = JstzdServer::new(config, port);
if let Err(e) = server.run().await {
eprintln!("failed to run jstzd server: {:?}", e);
let _ = server.stop().await;
exit(1);
}
wait_for_server(&mut server).await;

server.wait().await;

println!("Shutting down");
server.stop().await.unwrap();
}

async fn wait_for_server(server: &mut JstzdServer) {
let server_healthy =
retry(300, 100, || async { Ok(server.health_check().await) }).await;
if !server_healthy {
eprintln!("failed to run jstzd server: server never turned healthy");
let _ = server.stop().await;
exit(1);
}
}
54 changes: 33 additions & 21 deletions crates/jstzd/tests/main_test.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
use assert_cmd::prelude::*; // Add methods on commands
use predicates::prelude::*;
use assert_cmd::prelude::{CommandCargoExt, OutputAssertExt};
use octez::unused_port;
use predicates::prelude::predicate;
use std::thread;
use std::{io::Write, process::Command};
use tempfile::NamedTempFile; // Used for writing assertions // Run programs
use tempfile::NamedTempFile;

#[test]
fn unknown_command() -> Result<(), Box<dyn std::error::Error>> {
Expand All @@ -15,28 +17,38 @@ fn unknown_command() -> Result<(), Box<dyn std::error::Error>> {
Ok(())
}

#[test]
fn default_config() -> Result<(), Box<dyn std::error::Error>> {
let mut cmd = Command::cargo_bin("jstzd")?;

cmd.arg("run")
.assert()
.success()
.stdout(predicate::str::contains("ready"));

Ok(())
}

#[test]
fn valid_config_file() -> Result<(), Box<dyn std::error::Error>> {
let mut cmd = Command::cargo_bin("jstzd")?;
let port = unused_port();
let mut tmp_file = NamedTempFile::new().unwrap();
tmp_file.write_all(r#"{"protocol":{"bootstrap_accounts":[["edpkuSLWfVU1Vq7Jg9FucPyKmma6otcMHac9zG4oU1KMHSTBpJuGQ2","6000000000"]]}}"#.as_bytes()).unwrap();
tmp_file.write_all(format!(r#"{{"protocol":{{"bootstrap_accounts":[["edpkuSLWfVU1Vq7Jg9FucPyKmma6otcMHac9zG4oU1KMHSTBpJuGQ2","15000000000"]]}},"server_port":{}}}"#, port).as_bytes()).unwrap();

cmd.args(["run", &tmp_file.path().to_string_lossy()])
.assert()
.success()
.stdout(predicate::str::contains("ready"));
let handle = thread::spawn(move || {
Command::cargo_bin("jstzd")
.unwrap()
.args(["run", &tmp_file.path().to_string_lossy()])
.assert()
.success()
// baker log writes to stderr
.stderr(predicate::str::contains(
"block ready for delegate: activator",
));
});

let client = reqwest::blocking::Client::new();
thread::sleep(std::time::Duration::from_secs(10));
assert!(client
.get(&format!("http://localhost:{port}/health"))
.send()
.is_ok());
assert!(client
.put(&format!("http://localhost:{port}/shutdown"))
.send()?
.status()
.is_success());
handle
.join()
.expect("jstzd should have been taken down without any error");

Ok(())
}
Expand Down

0 comments on commit 88f7064

Please sign in to comment.