From dc68bc6c13b09ea2088142b90080a0049d492715 Mon Sep 17 00:00:00 2001 From: Kyle Bayes Date: Wed, 1 May 2024 09:38:25 -0700 Subject: [PATCH] Add another unit test for caching PNG decoded images verifying that when a PNG file is updated the stale cached asset is not used. PiperOrigin-RevId: 629748520 Change-Id: I6935a3d172ac1459602d3d82ac548adeb08a7b11 --- test/user/user_api_test.cc | 66 +++++++++++++++++++++++++++++- test/user/user_objects_test.cc | 26 ++++++------ test/xml/xml_native_reader_test.cc | 25 +++++------ 3 files changed, 88 insertions(+), 29 deletions(-) diff --git a/test/user/user_api_test.cc b/test/user/user_api_test.cc index 4c9af8ab..52a0a8ad 100644 --- a/test/user/user_api_test.cc +++ b/test/user/user_api_test.cc @@ -148,7 +148,8 @@ TEST_F(PluginTest, RecompileCompare) { } // ------------------- test cache with modified assets ------------------------- -TEST_F(PluginTest, RecompileCompareCache) { + +TEST_F(PluginTest, RecompileCompareObjCache) { static constexpr char xml[] = R"( @@ -200,7 +201,70 @@ TEST_F(PluginTest, RecompileCompareCache) { mj_deleteVFS(vfs.get()); } +TEST_F(PluginTest, RecompileComparePngCache) { + static constexpr char xml[] = R"( + + + + + + + + + + +)"; + + // tiny RGB 2 x 3 PNG file + static constexpr unsigned char tex1[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x08, 0x02, 0x00, 0x00, 0x00, 0x12, 0x16, 0xf1, 0x4d, 0x00, 0x00, 0x00, + 0x1c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x78, 0xc1, 0xc0, 0xc0, + 0xc0, 0xf0, 0xbf, 0xb8, 0xb8, 0x98, 0x81, 0xe1, 0x3f, 0xc3, 0xff, 0xff, + 0xff, 0xc5, 0xc4, 0xc4, 0x00, 0x46, 0xd7, 0x07, 0x7f, 0xd2, 0x52, 0xa1, + 0x41, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, + 0x82 + }; + + // previous PNG file, but rotated by 180 degrees + static constexpr unsigned char tex2[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x08, 0x02, 0x00, 0x00, 0x00, 0x12, 0x16, 0xf1, 0x4d, 0x00, 0x00, 0x00, + 0x1c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x10, 0x13, 0x13, 0xfb, + 0xff, 0xff, 0x3f, 0xc3, 0x7f, 0x06, 0x96, 0xd8, 0xd8, 0x58, 0x46, 0x46, + 0x86, 0x17, 0x0c, 0x0c, 0x00, 0x49, 0x22, 0x06, 0x44, 0xe4, 0x91, 0xb8, + 0x83, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, + 0x82 + }; + + + auto vfs = std::make_unique(); + mj_defaultVFS(vfs.get()); + mj_addBufferVFS(vfs.get(), "tex.png", tex1, sizeof(tex1)); + + std::array error; + + // load model once + mjModel* m = LoadModelFromString(xml, error.data(), error.size(), vfs.get()); + EXPECT_EQ(m->ntexdata, 18); // w x h x rgb = 3 x 2 x 3 + mjtByte byte = m->tex_rgb[0]; + mj_deleteModel(m); + + // update tex.png, load again + mj_deleteFileVFS(vfs.get(), "tex.png"); + mj_addBufferVFS(vfs.get(), "tex.png", tex2, sizeof(tex2)); + m = LoadModelFromString(xml, error.data(), error.size(), vfs.get()); + EXPECT_NE(m->tex_rgb[0], byte); + EXPECT_EQ(m->tex_rgb[15], byte); // first pixel is now last pixel + mj_deleteModel(m); + + mj_deleteVFS(vfs.get()); +} + // -------------------------------- test attach -------------------------------- + static constexpr char xml_child[] = R"( diff --git a/test/user/user_objects_test.cc b/test/user/user_objects_test.cc index 5441ea9f..93043166 100644 --- a/test/user/user_objects_test.cc +++ b/test/user/user_objects_test.cc @@ -342,20 +342,18 @@ TEST_F(ContentTypeTest, TextureLoadPng) { )"; - // credit: https://www.mjt.me.uk/posts/smallest-png/ - static constexpr unsigned char tiny[] = - { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, - 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x03, 0x00, - 0x00, 0x00, 0x66, 0xBC, 0x3A, 0x25, 0x00, 0x00, 0x00, - 0x03, 0x50, 0x4C, 0x54, 0x45, 0xB5, 0xD0, 0xD0, 0x63, - 0x04, 0x16, 0xEA, 0x00, 0x00, 0x00, 0x1F, 0x49, 0x44, - 0x41, 0x54, 0x68, 0x81, 0xED, 0xC1, 0x01, 0x0D, 0x00, - 0x00, 0x00, 0xC2, 0xA0, 0xF7, 0x4F, 0x6D, 0x0E, 0x37, - 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xBE, 0x0D, 0x21, 0x00, 0x00, 0x01, 0x9A, 0x60, 0xE1, - 0xD5, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, - 0xAE, 0x42, 0x60, 0x82 }; + // tiny RGB 2 x 3 PNG file + static constexpr unsigned char tiny[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x08, 0x02, 0x00, 0x00, 0x00, 0x12, 0x16, 0xf1, 0x4d, 0x00, 0x00, 0x00, + 0x1c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x78, 0xc1, 0xc0, 0xc0, + 0xc0, 0xf0, 0xbf, 0xb8, 0xb8, 0x98, 0x81, 0xe1, 0x3f, 0xc3, 0xff, 0xff, + 0xff, 0xc5, 0xc4, 0xc4, 0x00, 0x46, 0xd7, 0x07, 0x7f, 0xd2, 0x52, 0xa1, + 0x41, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, + 0x82 + }; + size_t tiny_sz = sizeof(tiny); char error[1024]; diff --git a/test/xml/xml_native_reader_test.cc b/test/xml/xml_native_reader_test.cc index 0a210378..5658be39 100644 --- a/test/xml/xml_native_reader_test.cc +++ b/test/xml/xml_native_reader_test.cc @@ -490,20 +490,17 @@ TEST_F(XMLReaderTest, InvalidDefaultClassName) { // ------------------------ test including ------------------------------------- -// credit: https://www.mjt.me.uk/posts/smallest-png/ -static constexpr unsigned char kTinyPng[] = - { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, - 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x03, 0x00, - 0x00, 0x00, 0x66, 0xBC, 0x3A, 0x25, 0x00, 0x00, 0x00, - 0x03, 0x50, 0x4C, 0x54, 0x45, 0xB5, 0xD0, 0xD0, 0x63, - 0x04, 0x16, 0xEA, 0x00, 0x00, 0x00, 0x1F, 0x49, 0x44, - 0x41, 0x54, 0x68, 0x81, 0xED, 0xC1, 0x01, 0x0D, 0x00, - 0x00, 0x00, 0xC2, 0xA0, 0xF7, 0x4F, 0x6D, 0x0E, 0x37, - 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xBE, 0x0D, 0x21, 0x00, 0x00, 0x01, 0x9A, 0x60, 0xE1, - 0xD5, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, - 0xAE, 0x42, 0x60, 0x82 }; +// tiny RGB 2 x 3 PNG file +static constexpr unsigned char kTinyPng[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x08, 0x02, 0x00, 0x00, 0x00, 0x12, 0x16, 0xf1, 0x4d, 0x00, 0x00, 0x00, + 0x1c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x78, 0xc1, 0xc0, 0xc0, + 0xc0, 0xf0, 0xbf, 0xb8, 0xb8, 0x98, 0x81, 0xe1, 0x3f, 0xc3, 0xff, 0xff, + 0xff, 0xc5, 0xc4, 0xc4, 0x00, 0x46, 0xd7, 0x07, 0x7f, 0xd2, 0x52, 0xa1, + 0x41, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, + 0x82 +}; TEST_F(XMLReaderTest, IncludeTest) { static constexpr char xml[] = R"(