influxdb/influxdb_iox/tests/end_to_end_cases/run_cli.rs

147 lines
4.1 KiB
Rust

use std::{
io::Read,
process::{Command, Stdio},
time::{Duration, Instant},
};
use assert_cmd::prelude::CommandCargoExt;
use tempfile::NamedTempFile;
use crate::common::server_fixture::BindAddresses;
#[test]
fn test_unreadable_store_early_exit() {
// Check that the server process checks early for broken store configs and exits if the store is unusable. This
// is important in our K8s setup since the proxy (istio for example) might come up late, so we don't wanna end
// up with a global server error because of that.
let addrs = BindAddresses::default();
let mut process = Command::cargo_bin("influxdb_iox")
.unwrap()
.arg("run")
.arg("database")
.env("INFLUXDB_IOX_OBJECT_STORE", "s3")
.env("AWS_ACCESS_KEY_ID", "foo")
.env("AWS_SECRET_ACCESS_KEY", "bar")
.env("INFLUXDB_IOX_BUCKET", "bucket")
.env("INFLUXDB_IOX_BIND_ADDR", addrs.http_bind_addr())
.env("INFLUXDB_IOX_GRPC_BIND_ADDR", addrs.grpc_bind_addr())
.spawn()
.unwrap();
let t_start = Instant::now();
loop {
if t_start.elapsed() > Duration::from_secs(10) {
process.kill().unwrap();
panic!("Server process did not exit!");
}
if let Some(status) = process.try_wait().unwrap() {
assert!(!status.success());
break;
}
std::thread::sleep(Duration::from_millis(10));
}
}
#[test]
fn test_deprecated_cli_without_server_type() {
let addrs = BindAddresses::default();
let (log_file, log_path) = NamedTempFile::new()
.expect("opening log file")
.keep()
.expect("expected to keep");
let stdout_log_file = log_file
.try_clone()
.expect("cloning file handle for stdout");
let mut process = Command::cargo_bin("influxdb_iox")
.unwrap()
.arg("run")
.env("INFLUXDB_IOX_BIND_ADDR", addrs.http_bind_addr())
.env("INFLUXDB_IOX_GRPC_BIND_ADDR", addrs.grpc_bind_addr())
.stdout(stdout_log_file)
.spawn()
.unwrap();
let t_start = Instant::now();
loop {
if t_start.elapsed() > Duration::from_secs(10) {
process.kill().unwrap();
panic!("Cannot find expected output in time.");
}
let mut output = String::new();
std::fs::File::open(&log_path)
.unwrap()
.read_to_string(&mut output)
.unwrap();
if output.contains("WARNING: Not specifying the run-mode is deprecated.") {
break;
}
std::thread::sleep(Duration::from_millis(10));
}
// process is still running
assert!(process.try_wait().unwrap().is_none());
// kill process
process.kill().unwrap();
process.wait().unwrap();
}
#[test]
fn test_early_return_from_grpc_worker() {
assert_early_exit_return_code("EarlyReturnFromGrpcWorker");
}
#[test]
fn test_early_return_from_server_worker() {
assert_early_exit_return_code("EarlyReturnFromServerWorker");
}
#[test]
fn test_panic_in_grpc_worker() {
assert_early_exit_return_code("PanicInGrpcWorker");
}
#[test]
fn test_panic_in_server_worker() {
assert_early_exit_return_code("PanicInServerWorker");
}
fn assert_early_exit_return_code(test_action: &str) {
let addrs = BindAddresses::default();
let mut process = Command::cargo_bin("influxdb_iox")
.unwrap()
.arg("run")
.arg("test")
.arg("--test-action")
.arg(test_action)
.env("INFLUXDB_IOX_BIND_ADDR", addrs.http_bind_addr())
.env("INFLUXDB_IOX_GRPC_BIND_ADDR", addrs.grpc_bind_addr())
.stdout(Stdio::null())
.stderr(Stdio::null())
.spawn()
.unwrap();
let t_start = Instant::now();
loop {
if t_start.elapsed() > Duration::from_secs(10) {
process.kill().unwrap();
panic!("Server process did not exit!");
}
if let Some(status) = process.try_wait().unwrap() {
assert!(!status.success());
break;
}
std::thread::sleep(Duration::from_millis(10));
}
}