Skip to content

Commit 90cd97d

Browse files
committed
Update modules, fix Android build, add test case
1 parent 644809a commit 90cd97d

3 files changed

Lines changed: 57 additions & 2 deletions

File tree

‎lib/android_build/app/src/main/cpp/CMakeLists.txt‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
# Sets the minimum version of CMake required to build the native library.
55

66
cmake_minimum_required(VERSION 3.4.1)
7-
set(CMAKE_CXX_STANDARD 11)
7+
set(CMAKE_CXX_STANDARD 14)
8+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
89

910
string(REPLACE "/lib/android_build/app/src/main/cpp" "" SDK_ROOT ${CMAKE_SOURCE_DIR})
1011

‎lib/android_build/maesdk/src/main/cpp/CMakeLists.txt‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
# Sets the minimum version of CMake required to build the native library.
55

66
cmake_minimum_required(VERSION 3.10.2)
7-
set(CMAKE_CXX_STANDARD 11)
7+
set(CMAKE_CXX_STANDARD 14)
8+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
89

910
# Enable Azure Monitor / Application Insights end-point support
1011
option(BUILD_AZMON "Build for Azure Monitor" YES)

‎tests/unittests/AIJsonSerializerTests.cpp‎

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,57 @@ TEST(AIJsonSerializerTests, valuesSanitized)
182182
EXPECT_EQ(expectLarge, result["data"]["baseData"]["properties"][expectSmall150].get<std::string>());
183183
}
184184

185+
TEST(AIJsonSerializerTests, replacesInvalidUtf8BytesInStrings)
186+
{
187+
std::unique_ptr<AIJsonSerializer> aiSerializer = std::make_unique<AIJsonSerializer>();
188+
189+
::CsProtocol::App app;
190+
app.ver = "appVer";
191+
app.locale = "appLocale";
192+
193+
::CsProtocol::Device device;
194+
device.localId = "deviceId";
195+
device.deviceClass = "deviceClass";
196+
197+
::CsProtocol::Protocol proto;
198+
proto.devMake = "protoDevMake";
199+
proto.devModel = "protoDevModel";
200+
201+
::CsProtocol::Os os;
202+
os.name = "osName";
203+
os.ver = "osVer";
204+
205+
::CsProtocol::User user;
206+
user.localId = "userId";
207+
208+
// Inject an invalid UTF-8 byte (0xA9) into a string property.
209+
// With json::error_handler_t::replace, serialization should not throw and
210+
// the invalid byte should be replaced by the UTF-8 encoding of U+FFFD.
211+
std::string invalidUtf8 = "ab";
212+
invalidUtf8.push_back(static_cast<char>(0xA9));
213+
invalidUtf8 += "cd";
214+
215+
::CsProtocol::Data data;
216+
::CsProtocol::Value prop;
217+
prop.stringValue = invalidUtf8;
218+
data.properties["bad_utf8"] = prop;
219+
220+
std::unique_ptr<::CsProtocol::Record> record = createTestRecord(
221+
"eventUtf8", 1, app, device, proto, os, user, data
222+
);
223+
IncomingEventContext context(PAL::generateUuidString(), TEST_TOKEN, EventLatency_Unspecified, EventPersistence_Normal, record.get());
224+
225+
EXPECT_NO_THROW(aiSerializer->serialize(&context));
226+
ASSERT_FALSE(context.record.blob.empty());
227+
228+
::nlohmann::json parsed;
229+
EXPECT_NO_THROW(parsed = nlohmann::json::parse(context.record.blob.begin(), context.record.blob.end()));
230+
231+
const std::string actual = parsed["data"]["baseData"]["properties"]["bad_utf8"].get<std::string>();
232+
const std::string expected = std::string("ab") + "\xEF\xBF\xBD" + "cd";
233+
234+
EXPECT_EQ(expected, actual);
235+
EXPECT_EQ(std::string::npos, actual.find(static_cast<char>(0xA9)));
236+
}
237+
185238
#endif // HAVE_MAT_AI

0 commit comments

Comments
 (0)