re-organize some unit tests
This commit is contained in:
parent
247e2f7482
commit
aade06d9a9
|
@ -447,7 +447,7 @@ pub mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn bad_input_data_results_in_errors() -> Result<(), QuestBinError> {
|
pub fn error_on_load_from_zero_bytes() {
|
||||||
let mut data: &[u8] = &[];
|
let mut data: &[u8] = &[];
|
||||||
assert_matches!(
|
assert_matches!(
|
||||||
QuestBin::from_uncompressed_bytes(&mut data),
|
QuestBin::from_uncompressed_bytes(&mut data),
|
||||||
|
@ -457,7 +457,10 @@ pub mod tests {
|
||||||
QuestBin::from_compressed_bytes(&mut data),
|
QuestBin::from_compressed_bytes(&mut data),
|
||||||
Err(QuestBinError::PrsCompressionError(..))
|
Err(QuestBinError::PrsCompressionError(..))
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn error_on_load_from_garbage_bytes() {
|
||||||
let mut data: &[u8] = b"This is definitely not a quest";
|
let mut data: &[u8] = b"This is definitely not a quest";
|
||||||
assert_matches!(
|
assert_matches!(
|
||||||
QuestBin::from_uncompressed_bytes(&mut data),
|
QuestBin::from_uncompressed_bytes(&mut data),
|
||||||
|
@ -467,16 +470,24 @@ pub mod tests {
|
||||||
QuestBin::from_compressed_bytes(&mut data),
|
QuestBin::from_compressed_bytes(&mut data),
|
||||||
Err(QuestBinError::PrsCompressionError(..))
|
Err(QuestBinError::PrsCompressionError(..))
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// bad data, but with valid object_code_offset to start ...
|
#[test]
|
||||||
|
pub fn error_on_mostly_junk_header() {
|
||||||
|
// the only correct part of this header is the object_code_offset
|
||||||
let mut data = Vec::<u8>::new();
|
let mut data = Vec::<u8>::new();
|
||||||
data.write_u32::<LittleEndian>(QUEST_BIN_HEADER_SIZE as u32)?;
|
data.write_u32::<LittleEndian>(QUEST_BIN_HEADER_SIZE as u32)
|
||||||
data.write_all(b"This is also definitely not a quest")?;
|
.unwrap();
|
||||||
|
data.write_all(b"This is also definitely not a quest")
|
||||||
|
.unwrap();
|
||||||
assert_matches!(
|
assert_matches!(
|
||||||
QuestBin::from_uncompressed_bytes(&mut data.as_slice()),
|
QuestBin::from_uncompressed_bytes(&mut data.as_slice()),
|
||||||
Err(QuestBinError::DataFormatError(..))
|
Err(QuestBinError::DataFormatError(..))
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn error_on_header_with_bad_language_value() {
|
||||||
// otherwise valid looking bin_header, but bad language value
|
// otherwise valid looking bin_header, but bad language value
|
||||||
let mut data: &[u8] = &[
|
let mut data: &[u8] = &[
|
||||||
0xD4, 0x01, 0x00, 0x00, // object_code_offset
|
0xD4, 0x01, 0x00, 0x00, // object_code_offset
|
||||||
|
@ -491,7 +502,10 @@ pub mod tests {
|
||||||
QuestBin::from_uncompressed_bytes(&mut data),
|
QuestBin::from_uncompressed_bytes(&mut data),
|
||||||
Err(QuestBinError::DataFormatError(..))
|
Err(QuestBinError::DataFormatError(..))
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn error_on_header_with_garbage_text_fields() {
|
||||||
// valid bin_header (so far) ...
|
// valid bin_header (so far) ...
|
||||||
let header: &[u8] = &[
|
let header: &[u8] = &[
|
||||||
0xD4, 0x01, 0x00, 0x00, // object_code_offset
|
0xD4, 0x01, 0x00, 0x00, // object_code_offset
|
||||||
|
@ -502,7 +516,9 @@ pub mod tests {
|
||||||
0x00, // language
|
0x00, // language
|
||||||
0x3A, 0x00, // quest_number_and_episode
|
0x3A, 0x00, // quest_number_and_episode
|
||||||
];
|
];
|
||||||
// ... and lets append random garbage to it
|
// ... and lets append random garbage to it.
|
||||||
|
// this garbage will read as text fields (name, etc) and be decoded from shift jis which
|
||||||
|
// will fail ...
|
||||||
let mut random_garbage = [0u8; 4096];
|
let mut random_garbage = [0u8; 4096];
|
||||||
let mut rng = StdRng::seed_from_u64(123456);
|
let mut rng = StdRng::seed_from_u64(123456);
|
||||||
random_garbage.try_fill(&mut rng).unwrap();
|
random_garbage.try_fill(&mut rng).unwrap();
|
||||||
|
@ -511,7 +527,10 @@ pub mod tests {
|
||||||
QuestBin::from_uncompressed_bytes(&mut data.as_slice()),
|
QuestBin::from_uncompressed_bytes(&mut data.as_slice()),
|
||||||
Err(QuestBinError::DataFormatError(..))
|
Err(QuestBinError::DataFormatError(..))
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn error_on_bin_that_is_too_small() {
|
||||||
// a complete valid bin_header ...
|
// a complete valid bin_header ...
|
||||||
let header: &[u8] = &[
|
let header: &[u8] = &[
|
||||||
0xD4, 0x01, 0x00, 0x00, 0xA4, 0x09, 0x00, 0x00, 0x4C, 0x19, 0x00, 0x00, 0xFF, 0xFF,
|
0xD4, 0x01, 0x00, 0x00, 0xA4, 0x09, 0x00, 0x00, 0x4C, 0x19, 0x00, 0x00, 0xFF, 0xFF,
|
||||||
|
@ -562,7 +581,57 @@ pub mod tests {
|
||||||
QuestBin::from_uncompressed_bytes(&mut data.as_slice()),
|
QuestBin::from_uncompressed_bytes(&mut data.as_slice()),
|
||||||
Err(QuestBinError::IoError(..))
|
Err(QuestBinError::IoError(..))
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
#[test]
|
||||||
|
pub fn error_on_non_dword_sized_function_offset_table() {
|
||||||
|
// i don't think this scenario being tested is really important ... it would mean something
|
||||||
|
// is generating garbage function_offset_tables to begin with ...
|
||||||
|
|
||||||
|
// a complete valid bin_header ...
|
||||||
|
let header: &[u8] = &[
|
||||||
|
0xD4, 0x01, 0x00, 0x00, 0xA4, 0x09, 0x00, 0x00, 0x4A, 0x19, 0x00, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0x00, 0x00, 0x3A, 0x00, 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x48, 0x45, 0x41,
|
||||||
|
0x54, 0x20, 0x53, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x65, 0x74, 0x72,
|
||||||
|
0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x0A, 0x77, 0x65, 0x61, 0x70, 0x6F, 0x6E, 0x20,
|
||||||
|
0x66, 0x72, 0x6F, 0x6D, 0x0A, 0x61, 0x20, 0x44, 0x72, 0x61, 0x67, 0x6F, 0x6E, 0x21,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x6C,
|
||||||
|
0x69, 0x65, 0x6E, 0x74, 0x3A, 0x20, 0x20, 0x48, 0x6F, 0x70, 0x6B, 0x69, 0x6E, 0x73,
|
||||||
|
0x2C, 0x20, 0x68, 0x75, 0x6E, 0x74, 0x65, 0x72, 0x0A, 0x51, 0x75, 0x65, 0x73, 0x74,
|
||||||
|
0x3A, 0x0A, 0x20, 0x4D, 0x79, 0x20, 0x77, 0x65, 0x61, 0x70, 0x6F, 0x6E, 0x20, 0x77,
|
||||||
|
0x61, 0x73, 0x20, 0x74, 0x61, 0x6B, 0x65, 0x6E, 0x0A, 0x20, 0x66, 0x72, 0x6F, 0x6D,
|
||||||
|
0x20, 0x6D, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6E, 0x20, 0x49, 0x20, 0x77, 0x61, 0x73,
|
||||||
|
0x0A, 0x20, 0x66, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x61, 0x20, 0x44,
|
||||||
|
0x72, 0x61, 0x67, 0x6F, 0x6E, 0x2E, 0x0A, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x3A,
|
||||||
|
0x20, 0x20, 0x3F, 0x3F, 0x3F, 0x20, 0x4D, 0x65, 0x73, 0x65, 0x74, 0x61, 0x0A, 0x0A,
|
||||||
|
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let object_code_data = [0u8; 2000];
|
||||||
|
let function_offset_table_data = [0u8; 4006]; // size here matches header above, but it is still a bad size
|
||||||
|
let data = [header, &object_code_data, &function_offset_table_data].concat();
|
||||||
|
|
||||||
|
assert_matches!(
|
||||||
|
QuestBin::from_uncompressed_bytes(&mut data.as_slice()),
|
||||||
|
Err(QuestBinError::DataFormatError(..))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -632,7 +632,7 @@ pub mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn bad_input_data_results_in_errors() -> Result<(), QuestDatError> {
|
pub fn error_on_load_from_zero_bytes() {
|
||||||
let mut data: &[u8] = &[];
|
let mut data: &[u8] = &[];
|
||||||
assert_matches!(
|
assert_matches!(
|
||||||
QuestDat::from_uncompressed_bytes(&mut data),
|
QuestDat::from_uncompressed_bytes(&mut data),
|
||||||
|
@ -642,7 +642,10 @@ pub mod tests {
|
||||||
QuestDat::from_compressed_bytes(&mut data),
|
QuestDat::from_compressed_bytes(&mut data),
|
||||||
Err(QuestDatError::PrsCompressionError(..))
|
Err(QuestDatError::PrsCompressionError(..))
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn error_on_load_from_garbage_bytes() {
|
||||||
let mut data: &[u8] = b"This is definitely not a quest";
|
let mut data: &[u8] = b"This is definitely not a quest";
|
||||||
assert_matches!(
|
assert_matches!(
|
||||||
QuestDat::from_uncompressed_bytes(&mut data),
|
QuestDat::from_uncompressed_bytes(&mut data),
|
||||||
|
@ -652,8 +655,11 @@ pub mod tests {
|
||||||
QuestDat::from_compressed_bytes(&mut data),
|
QuestDat::from_compressed_bytes(&mut data),
|
||||||
Err(QuestDatError::PrsCompressionError(..))
|
Err(QuestDatError::PrsCompressionError(..))
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// dat table header with a table_size issue
|
#[test]
|
||||||
|
pub fn errpr_on_table_header_with_bad_table_size() {
|
||||||
|
// dat table header with a table_size issue (table_size != table_body_size + 16)
|
||||||
let mut header: &[u8] = &[
|
let mut header: &[u8] = &[
|
||||||
0x01, 0x00, 0x00, 0x00, // table_type
|
0x01, 0x00, 0x00, 0x00, // table_type
|
||||||
0xD3, 0x08, 0x00, 0x00, // table_size
|
0xD3, 0x08, 0x00, 0x00, // table_size
|
||||||
|
@ -664,7 +670,10 @@ pub mod tests {
|
||||||
QuestDat::from_uncompressed_bytes(&mut header),
|
QuestDat::from_uncompressed_bytes(&mut header),
|
||||||
Err(QuestDatError::DataFormatError(..))
|
Err(QuestDatError::DataFormatError(..))
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn error_on_table_header_with_bad_table_type() {
|
||||||
// dat table header with a table_type issue
|
// dat table header with a table_type issue
|
||||||
let mut header: &[u8] = &[
|
let mut header: &[u8] = &[
|
||||||
0x11, 0x00, 0x00, 0x00, // table_type
|
0x11, 0x00, 0x00, 0x00, // table_type
|
||||||
|
@ -676,7 +685,10 @@ pub mod tests {
|
||||||
QuestDat::from_uncompressed_bytes(&mut header),
|
QuestDat::from_uncompressed_bytes(&mut header),
|
||||||
Err(QuestDatError::DataFormatError(..))
|
Err(QuestDatError::DataFormatError(..))
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn error_on_table_with_body_data_that_is_too_small() {
|
||||||
// a valid dat table header ...
|
// a valid dat table header ...
|
||||||
let header: &[u8] = &[
|
let header: &[u8] = &[
|
||||||
0x01, 0x00, 0x00, 0x00, // table_type
|
0x01, 0x00, 0x00, 0x00, // table_type
|
||||||
|
@ -693,16 +705,5 @@ pub mod tests {
|
||||||
QuestDat::from_uncompressed_bytes(&mut data.as_slice()),
|
QuestDat::from_uncompressed_bytes(&mut data.as_slice()),
|
||||||
Err(QuestDatError::IoError(..))
|
Err(QuestDatError::IoError(..))
|
||||||
);
|
);
|
||||||
|
|
||||||
// totally random data which should be interpreted as an invalid table header
|
|
||||||
let mut data = vec![0u8; 1024];
|
|
||||||
let mut rng = StdRng::seed_from_u64(15785357);
|
|
||||||
data.try_fill(&mut rng).unwrap();
|
|
||||||
assert_matches!(
|
|
||||||
QuestDat::from_uncompressed_bytes(&mut data.as_slice()),
|
|
||||||
Err(QuestDatError::DataFormatError(..))
|
|
||||||
);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue