Keep confirmed Watch snapshots current
This commit is contained in:
@@ -747,11 +747,11 @@ impl WatchSnapshotSender {
|
||||
);
|
||||
let selected_entries =
|
||||
u32::try_from(entries.len()).map_err(|_| WatchSnapshotError::TooManyEntries)?;
|
||||
self.status = MobileWatchSnapshotStatus {
|
||||
state: MobileWatchSnapshotState::Pending,
|
||||
revision: Some(self.journal.revision),
|
||||
detail: snapshot_detail("pending delivery", selected_entries, self.journal.revision),
|
||||
};
|
||||
self.status = status_from_journal(&self.journal);
|
||||
if self.status.state == MobileWatchSnapshotState::Pending {
|
||||
self.status.detail =
|
||||
snapshot_detail("pending delivery", selected_entries, self.journal.revision);
|
||||
}
|
||||
Ok(WatchSnapshotTransfer {
|
||||
revision: self.journal.revision,
|
||||
selected_entries,
|
||||
|
||||
@@ -261,6 +261,33 @@ fn duplicate_delivery_after_watch_restart_recovers_a_lost_acknowledgement() -> T
|
||||
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]
|
||||
fn authoritative_context_switches_sender_generation_and_rejects_delayed_packets() -> TestResult {
|
||||
let directory = tempfile::tempdir()?;
|
||||
|
||||
Reference in New Issue
Block a user