From e3d933f4937f42b335c72e93b3dba08e706a8e7b Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Wed, 2 Oct 2019 15:01:38 +0100 Subject: [PATCH 01/15] refactor: create separate methods for NDK serialization of JSON objects --- .../src/main/jni/utils/serializer.c | 384 +++++++++--------- .../src/main/jni/utils/serializer.h | 17 + 2 files changed, 213 insertions(+), 188 deletions(-) diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c index 26492c94db..dbcc155693 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c @@ -168,6 +168,191 @@ const char *bsg_severity_string(bsg_severity_t type) { } } +void bsg_serialize_context(const bugsnag_report *report, JSON_Object *event) { + if (strlen(report->context) > 0) { + json_object_set_string(event, "context", report->context); + } else { + json_object_set_string(event, "context", report->app.active_screen); + } +} + +void bsg_serialize_handled_state(const bugsnag_report *report, JSON_Object *event) { + // FUTURE(dm): severityReason/unhandled attributes are currently + // over-optimized for signal handling. in the future we may want to handle + // C++ exceptions, etc as well. + json_object_set_string(event, "severity", bsg_severity_string(report->severity)); + json_object_dotset_boolean(event, "unhandled", true); + json_object_dotset_string(event, "severityReason.type", "signal"); + json_object_dotset_string(event, "severityReason.attributes.signalType", report->exception.name); +} + +void bsg_serialize_app(const bsg_app_info app, JSON_Object *event) { + json_object_dotset_string(event, "app.version", app.version); + json_object_dotset_string(event, "app.id", app.id); + json_object_dotset_string(event, "app.type", app.type); + + json_object_dotset_string(event, "app.releaseStage", app.release_stage); + json_object_dotset_number(event, "app.versionCode", app.version_code); + if (strlen(app.build_uuid) > 0) { + json_object_dotset_string(event, "app.buildUUID", app.build_uuid); + } + json_object_dotset_string(event, "app.binaryArch", app.binaryArch); + json_object_dotset_number(event, "app.duration", app.duration); + json_object_dotset_number(event, "app.durationInForeground", app.duration_in_foreground); + json_object_dotset_boolean(event, "app.inForeground", app.in_foreground); +} + +void bsg_serialize_app_metadata(const bsg_app_info app, JSON_Object *event) { + json_object_dotset_string(event, "metaData.app.packageName", app.package_name); + json_object_dotset_string(event, "metaData.app.versionName", app.version_name); + json_object_dotset_string(event, "metaData.app.activeScreen", app.active_screen); + json_object_dotset_string(event, "metaData.app.name", app.name); + json_object_dotset_boolean(event, "metaData.app.lowMemory", app.low_memory); +} + +void bsg_serialize_device(const bsg_device_info device, JSON_Object *event) { + json_object_dotset_string(event, "device.osName", "android"); + json_object_dotset_string(event, "device.id", device.id); + json_object_dotset_string(event, "device.osVersion", device.os_version); + json_object_dotset_string(event, "device.manufacturer", device.manufacturer); + json_object_dotset_string(event, "device.model", device.model); + json_object_dotset_string(event, "device.orientation", device.orientation); + json_object_dotset_number(event, "device.runtimeVersions.androidApiLevel", device.api_level); + json_object_dotset_string(event, "device.runtimeVersions.osBuild", device.os_build); + + JSON_Value *abi_val = json_value_init_array(); + JSON_Array *cpu_abis = json_value_get_array(abi_val); + json_object_dotset_value(event, "device.cpuAbi", abi_val); + for (int i = 0; i < device.cpu_abi_count; i++) { + json_array_append_string(cpu_abis, device.cpu_abi[i].value); + } + + json_object_dotset_number(event, "device.totalMemory", device.total_memory); +} + +void bsg_serialize_device_metadata(const bsg_device_info device, JSON_Object *event) { + json_object_dotset_string(event, "metaData.device.brand", device.brand); + json_object_dotset_boolean(event, "metaData.device.emulator", device.emulator); + json_object_dotset_boolean(event, "metaData.device.jailbroken", device.jailbroken); + json_object_dotset_string(event, "metaData.device.locale", device.locale); + json_object_dotset_string(event, "metaData.device.locationStatus", device.location_status); + json_object_dotset_string(event, "metaData.device.networkAccess", device.network_access); + json_object_dotset_number(event, "metaData.device.dpi", device.dpi); + json_object_dotset_number(event, "metaData.device.screenDensity", device.screen_density); + json_object_dotset_string(event, "metaData.device.screenResolution", device.screen_resolution); + + char report_time[sizeof "2018-10-08T12:07:09Z"]; + if (device.time > 0) { + strftime(report_time, sizeof report_time, "%FT%TZ", gmtime(&device.time)); + json_object_dotset_string(event, "metaData.device.time", report_time); + } +} + +void bsg_serialize_custom_metadata(const bugsnag_metadata metadata, JSON_Object *event) { + for (int i = 0; i < metadata.value_count; i++) { + char *format = malloc(sizeof(char) * 256); + bsg_metadata_value value = metadata.values[i]; + + switch (value.type) { + case BSG_BOOL_VALUE: + sprintf(format, "metaData.%s.%s", value.section, value.name); + json_object_dotset_boolean(event, format, value.bool_value); + break; + case BSG_CHAR_VALUE: + sprintf(format, "metaData.%s.%s", value.section, value.name); + json_object_dotset_string(event, format, value.char_value); + break; + case BSG_NUMBER_VALUE: + sprintf(format, "metaData.%s.%s", value.section, value.name); + json_object_dotset_number(event, format, value.double_value); + break; + default: + break; + } + free(format); + } +} + +void bsg_serialize_user(const bsg_user user, JSON_Object *event) { + if (strlen(user.name) > 0) + json_object_dotset_string(event, "user.name", user.name); + if (strlen(user.email) > 0) + json_object_dotset_string(event, "user.email", user.email); + if (strlen(user.id) > 0) + json_object_dotset_string(event, "user.id", user.id); +} + +void bsg_serialize_session(bugsnag_report *report, JSON_Object *event) { + if (bugsnag_report_has_session(report)) { + json_object_dotset_string(event, "session.startedAt", + report->session_start); + json_object_dotset_string(event, "session.id", report->session_id); + json_object_dotset_number(event, "session.events.handled", + report->handled_events); + json_object_dotset_number(event, "session.events.unhandled", report->unhandled_events); + } +} + +void bsg_serialize_exception(JSON_Object *exception, JSON_Array *stacktrace, const bsg_exception exc) { + json_object_set_string(exception, "errorClass", exc.name); + json_object_set_string(exception, "message", exc.message); + json_object_set_string(exception, "type", "c"); + for (int findex = 0; findex < exc.frame_count; findex++) { + bsg_stackframe stackframe = exc.stacktrace[findex]; + JSON_Value *frame_val = json_value_init_object(); + JSON_Object *frame = json_value_get_object(frame_val); + json_object_set_number(frame, "frameAddress", stackframe.frame_address); + json_object_set_number(frame, "symbolAddress", stackframe.symbol_address); + json_object_set_number(frame, "loadAddress", stackframe.load_address); + json_object_set_number(frame, "lineNumber", stackframe.line_number); + if (strlen(stackframe.filename) > 0) { + json_object_set_string(frame, "file", stackframe.filename); + } + if (strlen(stackframe.method) == 0) { + char *frame_address = malloc(sizeof(char) * 32); + sprintf(frame_address, "0x%lx", + (unsigned long) stackframe.frame_address); + json_object_set_string(frame, "method", frame_address); + free(frame_address); + } else { + json_object_set_string(frame, "method", stackframe.method); + } + + json_array_append_value(stacktrace, frame_val); + } +} + +void bsg_serialize_breadcrumbs(const bugsnag_report *report, JSON_Array *crumbs) { + if (report->crumb_count > 0) { + int current_index = report->crumb_first_index; + while (json_array_get_count(crumbs) < report->crumb_count) { + JSON_Value *crumb_val = json_value_init_object(); + JSON_Object *crumb = json_value_get_object(crumb_val); + json_array_append_value(crumbs, crumb_val); + bugsnag_breadcrumb breadcrumb = report->breadcrumbs[current_index]; + json_object_set_string(crumb, "name", breadcrumb.name); + json_object_set_string(crumb, "timestamp", breadcrumb.timestamp); + json_object_set_string(crumb, "type", + bsg_crumb_type_string(breadcrumb.type)); + + JSON_Value *meta_val = json_value_init_object(); + JSON_Object *meta = json_value_get_object(meta_val); + json_object_set_value(crumb, "metaData", meta_val); + int metadata_index = 0; + while (strlen(breadcrumb.metadata[metadata_index].key) > 0) { + json_object_set_string(meta, breadcrumb.metadata[metadata_index].key, + breadcrumb.metadata[metadata_index].value); + metadata_index++; + } + + current_index++; + if (current_index == BUGSNAG_CRUMBS_MAX) { + current_index = 0; + } + } + } +} + char *bsg_serialize_report_to_json_string(bugsnag_report *report) { JSON_Value *event_val = json_value_init_object(); JSON_Object *event = json_value_get_object(event_val); @@ -185,194 +370,17 @@ char *bsg_serialize_report_to_json_string(bugsnag_report *report) { json_array_append_value(exceptions, ex_val); char *serialized_string = NULL; { - if (strlen(report->context) > 0) { - json_object_set_string(event, "context", report->context); - } else { - json_object_set_string(event, "context", report->app.active_screen); - } - - json_object_set_string(event, "severity", - bsg_severity_string(report->severity)); - // FUTURE(dm): severityReason/unhandled attributes are currently - // over-optimized for signal handling. in the future we may want to handle - // C++ exceptions, etc as well. - json_object_dotset_boolean(event, "unhandled", true); - json_object_dotset_string(event, "severityReason.type", "signal"); - json_object_dotset_string(event, "severityReason.attributes.signalType", - report->exception.name); - - json_object_dotset_string(event, "app.version", report->app.version); - json_object_dotset_string(event, "app.id", report->app.id); - json_object_dotset_string(event, "app.type", report->app.type); - - json_object_dotset_string(event, "app.releaseStage", - report->app.release_stage); - json_object_dotset_number(event, "app.versionCode", - report->app.version_code); - if (strlen(report->app.build_uuid) > 0) { - json_object_dotset_string(event, "app.buildUUID", report->app.build_uuid); - } - json_object_dotset_string(event, "app.binaryArch", - report->app.binaryArch); - json_object_dotset_number(event, "app.duration", report->app.duration); - json_object_dotset_number(event, "app.durationInForeground", - report->app.duration_in_foreground); - json_object_dotset_boolean(event, "app.inForeground", - report->app.in_foreground); - json_object_dotset_string(event, "metaData.app.packageName", - report->app.package_name); - json_object_dotset_string(event, "metaData.app.versionName", - report->app.version_name); - json_object_dotset_string(event, "metaData.app.activeScreen", - report->app.active_screen); - json_object_dotset_string(event, "metaData.app.name", report->app.name); - json_object_dotset_boolean(event, "metaData.app.lowMemory", - report->app.low_memory); - - json_object_dotset_string(event, "device.osName", "android"); - json_object_dotset_string(event, "device.id", report->device.id); - json_object_dotset_string(event, "device.osVersion", - report->device.os_version); - json_object_dotset_string(event, "device.manufacturer", - report->device.manufacturer); - json_object_dotset_string(event, "device.model", report->device.model); - json_object_dotset_string(event, "device.orientation", - report->device.orientation); - json_object_dotset_number(event, "device.runtimeVersions.androidApiLevel", - report->device.api_level); - json_object_dotset_string(event, "device.runtimeVersions.osBuild", - report->device.os_build); - - JSON_Value *abi_val = json_value_init_array(); - JSON_Array *cpu_abis = json_value_get_array(abi_val); - json_object_dotset_value(event, "device.cpuAbi", abi_val); - for (int i = 0; i < report->device.cpu_abi_count; i++) { - json_array_append_string(cpu_abis, report->device.cpu_abi[i].value); - } - - json_object_dotset_number(event, "device.totalMemory", - report->device.total_memory); - json_object_dotset_string(event, "metaData.device.brand", - report->device.brand); - json_object_dotset_boolean(event, "metaData.device.emulator", - report->device.emulator); - json_object_dotset_boolean(event, "metaData.device.jailbroken", - report->device.jailbroken); - json_object_dotset_string(event, "metaData.device.locale", - report->device.locale); - json_object_dotset_string(event, "metaData.device.locationStatus", - report->device.location_status); - json_object_dotset_string(event, "metaData.device.networkAccess", - report->device.network_access); - json_object_dotset_number(event, "metaData.device.dpi", report->device.dpi); - json_object_dotset_number(event, "metaData.device.screenDensity", - report->device.screen_density); - json_object_dotset_string(event, "metaData.device.screenResolution", - report->device.screen_resolution); - - char report_time[sizeof "2018-10-08T12:07:09Z"]; - if (report->device.time > 0) { - strftime(report_time, sizeof report_time, "%FT%TZ", - gmtime(&report->device.time)); - json_object_dotset_string(event, "metaData.device.time", report_time); - } - - // Serialize custom metadata - { - for (int i = 0; i < report->metadata.value_count; i++) { - char *format = malloc(sizeof(char) * 256); - bsg_metadata_value value = report->metadata.values[i]; - - switch (value.type) { - case BSG_BOOL_VALUE: - sprintf(format, "metaData.%s.%s", value.section, value.name); - json_object_dotset_boolean(event, format, value.bool_value); - break; - case BSG_CHAR_VALUE: - sprintf(format, "metaData.%s.%s", value.section, value.name); - json_object_dotset_string(event, format, value.char_value); - break; - case BSG_NUMBER_VALUE: - sprintf(format, "metaData.%s.%s", value.section, value.name); - json_object_dotset_number(event, format, value.double_value); - break; - default: - break; - } - free(format); - } - } - - if (strlen(report->user.name) > 0) - json_object_dotset_string(event, "user.name", report->user.name); - if (strlen(report->user.email) > 0) - json_object_dotset_string(event, "user.email", report->user.email); - if (strlen(report->user.id) > 0) - json_object_dotset_string(event, "user.id", report->user.id); - - if (bugsnag_report_has_session(report)) { - json_object_dotset_string(event, "session.startedAt", - report->session_start); - json_object_dotset_string(event, "session.id", report->session_id); - json_object_dotset_number(event, "session.events.handled", - report->handled_events); - json_object_dotset_number(event, "session.events.unhandled", report->unhandled_events); - } - - json_object_set_string(exception, "errorClass", report->exception.name); - json_object_set_string(exception, "message", report->exception.message); - json_object_set_string(exception, "type", "c"); - for (int findex = 0; findex < report->exception.frame_count; findex++) { - bsg_stackframe stackframe = report->exception.stacktrace[findex]; - JSON_Value *frame_val = json_value_init_object(); - JSON_Object *frame = json_value_get_object(frame_val); - json_object_set_number(frame, "frameAddress", stackframe.frame_address); - json_object_set_number(frame, "symbolAddress", stackframe.symbol_address); - json_object_set_number(frame, "loadAddress", stackframe.load_address); - json_object_set_number(frame, "lineNumber", stackframe.line_number); - if (strlen(stackframe.filename) > 0) { - json_object_set_string(frame, "file", stackframe.filename); - } - if (strlen(stackframe.method) == 0) { - char *frame_address = malloc(sizeof(char) * 32); - sprintf(frame_address, "0x%lx", - (unsigned long)stackframe.frame_address); - json_object_set_string(frame, "method", frame_address); - free(frame_address); - } else { - json_object_set_string(frame, "method", stackframe.method); - } - - json_array_append_value(stacktrace, frame_val); - } - if (report->crumb_count > 0) { - int current_index = report->crumb_first_index; - while (json_array_get_count(crumbs) < report->crumb_count) { - JSON_Value *crumb_val = json_value_init_object(); - JSON_Object *crumb = json_value_get_object(crumb_val); - json_array_append_value(crumbs, crumb_val); - bugsnag_breadcrumb breadcrumb = report->breadcrumbs[current_index]; - json_object_set_string(crumb, "name", breadcrumb.name); - json_object_set_string(crumb, "timestamp", breadcrumb.timestamp); - json_object_set_string(crumb, "type", - bsg_crumb_type_string(breadcrumb.type)); - - JSON_Value *meta_val = json_value_init_object(); - JSON_Object *meta = json_value_get_object(meta_val); - json_object_set_value(crumb, "metaData", meta_val); - int metadata_index = 0; - while (strlen(breadcrumb.metadata[metadata_index].key) > 0) { - json_object_set_string(meta, breadcrumb.metadata[metadata_index].key, - breadcrumb.metadata[metadata_index].value); - metadata_index++; - } - - current_index++; - if (current_index == BUGSNAG_CRUMBS_MAX) { - current_index = 0; - } - } - } + bsg_serialize_context(report, event); + bsg_serialize_handled_state(report, event); + bsg_serialize_app(report->app, event); + bsg_serialize_app_metadata(report->app, event); + bsg_serialize_device(report->device, event); + bsg_serialize_device_metadata(report->device, event); + bsg_serialize_custom_metadata(report->metadata, event); + bsg_serialize_user(report->user, event); + bsg_serialize_session(report, event); + bsg_serialize_exception(exception, stacktrace, report->exception); + bsg_serialize_breadcrumbs(report, crumbs); serialized_string = json_serialize_to_string(event_val); json_value_free(event_val); diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h index 75ca559b15..e35fb6a1c3 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h @@ -16,6 +16,23 @@ char *bsg_serialize_report_to_json_string(bugsnag_report *report); bool bsg_serialize_report_to_file(bsg_environment *env) __asyncsafe; bugsnag_report *bsg_deserialize_report_from_file(char *filepath); + +void bsg_serialize_context(const bugsnag_report *report, JSON_Object *event); +void bsg_serialize_handled_state(const bugsnag_report *report, JSON_Object *event); +void bsg_serialize_app(const bsg_app_info app, JSON_Object *event); +void bsg_serialize_app_metadata(const bsg_app_info app, JSON_Object *event); +void bsg_serialize_device(const bsg_device_info device, JSON_Object *event); +void bsg_serialize_device_metadata(const bsg_device_info device, JSON_Object *event); +void bsg_serialize_custom_metadata(const bugsnag_metadata metadata, JSON_Object *event); +void bsg_serialize_user(const bsg_user user, JSON_Object *event); +void bsg_serialize_session(bugsnag_report *report, JSON_Object *event); +void bsg_serialize_exception(JSON_Object *exception, JSON_Array *stacktrace, const bsg_exception exc); +void bsg_serialize_breadcrumbs(const bugsnag_report *report, JSON_Array *crumbs); +char *bsg_serialize_report_to_json_string(bugsnag_report *report); + + + + #ifdef __cplusplus } #endif From c614c901a5180223f6d3daac34d162b2f0a926c5 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Wed, 2 Oct 2019 16:58:27 +0100 Subject: [PATCH 02/15] test: create parameterised serialization tests for NDK --- .../bugsnag/android/ndk/NativeCXXTest.java | 6 ++-- .../com/bugsnag/android/ndk/ResourceUtils.kt | 4 +++ .../android/ndk/UserSerializationTest.kt | 32 +++++++++++++++++++ .../com/bugsnag/android/ndk/VerifyUtils.kt | 11 +++++++ .../resources/user_serialization_0.json | 1 + .../resources/user_serialization_1.json | 1 + .../src/test/CMakeLists.txt | 1 + .../src/test/cpp/main.c | 31 ++++++++++++++++-- .../src/test/cpp/test_serializer.c | 30 +++++++++++++++++ .../src/test/cpp/test_serializer.h | 15 +++++++++ 10 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ResourceUtils.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/UserSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/VerifyUtils.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_0.json create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_1.json create mode 100644 bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c create mode 100644 bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java index dd2f0b41da..7202ee3ef8 100644 --- a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java @@ -2,6 +2,8 @@ import org.junit.Test; +import static com.bugsnag.android.ndk.VerifyUtilsKt.verifyNativeRun; + public class NativeCXXTest { static { @@ -13,8 +15,6 @@ public class NativeCXXTest { @Test public void testPassesNativeSuite() throws Exception { - if (run() != 0) { - throw new Exception("Check device logs for native test results"); - } + verifyNativeRun(run()); } } diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ResourceUtils.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ResourceUtils.kt new file mode 100644 index 0000000000..5438014243 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ResourceUtils.kt @@ -0,0 +1,4 @@ +package com.bugsnag.android.ndk + +internal fun loadJson(resourceName: String) = + NativeCXXTest::class.java.classLoader!!.getResource(resourceName).readText() diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/UserSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/UserSerializationTest.kt new file mode 100644 index 0000000000..198a5a4bfa --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/UserSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class UserSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = (0..1) + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("user_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/VerifyUtils.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/VerifyUtils.kt new file mode 100644 index 0000000000..755db00371 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/VerifyUtils.kt @@ -0,0 +1,11 @@ +package com.bugsnag.android.ndk + +import java.lang.IllegalStateException + +internal fun verifyNativeRun(code: Int): Boolean { + if (code != 0) { + throw IllegalStateException("Native tests failed. Check device logs for results.") + } else { + return true + } +} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_0.json new file mode 100644 index 0000000000..5527107eb3 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_0.json @@ -0,0 +1 @@ +{"user":{"name":"Fenton","email":"fenton@io.example.com","id":"1234"}} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_1.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_1.json new file mode 100644 index 0000000000..bb1f4bb2d2 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_1.json @@ -0,0 +1 @@ +{"user":{"name":"Jamie","email":"jamie@bugsnag.com","id":"456"}} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/CMakeLists.txt b/bugsnag-plugin-android-ndk/src/test/CMakeLists.txt index cc54c1bf3e..68afbde20c 100644 --- a/bugsnag-plugin-android-ndk/src/test/CMakeLists.txt +++ b/bugsnag-plugin-android-ndk/src/test/CMakeLists.txt @@ -8,5 +8,6 @@ add_library(bugsnag-ndk-test SHARED cpp/main.c cpp/test_utils_string.c cpp/test_utils_serialize.c + cpp/test_serializer.c cpp/test_breadcrumbs.c) target_link_libraries(bugsnag-ndk-test bugsnag-ndk) diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index e695876d55..1cfa2e3ce7 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -5,6 +5,11 @@ #include #include +#include +#include +#include +#include "test_serializer.h" + SUITE(string_utils); SUITE(serialize_utils); SUITE(breadcrumbs); @@ -16,10 +21,32 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeCXXTest_run( int argc = 0; char *argv[] = {}; GREATEST_MAIN_BEGIN(); - RUN_SUITE(string_utils); RUN_SUITE(serialize_utils); RUN_SUITE(breadcrumbs); - GREATEST_MAIN_END(); } + +TEST test_user_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_object(); + JSON_Object *event = json_value_get_object(event_val); + bsg_user *user = test_case->data_ptr; + bsg_serialize_user(*user, event); + free(user); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_UserSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadUserTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_user_serialization, test_case); + GREATEST_MAIN_END(); +} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c new file mode 100644 index 0000000000..45c7c3b688 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -0,0 +1,30 @@ +#include "test_serializer.h" + +enum greatest_test_res validate_serialized_json(const test_case *test_case, + JSON_Value *event_val) { + // convert to string + char *serialized_string = json_serialize_to_string(event_val); + json_value_free(event_val); + + // validate structure + char *expected = test_case->expected_json; + ASSERT_STR_EQ(expected, serialized_string); + PASS(); +} + +bsg_user * loadUserTestCase(jint num) { + bsg_user *user; + + if (num == 0) { + user = malloc(sizeof(bsg_user)); + strcpy(user->id, "1234"); + strcpy(user->email, "fenton@io.example.com"); + strcpy(user->name, "Fenton"); + } else { + user = malloc(sizeof(bsg_user)); + strcpy(user->id, "456"); + strcpy(user->email, "jamie@bugsnag.com"); + strcpy(user->name, "Jamie"); + } + return user; +} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h new file mode 100644 index 0000000000..8c28bba28e --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -0,0 +1,15 @@ +#include +#include + +#include +#include +#include + +typedef struct { + void *data_ptr; + char *expected_json; +} test_case; + +enum greatest_test_res validate_serialized_json(const test_case *test_case, + JSON_Value *event_val); +bsg_user * loadUserTestCase(jint num); From cf9bb89df2a56a1332f9fe1309411730d10b5edc Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 13:17:08 +0100 Subject: [PATCH 03/15] test: create NDK serialization tests for app --- .../android/ndk/AppSerializationTest.kt | 32 +++++++++++++++++++ .../resources/app_serialization_0.json | 1 + .../src/test/cpp/main.c | 26 ++++++++++++++- .../src/test/cpp/test_serializer.c | 17 +++++++++- .../src/test/cpp/test_serializer.h | 1 + 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/AppSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/app_serialization_0.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/AppSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/AppSerializationTest.kt new file mode 100644 index 0000000000..fd16bb17f7 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/AppSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class AppSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = 0..0 + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("app_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/app_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/app_serialization_0.json new file mode 100644 index 0000000000..846afa0c59 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/app_serialization_0.json @@ -0,0 +1 @@ +{"app":{"version":"22","id":"com.bugsnag.example","type":"android","releaseStage":"prod","versionCode":55,"buildUUID":"1234-uuid","binaryArch":"x86","duration":6502,"durationInForeground":6502,"inForeground":true}} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index 1cfa2e3ce7..d60f0ce9f0 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -49,4 +49,28 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_UserSerializationTest_run( GREATEST_MAIN_BEGIN(); RUN_TEST1(test_user_serialization, test_case); GREATEST_MAIN_END(); -} \ No newline at end of file +} + +TEST test_app_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_object(); + JSON_Object *event = json_value_get_object(event_val); + bsg_app_info *app = test_case->data_ptr; + bsg_serialize_app(*app, event); + free(app); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_AppSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadAppTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_app_serialization, test_case); + GREATEST_MAIN_END(); +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index 45c7c3b688..ae856120a9 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -27,4 +27,19 @@ bsg_user * loadUserTestCase(jint num) { strcpy(user->name, "Jamie"); } return user; -} \ No newline at end of file +} + +bsg_app_info * loadAppTestCase(jint num) { + bsg_app_info *app = malloc(sizeof(bsg_app_info)); + strcpy(app->version, "22"); + strcpy(app->id, "com.bugsnag.example"); + strcpy(app->type, "android"); + strcpy(app->release_stage, "prod"); + app->version_code = 55; + strcpy(app->build_uuid, "1234-uuid"); + strcpy(app->binaryArch, "x86"); + app->duration = 6502; + app->duration_in_foreground = 6502; + app->in_foreground = true; + return app; +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h index 8c28bba28e..94efca12ae 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -13,3 +13,4 @@ typedef struct { enum greatest_test_res validate_serialized_json(const test_case *test_case, JSON_Value *event_val); bsg_user * loadUserTestCase(jint num); +bsg_app_info * loadAppTestCase(jint num); From 458b0b182b6fba3ddb45f3a3acf8aa06dce6b374 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 13:24:39 +0100 Subject: [PATCH 04/15] test: create NDK serialization tests for app metadata --- .../ndk/AppMetaDataSerializationTest.kt | 32 +++++++++++++++++++ .../app_meta_data_serialization_0.json | 1 + .../src/test/cpp/main.c | 26 +++++++++++++-- .../src/test/cpp/test_serializer.c | 10 ++++++ .../src/test/cpp/test_serializer.h | 1 + 5 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/AppMetaDataSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/app_meta_data_serialization_0.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/AppMetaDataSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/AppMetaDataSerializationTest.kt new file mode 100644 index 0000000000..ceeb5befc0 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/AppMetaDataSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class AppMetaDataSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = 0..0 + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("app_meta_data_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/app_meta_data_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/app_meta_data_serialization_0.json new file mode 100644 index 0000000000..10c2919974 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/app_meta_data_serialization_0.json @@ -0,0 +1 @@ +{"metaData":{"app":{"packageName":"com.bugsnag.example","versionName":"5.0","activeScreen":"MainActivity","name":"PhotoSnap","lowMemory":true}}} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index d60f0ce9f0..05f218e537 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -40,7 +40,6 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_UserSerializationTest_run( JNIEnv *_env, jobject _this, jint num, jstring expected_json) { int argc = 0; char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); test_case->data_ptr = loadUserTestCase(num); @@ -64,7 +63,6 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_AppSerializationTest_run( JNIEnv *_env, jobject _this, jint num, jstring expected_json) { int argc = 0; char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); test_case->data_ptr = loadAppTestCase(num); @@ -74,3 +72,27 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_AppSerializationTest_run( RUN_TEST1(test_app_serialization, test_case); GREATEST_MAIN_END(); } + + +TEST test_app_meta_data_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_object(); + JSON_Object *event = json_value_get_object(event_val); + bsg_app_info *app = test_case->data_ptr; + bsg_serialize_app_metadata(*app, event); + free(app); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_AppMetaDataSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadAppMetaDataTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_app_meta_data_serialization, test_case); + GREATEST_MAIN_END(); +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index ae856120a9..02105bdf94 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -43,3 +43,13 @@ bsg_app_info * loadAppTestCase(jint num) { app->in_foreground = true; return app; } + +bsg_app_info * loadAppMetaDataTestCase(jint num) { + bsg_app_info *app = malloc(sizeof(bsg_app_info)); + strcpy(app->package_name, "com.bugsnag.example"); + strcpy(app->version_name, "5.0"); + strcpy(app->active_screen, "MainActivity"); + strcpy(app->name, "PhotoSnap"); + app->low_memory = true; + return app; +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h index 94efca12ae..b2734131f4 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -14,3 +14,4 @@ enum greatest_test_res validate_serialized_json(const test_case *test_case, JSON_Value *event_val); bsg_user * loadUserTestCase(jint num); bsg_app_info * loadAppTestCase(jint num); +bsg_app_info * loadAppMetaDataTestCase(jint num); From 14a7c441a8de3b98ae40713aa8fa1fce131b133d Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 14:07:01 +0100 Subject: [PATCH 05/15] create NDK serialization tests for device --- .../android/ndk/DeviceSerializationTest.kt | 32 +++++++++++++++++++ .../resources/device_serialization_0.json | 1 + .../src/test/cpp/main.c | 24 +++++++++++++- .../src/test/cpp/test_serializer.c | 17 ++++++++++ .../src/test/cpp/test_serializer.h | 1 + 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/DeviceSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/device_serialization_0.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/DeviceSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/DeviceSerializationTest.kt new file mode 100644 index 0000000000..d562a0c578 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/DeviceSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class DeviceSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = 0..0 + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("device_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/device_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/device_serialization_0.json new file mode 100644 index 0000000000..54fd83918a --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/device_serialization_0.json @@ -0,0 +1 @@ +{"device":{"osName":"android","id":"f5gh7","osVersion":"8.1","manufacturer":"Samsung","model":"S7","orientation":"portrait","runtimeVersions":{"androidApiLevel":29,"osBuild":"BullDog 5.2"},"cpuAbi":["x86"],"totalMemory":512340922}} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index 05f218e537..9e04f4a7c9 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -73,7 +73,6 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_AppSerializationTest_run( GREATEST_MAIN_END(); } - TEST test_app_meta_data_serialization(test_case *test_case) { JSON_Value *event_val = json_value_init_object(); JSON_Object *event = json_value_get_object(event_val); @@ -96,3 +95,26 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_AppMetaDataSerializationTest_ RUN_TEST1(test_app_meta_data_serialization, test_case); GREATEST_MAIN_END(); } + +TEST test_device_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_object(); + JSON_Object *event = json_value_get_object(event_val); + bsg_device_info *device = test_case->data_ptr; + bsg_serialize_device(*device, event); + free(device); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_DeviceSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadDeviceTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_device_serialization, test_case); + GREATEST_MAIN_END(); +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index 02105bdf94..ade0c693bd 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -1,3 +1,4 @@ +#include #include "test_serializer.h" enum greatest_test_res validate_serialized_json(const test_case *test_case, @@ -53,3 +54,19 @@ bsg_app_info * loadAppMetaDataTestCase(jint num) { app->low_memory = true; return app; } + +bsg_device_info * loadDeviceTestCase(jint num) { + bsg_device_info *device = malloc(sizeof(bsg_device_info)); + strcpy(device->id, "f5gh7"); + strcpy(device->os_version, "8.1"); + strcpy(device->manufacturer, "Samsung"); + strcpy(device->model, "S7"); + strcpy(device->orientation, "portrait"); + strcpy(device->os_build, "BullDog 5.2"); + device->total_memory = 512340922; + device->api_level = 29; + + bsg_strncpy_safe(device->cpu_abi[0].value, "x86", sizeof(device->cpu_abi[0].value)); + device->cpu_abi_count = 1; + return device; +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h index b2734131f4..5a65375b22 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -15,3 +15,4 @@ enum greatest_test_res validate_serialized_json(const test_case *test_case, bsg_user * loadUserTestCase(jint num); bsg_app_info * loadAppTestCase(jint num); bsg_app_info * loadAppMetaDataTestCase(jint num); +bsg_device_info * loadDeviceTestCase(jint num); From b2f362688b3faa6e9358a4315b0cedaf7c5ced04 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 14:32:47 +0100 Subject: [PATCH 06/15] test: create NDK serialization tests for device metadata --- .../ndk/DeviceMetaDataSerializationTest.kt | 32 +++++++++++++++++++ .../device_meta_data_serialization_0.json | 1 + .../src/test/cpp/main.c | 23 +++++++++++++ .../src/test/cpp/test_serializer.c | 17 ++++++++++ .../src/test/cpp/test_serializer.h | 1 + 5 files changed, 74 insertions(+) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/DeviceMetaDataSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/device_meta_data_serialization_0.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/DeviceMetaDataSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/DeviceMetaDataSerializationTest.kt new file mode 100644 index 0000000000..bbe890569d --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/DeviceMetaDataSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class DeviceMetaDataSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = 0..0 + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("device_meta_data_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/device_meta_data_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/device_meta_data_serialization_0.json new file mode 100644 index 0000000000..ff8bcc8608 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/device_meta_data_serialization_0.json @@ -0,0 +1 @@ +{"metaData":{"device":{"brand":"Samsung","emulator":false,"jailbroken":false,"locale":"En","locationStatus":"cellular","networkAccess":"full","dpi":320,"screenDensity":3.5,"screenResolution":"1024x768","time":"2029-01-01T00:00:00Z"}}} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index 9e04f4a7c9..e86219504b 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -118,3 +118,26 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_DeviceSerializationTest_run( RUN_TEST1(test_device_serialization, test_case); GREATEST_MAIN_END(); } + +TEST test_device_meta_data_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_object(); + JSON_Object *event = json_value_get_object(event_val); + bsg_device_info *device = test_case->data_ptr; + bsg_serialize_device_metadata(*device, event); + free(device); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_DeviceMetaDataSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadDeviceMetaDataTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_device_meta_data_serialization, test_case); + GREATEST_MAIN_END(); +} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index ade0c693bd..39d596a6d2 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -70,3 +70,20 @@ bsg_device_info * loadDeviceTestCase(jint num) { device->cpu_abi_count = 1; return device; } + +bsg_device_info * loadDeviceMetaDataTestCase(jint num) { + bsg_device_info *device = malloc(sizeof(bsg_device_info)); + strcpy(device->brand, "Samsung"); + strcpy(device->locale, "En"); + strcpy(device->location_status, "cellular"); + strcpy(device->network_access, "full"); + strcpy(device->screen_resolution, "1024x768"); + device->emulator = false; + device->jailbroken = false; + device->dpi = 320; + device->screen_density = 3.5; + + struct tm time = { 0, 0, 0, 1, 12, 128 }; + device->time = mktime(&time); + return device; +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h index 5a65375b22..f333ae7fa1 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -16,3 +16,4 @@ bsg_user * loadUserTestCase(jint num); bsg_app_info * loadAppTestCase(jint num); bsg_app_info * loadAppMetaDataTestCase(jint num); bsg_device_info * loadDeviceTestCase(jint num); +bsg_device_info * loadDeviceMetaDataTestCase(jint num); From d13c593d4336f08f3883f1e483983917de86ea83 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 14:41:32 +0100 Subject: [PATCH 07/15] test: create NDK serialization tests for custom metadata --- .../ndk/CustomMetaDataSerializationTest.kt | 32 +++++++++++++++++++ .../custom_meta_data_serialization_0.json | 1 + .../src/test/cpp/main.c | 25 ++++++++++++++- .../src/test/cpp/test_serializer.c | 5 +++ .../src/test/cpp/test_serializer.h | 1 + 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/CustomMetaDataSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/custom_meta_data_serialization_0.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/CustomMetaDataSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/CustomMetaDataSerializationTest.kt new file mode 100644 index 0000000000..60bb208ff3 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/CustomMetaDataSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class CustomMetaDataSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = 0..0 + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("custom_meta_data_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/custom_meta_data_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/custom_meta_data_serialization_0.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/custom_meta_data_serialization_0.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index e86219504b..420c210fb7 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -140,4 +140,27 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_DeviceMetaDataSerializationTe GREATEST_MAIN_BEGIN(); RUN_TEST1(test_device_meta_data_serialization, test_case); GREATEST_MAIN_END(); -} \ No newline at end of file +} + +TEST test_custom_meta_data_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_object(); + JSON_Object *event = json_value_get_object(event_val); + bugsnag_metadata *meta_data = test_case->data_ptr; + bsg_serialize_custom_metadata(*meta_data, event); + free(meta_data); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_CustomMetaDataSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadCustomMetaDataTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_custom_meta_data_serialization, test_case); + GREATEST_MAIN_END(); +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index 39d596a6d2..c853238d08 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -87,3 +87,8 @@ bsg_device_info * loadDeviceMetaDataTestCase(jint num) { device->time = mktime(&time); return device; } + +bugsnag_metadata * loadCustomMetaDataTestCase(jint num) { + bugsnag_metadata *data = malloc(sizeof(bugsnag_metadata)); + return data; +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h index f333ae7fa1..3dbba7bd07 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -17,3 +17,4 @@ bsg_app_info * loadAppTestCase(jint num); bsg_app_info * loadAppMetaDataTestCase(jint num); bsg_device_info * loadDeviceTestCase(jint num); bsg_device_info * loadDeviceMetaDataTestCase(jint num); +bugsnag_metadata * loadCustomMetaDataTestCase(jint num); From 2cd2abcfb3898341698765d9af7edf958290c144 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 15:06:50 +0100 Subject: [PATCH 08/15] test: create NDK serialization tests for context --- .../android/ndk/ContextSerializationTest.kt | 32 +++++++++++++++++++ .../resources/context_serialization_0.json | 1 + .../src/main/jni/utils/serializer.c | 2 +- .../src/main/jni/utils/serializer.h | 2 +- .../src/test/cpp/main.c | 23 +++++++++++++ .../src/test/cpp/test_serializer.c | 7 ++++ .../src/test/cpp/test_serializer.h | 1 + 7 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ContextSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/context_serialization_0.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ContextSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ContextSerializationTest.kt new file mode 100644 index 0000000000..daabe3cc33 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ContextSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class ContextSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = 0..0 + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("context_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/context_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/context_serialization_0.json new file mode 100644 index 0000000000..f503716fb7 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/context_serialization_0.json @@ -0,0 +1 @@ +{"context":"CustomContext"} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c index dbcc155693..ea8ccd39d8 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c @@ -168,7 +168,7 @@ const char *bsg_severity_string(bsg_severity_t type) { } } -void bsg_serialize_context(const bugsnag_report *report, JSON_Object *event) { +void bsg_serialize_context(bugsnag_report *report, JSON_Object *event) { if (strlen(report->context) > 0) { json_object_set_string(event, "context", report->context); } else { diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h index e35fb6a1c3..870ae8a05a 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h @@ -17,7 +17,7 @@ bool bsg_serialize_report_to_file(bsg_environment *env) __asyncsafe; bugsnag_report *bsg_deserialize_report_from_file(char *filepath); -void bsg_serialize_context(const bugsnag_report *report, JSON_Object *event); +void bsg_serialize_context(bugsnag_report *report, JSON_Object *event); void bsg_serialize_handled_state(const bugsnag_report *report, JSON_Object *event); void bsg_serialize_app(const bsg_app_info app, JSON_Object *event); void bsg_serialize_app_metadata(const bsg_app_info app, JSON_Object *event); diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index 420c210fb7..61119f8f7b 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -164,3 +164,26 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_CustomMetaDataSerializationTe RUN_TEST1(test_custom_meta_data_serialization, test_case); GREATEST_MAIN_END(); } + +TEST test_context_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_object(); + JSON_Object *event = json_value_get_object(event_val); + bugsnag_report *report = test_case->data_ptr; + bsg_serialize_context(report, event); + free(report); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_ContextSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadContextTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_context_serialization, test_case); + GREATEST_MAIN_END(); +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index c853238d08..b71f6950a1 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -92,3 +92,10 @@ bugsnag_metadata * loadCustomMetaDataTestCase(jint num) { bugsnag_metadata *data = malloc(sizeof(bugsnag_metadata)); return data; } + +bugsnag_report * loadContextTestCase(jint num) { + bugsnag_report *data = malloc(sizeof(bugsnag_report)); + strcpy(data->context, "CustomContext"); + strcpy(data->app.active_screen, "ExampleActivity"); + return data; +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h index 3dbba7bd07..5e63c99f42 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -18,3 +18,4 @@ bsg_app_info * loadAppMetaDataTestCase(jint num); bsg_device_info * loadDeviceTestCase(jint num); bsg_device_info * loadDeviceMetaDataTestCase(jint num); bugsnag_metadata * loadCustomMetaDataTestCase(jint num); +bugsnag_report * loadContextTestCase(jint num); From 55a61861da4e9509f152c50a735ae09266dd1a24 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 15:13:58 +0100 Subject: [PATCH 09/15] test: create NDK serialization tests for handled state --- .../ndk/HandledStateSerializationTest.kt | 32 +++++++++++++++++++ .../handled_state_serialization_0.json | 1 + .../src/main/jni/utils/serializer.c | 2 +- .../src/main/jni/utils/serializer.h | 2 +- .../src/test/cpp/main.c | 23 +++++++++++++ .../src/test/cpp/test_serializer.c | 5 +++ .../src/test/cpp/test_serializer.h | 1 + 7 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/HandledStateSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/handled_state_serialization_0.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/HandledStateSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/HandledStateSerializationTest.kt new file mode 100644 index 0000000000..6a5c541b1f --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/HandledStateSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class HandledStateSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = 0..0 + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("handled_state_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/handled_state_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/handled_state_serialization_0.json new file mode 100644 index 0000000000..57fdcc1ef9 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/handled_state_serialization_0.json @@ -0,0 +1 @@ +{"severity":"error","unhandled":true,"severityReason":{"type":"signal","attributes":{"signalType":""}}} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c index ea8ccd39d8..dbcc155693 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c @@ -168,7 +168,7 @@ const char *bsg_severity_string(bsg_severity_t type) { } } -void bsg_serialize_context(bugsnag_report *report, JSON_Object *event) { +void bsg_serialize_context(const bugsnag_report *report, JSON_Object *event) { if (strlen(report->context) > 0) { json_object_set_string(event, "context", report->context); } else { diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h index 870ae8a05a..e35fb6a1c3 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h @@ -17,7 +17,7 @@ bool bsg_serialize_report_to_file(bsg_environment *env) __asyncsafe; bugsnag_report *bsg_deserialize_report_from_file(char *filepath); -void bsg_serialize_context(bugsnag_report *report, JSON_Object *event); +void bsg_serialize_context(const bugsnag_report *report, JSON_Object *event); void bsg_serialize_handled_state(const bugsnag_report *report, JSON_Object *event); void bsg_serialize_app(const bsg_app_info app, JSON_Object *event); void bsg_serialize_app_metadata(const bsg_app_info app, JSON_Object *event); diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index 61119f8f7b..b90e91c3a1 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -187,3 +187,26 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_ContextSerializationTest_run( RUN_TEST1(test_context_serialization, test_case); GREATEST_MAIN_END(); } + +TEST test_handled_state_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_object(); + JSON_Object *event = json_value_get_object(event_val); + bugsnag_report *report = test_case->data_ptr; + bsg_serialize_handled_state(report, event); + free(report); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_HandledStateSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadHandledStateTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_handled_state_serialization, test_case); + GREATEST_MAIN_END(); +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index b71f6950a1..68929d430a 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -99,3 +99,8 @@ bugsnag_report * loadContextTestCase(jint num) { strcpy(data->app.active_screen, "ExampleActivity"); return data; } + +bugsnag_report * loadHandledStateTestCase(jint num) { + bugsnag_report *data = malloc(sizeof(bugsnag_report)); + return data; +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h index 5e63c99f42..e750ddab0d 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -19,3 +19,4 @@ bsg_device_info * loadDeviceTestCase(jint num); bsg_device_info * loadDeviceMetaDataTestCase(jint num); bugsnag_metadata * loadCustomMetaDataTestCase(jint num); bugsnag_report * loadContextTestCase(jint num); +bugsnag_report * loadHandledStateTestCase(jint num); From 55eb04dc69ae17154d2445128483e46caba3165d Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 15:22:39 +0100 Subject: [PATCH 10/15] test: create NDK serialization tests for session --- .../android/ndk/SessionSerializationTest.kt | 32 +++++++++++++++++++ .../resources/session_serialization_0.json | 1 + .../src/test/cpp/main.c | 23 +++++++++++++ .../src/test/cpp/test_serializer.c | 5 +++ .../src/test/cpp/test_serializer.h | 1 + 5 files changed, 62 insertions(+) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/SessionSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/session_serialization_0.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/SessionSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/SessionSerializationTest.kt new file mode 100644 index 0000000000..153ca4bb88 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/SessionSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class SessionSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = 0..0 + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("session_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/session_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/session_serialization_0.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/session_serialization_0.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index b90e91c3a1..f34c3622d9 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -210,3 +210,26 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_HandledStateSerializationTest RUN_TEST1(test_handled_state_serialization, test_case); GREATEST_MAIN_END(); } + +TEST test_session_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_object(); + JSON_Object *event = json_value_get_object(event_val); + bugsnag_report *report = test_case->data_ptr; + bsg_serialize_session(report, event); + free(report); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_SessionSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadSessionTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_session_serialization, test_case); + GREATEST_MAIN_END(); +} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index 68929d430a..ebf1c4a23d 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -104,3 +104,8 @@ bugsnag_report * loadHandledStateTestCase(jint num) { bugsnag_report *data = malloc(sizeof(bugsnag_report)); return data; } + +bugsnag_report * loadSessionTestCase(jint num) { + bugsnag_report *data = malloc(sizeof(bugsnag_report)); + return data; +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h index e750ddab0d..0d27be2af2 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -20,3 +20,4 @@ bsg_device_info * loadDeviceMetaDataTestCase(jint num); bugsnag_metadata * loadCustomMetaDataTestCase(jint num); bugsnag_report * loadContextTestCase(jint num); bugsnag_report * loadHandledStateTestCase(jint num); +bugsnag_report * loadSessionTestCase(jint num); From 759c4aa1ccab9da264fc36fa90b81a9f5106ea52 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 15:29:55 +0100 Subject: [PATCH 11/15] test: create NDK serialization tests for breadcrumbs --- .../ndk/BreadcrumbsSerializationTest.kt | 32 +++++++++++++++++++ .../breadcrumbs_serialization_0.json | 1 + .../src/test/cpp/main.c | 25 ++++++++++++++- .../src/test/cpp/test_serializer.c | 5 +++ .../src/test/cpp/test_serializer.h | 1 + 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbsSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/breadcrumbs_serialization_0.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbsSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbsSerializationTest.kt new file mode 100644 index 0000000000..7fd02b801d --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbsSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class BreadcrumbsSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = 0..0 + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("breadcrumbs_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/breadcrumbs_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/breadcrumbs_serialization_0.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/breadcrumbs_serialization_0.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index f34c3622d9..0ad32cc3b5 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -232,4 +232,27 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_SessionSerializationTest_run( GREATEST_MAIN_BEGIN(); RUN_TEST1(test_session_serialization, test_case); GREATEST_MAIN_END(); -} \ No newline at end of file +} + +TEST test_breadcrumbs_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_array(); + JSON_Array *event = json_value_get_array(event_val); + bugsnag_report *report = test_case->data_ptr; + bsg_serialize_breadcrumbs(report, event); + free(report); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_BreadcrumbsSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadBreadcrumbsTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_breadcrumbs_serialization, test_case); + GREATEST_MAIN_END(); +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index ebf1c4a23d..eaedfe45a6 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -109,3 +109,8 @@ bugsnag_report * loadSessionTestCase(jint num) { bugsnag_report *data = malloc(sizeof(bugsnag_report)); return data; } + +bugsnag_report * loadBreadcrumbsTestCase(jint num) { + bugsnag_report *data = malloc(sizeof(bugsnag_report)); + return data; +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h index 0d27be2af2..4f5d7e4350 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -21,3 +21,4 @@ bugsnag_metadata * loadCustomMetaDataTestCase(jint num); bugsnag_report * loadContextTestCase(jint num); bugsnag_report * loadHandledStateTestCase(jint num); bugsnag_report * loadSessionTestCase(jint num); +bugsnag_report * loadBreadcrumbsTestCase(jint num); From 7214e35335c5e06ca090734d58b5b0d59d5aebff Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 15:38:56 +0100 Subject: [PATCH 12/15] refactor: extract separate method for serializing stackframe --- .../src/main/jni/utils/serializer.c | 42 ++++++++++--------- .../src/main/jni/utils/serializer.h | 1 + 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c index dbcc155693..e794c3d17c 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c @@ -299,27 +299,31 @@ void bsg_serialize_exception(JSON_Object *exception, JSON_Array *stacktrace, con json_object_set_string(exception, "type", "c"); for (int findex = 0; findex < exc.frame_count; findex++) { bsg_stackframe stackframe = exc.stacktrace[findex]; - JSON_Value *frame_val = json_value_init_object(); - JSON_Object *frame = json_value_get_object(frame_val); - json_object_set_number(frame, "frameAddress", stackframe.frame_address); - json_object_set_number(frame, "symbolAddress", stackframe.symbol_address); - json_object_set_number(frame, "loadAddress", stackframe.load_address); - json_object_set_number(frame, "lineNumber", stackframe.line_number); - if (strlen(stackframe.filename) > 0) { - json_object_set_string(frame, "file", stackframe.filename); - } - if (strlen(stackframe.method) == 0) { - char *frame_address = malloc(sizeof(char) * 32); - sprintf(frame_address, "0x%lx", - (unsigned long) stackframe.frame_address); - json_object_set_string(frame, "method", frame_address); - free(frame_address); - } else { - json_object_set_string(frame, "method", stackframe.method); - } + bsg_serialize_stackframe(stacktrace, &stackframe); + } +} - json_array_append_value(stacktrace, frame_val); +void bsg_serialize_stackframe(JSON_Array *stacktrace, bsg_stackframe *stackframe) { + JSON_Value *frame_val = json_value_init_object(); + JSON_Object *frame = json_value_get_object(frame_val); + json_object_set_number(frame, "frameAddress", (*stackframe).frame_address); + json_object_set_number(frame, "symbolAddress", (*stackframe).symbol_address); + json_object_set_number(frame, "loadAddress", (*stackframe).load_address); + json_object_set_number(frame, "lineNumber", (*stackframe).line_number); + if (strlen((*stackframe).filename) > 0) { + json_object_set_string(frame, "file", (*stackframe).filename); } + if (strlen((*stackframe).method) == 0) { + char *frame_address = malloc(sizeof(char) * 32); + sprintf(frame_address, "0x%lx", + (unsigned long) (*stackframe).frame_address); + json_object_set_string(frame, "method", frame_address); + free(frame_address); + } else { + json_object_set_string(frame, "method", (*stackframe).method); + } + + json_array_append_value(stacktrace, frame_val); } void bsg_serialize_breadcrumbs(const bugsnag_report *report, JSON_Array *crumbs) { diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h index e35fb6a1c3..1b2e0178c5 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h @@ -26,6 +26,7 @@ void bsg_serialize_device_metadata(const bsg_device_info device, JSON_Object *ev void bsg_serialize_custom_metadata(const bugsnag_metadata metadata, JSON_Object *event); void bsg_serialize_user(const bsg_user user, JSON_Object *event); void bsg_serialize_session(bugsnag_report *report, JSON_Object *event); +void bsg_serialize_stackframe(JSON_Array *stacktrace, bsg_stackframe *stackframe); void bsg_serialize_exception(JSON_Object *exception, JSON_Array *stacktrace, const bsg_exception exc); void bsg_serialize_breadcrumbs(const bugsnag_report *report, JSON_Array *crumbs); char *bsg_serialize_report_to_json_string(bugsnag_report *report); From 8e3f6da78db33f88541fe65ec3e5da6eceea1bfe Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 15:53:34 +0100 Subject: [PATCH 13/15] test add NDK serialization tests for stackframe --- .../ndk/StackframeSerializationTest.kt | 32 +++++++++++++++++++ .../resources/stackframe_serialization_0.json | 1 + .../src/main/jni/utils/serializer.c | 4 +-- .../src/main/jni/utils/serializer.h | 2 +- .../src/test/cpp/main.c | 23 +++++++++++++ .../src/test/cpp/test_serializer.c | 11 +++++++ .../src/test/cpp/test_serializer.h | 1 + 7 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/StackframeSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/stackframe_serialization_0.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/StackframeSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/StackframeSerializationTest.kt new file mode 100644 index 0000000000..8446342396 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/StackframeSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class StackframeSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = 0..0 + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("stackframe_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/stackframe_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/stackframe_serialization_0.json new file mode 100644 index 0000000000..cf85931a12 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/stackframe_serialization_0.json @@ -0,0 +1 @@ +[{"frameAddress":536870912,"symbolAddress":369098752,"loadAddress":301989888,"lineNumber":52,"file":"foo.c","method":"bar()"}] \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c index e794c3d17c..15c19e0e71 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c @@ -299,11 +299,11 @@ void bsg_serialize_exception(JSON_Object *exception, JSON_Array *stacktrace, con json_object_set_string(exception, "type", "c"); for (int findex = 0; findex < exc.frame_count; findex++) { bsg_stackframe stackframe = exc.stacktrace[findex]; - bsg_serialize_stackframe(stacktrace, &stackframe); + bsg_serialize_stackframe(&stackframe, stacktrace); } } -void bsg_serialize_stackframe(JSON_Array *stacktrace, bsg_stackframe *stackframe) { +void bsg_serialize_stackframe(bsg_stackframe *stackframe, JSON_Array *stacktrace) { JSON_Value *frame_val = json_value_init_object(); JSON_Object *frame = json_value_get_object(frame_val); json_object_set_number(frame, "frameAddress", (*stackframe).frame_address); diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h index 1b2e0178c5..8d3ad9088f 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h @@ -26,7 +26,7 @@ void bsg_serialize_device_metadata(const bsg_device_info device, JSON_Object *ev void bsg_serialize_custom_metadata(const bugsnag_metadata metadata, JSON_Object *event); void bsg_serialize_user(const bsg_user user, JSON_Object *event); void bsg_serialize_session(bugsnag_report *report, JSON_Object *event); -void bsg_serialize_stackframe(JSON_Array *stacktrace, bsg_stackframe *stackframe); +void bsg_serialize_stackframe(bsg_stackframe *stackframe, JSON_Array *stacktrace); void bsg_serialize_exception(JSON_Object *exception, JSON_Array *stacktrace, const bsg_exception exc); void bsg_serialize_breadcrumbs(const bugsnag_report *report, JSON_Array *crumbs); char *bsg_serialize_report_to_json_string(bugsnag_report *report); diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index 0ad32cc3b5..3b6181b7e5 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -256,3 +256,26 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_BreadcrumbsSerializationTest_ RUN_TEST1(test_breadcrumbs_serialization, test_case); GREATEST_MAIN_END(); } + +TEST test_stackframe_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_array(); + JSON_Array *event = json_value_get_array(event_val); + bsg_stackframe *frame = test_case->data_ptr; + bsg_serialize_stackframe(frame, event); + free(frame); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_StackframeSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadStackframeTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_stackframe_serialization, test_case); + GREATEST_MAIN_END(); +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index eaedfe45a6..4f46991a9f 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -114,3 +114,14 @@ bugsnag_report * loadBreadcrumbsTestCase(jint num) { bugsnag_report *data = malloc(sizeof(bugsnag_report)); return data; } + +bsg_stackframe * loadStackframeTestCase(jint num) { + bsg_stackframe *data = malloc(sizeof(bsg_stackframe)); + data->frame_address = 0x20000000; + data->symbol_address = 0x16000000; + data->load_address = 0x12000000; + data->line_number= 52; + strcpy(data->filename, "foo.c"); + strcpy(data->method, "bar()"); + return data; +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h index 4f5d7e4350..f1421d693c 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -22,3 +22,4 @@ bugsnag_report * loadContextTestCase(jint num); bugsnag_report * loadHandledStateTestCase(jint num); bugsnag_report * loadSessionTestCase(jint num); bugsnag_report * loadBreadcrumbsTestCase(jint num); +bsg_stackframe * loadStackframeTestCase(jint num); From 849bdc32847933354476f935dad46eb3756bf6fc Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 16:20:46 +0100 Subject: [PATCH 14/15] test: add NDK serialization tests for exception --- .../android/ndk/ExceptionSerializationTest.kt | 32 +++++++++++++++++++ .../resources/exception_serialization_0.json | 1 + .../src/main/jni/utils/serializer.c | 4 +-- .../src/main/jni/utils/serializer.h | 6 +--- .../src/test/cpp/main.c | 27 ++++++++++++++++ .../src/test/cpp/test_serializer.c | 10 ++++++ .../src/test/cpp/test_serializer.h | 1 + .../src/test/cpp/test_utils_serialize.c | 2 +- 8 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ExceptionSerializationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/exception_serialization_0.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ExceptionSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ExceptionSerializationTest.kt new file mode 100644 index 0000000000..3f0525d529 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/ExceptionSerializationTest.kt @@ -0,0 +1,32 @@ +package com.bugsnag.android.ndk + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.* + +@RunWith(Parameterized::class) +internal class ExceptionSerializationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + + @JvmStatic + @Parameters + fun testCases() = 0..0 + } + + external fun run(testCase: Int, expectedJson: String): Int + + @Parameter + lateinit var testCase: Number + + @Test + fun testPassesNativeSuite() { + val expectedJson = loadJson("exception_serialization_$testCase.json") + verifyNativeRun(run(testCase.toInt(), expectedJson)) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/exception_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/exception_serialization_0.json new file mode 100644 index 0000000000..824991cc15 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/resources/exception_serialization_0.json @@ -0,0 +1 @@ +{"stacktrace":[{"frameAddress":0,"symbolAddress":0,"loadAddress":0,"lineNumber":0,"method":"0x0"}],"errorClass":"signal","message":"whoops something went wrong","type":"c"} \ No newline at end of file diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c index 15c19e0e71..e5e161eed5 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c @@ -293,7 +293,7 @@ void bsg_serialize_session(bugsnag_report *report, JSON_Object *event) { } } -void bsg_serialize_exception(JSON_Object *exception, JSON_Array *stacktrace, const bsg_exception exc) { +void bsg_serialize_exception(bsg_exception exc, JSON_Object *exception, JSON_Array *stacktrace) { json_object_set_string(exception, "errorClass", exc.name); json_object_set_string(exception, "message", exc.message); json_object_set_string(exception, "type", "c"); @@ -383,7 +383,7 @@ char *bsg_serialize_report_to_json_string(bugsnag_report *report) { bsg_serialize_custom_metadata(report->metadata, event); bsg_serialize_user(report->user, event); bsg_serialize_session(report, event); - bsg_serialize_exception(exception, stacktrace, report->exception); + bsg_serialize_exception(report->exception, exception, stacktrace); bsg_serialize_breadcrumbs(report, crumbs); serialized_string = json_serialize_to_string(event_val); diff --git a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h index 8d3ad9088f..1df0e3c019 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h @@ -27,14 +27,10 @@ void bsg_serialize_custom_metadata(const bugsnag_metadata metadata, JSON_Object void bsg_serialize_user(const bsg_user user, JSON_Object *event); void bsg_serialize_session(bugsnag_report *report, JSON_Object *event); void bsg_serialize_stackframe(bsg_stackframe *stackframe, JSON_Array *stacktrace); -void bsg_serialize_exception(JSON_Object *exception, JSON_Array *stacktrace, const bsg_exception exc); +void bsg_serialize_exception(bsg_exception exc, JSON_Object *exception, JSON_Array *stacktrace); void bsg_serialize_breadcrumbs(const bugsnag_report *report, JSON_Array *crumbs); char *bsg_serialize_report_to_json_string(bugsnag_report *report); - - - #ifdef __cplusplus } #endif - diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index 3b6181b7e5..08152287ef 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -279,3 +279,30 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_StackframeSerializationTest_r RUN_TEST1(test_stackframe_serialization, test_case); GREATEST_MAIN_END(); } + +TEST test_exception_serialization(test_case *test_case) { + JSON_Value *event_val = json_value_init_object(); + JSON_Object *exception = json_value_get_object(event_val); + JSON_Value *stack_val = json_value_init_array(); + JSON_Array *stacktrace = json_value_get_array(stack_val); + json_object_set_value(exception, "stacktrace", stack_val); + + bsg_exception *exc = test_case->data_ptr; + bsg_serialize_exception(*exc, exception, stacktrace); + free(exc); + return validate_serialized_json(test_case, event_val); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_ExceptionSerializationTest_run( + JNIEnv *_env, jobject _this, jint num, jstring expected_json) { + int argc = 0; + char *argv[] = {}; + test_case *test_case = malloc(sizeof(test_case)); + test_case->data_ptr = loadExceptionTestCase(num); + + char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); + test_case->expected_json = str; + GREATEST_MAIN_BEGIN(); + RUN_TEST1(test_exception_serialization, test_case); + GREATEST_MAIN_END(); +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index 4f46991a9f..568cc3dde9 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -125,3 +125,13 @@ bsg_stackframe * loadStackframeTestCase(jint num) { strcpy(data->method, "bar()"); return data; } + +bsg_exception * loadExceptionTestCase(jint num) { + bsg_exception *data = malloc(sizeof(bsg_exception)); + strcpy(data->name, "signal"); + strcpy(data->message, "whoops something went wrong"); + strcpy(data->type, "c"); + data->frame_count = 1; + // TODO stacktrace + return data; +} diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h index f1421d693c..6aebfab3f3 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -23,3 +23,4 @@ bugsnag_report * loadHandledStateTestCase(jint num); bugsnag_report * loadSessionTestCase(jint num); bugsnag_report * loadBreadcrumbsTestCase(jint num); bsg_stackframe * loadStackframeTestCase(jint num); +bsg_exception * loadExceptionTestCase(jint num); diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_utils_serialize.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_utils_serialize.c index 7d107ef64b..3f0b99be80 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_utils_serialize.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_utils_serialize.c @@ -51,7 +51,7 @@ void generate_basic_report(bugsnag_report *report) { bugsnag_report_v1 *bsg_generate_report_v1(void) { bugsnag_report_v1 *report = calloc(1, sizeof(bugsnag_report_v1)); - generate_basic_report(report); + generate_basic_report((bugsnag_report *) report); return report; } From c540d2795669bc7e208cf41739cea27ce409cab5 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 3 Oct 2019 16:28:29 +0100 Subject: [PATCH 15/15] reorder import --- .../java/com/bugsnag/android/ndk/NativeCXXTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java index 7202ee3ef8..93aef746bd 100644 --- a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java @@ -1,9 +1,9 @@ package com.bugsnag.android.ndk; -import org.junit.Test; - import static com.bugsnag.android.ndk.VerifyUtilsKt.verifyNativeRun; +import org.junit.Test; + public class NativeCXXTest { static {