File size: 3,965 Bytes
854994d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | use pretty_assertions::assert_eq;
use tempfile::TempDir;
use super::DaemonSettings;
use super::MAX_SHUTDOWN_GRACE_SECONDS;
#[tokio::test]
async fn remote_control_save_preserves_updater_settings() {
let temp = TempDir::new().expect("temp dir");
let path = temp.path().join("settings.json");
tokio::fs::write(&path, r#"{"remoteControlEnabled":true}"#)
.await
.expect("write legacy settings");
let settings = DaemonSettings::load(&path).await.expect("load settings");
assert_eq!(
settings,
DaemonSettings {
remote_control_enabled: true,
..DaemonSettings::default()
}
);
tokio::fs::write(
&path,
r#"{"remoteControlEnabled":true,"shutdownGraceSeconds":25,"updater":{"autoUpdateEnabled":false,"updateIntervalMinutes":17},"futureSetting":42}"#,
)
.await
.expect("write settings");
let updated = DaemonSettings {
remote_control_enabled: false,
..DaemonSettings::load(&path)
.await
.expect("load updater settings")
};
updated.save(&path).await.expect("save remote control");
assert_eq!(
serde_json::from_slice::<serde_json::Value>(
&tokio::fs::read(&path).await.expect("read settings")
)
.expect("parse settings"),
serde_json::json!({
"remoteControlEnabled": false,
"shutdownGraceSeconds": 25,
"updater": {"autoUpdateEnabled": false, "updateIntervalMinutes": 17},
"futureSetting": 42,
})
);
}
#[tokio::test]
async fn shutdown_grace_accepts_zero_through_five_minutes() {
let temp = TempDir::new().expect("temp dir");
let path = temp.path().join("settings.json");
assert_eq!(
DaemonSettings::load(&path).await.expect("missing settings"),
DaemonSettings::default()
);
assert_eq!(
DaemonSettings::load_for_stop(&path)
.await
.shutdown_grace_seconds,
60
);
for seconds in [
0,
MAX_SHUTDOWN_GRACE_SECONDS,
MAX_SHUTDOWN_GRACE_SECONDS + 1,
] {
tokio::fs::write(
&path,
serde_json::to_vec(&serde_json::json!({"shutdownGraceSeconds": seconds}))
.expect("serialize settings"),
)
.await
.expect("write settings");
let expected = (seconds <= MAX_SHUTDOWN_GRACE_SECONDS).then_some(seconds);
assert_eq!(
DaemonSettings::load(&path)
.await
.ok()
.map(|settings| settings.shutdown_grace_seconds),
expected
);
assert_eq!(
DaemonSettings::load_for_stop(&path)
.await
.shutdown_grace_seconds,
expected.unwrap_or(60)
);
}
tokio::fs::write(&path, r#"{"shutdownGraceSeconds":"unlimited"}"#)
.await
.expect("write invalid settings");
assert!(DaemonSettings::load(&path).await.is_err());
assert_eq!(
DaemonSettings::load_for_stop(&path)
.await
.shutdown_grace_seconds,
60
);
}
#[tokio::test]
async fn update_interval_accepts_long_values_and_rejects_zero() {
let temp = TempDir::new().expect("temp dir");
let path = temp.path().join("settings.json");
for minutes in [u32::MAX, 0] {
tokio::fs::write(
&path,
serde_json::to_vec(&serde_json::json!({
"updater": {"updateIntervalMinutes": minutes},
}))
.expect("serialize invalid settings"),
)
.await
.expect("write invalid settings");
let loaded = DaemonSettings::load(&path).await;
if minutes == 0 {
assert!(loaded.is_err());
} else {
assert_eq!(
loaded.expect("load long interval").update_interval_minutes,
minutes
);
}
}
}
|