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
            );
        }
    }
}