Skip to content

Commit 9adf12f

Browse files
authored
Add low-level test for message encoding (#1214)
This ensures that no one can accidentally break `HereIAm` or `YesItsMe` when editing the `enum Message`.
1 parent c77c8e4 commit 9adf12f

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

protocol/src/lib.rs

+62
Original file line numberDiff line numberDiff line change
@@ -1436,4 +1436,66 @@ mod tests {
14361436
let mut buffer = BytesMut::new();
14371437
assert!(encoder.encode(input, &mut buffer).is_err());
14381438
}
1439+
1440+
/// Test that the `Message::HereIAm { version, .. }` encoding is stable
1441+
///
1442+
/// This encoding is used to check for compatibility, so it cannot change
1443+
/// even upon protocol version bumps.
1444+
#[test]
1445+
fn here_i_am_version() {
1446+
let upstairs_id = Uuid::new_v4();
1447+
let session_id = Uuid::new_v4();
1448+
let m = Message::HereIAm {
1449+
version: 123,
1450+
upstairs_id,
1451+
session_id,
1452+
gen: 567,
1453+
read_only: true,
1454+
encrypted: false,
1455+
alternate_versions: vec![8, 9],
1456+
};
1457+
let encoded = bincode::serialize(&m).unwrap();
1458+
assert_eq!(
1459+
&encoded[0..16],
1460+
[
1461+
0, 0, 0, 0, // tag
1462+
123, 0, 0, 0, // version
1463+
16, 0, 0, 0, 0, 0, 0, 0, // UUID length
1464+
]
1465+
);
1466+
assert_eq!(&encoded[16..32], upstairs_id.into_bytes());
1467+
assert_eq!(&encoded[32..40], [16, 0, 0, 0, 0, 0, 0, 0]); // UUID length
1468+
assert_eq!(&encoded[40..56], session_id.into_bytes());
1469+
assert_eq!(
1470+
&encoded[56..],
1471+
[
1472+
55, 2, 0, 0, 0, 0, 0, 0, // gen
1473+
1, // read_only
1474+
0, // encrypted
1475+
2, 0, 0, 0, 0, 0, 0, 0, // alternate_versions.len()
1476+
8, 0, 0, 0, // alternate_versions[0]
1477+
9, 0, 0, 0, // alternate_versions[1]
1478+
]
1479+
);
1480+
}
1481+
1482+
/// Test that the `Message::YesItsMe { version, .. }` encoding is stable
1483+
///
1484+
/// This encoding is used to check for compatibility, so it cannot change
1485+
/// even upon protocol version bumps.
1486+
#[test]
1487+
fn yes_its_me_version() {
1488+
let m = Message::YesItsMe {
1489+
version: 123,
1490+
repair_addr: "127.0.0.1:123".parse().unwrap(),
1491+
};
1492+
let encoded = bincode::serialize(&m).unwrap();
1493+
assert_eq!(
1494+
&encoded[0..8],
1495+
[
1496+
1, 0, 0, 0, // tag
1497+
123, 0, 0, 0 // version
1498+
]
1499+
);
1500+
}
14391501
}

0 commit comments

Comments
 (0)