This repository has been archived on 2026-10-10. You can view files and clone it, but cannot push or open issues or pull requests.
molotov/crates/molotov-core/tests/asset_fixes_test.rs

61 lines
2.2 KiB
Rust

// SPDX-License-Identifier: GPL-3.0-or-later
use molotov_core::assets::asset::AssetFile;
use molotov_core::assets::c_api::*;
use molotov_core::assets::manager::AssetManager;
use tempfile::tempdir;
#[test]
fn test_aasset_read_invalid_handle_returns_error_negative_one() {
unsafe {
// Invalid or null pointer must return -1, never fake 0
let ret = AAsset_read(std::ptr::null_mut(), std::ptr::null_mut(), 16);
assert_eq!(ret, -1, "Invalid handle or null buffer must return -1");
let bogus_handle = 0x9999 as *mut ();
let mut buf = [0u8; 16];
let ret2 = AAsset_read(bogus_handle, buf.as_mut_ptr() as *mut _, 16);
assert_eq!(ret2, -1, "Stale or closed handle must return -1");
}
}
#[test]
fn test_empty_asset_get_buffer_returns_null() {
let empty_asset = AssetFile::new(vec![]);
assert_eq!(empty_asset.length(), 0);
assert!(
empty_asset.get_buffer().is_null(),
"Empty asset get_buffer must return NULL, never dangling pointer 0x1"
);
}
#[test]
fn test_seek_overflow_does_not_panic() {
let mut asset = AssetFile::new(b"SAMPLE".to_vec());
// Seeking with i64::MAX from SEEK_CUR must return -1 using checked arithmetic
let ret = asset.seek(i64::MAX, 1);
assert_eq!(ret, -1);
}
#[test]
fn test_path_normalization_and_disk_mod_resolution() {
let temp = tempdir().unwrap();
let mods_dir = temp.path().join("mods");
std::fs::create_dir_all(&mods_dir).unwrap();
let custom_sound = mods_dir.join("content/sounds/ouch.ogg");
if let Some(parent) = custom_sound.parent() {
std::fs::create_dir_all(parent).unwrap();
}
std::fs::write(&custom_sound, b"CUSTOM_DISK_MOD_DATA").unwrap();
let mut mgr = AssetManager::new_with_mods_dir(Some(mods_dir));
mgr.add_asset("content/sounds/ouch.ogg", b"BASE_DATA".to_vec());
// Should resolve path with Windows backslashes and leading slashes
let asset = mgr.open(r"\content\sounds\ouch.ogg").expect("Should open with backslash normalization");
let mut out = vec![0u8; asset.length() as usize];
let mut asset_mut = asset;
asset_mut.read(&mut out);
assert_eq!(&out, b"CUSTOM_DISK_MOD_DATA", "Must resolve disk mod overlay with normalized path");
}