Keep confirmed Watch snapshots current
This commit is contained in:
@@ -747,11 +747,11 @@ impl WatchSnapshotSender {
|
|||||||
);
|
);
|
||||||
let selected_entries =
|
let selected_entries =
|
||||||
u32::try_from(entries.len()).map_err(|_| WatchSnapshotError::TooManyEntries)?;
|
u32::try_from(entries.len()).map_err(|_| WatchSnapshotError::TooManyEntries)?;
|
||||||
self.status = MobileWatchSnapshotStatus {
|
self.status = status_from_journal(&self.journal);
|
||||||
state: MobileWatchSnapshotState::Pending,
|
if self.status.state == MobileWatchSnapshotState::Pending {
|
||||||
revision: Some(self.journal.revision),
|
self.status.detail =
|
||||||
detail: snapshot_detail("pending delivery", selected_entries, self.journal.revision),
|
snapshot_detail("pending delivery", selected_entries, self.journal.revision);
|
||||||
};
|
}
|
||||||
Ok(WatchSnapshotTransfer {
|
Ok(WatchSnapshotTransfer {
|
||||||
revision: self.journal.revision,
|
revision: self.journal.revision,
|
||||||
selected_entries,
|
selected_entries,
|
||||||
|
|||||||
@@ -261,6 +261,33 @@ fn duplicate_delivery_after_watch_restart_recovers_a_lost_acknowledgement() -> T
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn confirmed_unchanged_snapshot_stays_current_when_republished() -> TestResult {
|
||||||
|
let directory = tempfile::tempdir()?;
|
||||||
|
let journal = directory.path().join("watch-snapshot.toml");
|
||||||
|
let entries = || vec![entry("otp/alice", "Acme", "alice", b"secret")];
|
||||||
|
let mut sender = WatchSnapshotSender::load(journal.clone());
|
||||||
|
let first = sender.prepare("paired-watch", entries())?;
|
||||||
|
let receipt = WatchRuntime::default()
|
||||||
|
.apply_snapshot(first.snapshot().expose().to_vec())?
|
||||||
|
.receipt()
|
||||||
|
.to_vec();
|
||||||
|
assert_eq!(
|
||||||
|
sender.acknowledge(&receipt)?.state(),
|
||||||
|
MobileWatchSnapshotState::Current
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(sender.prepare("paired-watch", entries())?.revision(), 1);
|
||||||
|
assert_eq!(sender.status().state(), MobileWatchSnapshotState::Current);
|
||||||
|
let mut reloaded = WatchSnapshotSender::load(journal);
|
||||||
|
assert_eq!(reloaded.status().state(), MobileWatchSnapshotState::Current);
|
||||||
|
reloaded.prepare("paired-watch", entries())?;
|
||||||
|
assert_eq!(reloaded.status().state(), MobileWatchSnapshotState::Current);
|
||||||
|
assert_eq!(reloaded.prepare("paired-watch", Vec::new())?.revision(), 2);
|
||||||
|
assert_eq!(reloaded.status().state(), MobileWatchSnapshotState::Pending);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn authoritative_context_switches_sender_generation_and_rejects_delayed_packets() -> TestResult {
|
fn authoritative_context_switches_sender_generation_and_rejects_delayed_packets() -> TestResult {
|
||||||
let directory = tempfile::tempdir()?;
|
let directory = tempfile::tempdir()?;
|
||||||
|
|||||||
Reference in New Issue
Block a user