feat(gui): tines-gui skeleton (ipc client, config gen, theme)
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
//! The GUI's generated configs must deserialize as the service's `Config`
|
||||
//! byte-for-byte: unknown keys are fatal on the service side.
|
||||
|
||||
use tines_gui::config::{NodeConfig, generate_node_id};
|
||||
|
||||
#[test]
|
||||
fn generated_config_parses_as_service_config() {
|
||||
// bt: transport bt, a peer, no bus socket.
|
||||
let bt = NodeConfig::bt(
|
||||
generate_node_id(),
|
||||
Some(generate_node_id()),
|
||||
"/tmp/fleet/log".into(),
|
||||
"/tmp/fleet/node.sock".into(),
|
||||
);
|
||||
let json = serde_json::to_string(&bt).unwrap();
|
||||
let parsed: tines::config::Config =
|
||||
serde_json::from_str(&json).expect("bt config must parse as the service config");
|
||||
assert_eq!(parsed.node_id, bt.node_id);
|
||||
assert_eq!(parsed.peer, bt.peer);
|
||||
assert_eq!(parsed.bus_socket, None);
|
||||
assert_eq!(parsed.validate(), Ok(()));
|
||||
|
||||
// bus: transport bus, no peer, a bus socket.
|
||||
let bus = NodeConfig::bus(
|
||||
generate_node_id(),
|
||||
None,
|
||||
"/tmp/fleet/log".into(),
|
||||
"/tmp/fleet/node.sock".into(),
|
||||
"/tmp/fleet/bus.sock".into(),
|
||||
);
|
||||
let json = serde_json::to_string(&bus).unwrap();
|
||||
let parsed: tines::config::Config =
|
||||
serde_json::from_str(&json).expect("bus config must parse as the service config");
|
||||
assert_eq!(parsed.node_id, bus.node_id);
|
||||
assert_eq!(parsed.peer, None);
|
||||
assert_eq!(parsed.bus_socket, Some("/tmp/fleet/bus.sock".to_string()));
|
||||
assert_eq!(parsed.validate(), Ok(()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn node_id_is_32_hex_chars() {
|
||||
let id = generate_node_id();
|
||||
assert_eq!(id.len(), 32, "node id must be 32 chars, got {id:?}");
|
||||
assert!(
|
||||
id.chars()
|
||||
.all(|c| c.is_ascii_hexdigit() && !c.is_ascii_uppercase()),
|
||||
"node id must be lowercase hex, got {id:?}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn fleet_dir_is_0700() {
|
||||
use std::os::unix::fs::PermissionsExt;
|
||||
|
||||
// Point XDG_STATE_HOME at a scratch dir so the test never touches the
|
||||
// real ~/.local/state, and fleet_dir's creation is what we inspect.
|
||||
let scratch = std::env::temp_dir().join(format!("tines-gui-state-{}", std::process::id()));
|
||||
std::fs::remove_dir_all(&scratch).ok();
|
||||
std::fs::create_dir_all(&scratch).unwrap();
|
||||
// SAFETY: this is the only test in this binary touching fleet_dir, and
|
||||
// the test binary dies right after; the env change cannot leak to other
|
||||
// tests in other binaries.
|
||||
unsafe { std::env::set_var("XDG_STATE_HOME", &scratch) };
|
||||
|
||||
let dir = tines_gui::config::fleet_dir("fleet-a");
|
||||
let meta = std::fs::metadata(&dir).expect("fleet dir must be created");
|
||||
assert!(meta.is_dir());
|
||||
assert_eq!(
|
||||
meta.permissions().mode() & 0o777,
|
||||
0o700,
|
||||
"fleet dir must be 0700"
|
||||
);
|
||||
|
||||
std::fs::remove_dir_all(&scratch).ok();
|
||||
}
|
||||
Reference in New Issue
Block a user