From f9a7a2b6ff1c9ffba10e64234837296fab097885 Mon Sep 17 00:00:00 2001 From: Dylan Ross Date: Wed, 27 Aug 2025 20:44:12 -0700 Subject: [PATCH 1/5] chore(sdk): test using utf8 chars --- src/c2pa.cpp | 2 +- "tests/fixtures/C\303\226\303\204_.jpg" | Bin 0 -> 137886 bytes tests/reader.test.cpp | 15 ++++++++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 "tests/fixtures/C\303\226\303\204_.jpg" diff --git a/src/c2pa.cpp b/src/c2pa.cpp index 6bcb8e18..1505da39 100644 --- a/src/c2pa.cpp +++ b/src/c2pa.cpp @@ -127,7 +127,7 @@ namespace c2pa /// converts a filesystem::path to a string in utf-8 format inline std::string path_to_string(const filesystem::path &source_path) { - return reinterpret_cast(source_path.u8string().c_str()); + return source_path.u8string(); } /// Reads a file and returns the manifest json as a C2pa::String. diff --git "a/tests/fixtures/C\303\226\303\204_.jpg" "b/tests/fixtures/C\303\226\303\204_.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..afd07a28d430d297171ff6fb6e15a245cd4aef4c GIT binary patch literal 137886 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 From 9b79d774ddfb4aca4dcee2b6aefcdec2f61588cc Mon Sep 17 00:00:00 2001 From: Dylan Ross Date: Wed, 27 Aug 2025 21:45:35 -0700 Subject: [PATCH 2/5] chore(sdk): test using utf8 chars --- tests/reader.test.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index e97a7d3a..df944c9a 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -28,12 +28,11 @@ TEST(Reader, StreamWithManifest) std::cout << "Test file path: " << test_file << std::endl; for (const auto& entry : fs::directory_iterator(test_file.parent_path() )) { - std::cout << entry.path() << std::endl; + std::cout << entry.path().native() << std::endl; } - // read the new manifest and display the JSON - std::ifstream file_stream(test_file.wstring(), std::ios::binary); + std::ifstream file_stream(test_file.native(), std::ios::binary); ASSERT_TRUE(file_stream.is_open()) << "Failed to open file: " << test_file; auto reader = c2pa::Reader("image/jpeg", file_stream); From 40e345c986a21d305998d94dd24a3e57ca2b0d1d Mon Sep 17 00:00:00 2001 From: Dylan Ross Date: Wed, 27 Aug 2025 21:47:49 -0700 Subject: [PATCH 3/5] chore(sdk): test using utf8 chars --- tests/reader.test.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index df944c9a..3112282d 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -21,15 +21,10 @@ namespace fs = std::filesystem; TEST(Reader, StreamWithManifest) { fs::path current_dir = fs::path(__FILE__).parent_path(); - std::cout << "Current directory: " << current_dir << std::endl; -// fs::path test_file = current_dir / "../tests/fixtures/CÖÄ_.jpg"; - fs::path test_file = current_dir.parent_path().append("tests").append("fixtures").append("CÖÄ_.jpg"); - - std::cout << "Test file path: " << test_file << std::endl; - - for (const auto& entry : fs::directory_iterator(test_file.parent_path() )) { - std::cout << entry.path().native() << std::endl; - } + fs::path test_file = current_dir.parent_path() + .append("tests") + .append("fixtures") + .append("CÖÄ_.jpg"); // read the new manifest and display the JSON std::ifstream file_stream(test_file.native(), std::ios::binary); @@ -69,7 +64,8 @@ class RemoteUrlTests static c2pa::Reader reader_from_fixture(const std::string &file_name) { auto current_dir = fs::path(__FILE__).parent_path(); auto fixture = current_dir / "../tests/fixtures" / file_name; - return {fixture}; + auto stream = std::ifstream(fixture.native(), std::ios::binary); + return { "image/jpeg", stream }; } }; From 022818b46eeb009a804296c8ba6677994b9999d5 Mon Sep 17 00:00:00 2001 From: Dylan Ross Date: Thu, 28 Aug 2025 09:48:01 -0700 Subject: [PATCH 4/5] chore(sdk): test using utf8 chars --- CMakeLists.txt | 4 ++++ tests/reader.test.cpp | 34 ++++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 354896d8..d27ce131 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,10 @@ set(CMAKE_C_STANDARD 17) set(CMAKE_CXX_STANDARD 20) set(CMAKE_OSX_DEPLOYMENT_TARGET "13.3") +if(MSVC) +add_compile_options(/utf-8) +endif() + # Set RPATH settings for shared library discovery set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index 3112282d..1e953f46 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -14,20 +14,18 @@ #include #include #include +#include using nlohmann::json; namespace fs = std::filesystem; -TEST(Reader, StreamWithManifest) -{ +TEST(Reader, StreamWithManifest) { fs::path current_dir = fs::path(__FILE__).parent_path(); - fs::path test_file = current_dir.parent_path() - .append("tests") - .append("fixtures") - .append("CÖÄ_.jpg"); + fs::path test_file = current_dir.parent_path() / "tests" / "fixtures" / L"CÖÄ_.jpg"; + ASSERT_TRUE(std::filesystem::exists(test_file)) << "Test file does not exist: " << test_file; // read the new manifest and display the JSON - std::ifstream file_stream(test_file.native(), std::ios::binary); + std::ifstream file_stream(test_file, std::ios::binary); ASSERT_TRUE(file_stream.is_open()) << "Failed to open file: " << test_file; auto reader = c2pa::Reader("image/jpeg", file_stream); @@ -62,10 +60,10 @@ class RemoteUrlTests : public ::testing::TestWithParam> { public: static c2pa::Reader reader_from_fixture(const std::string &file_name) { - auto current_dir = fs::path(__FILE__).parent_path(); - auto fixture = current_dir / "../tests/fixtures" / file_name; - auto stream = std::ifstream(fixture.native(), std::ios::binary); - return { "image/jpeg", stream }; + auto current_dir = fs::path(__FILE__).parent_path(); + auto fixture = current_dir / "../tests/fixtures" / file_name; + std::ifstream stream(fixture, std::ios::binary); + return { "image/jpeg", stream }; } }; @@ -73,7 +71,7 @@ INSTANTIATE_TEST_SUITE_P(ReaderRemoteUrlTests, RemoteUrlTests, ::testing::Values( // (fixture filename, is_remote_manifest) std::make_tuple("cloud.jpg", true), - std::make_tuple("CÖÄ_.jpg", false))); + std::make_tuple("C.jpg", false))); TEST_P(RemoteUrlTests, RemoteUrl) { auto reader = reader_from_fixture(std::get<0>(GetParam())); @@ -87,6 +85,18 @@ TEST_P(RemoteUrlTests, IsEmbeddedTest) { EXPECT_EQ(reader.is_embedded(), !expected_is_remote); } +TEST(Reader, HasManifestUtf8Path) { + auto current_dir = fs::path(__FILE__).parent_path(); + auto test_file = current_dir / "../tests/fixtures/CÖÄ_.jpg"; + ASSERT_TRUE(std::filesystem::exists(test_file)) << "Test file does not exist: " << test_file; + + std::ifstream stream(test_file, std::ios::binary); + auto reader = c2pa::Reader("image/jpeg", stream); + + EXPECT_FALSE(reader.remote_url()); + EXPECT_TRUE(reader.is_embedded()); +} + /* remove this until we resolve CAWG Identity testing TEST(Reader, FileWithCawgIdentityManifest) { From e23060c5633eeed583f680510b9dff722aae9a6e Mon Sep 17 00:00:00 2001 From: Dylan Ross Date: Tue, 2 Sep 2025 13:03:08 -0700 Subject: [PATCH 5/5] chore(sdk): test using utf8 chars --- tests/reader.test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index 1e953f46..c1794574 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -87,7 +87,7 @@ TEST_P(RemoteUrlTests, IsEmbeddedTest) { TEST(Reader, HasManifestUtf8Path) { auto current_dir = fs::path(__FILE__).parent_path(); - auto test_file = current_dir / "../tests/fixtures/CÖÄ_.jpg"; + auto test_file = current_dir.parent_path() / "tests" / "fixtures" / L"CÖÄ_.jpg"; ASSERT_TRUE(std::filesystem::exists(test_file)) << "Test file does not exist: " << test_file; std::ifstream stream(test_file, std::ios::binary);