Getting to the way it's supposed to be!
This commit is contained in:
291
modules/ufbx/test/test_fuzz.h
Normal file
291
modules/ufbx/test/test_fuzz.h
Normal file
@@ -0,0 +1,291 @@
|
||||
#undef UFBXT_TEST_GROUP
|
||||
#define UFBXT_TEST_GROUP "fuzz"
|
||||
|
||||
UFBXT_TEST(fuzz_files)
|
||||
#if UFBXT_IMPL
|
||||
{
|
||||
size_t ok = 0;
|
||||
size_t i = g_fuzz_step < SIZE_MAX ? g_fuzz_step : 0;
|
||||
for (; i < 10000; i++) {
|
||||
if (g_fuzz_file != SIZE_MAX && i != g_fuzz_file) continue;
|
||||
|
||||
char name[512];
|
||||
char buf[512];
|
||||
snprintf(name, sizeof(name), "fuzz_%04zu", i);
|
||||
snprintf(buf, sizeof(buf), "%sfuzz/fuzz_%04zu.fbx", data_root, i);
|
||||
|
||||
size_t size;
|
||||
void *data = ufbxt_read_file(buf, &size);
|
||||
if (!data) break;
|
||||
|
||||
ufbx_error error;
|
||||
|
||||
ufbx_load_opts load_opts = { 0 };
|
||||
load_opts.temp_allocator.memory_limit = 0x4000000; // 64MB
|
||||
load_opts.result_allocator.memory_limit = 0x4000000; // 64MB
|
||||
load_opts.file_format = UFBX_FILE_FORMAT_FBX;
|
||||
|
||||
ufbx_scene *scene = ufbx_load_memory(data, size, &load_opts, &error);
|
||||
if (scene) {
|
||||
ufbxt_check_scene(scene);
|
||||
ok++;
|
||||
}
|
||||
bool allow_error = scene == NULL;
|
||||
|
||||
ufbx_free_scene(scene);
|
||||
|
||||
ufbxt_progress_ctx stream_progress_ctx = { 0 };
|
||||
|
||||
bool temp_freed = false, result_freed = false;
|
||||
|
||||
ufbx_load_opts stream_opts = load_opts;
|
||||
ufbxt_init_allocator(&stream_opts.temp_allocator, &temp_freed);
|
||||
ufbxt_init_allocator(&stream_opts.result_allocator, &result_freed);
|
||||
stream_opts.read_buffer_size = 1;
|
||||
stream_opts.temp_allocator.huge_threshold = 1;
|
||||
stream_opts.result_allocator.huge_threshold = 1;
|
||||
stream_opts.progress_cb.fn = &ufbxt_measure_progress;
|
||||
stream_opts.progress_cb.user = &stream_progress_ctx;
|
||||
stream_opts.progress_interval_hint = 1;
|
||||
ufbx_scene *streamed_scene = ufbx_load_file(buf, &stream_opts, &error);
|
||||
if (streamed_scene) {
|
||||
ufbxt_check_scene(streamed_scene);
|
||||
ufbxt_assert(scene);
|
||||
} else {
|
||||
ufbxt_assert(!scene);
|
||||
}
|
||||
ufbx_free_scene(streamed_scene);
|
||||
|
||||
ufbxt_assert(temp_freed);
|
||||
ufbxt_assert(result_freed);
|
||||
|
||||
int prev_fuzz_quality = g_fuzz_quality;
|
||||
g_fuzz_quality = g_heavy_fuzz_quality;
|
||||
ufbxt_do_fuzz(name, data, size, buf, allow_error, UFBX_FILE_FORMAT_FBX, NULL);
|
||||
g_fuzz_quality = prev_fuzz_quality;
|
||||
|
||||
free(data);
|
||||
}
|
||||
|
||||
ufbxt_logf(".. Loaded fuzz files: %zu (%zu non-errors)", i, ok);
|
||||
}
|
||||
#endif
|
||||
|
||||
UFBXT_TEST(fuzz_cache_xml)
|
||||
#if UFBXT_IMPL
|
||||
{
|
||||
size_t ok = 0;
|
||||
size_t i = g_fuzz_step < SIZE_MAX ? g_fuzz_step : 0;
|
||||
for (; i < 10000; i++) {
|
||||
if (g_fuzz_file != SIZE_MAX && i != g_fuzz_file) continue;
|
||||
|
||||
char buf[512];
|
||||
snprintf(buf, sizeof(buf), "%scache_fuzz/xml/fuzz_%04zu.xml", data_root, i);
|
||||
|
||||
ufbx_geometry_cache_opts cache_opts = { 0 };
|
||||
cache_opts.temp_allocator.memory_limit = 0x4000000; // 64MB
|
||||
cache_opts.result_allocator.memory_limit = 0x4000000; // 64MB
|
||||
|
||||
if (g_dedicated_allocs) {
|
||||
cache_opts.temp_allocator.huge_threshold = 1;
|
||||
cache_opts.result_allocator.huge_threshold = 1;
|
||||
}
|
||||
|
||||
size_t size;
|
||||
void *data = ufbxt_read_file(buf, &size);
|
||||
if (!data) break;
|
||||
|
||||
// TODO: Read memory?
|
||||
|
||||
ufbx_error error;
|
||||
ufbx_geometry_cache *cache = ufbx_load_geometry_cache(buf, &cache_opts, &error);
|
||||
if (cache) {
|
||||
ufbxt_check_string(cache->root_filename);
|
||||
ok++;
|
||||
}
|
||||
ufbx_free_geometry_cache(cache);
|
||||
|
||||
free(data);
|
||||
}
|
||||
|
||||
ufbxt_logf(".. Loaded fuzz files: %zu (%zu non-errors)", i, ok);
|
||||
}
|
||||
#endif
|
||||
|
||||
UFBXT_TEST(fuzz_cache_mcx)
|
||||
#if UFBXT_IMPL
|
||||
{
|
||||
size_t ok = 0;
|
||||
size_t i = g_fuzz_step < SIZE_MAX ? g_fuzz_step : 0;
|
||||
for (; i < 10000; i++) {
|
||||
if (g_fuzz_file != SIZE_MAX && i != g_fuzz_file) continue;
|
||||
|
||||
char buf[512];
|
||||
snprintf(buf, sizeof(buf), "%scache_fuzz/mcx/fuzz_%04zu.mcx", data_root, i);
|
||||
|
||||
ufbx_geometry_cache_opts cache_opts = { 0 };
|
||||
cache_opts.temp_allocator.memory_limit = 0x4000000; // 64MB
|
||||
cache_opts.result_allocator.memory_limit = 0x4000000; // 64MB
|
||||
|
||||
if (g_dedicated_allocs) {
|
||||
cache_opts.temp_allocator.huge_threshold = 1;
|
||||
cache_opts.result_allocator.huge_threshold = 1;
|
||||
}
|
||||
|
||||
size_t size;
|
||||
void *data = ufbxt_read_file(buf, &size);
|
||||
if (!data) break;
|
||||
|
||||
// TODO: Read memory?
|
||||
|
||||
ufbx_error error;
|
||||
ufbx_geometry_cache *cache = ufbx_load_geometry_cache(buf, &cache_opts, &error);
|
||||
if (cache) {
|
||||
ufbxt_check_string(cache->root_filename);
|
||||
ok++;
|
||||
}
|
||||
ufbx_free_geometry_cache(cache);
|
||||
|
||||
free(data);
|
||||
}
|
||||
|
||||
ufbxt_logf(".. Loaded fuzz files: %zu (%zu non-errors)", i, ok);
|
||||
}
|
||||
#endif
|
||||
|
||||
UFBXT_TEST(fuzz_obj_files)
|
||||
#if UFBXT_IMPL
|
||||
{
|
||||
size_t ok = 0;
|
||||
size_t i = g_fuzz_step < SIZE_MAX ? g_fuzz_step : 0;
|
||||
for (; i < 10000; i++) {
|
||||
if (g_fuzz_file != SIZE_MAX && i != g_fuzz_file) continue;
|
||||
|
||||
char name[512];
|
||||
char buf[512];
|
||||
snprintf(name, sizeof(name), "obj_fuzz_%04zu", i);
|
||||
snprintf(buf, sizeof(buf), "%sobj_fuzz/fuzz_%04zu.obj", data_root, i);
|
||||
|
||||
size_t size;
|
||||
void *data = ufbxt_read_file(buf, &size);
|
||||
if (!data) break;
|
||||
|
||||
ufbx_error error;
|
||||
|
||||
ufbx_load_opts load_opts = { 0 };
|
||||
load_opts.temp_allocator.memory_limit = 0x4000000; // 64MB
|
||||
load_opts.result_allocator.memory_limit = 0x4000000; // 64MB
|
||||
load_opts.file_format = UFBX_FILE_FORMAT_OBJ;
|
||||
|
||||
ufbx_scene *scene = ufbx_load_memory(data, size, &load_opts, &error);
|
||||
if (scene) {
|
||||
ufbxt_check_scene(scene);
|
||||
ok++;
|
||||
}
|
||||
|
||||
bool allow_error = scene == NULL;
|
||||
|
||||
ufbx_free_scene(scene);
|
||||
|
||||
ufbxt_progress_ctx stream_progress_ctx = { 0 };
|
||||
|
||||
bool temp_freed = false, result_freed = false;
|
||||
|
||||
ufbx_load_opts stream_opts = load_opts;
|
||||
ufbxt_init_allocator(&stream_opts.temp_allocator, &temp_freed);
|
||||
ufbxt_init_allocator(&stream_opts.result_allocator, &result_freed);
|
||||
stream_opts.read_buffer_size = 1;
|
||||
stream_opts.temp_allocator.huge_threshold = 1;
|
||||
stream_opts.result_allocator.huge_threshold = 1;
|
||||
stream_opts.progress_cb.fn = &ufbxt_measure_progress;
|
||||
stream_opts.progress_cb.user = &stream_progress_ctx;
|
||||
stream_opts.progress_interval_hint = 1;
|
||||
ufbx_scene *streamed_scene = ufbx_load_file(buf, &stream_opts, &error);
|
||||
if (streamed_scene) {
|
||||
ufbxt_check_scene(streamed_scene);
|
||||
ufbxt_assert(scene);
|
||||
} else {
|
||||
ufbxt_assert(!scene);
|
||||
}
|
||||
ufbx_free_scene(streamed_scene);
|
||||
|
||||
ufbxt_assert(temp_freed);
|
||||
ufbxt_assert(result_freed);
|
||||
|
||||
ufbxt_do_fuzz(name, data, size, buf, allow_error, UFBX_FILE_FORMAT_OBJ, NULL);
|
||||
|
||||
free(data);
|
||||
}
|
||||
|
||||
ufbxt_logf(".. Loaded fuzz files: %zu (%zu non-errors)", i, ok);
|
||||
}
|
||||
#endif
|
||||
|
||||
UFBXT_TEST(fuzz_mtl_files)
|
||||
#if UFBXT_IMPL
|
||||
{
|
||||
size_t ok = 0;
|
||||
size_t i = g_fuzz_step < SIZE_MAX ? g_fuzz_step : 0;
|
||||
for (; i < 10000; i++) {
|
||||
if (g_fuzz_file != SIZE_MAX && i != g_fuzz_file) continue;
|
||||
|
||||
char name[512];
|
||||
char buf[512];
|
||||
snprintf(name, sizeof(name), "mtl_fuzz_%04zu", i);
|
||||
snprintf(buf, sizeof(buf), "%smtl_fuzz/fuzz_%04zu.mtl", data_root, i);
|
||||
|
||||
size_t size;
|
||||
void *data = ufbxt_read_file(buf, &size);
|
||||
if (!data) break;
|
||||
|
||||
ufbx_error error;
|
||||
|
||||
ufbx_load_opts load_opts = { 0 };
|
||||
load_opts.temp_allocator.memory_limit = 0x4000000; // 64MB
|
||||
load_opts.result_allocator.memory_limit = 0x4000000; // 64MB
|
||||
load_opts.file_format = UFBX_FILE_FORMAT_MTL;
|
||||
|
||||
ufbx_scene *scene = ufbx_load_memory(data, size, &load_opts, &error);
|
||||
if (scene) {
|
||||
ufbxt_check_scene(scene);
|
||||
ok++;
|
||||
}
|
||||
|
||||
bool allow_error = scene == NULL;
|
||||
|
||||
ufbx_free_scene(scene);
|
||||
|
||||
ufbxt_progress_ctx stream_progress_ctx = { 0 };
|
||||
|
||||
bool temp_freed = false, result_freed = false;
|
||||
|
||||
ufbx_load_opts stream_opts = load_opts;
|
||||
ufbxt_init_allocator(&stream_opts.temp_allocator, &temp_freed);
|
||||
ufbxt_init_allocator(&stream_opts.result_allocator, &result_freed);
|
||||
stream_opts.read_buffer_size = 1;
|
||||
stream_opts.temp_allocator.huge_threshold = 1;
|
||||
stream_opts.result_allocator.huge_threshold = 1;
|
||||
stream_opts.progress_cb.fn = &ufbxt_measure_progress;
|
||||
stream_opts.progress_cb.user = &stream_progress_ctx;
|
||||
stream_opts.progress_interval_hint = 1;
|
||||
ufbx_scene *streamed_scene = ufbx_load_file(buf, &stream_opts, &error);
|
||||
if (streamed_scene) {
|
||||
ufbxt_check_scene(streamed_scene);
|
||||
ufbxt_assert(scene);
|
||||
} else {
|
||||
ufbxt_assert(!scene);
|
||||
}
|
||||
ufbx_free_scene(streamed_scene);
|
||||
|
||||
ufbxt_assert(temp_freed);
|
||||
ufbxt_assert(result_freed);
|
||||
|
||||
ufbxt_do_fuzz(name, data, size, buf, allow_error, UFBX_FILE_FORMAT_MTL, NULL);
|
||||
|
||||
free(data);
|
||||
}
|
||||
|
||||
ufbxt_logf(".. Loaded fuzz files: %zu (%zu non-errors)", i, ok);
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user