From a9028465afd160120e1368d963ebd9fbd87cd936 Mon Sep 17 00:00:00 2001 From: Will Toohey Date: Wed, 25 Jun 2025 01:09:10 +1000 Subject: [PATCH] Add some merged XML tests --- .gitignore | 1 + src/avs.h | 1 + src/hook.cpp | 4 +- src/imagefs.cpp | 5 +- src/modpath_handler.cpp | 7 +++ src/modpath_handler.h | 1 + src/tests.cpp | 47 +++++++++++++++++++ .../xml_merge/data2/subfolder/base.merged.xml | 6 +++ .../xml_merge/data2/subfolder/base.xml | 6 +++ 9 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 testcases_data_mods/xml_merge/data2/subfolder/base.merged.xml create mode 100644 testcases_data_mods/xml_merge/data2/subfolder/base.xml diff --git a/.gitignore b/.gitignore index 1984523..b393e49 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ build64/ dist/ subprojects/googletest* subprojects/packagecache +testcases_data_mods/_cache/ diff --git a/src/avs.h b/src/avs.h index 97e00bf..fb5737c 100644 --- a/src/avs.h +++ b/src/avs.h @@ -220,6 +220,7 @@ bool rapidxml_from_avs_filepath( rapidxml::xml_document<>& doc, rapidxml::xml_document<>& doc_to_allocate_with ); +char* avs_file_to_string(AVS_FILE f, rapidxml::xml_document<>& allocator); std::vector avs_file_to_vec(AVS_FILE f); bool init_avs(void); unsigned char* lz_compress(unsigned char* input, size_t length, size_t *compressed_length); diff --git a/src/hook.cpp b/src/hook.cpp index 00f590d..8c53857 100644 --- a/src/hook.cpp +++ b/src/hook.cpp @@ -376,8 +376,8 @@ AVS_FILE hook_avs_fs_open(const char* name, uint16_t mode, int flags) { if(name == NULL || inside_pkfs_hook) return avs_fs_open(name, mode, flags); log_verbose("opening %s mode %d flags %d", name, mode, flags); - // only touch reads - new AVS has bitflags (R=1,W=2), old AVS has enum (R=0,W=1,RW=2) - if ((avs_loaded_version >= 1400 && mode != 1) || (avs_loaded_version < 1400 && mode != 0)) { + // only touch reads + if (mode != avs_open_mode_read()) { return avs_fs_open(name, mode, flags); } string path = name; diff --git a/src/imagefs.cpp b/src/imagefs.cpp index 319b6f2..a1507f5 100644 --- a/src/imagefs.cpp +++ b/src/imagefs.cpp @@ -584,13 +584,16 @@ void merge_xmls(HookFile &file) { auto cache_hasher = CacheHasher(out_hashed); cache_hasher.add(starting); // don't forget to take the input into account + log_info("Merging into %s", starting.c_str()); for (auto &path : to_merge) { + log_info(" %s", path.c_str()); cache_hasher.add(path); } cache_hasher.finish(); // no need to merge - timestamps all up to date, dll not newer, files haven't been deleted if(cache_hasher.matches()) { + log_info("Merged XML up to date"); file.mod_path = out; return; } @@ -601,9 +604,7 @@ void merge_xmls(HookFile &file) { return; } - log_info("Merging into %s", starting.c_str()); for (auto &path : to_merge) { - log_info(" %s", path.c_str()); rapidxml::xml_document<> rapid_to_merge; auto merge_load_result = rapidxml_from_avs_filepath(path, rapid_to_merge, merged_xml); if (!merge_load_result) { diff --git a/src/modpath_handler.cpp b/src/modpath_handler.cpp index e5beb2c..5592a58 100644 --- a/src/modpath_handler.cpp +++ b/src/modpath_handler.cpp @@ -81,7 +81,10 @@ void cache_mods(void) { static vector game_folders; void init_modpath_handler(void) { + log_verbose("Top level folders:"); for (auto folder : folders_in_folder(".")) { + log_verbose(" %s", folder.c_str()); + // data is the normal case we transparently handle if (!strcasecmp(folder.c_str(), "data")) { continue; @@ -91,6 +94,10 @@ void init_modpath_handler(void) { } } +void modpath_debug_add_folder(const string &folder) { + game_folders.push_back(folder + "/"); +} + optional normalise_path(const string &_path) { auto path = _path; ramfs_demangler_demangle_if_possible(path); diff --git a/src/modpath_handler.h b/src/modpath_handler.h index 8b978f2..91c02da 100644 --- a/src/modpath_handler.h +++ b/src/modpath_handler.h @@ -15,6 +15,7 @@ using std::string; using std::vector; void init_modpath_handler(void); +void modpath_debug_add_folder(const string &folder); void cache_mods(void); vector available_mods(); // mutates source string to be all lowercase diff --git a/src/tests.cpp b/src/tests.cpp index 929dc4b..5d7c660 100644 --- a/src/tests.cpp +++ b/src/tests.cpp @@ -149,3 +149,50 @@ TEST(ImageFs, MD5DemanglingWorks) { avs_fs_umount_by_desc(desc); } + +TEST(Xml, MergingWorks) { + modpath_debug_add_folder("data2"); // also test data2 handling for good measure + auto f = hook_avs_fs_open("data2/subfolder/base.xml", avs_open_mode_read(), 420); + ASSERT_GT(f, 0); + + rapidxml::xml_document<> xml_doc; + auto xml_text = avs_file_to_string(f, xml_doc); + + avs_fs_close(f); + + xml_doc.parse(xml_text); + + auto node = xml_doc.first_node(); + ASSERT_TRUE(node); + EXPECT_STREQ(node->name(), "afplist"); + + + node = node->first_node(); + ASSERT_TRUE(node); + EXPECT_STREQ(node->name(), "afp"); + + auto attr = node->first_attribute("name"); + ASSERT_TRUE(attr); + EXPECT_STREQ(attr->value(), "hare"); + + auto geo = node->first_node("geo"); + ASSERT_TRUE(geo); + EXPECT_STREQ(geo->value(), "5 10 15"); + + + node = node->next_sibling(); + ASSERT_TRUE(node); + EXPECT_STREQ(node->name(), "afp"); + + attr = node->first_attribute("name"); + ASSERT_TRUE(attr); + EXPECT_STREQ(attr->value(), "hare2"); + + geo = node->first_node("geo"); + ASSERT_TRUE(geo); + EXPECT_STREQ(geo->value(), "20 25 30"); + + + node = node->next_sibling(); + ASSERT_FALSE(node); +} diff --git a/testcases_data_mods/xml_merge/data2/subfolder/base.merged.xml b/testcases_data_mods/xml_merge/data2/subfolder/base.merged.xml new file mode 100644 index 0000000..043b85d --- /dev/null +++ b/testcases_data_mods/xml_merge/data2/subfolder/base.merged.xml @@ -0,0 +1,6 @@ + + + + 20 25 30 + + diff --git a/testcases_data_mods/xml_merge/data2/subfolder/base.xml b/testcases_data_mods/xml_merge/data2/subfolder/base.xml new file mode 100644 index 0000000..8b18da7 --- /dev/null +++ b/testcases_data_mods/xml_merge/data2/subfolder/base.xml @@ -0,0 +1,6 @@ + + + + 5 10 15 + +