Skip to content

Commit 0a1bd10

Browse files
lauraltioanachirca
authored andcommitted
Add more integration tests
Added tests for Vec, struct, union, enum, FamStructWrapper and combinations of them for testing `Versionize` functionality. Signed-off-by: Laura Loghin <[email protected]>
1 parent 3ecbf9b commit 0a1bd10

File tree

5 files changed

+1326
-353
lines changed

5 files changed

+1326
-353
lines changed

coverage_config_aarch64.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"coverage_score": 91.8, "exclude_path": "", "crate_features": ""}
1+
{"coverage_score": 92.2, "exclude_path": "", "crate_features": ""}

coverage_config_x86_64.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"coverage_score": 92.8, "exclude_path": "", "crate_features": ""}
1+
{"coverage_score": 93.0, "exclude_path": "", "crate_features": ""}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,6 @@ mod tests {
116116
format!("{:?}{}", Io(0), Io(0));
117117
format!("{:?}{}", Serialize(str.clone()), Serialize(str.clone()));
118118
format!("{:?}{}", Deserialize(str.clone()), Deserialize(str.clone()));
119-
format!("{:?}{}", Semantic(str.clone()), Semantic(str.clone()));
119+
format!("{:?}{}", Semantic(str.clone()), Semantic(str));
120120
}
121121
}

src/primitives.rs

Lines changed: 0 additions & 295 deletions
Original file line numberDiff line numberDiff line change
@@ -418,30 +418,8 @@ impl<T: Versionize, U: Versionize> Versionize for (T, U) {
418418

419419
#[cfg(test)]
420420
mod tests {
421-
#![allow(non_upper_case_globals)]
422-
#![allow(non_camel_case_types)]
423-
#![allow(non_snake_case)]
424421
use super::*;
425422
use super::{VersionMap, Versionize, VersionizeResult};
426-
use vmm_sys_util::generate_fam_struct_impl;
427-
428-
#[repr(C)]
429-
#[derive(Default, Debug, Versionize)]
430-
struct Message {
431-
pub len: u32,
432-
pub padding: u32,
433-
pub value: u32,
434-
#[version(start = 2, default_fn = "default_extra_value")]
435-
pub extra_value: u16,
436-
pub entries: __IncompleteArrayField<u32>,
437-
}
438-
439-
impl Message {
440-
fn default_extra_value(_source_version: u16) -> u16 {
441-
321
442-
}
443-
}
444-
generate_fam_struct_impl!(Message, u32, entries, u32, len, 100);
445423

446424
// Generate primitive tests using this macro.
447425
macro_rules! primitive_int_test {
@@ -492,53 +470,6 @@ mod tests {
492470
assert_eq!(store, restore);
493471
}
494472

495-
#[repr(u32)]
496-
#[derive(Debug, Versionize, PartialEq, Clone)]
497-
pub enum TestState {
498-
Zero,
499-
One(u32, String),
500-
#[version(start = 2, default_fn = "test_state_default_one")]
501-
Two(u32),
502-
#[version(start = 3, default_fn = "test_state_default_two")]
503-
Three(u32),
504-
}
505-
506-
impl Default for TestState {
507-
fn default() -> Self {
508-
Self::One(1, "Default".to_owned())
509-
}
510-
}
511-
512-
impl TestState {
513-
fn test_state_default_one(
514-
&self,
515-
target_version: u16,
516-
) -> Result<TestState, VersionizeError> {
517-
match target_version {
518-
2 => Ok(TestState::Two(2)),
519-
1 => Ok(TestState::Zero),
520-
i => Err(VersionizeError::Serialize(format!(
521-
"Unknown target version: {}",
522-
i
523-
))),
524-
}
525-
}
526-
527-
fn test_state_default_two(
528-
&self,
529-
target_version: u16,
530-
) -> Result<TestState, VersionizeError> {
531-
match target_version {
532-
2 => Ok(TestState::Two(2)),
533-
1 => Ok(TestState::One(1, "Test".to_owned())),
534-
i => Err(VersionizeError::Serialize(format!(
535-
"Unknown target version: {}",
536-
i
537-
))),
538-
}
539-
}
540-
}
541-
542473
#[derive(Debug, serde_derive::Deserialize, PartialEq, serde_derive::Serialize, Versionize)]
543474
enum CompatibleEnum {
544475
A,
@@ -642,60 +573,6 @@ mod tests {
642573
assert_eq!(test_struct, restored_state);
643574
}
644575

645-
#[test]
646-
fn test_enum_basic() {
647-
let mut snapshot_mem = vec![0u8; 64];
648-
let mut vm = VersionMap::new();
649-
vm.new_version()
650-
.set_type_version(TestState::type_id(), 2)
651-
.new_version()
652-
.set_type_version(TestState::type_id(), 3);
653-
654-
// Test trivial case.
655-
let state = TestState::One(1337, "a string".to_owned());
656-
state
657-
.serialize(&mut snapshot_mem.as_mut_slice(), &vm, 1)
658-
.unwrap();
659-
let restored_state =
660-
<TestState as Versionize>::deserialize(&mut snapshot_mem.as_slice(), &vm, 1).unwrap();
661-
assert_eq!(state, restored_state);
662-
}
663-
664-
#[test]
665-
fn test_enum_rollback() {
666-
let mut snapshot_mem = vec![0u8; 64];
667-
let mut vm = VersionMap::new();
668-
vm.new_version()
669-
.set_type_version(TestState::type_id(), 2)
670-
.new_version()
671-
.set_type_version(TestState::type_id(), 3);
672-
673-
// Test `default_fn` for serialization of enum variants that don't exist in previous versions.
674-
let state = TestState::Three(1337);
675-
state
676-
.serialize(&mut snapshot_mem.as_mut_slice(), &vm, 2)
677-
.unwrap();
678-
let restored_state =
679-
<TestState as Versionize>::deserialize(&mut snapshot_mem.as_slice(), &vm, 2).unwrap();
680-
assert_eq!(restored_state, TestState::Two(2));
681-
682-
let state = TestState::Three(1337);
683-
state
684-
.serialize(&mut snapshot_mem.as_mut_slice(), &vm, 1)
685-
.unwrap();
686-
let restored_state =
687-
<TestState as Versionize>::deserialize(&mut snapshot_mem.as_slice(), &vm, 1).unwrap();
688-
assert_eq!(restored_state, TestState::One(1, "Test".to_owned()));
689-
690-
let state = TestState::Two(1234);
691-
state
692-
.serialize(&mut snapshot_mem.as_mut_slice(), &vm, 1)
693-
.unwrap();
694-
let restored_state =
695-
<TestState as Versionize>::deserialize(&mut snapshot_mem.as_slice(), &vm, 1).unwrap();
696-
assert_eq!(restored_state, TestState::Zero);
697-
}
698-
699576
#[test]
700577
fn test_ser_de_bool() {
701578
let vm = VersionMap::new();
@@ -824,178 +701,6 @@ mod tests {
824701
assert_eq!(store, restore);
825702
}
826703

827-
#[test]
828-
fn test_ser_de_vec_version() {
829-
type MessageFamStructWrapper = FamStructWrapper<Message>;
830-
let vm = VersionMap::new();
831-
let mut f = MessageFamStructWrapper::new(0);
832-
f.as_mut_fam_struct().padding = 123;
833-
f.as_mut_fam_struct().extra_value = 321;
834-
835-
f.push(10).unwrap();
836-
f.push(20).unwrap();
837-
838-
let mut snapshot_mem = vec![0u8; 512];
839-
let mut store = Vec::new();
840-
store.push(f.clone());
841-
store.push(f.clone());
842-
843-
store
844-
.serialize(&mut snapshot_mem.as_mut_slice(), &vm, 1)
845-
.unwrap();
846-
let restore = <Vec<MessageFamStructWrapper> as Versionize>::deserialize(
847-
&mut snapshot_mem.as_slice(),
848-
&vm,
849-
1,
850-
)
851-
.unwrap();
852-
let eq = store == restore;
853-
// This is important to test separately as we rely on the default_fn to
854-
// override the u16 default value.
855-
assert_eq!(321, restore[0].as_fam_struct_ref().extra_value);
856-
assert!(eq);
857-
}
858-
859-
#[repr(C)]
860-
#[derive(Default)]
861-
pub struct __IncompleteArrayField<T>(::std::marker::PhantomData<T>, [T; 0]);
862-
impl<T> __IncompleteArrayField<T> {
863-
#[inline]
864-
pub fn new() -> Self {
865-
__IncompleteArrayField(::std::marker::PhantomData, [])
866-
}
867-
#[inline]
868-
pub unsafe fn as_ptr(&self) -> *const T {
869-
self as *const __IncompleteArrayField<T> as *const T
870-
}
871-
#[inline]
872-
pub unsafe fn as_mut_ptr(&mut self) -> *mut T {
873-
self as *mut __IncompleteArrayField<T> as *mut T
874-
}
875-
#[inline]
876-
pub unsafe fn as_slice(&self, len: usize) -> &[T] {
877-
::std::slice::from_raw_parts(self.as_ptr(), len)
878-
}
879-
#[inline]
880-
pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] {
881-
::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len)
882-
}
883-
}
884-
885-
impl<T> ::std::fmt::Debug for __IncompleteArrayField<T> {
886-
fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
887-
fmt.write_str("__IncompleteArrayField")
888-
}
889-
}
890-
impl<T> ::std::clone::Clone for __IncompleteArrayField<T> {
891-
#[inline]
892-
fn clone(&self) -> Self {
893-
Self::new()
894-
}
895-
}
896-
897-
impl<T> Versionize for __IncompleteArrayField<T> {
898-
#[inline]
899-
fn serialize<W: std::io::Write>(
900-
&self,
901-
_writer: &mut W,
902-
_version_map: &VersionMap,
903-
_app_version: u16,
904-
) -> Result<(), VersionizeError> {
905-
Ok(())
906-
}
907-
908-
#[inline]
909-
fn deserialize<R: std::io::Read>(
910-
_reader: &mut R,
911-
_version_map: &VersionMap,
912-
_app_version: u16,
913-
) -> Result<Self, VersionizeError> {
914-
Ok(Self::new())
915-
}
916-
917-
// Not used.
918-
fn version() -> u16 {
919-
1
920-
}
921-
}
922-
923-
#[test]
924-
fn test_famstruct() {
925-
type MessageFamStructWrapper = FamStructWrapper<Message>;
926-
927-
let vm = VersionMap::new();
928-
let mut f = MessageFamStructWrapper::new(0);
929-
f.as_mut_fam_struct().padding = 123;
930-
f.as_mut_fam_struct().extra_value = 321;
931-
932-
f.push(10).unwrap();
933-
f.push(20).unwrap();
934-
935-
let mut snapshot_mem = vec![0u8; 64];
936-
f.serialize(&mut snapshot_mem.as_mut_slice(), &vm, 1)
937-
.unwrap();
938-
let restored_state =
939-
MessageFamStructWrapper::deserialize(&mut snapshot_mem.as_slice(), &vm, 1).unwrap();
940-
941-
let original_values = f.as_slice();
942-
let restored_values = restored_state.as_slice();
943-
944-
assert_eq!(
945-
f.as_fam_struct_ref().padding,
946-
restored_state.as_fam_struct_ref().padding
947-
);
948-
assert_eq!(original_values, restored_values);
949-
assert_eq!(
950-
f.as_fam_struct_ref().extra_value,
951-
restored_state.as_fam_struct_ref().extra_value
952-
);
953-
}
954-
955-
#[test]
956-
fn test_famstruct_ser_error() {
957-
type MessageFamStructWrapper = FamStructWrapper<Message>;
958-
959-
let vm = VersionMap::new();
960-
let mut f = MessageFamStructWrapper::new(0);
961-
f.as_mut_fam_struct().padding = 123;
962-
f.as_mut_fam_struct().extra_value = 321;
963-
964-
f.push(10).unwrap();
965-
f.push(20).unwrap();
966-
967-
let mut snapshot_mem = vec![0u8; 16];
968-
969-
assert!(f
970-
.serialize(&mut snapshot_mem.as_mut_slice(), &vm, 1)
971-
.is_err());
972-
}
973-
#[test]
974-
fn test_famstruct_version() {
975-
type MessageFamStructWrapper = FamStructWrapper<Message>;
976-
977-
let vm = VersionMap::new();
978-
let mut f = MessageFamStructWrapper::new(0);
979-
f.as_mut_fam_struct().padding = 123;
980-
f.push(10).unwrap();
981-
f.push(20).unwrap();
982-
983-
let mut snapshot_mem = vec![0u8; 64];
984-
f.serialize(&mut snapshot_mem.as_mut_slice(), &vm, 1)
985-
.unwrap();
986-
let restored_state =
987-
MessageFamStructWrapper::deserialize(&mut snapshot_mem.as_slice(), &vm, 1).unwrap();
988-
989-
let original_values = f.as_slice();
990-
let restored_values = restored_state.as_slice();
991-
992-
assert_eq!(
993-
f.as_fam_struct_ref().padding,
994-
restored_state.as_fam_struct_ref().padding
995-
);
996-
assert_eq!(original_values, restored_values);
997-
}
998-
999704
#[test]
1000705
fn test_vec_limit() {
1001706
// We need extra 8 bytes for vector len.

0 commit comments

Comments
 (0)