common/mount/conflict/
base_wins.rs1use crate::crypto::PublicKey;
4
5use super::types::{Conflict, Resolution};
6use super::ConflictResolver;
7
8#[derive(Debug, Clone, Default)]
14pub struct BaseWins;
15
16impl BaseWins {
17 pub fn new() -> Self {
19 Self
20 }
21}
22
23impl ConflictResolver for BaseWins {
24 fn resolve(&self, _conflict: &Conflict, _local_peer: &PublicKey) -> Resolution {
25 Resolution::UseBase
26 }
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32 use crate::crypto::SecretKey;
33 use crate::mount::path_ops::{OpId, OpType, PathOperation};
34 use std::path::PathBuf;
35
36 fn make_peer_id(seed: u8) -> PublicKey {
37 let mut seed_bytes = [0u8; 32];
38 seed_bytes[0] = seed;
39 let secret = SecretKey::from(seed_bytes);
40 secret.public()
41 }
42
43 fn make_op(peer_id: PublicKey, timestamp: u64, op_type: OpType, path: &str) -> PathOperation {
44 PathOperation {
45 id: OpId { timestamp, peer_id },
46 op_type,
47 path: PathBuf::from(path),
48 content_link: None,
49 is_dir: false,
50 }
51 }
52
53 #[test]
54 fn test_base_wins() {
55 let peer1 = make_peer_id(1);
56 let peer2 = make_peer_id(2);
57
58 let base = make_op(peer1, 1, OpType::Add, "file.txt");
59 let incoming = make_op(peer2, 2, OpType::Remove, "file.txt");
60
61 let conflict = Conflict::new(PathBuf::from("file.txt"), base, incoming);
62 let resolver = BaseWins::new();
63
64 assert_eq!(resolver.resolve(&conflict, &peer1), Resolution::UseBase);
66 }
67}