292 lines
7.7 KiB
C
292 lines
7.7 KiB
C
#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
|
|
|