From de2b72c667ae52f5de30c5c85d2fad9bdd1576fc Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Wed, 14 Jul 2021 13:58:02 +0100 Subject: [PATCH 01/11] refactor: prefer calloc() to malloc() in NDK code --- CHANGELOG.md | 7 +++++ .../src/main/jni/bugsnag.c | 2 +- .../src/main/jni/metadata.c | 2 +- .../src/main/jni/utils/serializer.c | 28 +++++++++---------- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e077a140c..44fdfbee70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## TBD + +### Bug fixes + +* Prefer `calloc()` to `malloc()` in NDK code + [#1320](https://github.com/bugsnag/bugsnag-android/pull/1320) + ## 5.10.0 (2021-07-14) ### Enhancements diff --git a/bugsnag-plugin-android-ndk/src/main/jni/bugsnag.c b/bugsnag-plugin-android-ndk/src/main/jni/bugsnag.c index c4fdcf371d..4957700344 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/bugsnag.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/bugsnag.c @@ -84,7 +84,7 @@ void bsg_populate_notify_stacktrace(JNIEnv *env, bugsnag_stackframe *stacktrace, jstring filename = bsg_safe_new_string_utf(env, frame.filename); jstring method; if (strlen(frame.method) == 0) { - char *frame_address = malloc(sizeof(char) * 32); + char *frame_address = calloc(1, sizeof(char) * 32); sprintf(frame_address, "0x%lx", (unsigned long)frame.frame_address); method = bsg_safe_new_string_utf(env, frame_address); free(frame_address); diff --git a/bugsnag-plugin-android-ndk/src/main/jni/metadata.c b/bugsnag-plugin-android-ndk/src/main/jni/metadata.c index 7e38f1634b..847bc215d2 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/metadata.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/metadata.c @@ -49,7 +49,7 @@ void bsg_populate_metadata_value(JNIEnv *env, bugsnag_metadata *dst, * references here. */ bsg_jni_cache *bsg_populate_jni_cache(JNIEnv *env) { - bsg_jni_cache *jni_cache = malloc(sizeof(bsg_jni_cache)); + bsg_jni_cache *jni_cache = calloc(1, sizeof(bsg_jni_cache)); // lookup java/lang/Integer jni_cache->integer = bsg_safe_find_class(env, "java/lang/Integer"); 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 92a9d7200f..505cc1ac90 100644 --- a/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c @@ -70,7 +70,7 @@ bugsnag_event *bsg_deserialize_event_from_file(char *filepath) { bugsnag_report_v1 *bsg_report_v1_read(int fd) { size_t event_size = sizeof(bugsnag_report_v1); - bugsnag_report_v1 *event = malloc(event_size); + bugsnag_report_v1 *event = calloc(1, event_size); ssize_t len = read(fd, event, event_size); if (len != event_size) { @@ -82,7 +82,7 @@ bugsnag_report_v1 *bsg_report_v1_read(int fd) { bugsnag_report_v2 *bsg_report_v2_read(int fd) { size_t event_size = sizeof(bugsnag_report_v2); - bugsnag_report_v2 *event = malloc(event_size); + bugsnag_report_v2 *event = calloc(1, event_size); ssize_t len = read(fd, event, event_size); if (len != event_size) { @@ -94,7 +94,7 @@ bugsnag_report_v2 *bsg_report_v2_read(int fd) { bugsnag_report_v3 *bsg_report_v3_read(int fd) { size_t event_size = sizeof(bugsnag_report_v3); - bugsnag_report_v3 *event = malloc(event_size); + bugsnag_report_v3 *event = calloc(1, event_size); ssize_t len = read(fd, event, event_size); if (len != event_size) { @@ -106,7 +106,7 @@ bugsnag_report_v3 *bsg_report_v3_read(int fd) { bugsnag_report_v4 *bsg_report_v4_read(int fd) { size_t event_size = sizeof(bugsnag_report_v4); - bugsnag_report_v4 *event = malloc(event_size); + bugsnag_report_v4 *event = calloc(1, event_size); ssize_t len = read(fd, event, event_size); if (len != event_size) { @@ -118,7 +118,7 @@ bugsnag_report_v4 *bsg_report_v4_read(int fd) { bugsnag_event *bsg_report_v5_read(int fd) { size_t event_size = sizeof(bugsnag_event); - bugsnag_event *event = malloc(event_size); + bugsnag_event *event = calloc(1, event_size); ssize_t len = read(fd, event, event_size); if (len != event_size) { @@ -170,7 +170,7 @@ bugsnag_event *bsg_map_v4_to_report(bugsnag_report_v4 *report_v4) { if (report_v4 == NULL) { return NULL; } - bugsnag_event *event = malloc(sizeof(bugsnag_event)); + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); if (event != NULL) { event->notifier = report_v4->notifier; @@ -204,7 +204,7 @@ bugsnag_event *bsg_map_v3_to_report(bugsnag_report_v3 *report_v3) { if (report_v3 == NULL) { return NULL; } - bugsnag_report_v4 *event = malloc(sizeof(bugsnag_event)); + bugsnag_report_v4 *event = calloc(1, sizeof(bugsnag_event)); if (event != NULL) { event->notifier = report_v3->notifier; @@ -236,7 +236,7 @@ bugsnag_event *bsg_map_v2_to_report(bugsnag_report_v2 *report_v2) { if (report_v2 == NULL) { return NULL; } - bugsnag_report_v3 *event = malloc(sizeof(bugsnag_report_v3)); + bugsnag_report_v3 *event = calloc(1, sizeof(bugsnag_report_v3)); if (event != NULL) { // assign metadata first as old app/device fields are migrated there @@ -317,7 +317,7 @@ void migrate_breadcrumb_v1(bugsnag_report_v2 *report_v2, int crumb_index = bsg_calculate_v1_crumb_index(k, report_v2->crumb_first_index); bugsnag_breadcrumb_v1 *old_crumb = &report_v2->breadcrumbs[crumb_index]; - bugsnag_breadcrumb *new_crumb = malloc(sizeof(bugsnag_breadcrumb)); + bugsnag_breadcrumb *new_crumb = calloc(1, sizeof(bugsnag_breadcrumb)); // copy old crumb fields to new new_crumb->type = old_crumb->type; @@ -439,7 +439,7 @@ bugsnag_event *bsg_map_v1_to_report(bugsnag_report_v1 *report_v1) { return NULL; } size_t report_size = sizeof(bugsnag_report_v2); - bugsnag_report_v2 *event_v2 = malloc(report_size); + bugsnag_report_v2 *event_v2 = calloc(1, report_size); if (event_v2 != NULL) { event_v2->notifier = report_v1->notifier; @@ -468,7 +468,7 @@ bugsnag_event *bsg_map_v1_to_report(bugsnag_report_v1 *report_v1) { } bsg_report_header *bsg_report_header_read(int fd) { - bsg_report_header *header = malloc(sizeof(bsg_report_header)); + bsg_report_header *header = calloc(1, sizeof(bsg_report_header)); ssize_t len = read(fd, header, sizeof(bsg_report_header)); if (len != sizeof(bsg_report_header)) { free(header); @@ -619,7 +619,7 @@ void bsg_serialize_device_metadata(const bsg_device_info device, void bsg_serialize_custom_metadata(const bugsnag_metadata metadata, JSON_Object *event_obj) { for (int i = 0; i < metadata.value_count; i++) { - char *format = malloc(sizeof(char) * 256); + char *format = calloc(1, sizeof(char) * 256); bsg_metadata_value value = metadata.values[i]; switch (value.type) { @@ -645,7 +645,7 @@ void bsg_serialize_custom_metadata(const bugsnag_metadata metadata, void bsg_serialize_breadcrumb_metadata(const bugsnag_metadata metadata, JSON_Object *event_obj) { for (int i = 0; i < metadata.value_count; i++) { - char *format = malloc(sizeof(char) * 256); + char *format = calloc(1, sizeof(char) * 256); bsg_metadata_value value = metadata.values[i]; switch (value.type) { @@ -712,7 +712,7 @@ void bsg_serialize_stackframe(bugsnag_stackframe *stackframe, json_object_set_string(frame, "file", (*stackframe).filename); } if (strlen((*stackframe).method) == 0) { - char *frame_address = malloc(sizeof(char) * 32); + char *frame_address = calloc(1, sizeof(char) * 32); sprintf(frame_address, "0x%lx", (unsigned long)(*stackframe).frame_address); json_object_set_string(frame, "method", frame_address); free(frame_address); From 2bf7eb8e7b189c262069c41bbaa4de21a067cb82 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Wed, 14 Jul 2021 12:34:51 +0100 Subject: [PATCH 02/11] test: fix crash in NDK breadcrumb test by using memset to reset test data --- .../ndk/BreadcrumbStateSerializationTest.kt | 20 ++++-------- .../com/bugsnag/android/ndk/ResourceUtils.kt | 12 +++++-- ..._0.json => breadcrumbs_serialization.json} | 0 .../src/test/cpp/main.c | 32 +++++++------------ .../src/test/cpp/test_serializer.c | 11 ++++--- .../src/test/cpp/test_serializer.h | 2 +- 6 files changed, 34 insertions(+), 43 deletions(-) rename bugsnag-plugin-android-ndk/src/androidTest/resources/{breadcrumbs_serialization_0.json => breadcrumbs_serialization.json} (100%) diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbStateSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbStateSerializationTest.kt index ad6ee448ad..2612e337aa 100644 --- a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbStateSerializationTest.kt +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbStateSerializationTest.kt @@ -1,10 +1,8 @@ package com.bugsnag.android.ndk +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized -@RunWith(Parameterized::class) internal class BreadcrumbStateSerializationTest { companion object { @@ -12,20 +10,14 @@ internal class BreadcrumbStateSerializationTest { System.loadLibrary("bugsnag-ndk") System.loadLibrary("bugsnag-ndk-test") } - - @JvmStatic - @Parameterized.Parameters - fun testCases() = 0..0 } - external fun run(testCase: Int, expectedJson: String): Int - - @Parameterized.Parameter - lateinit var testCase: Number + external fun serializeBreadcrumbs(): String @Test - fun testPassesNativeSuite() { - val expectedJson = loadJson("breadcrumbs_serialization_$testCase.json") - verifyNativeRun(run(testCase.toInt(), expectedJson)) + fun testBreadcrumbSerialization() { + val expected = loadJson("breadcrumbs_serialization.json") + val json = serializeBreadcrumbs() + assertEquals(expected, json) } } 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 index 5438014243..436c340313 100644 --- 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 @@ -1,4 +1,12 @@ package com.bugsnag.android.ndk -internal fun loadJson(resourceName: String) = - NativeCXXTest::class.java.classLoader!!.getResource(resourceName).readText() +internal fun loadJson(resourceName: String): String { + val classLoader = requireNotNull(NativeCXXTest::class.java.classLoader) + val resource = classLoader.getResource(resourceName) + ?: throw IllegalArgumentException("Could not find $resourceName") + val json = resource.readText() + if (json.isEmpty()) { + throw IllegalStateException("Failed to read JSON from $resourceName") + } + return json +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/breadcrumbs_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/breadcrumbs_serialization.json similarity index 100% rename from bugsnag-plugin-android-ndk/src/androidTest/resources/breadcrumbs_serialization_0.json rename to bugsnag-plugin-android-ndk/src/androidTest/resources/breadcrumbs_serialization.json diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index d5cdd6c393..941f83cd90 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -213,27 +213,17 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_SessionSerializationTest_run( GREATEST_MAIN_END(); } -TEST test_breadcrumbs_serialization(test_case *test_case) { - JSON_Value *event_val = json_value_init_array(); - JSON_Array *event_ary = json_value_get_array(event_val); - bugsnag_event *event = test_case->data_ptr; - bsg_serialize_breadcrumbs(event, event_ary); - free(event); - return validate_serialized_json(test_case, event_val); -} - -JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_BreadcrumbStateSerializationTest_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(); +JNIEXPORT jstring JNICALL +Java_com_bugsnag_android_ndk_BreadcrumbStateSerializationTest_serializeBreadcrumbs(JNIEnv *env, + jobject thiz) { + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); + memset(event, 0, sizeof(bugsnag_event)); + loadBreadcrumbsTestCase(event); + JSON_Value *eventVal = json_value_init_array(); + JSON_Array *eventAry = json_value_get_array(eventVal); + bsg_serialize_breadcrumbs(event, eventAry); + char *string = json_serialize_to_string(eventVal); + return (*env)->NewStringUTF(env, string); } TEST test_stackframe_serialization(test_case *test_case) { 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 951968bc27..eb0097a2c7 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -124,15 +124,16 @@ bugsnag_event * loadSessionTestCase(jint num) { return data; } -bugsnag_event * loadBreadcrumbsTestCase(jint num) { - bugsnag_event *event = malloc(sizeof(bugsnag_event)); - - // ensure that serialization loop is covered by test +bugsnag_event *loadBreadcrumbsTestCase(bugsnag_event *event) { + bugsnag_breadcrumb *crumb = malloc(sizeof(bugsnag_breadcrumb)); + memset(crumb, 0, sizeof(bugsnag_breadcrumb)); event->crumb_count = 4; event->crumb_first_index = BUGSNAG_CRUMBS_MAX - 2; + // ensure that serialization loop is covered by test + // first breadcrumb - bugsnag_breadcrumb *crumb = &event->breadcrumbs[BUGSNAG_CRUMBS_MAX - 2]; + crumb = &event->breadcrumbs[BUGSNAG_CRUMBS_MAX - 2]; crumb->type = BSG_CRUMB_USER; strcpy(crumb->name, "Jane"); strcpy(crumb->timestamp, "2018-10-08T12:07:09Z"); 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 4f29f6796e..d0d276f59a 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -20,6 +20,6 @@ bugsnag_metadata * loadCustomMetadataTestCase(jint num); bugsnag_event * loadContextTestCase(jint num); bugsnag_event * loadSeverityReasonTestCase(jint num); bugsnag_event * loadSessionTestCase(jint num); -bugsnag_event * loadBreadcrumbsTestCase(jint num); +bugsnag_event *loadBreadcrumbsTestCase(bugsnag_event *event); bugsnag_stackframe * loadStackframeTestCase(jint num); bsg_error * loadExceptionTestCase(jint num); From 5b2d60c57bef27fdf483a02128db71ef7fba8165 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Wed, 14 Jul 2021 14:09:49 +0100 Subject: [PATCH 03/11] test: use calloc rather than malloc in test code --- .../src/test/cpp/main.c | 20 ++++++++--------- .../src/test/cpp/test_breadcrumbs.c | 2 +- .../src/test/cpp/test_serializer.c | 22 +++++++++---------- .../src/test/cpp/test_utils_serialize.c | 20 ++++++++--------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index 941f83cd90..31b90355bc 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -42,7 +42,7 @@ 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 *test_case = calloc(1, sizeof(test_case)); test_case->data_ptr = loadUserTestCase(num); char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); @@ -65,7 +65,7 @@ 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 *test_case = calloc(1, sizeof(test_case)); test_case->data_ptr = loadAppTestCase(num); char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); @@ -88,7 +88,7 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_AppMetadataSerializationTest_ JNIEnv *_env, jobject _this, jint num, jstring expected_json) { int argc = 0; char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); + test_case *test_case = calloc(1, sizeof(test_case)); test_case->data_ptr = loadAppMetadataTestCase(num); char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); @@ -111,7 +111,7 @@ 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 *test_case = calloc(1, sizeof(test_case)); test_case->data_ptr = loadDeviceTestCase(num); char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); @@ -134,7 +134,7 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_CustomMetadataSerializationTe JNIEnv *_env, jobject _this, jint num, jstring expected_json) { int argc = 0; char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); + test_case *test_case = calloc(1, sizeof(test_case)); test_case->data_ptr = loadCustomMetadataTestCase(num); char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); @@ -157,7 +157,7 @@ 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 *test_case = calloc(1, sizeof(test_case)); test_case->data_ptr = loadContextTestCase(num); char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); @@ -180,7 +180,7 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_SeverityReasonSerializationTe JNIEnv *_env, jobject _this, jint num, jstring expected_json) { int argc = 0; char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); + test_case *test_case = calloc(1, sizeof(test_case)); test_case->data_ptr = loadSeverityReasonTestCase(num); char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); @@ -203,7 +203,7 @@ 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 *test_case = calloc(1, sizeof(test_case)); test_case->data_ptr = loadSessionTestCase(num); char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); @@ -239,7 +239,7 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_StackframeSerializationTest_r JNIEnv *_env, jobject _this, jint num, jstring expected_json) { int argc = 0; char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); + test_case *test_case = calloc(1, sizeof(test_case)); test_case->data_ptr = loadStackframeTestCase(num); char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); @@ -266,7 +266,7 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_ExceptionSerializationTest_ru JNIEnv *_env, jobject _this, jint num, jstring expected_json) { int argc = 0; char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); + test_case *test_case = calloc(1, sizeof(test_case)); test_case->data_ptr = loadExceptionTestCase(num); char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c index 6553ab9228..30f3af082c 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c @@ -43,7 +43,7 @@ TEST test_add_breadcrumbs_over_max(void) { int breadcrumb_count = 64; for (int i=0; i < breadcrumb_count; i++) { - char *format = malloc(sizeof(char) * breadcrumb_count); + char *format = calloc(1, sizeof(char) * breadcrumb_count); memset(format, 0, sizeof(char) * breadcrumb_count); sprintf(format, "crumb: %d", i); bugsnag_breadcrumb *crumb = init_breadcrumb(format, "go go go", BSG_CRUMB_USER); 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 eb0097a2c7..c4f7a3a46d 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -17,12 +17,12 @@ bugsnag_user * loadUserTestCase(jint num) { bugsnag_user *user; if (num == 0) { - user = malloc(sizeof(bugsnag_user)); + user = calloc(1, sizeof(bugsnag_user)); strcpy(user->name, "Fenton"); strcpy(user->email, "fenton@io.example.com"); strcpy(user->id, "1234"); } else { - user = malloc(sizeof(bugsnag_user)); + user = calloc(1, sizeof(bugsnag_user)); strcpy(user->name, "Jamie"); strcpy(user->email, "jamie@bugsnag.com"); strcpy(user->id, "456"); @@ -31,7 +31,7 @@ bugsnag_user * loadUserTestCase(jint num) { } bsg_app_info * loadAppTestCase(jint num) { - bsg_app_info *app = malloc(sizeof(bsg_app_info)); + bsg_app_info *app = calloc(1, sizeof(bsg_app_info)); strcpy(app->id, "com.bugsnag.example"); strcpy(app->release_stage, "prod"); strcpy(app->type, "android"); @@ -55,7 +55,7 @@ bsg_app_info * loadAppMetadataTestCase(jint num) { } bsg_device_info * loadDeviceTestCase(jint num) { - bsg_device_info *device = malloc(sizeof(bsg_device_info)); + bsg_device_info *device = calloc(1, sizeof(bsg_device_info)); device->api_level = 29; bsg_strncpy_safe(device->cpu_abi[0].value, "x86", sizeof(device->cpu_abi[0].value)); device->cpu_abi_count = 1; @@ -76,7 +76,7 @@ bsg_device_info * loadDeviceTestCase(jint num) { } bugsnag_metadata * loadCustomMetadataTestCase(jint num) { - bugsnag_metadata *data = malloc(sizeof(bugsnag_metadata)); + bugsnag_metadata *data = calloc(1, sizeof(bugsnag_metadata)); data->value_count = 4; data->values[0].type = BSG_METADATA_CHAR_VALUE; @@ -101,14 +101,14 @@ bugsnag_metadata * loadCustomMetadataTestCase(jint num) { } bugsnag_event * loadContextTestCase(jint num) { - bugsnag_event *data = malloc(sizeof(bugsnag_event)); + bugsnag_event *data = calloc(1, sizeof(bugsnag_event)); strcpy(data->context, "CustomContext"); strcpy(data->app.active_screen, "ExampleActivity"); return data; } bugsnag_event * loadSeverityReasonTestCase(jint num) { - bugsnag_event *data = malloc(sizeof(bugsnag_event)); + bugsnag_event *data = calloc(1, sizeof(bugsnag_event)); data->unhandled = true; data->severity = BSG_SEVERITY_ERR; strcpy(data->error.errorClass, "SIGABRT"); @@ -116,7 +116,7 @@ bugsnag_event * loadSeverityReasonTestCase(jint num) { } bugsnag_event * loadSessionTestCase(jint num) { - bugsnag_event *data = malloc(sizeof(bugsnag_event)); + bugsnag_event *data = calloc(1, sizeof(bugsnag_event)); strcpy(data->session_id, "123"); strcpy(data->session_start, "2018-10-08T12:07:09Z"); data->handled_events = 2; @@ -125,7 +125,7 @@ bugsnag_event * loadSessionTestCase(jint num) { } bugsnag_event *loadBreadcrumbsTestCase(bugsnag_event *event) { - bugsnag_breadcrumb *crumb = malloc(sizeof(bugsnag_breadcrumb)); + bugsnag_breadcrumb *crumb = calloc(1, sizeof(bugsnag_breadcrumb)); memset(crumb, 0, sizeof(bugsnag_breadcrumb)); event->crumb_count = 4; event->crumb_first_index = BUGSNAG_CRUMBS_MAX - 2; @@ -188,7 +188,7 @@ bugsnag_event *loadBreadcrumbsTestCase(bugsnag_event *event) { } bugsnag_stackframe * loadStackframeTestCase(jint num) { - bugsnag_stackframe *data = malloc(sizeof(bugsnag_stackframe)); + bugsnag_stackframe *data = calloc(1, sizeof(bugsnag_stackframe)); data->frame_address = 0x20000000; data->symbol_address = 0x16000000; data->load_address = 0x12000000; @@ -199,7 +199,7 @@ bugsnag_stackframe * loadStackframeTestCase(jint num) { } bsg_error * loadExceptionTestCase(jint num) { - bsg_error *data = malloc(sizeof(bsg_error)); + bsg_error *data = calloc(1, sizeof(bsg_error)); strcpy(data->errorClass, "signal"); strcpy(data->errorMessage, "whoops something went wrong"); strcpy(data->type, "c"); 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 9c5a72b432..d67715a14c 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 @@ -192,13 +192,13 @@ void bsg_update_next_run_info(bsg_environment *env); char *test_read_last_run_info(const bsg_environment *env) { int fd = open(SERIALIZE_TEST_FILE, O_RDONLY); size_t size = sizeof(env->next_last_run_info); - char *buf = malloc(size); + char *buf = calloc(1, size); read(fd, buf, size); return buf; } test_last_run_info_serialization(void) { - bsg_environment *env = malloc(sizeof(bsg_environment)); + bsg_environment *env = calloc(1, sizeof(bsg_environment)); strcpy(env->last_run_info_path, SERIALIZE_TEST_FILE); // update LastRunInfo with defaults @@ -218,7 +218,7 @@ test_last_run_info_serialization(void) { } TEST test_report_to_file(void) { - bsg_environment *env = malloc(sizeof(bsg_environment)); + bsg_environment *env = calloc(1, sizeof(bsg_environment)); env->report_header.version = 7; env->report_header.big_endian = 1; bugsnag_event *report = bsg_generate_event(); @@ -232,7 +232,7 @@ TEST test_report_to_file(void) { } TEST test_file_to_report(void) { - bsg_environment *env = malloc(sizeof(bsg_environment)); + bsg_environment *env = calloc(1, sizeof(bsg_environment)); env->report_header.version = 5; env->report_header.big_endian = 1; strcpy(env->report_header.os_build, "macOS Sierra"); @@ -252,7 +252,7 @@ TEST test_file_to_report(void) { } TEST test_report_v1_migration(void) { - bsg_environment *env = malloc(sizeof(bsg_environment)); + bsg_environment *env = calloc(1, sizeof(bsg_environment)); env->report_header.version = 1; env->report_header.big_endian = 1; strcpy(env->report_header.os_build, "macOS Sierra"); @@ -276,7 +276,7 @@ TEST test_report_v1_migration(void) { } TEST test_report_v2_migration(void) { - bsg_environment *env = malloc(sizeof(bsg_environment)); + bsg_environment *env = calloc(1, sizeof(bsg_environment)); bugsnag_report_v2 *generated_report = bsg_generate_report_v2(); memcpy(&env->next_event, generated_report, sizeof(bugsnag_report_v2)); @@ -330,7 +330,7 @@ TEST test_report_v2_migration(void) { } TEST test_report_v3_migration(void) { - bsg_environment *env = malloc(sizeof(bsg_environment)); + bsg_environment *env = calloc(1, sizeof(bsg_environment)); env->report_header.version = 3; env->report_header.big_endian = 1; strcpy(env->report_header.os_build, "macOS Sierra"); @@ -362,7 +362,7 @@ TEST test_report_v3_migration(void) { } TEST test_report_v4_migration(void) { - bsg_environment *env = malloc(sizeof(bsg_environment)); + bsg_environment *env = calloc(1, sizeof(bsg_environment)); env->report_header.version = 4; env->report_header.big_endian = 1; strcpy(env->report_header.os_build, "macOS Sierra"); @@ -518,8 +518,8 @@ TEST test_breadcrumbs_to_json(void) { void migrate_app_v2(bugsnag_report_v4 *report_v4, bugsnag_event *event); TEST test_migrate_app_v2(void) { - bugsnag_report_v4 *report_v4 = malloc(sizeof(bugsnag_report_v4)); - bugsnag_event *event = malloc(sizeof(bugsnag_event)); + bugsnag_report_v4 *report_v4 = calloc(1, sizeof(bugsnag_report_v4)); + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); bsg_app_info_v2 *seed = &report_v4->app; bsg_app_info *app = &event->app; From 95fdf3be2aa1f441af6c8bb6edaebf17f87fac98 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Wed, 14 Jul 2021 15:16:35 +0100 Subject: [PATCH 04/11] test: reorganize native test cases into smaller suites --- .../android/ndk/NativeBreadcrumbTest.kt | 20 +++++ .../bugsnag/android/ndk/NativeCXXTest.java | 20 ----- .../android/ndk/NativeEventAppMutatorsTest.kt | 20 +++++ .../ndk/NativeEventDeviceMutatorsTest.kt | 20 +++++ .../android/ndk/NativeEventMutatorsTest.kt | 20 +++++ .../android/ndk/NativeJsonSerializeTest.kt | 20 +++++ .../bugsnag/android/ndk/NativeStringTest.kt | 20 +++++ .../android/ndk/NativeStructMigrationTest.kt | 20 +++++ .../android/ndk/NativeStructToFileTest.kt | 20 +++++ .../com/bugsnag/android/ndk/ResourceUtils.kt | 2 +- .../com/bugsnag/android/ndk/VerifyUtils.kt | 3 +- .../src/test/cpp/main.c | 80 ++++++++++++++++--- .../src/test/cpp/test_breadcrumbs.c | 2 +- .../src/test/cpp/test_bsg_event.c | 18 +++-- .../src/test/cpp/test_utils_serialize.c | 22 +++-- .../src/test/cpp/test_utils_string.c | 3 +- 16 files changed, 261 insertions(+), 49 deletions(-) create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeBreadcrumbTest.kt delete mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventAppMutatorsTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventDeviceMutatorsTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventMutatorsTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeJsonSerializeTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStringTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStructMigrationTest.kt create mode 100644 bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStructToFileTest.kt diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeBreadcrumbTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeBreadcrumbTest.kt new file mode 100644 index 0000000000..d24b79f012 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeBreadcrumbTest.kt @@ -0,0 +1,20 @@ +package com.bugsnag.android.ndk + +import org.junit.Test + +class NativeBreadcrumbTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + } + + external fun run(): Int + + @Test + fun testPassesNativeSuite() { + verifyNativeRun(run()) + } +} 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 deleted file mode 100644 index 93aef746bd..0000000000 --- a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.bugsnag.android.ndk; - -import static com.bugsnag.android.ndk.VerifyUtilsKt.verifyNativeRun; - -import org.junit.Test; - -public class NativeCXXTest { - - static { - System.loadLibrary("bugsnag-ndk"); - System.loadLibrary("bugsnag-ndk-test"); - } - - public native int run(); - - @Test - public void testPassesNativeSuite() throws Exception { - verifyNativeRun(run()); - } -} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventAppMutatorsTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventAppMutatorsTest.kt new file mode 100644 index 0000000000..4b5f17149c --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventAppMutatorsTest.kt @@ -0,0 +1,20 @@ +package com.bugsnag.android.ndk + +import org.junit.Test + +class NativeEventAppMutatorsTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + } + + external fun run(): Int + + @Test + fun testPassesNativeSuite() { + verifyNativeRun(run()) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventDeviceMutatorsTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventDeviceMutatorsTest.kt new file mode 100644 index 0000000000..7c8a927658 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventDeviceMutatorsTest.kt @@ -0,0 +1,20 @@ +package com.bugsnag.android.ndk + +import org.junit.Test + +class NativeEventDeviceMutatorsTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + } + + external fun run(): Int + + @Test + fun testPassesNativeSuite() { + verifyNativeRun(run()) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventMutatorsTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventMutatorsTest.kt new file mode 100644 index 0000000000..c5566cfee7 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeEventMutatorsTest.kt @@ -0,0 +1,20 @@ +package com.bugsnag.android.ndk + +import org.junit.Test + +class NativeEventMutatorsTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + } + + external fun run(): Int + + @Test + fun testPassesNativeSuite() { + verifyNativeRun(run()) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeJsonSerializeTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeJsonSerializeTest.kt new file mode 100644 index 0000000000..652db32832 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeJsonSerializeTest.kt @@ -0,0 +1,20 @@ +package com.bugsnag.android.ndk + +import org.junit.Test + +class NativeJsonSerializeTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + } + + external fun run(): Int + + @Test + fun testPassesNativeSuite() { + verifyNativeRun(run()) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStringTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStringTest.kt new file mode 100644 index 0000000000..1fae09e833 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStringTest.kt @@ -0,0 +1,20 @@ +package com.bugsnag.android.ndk + +import org.junit.Test + +class NativeStringTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + } + + external fun run(): Int + + @Test + fun testPassesNativeSuite() { + verifyNativeRun(run()) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStructMigrationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStructMigrationTest.kt new file mode 100644 index 0000000000..3cb06500da --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStructMigrationTest.kt @@ -0,0 +1,20 @@ +package com.bugsnag.android.ndk + +import org.junit.Test + +class NativeStructMigrationTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + } + + external fun run(): Int + + @Test + fun testPassesNativeSuite() { + verifyNativeRun(run()) + } +} diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStructToFileTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStructToFileTest.kt new file mode 100644 index 0000000000..d2fe5fdfa7 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeStructToFileTest.kt @@ -0,0 +1,20 @@ +package com.bugsnag.android.ndk + +import org.junit.Test + +class NativeStructToFileTest { + + companion object { + init { + System.loadLibrary("bugsnag-ndk") + System.loadLibrary("bugsnag-ndk-test") + } + } + + external fun run(): Int + + @Test + fun testPassesNativeSuite() { + 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 index 436c340313..bda30e8e86 100644 --- 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 @@ -1,7 +1,7 @@ package com.bugsnag.android.ndk internal fun loadJson(resourceName: String): String { - val classLoader = requireNotNull(NativeCXXTest::class.java.classLoader) + val classLoader = requireNotNull(NativeJsonSerializeTest::class.java.classLoader) val resource = classLoader.getResource(resourceName) ?: throw IllegalArgumentException("Could not find $resourceName") val json = resource.readText() 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 index bffb938ccb..43eca873be 100644 --- 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 @@ -4,7 +4,8 @@ import java.lang.IllegalStateException internal fun verifyNativeRun(code: Int): Boolean { if (code != 0) { - throw IllegalStateException("Native tests failed. Check device logs for results.") + throw IllegalStateException("Native test suite failed." + + " Filter the device logs by 'BugsnagNDKTest' to get the results.") } else { return true } diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index 31b90355bc..ec8ff7be0e 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -10,25 +10,85 @@ #include #include "test_serializer.h" -SUITE(string_utils); -SUITE(serialize_utils); -SUITE(breadcrumbs); -SUITE(event_mutators); +SUITE(suite_string_utils); +SUITE(suite_json_serialization); +SUITE(suite_breadcrumbs); +SUITE(suite_event_mutators); +SUITE(suite_event_app_mutators); +SUITE(suite_event_device_mutators); +SUITE(suite_struct_to_file); +SUITE(suite_struct_migration); GREATEST_MAIN_DEFS(); -JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeCXXTest_run( - JNIEnv *_env, jobject _this) { +/** + * Runs a test suite using greatest. + * + * @param a pointer to the test_suite function + * @return the exit code of the test suite + */ +int run_test_suite(void (*test_suite)(void)) { + int argc = 0; + char *argv[] = {}; + GREATEST_MAIN_BEGIN(); + RUN_SUITE(test_suite); + GREATEST_MAIN_END(); +} + +/** + * Runs a test using greatest. + * + * @param a pointer to the test_suite function + * @return the exit code of the test suite + */ +int run_test(enum greatest_test_res (*test)(void)) { int argc = 0; char *argv[] = {}; GREATEST_MAIN_BEGIN(); - RUN_SUITE(string_utils); - RUN_SUITE(serialize_utils); - RUN_SUITE(breadcrumbs); - RUN_SUITE(event_mutators); + RUN_TEST(test); GREATEST_MAIN_END(); } +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeStringTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_string_utils); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeJsonSerializeTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_json_serialization); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeStructToFileTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_struct_to_file); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeStructMigrationTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_struct_migration); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeBreadcrumbTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_breadcrumbs); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeEventMutatorsTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_event_mutators); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeEventAppMutatorsTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_event_app_mutators); +} + +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeEventDeviceMutatorsTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_event_device_mutators); +} + 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); diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c index 30f3af082c..4cfb584fe5 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c @@ -113,7 +113,7 @@ TEST test_bsg_calculate_crumb_index(void) { PASS(); } -SUITE(breadcrumbs) { +SUITE(suite_breadcrumbs) { RUN_TEST(test_add_breadcrumb); RUN_TEST(test_add_breadcrumbs_over_max); RUN_TEST(test_bsg_calculate_total_crumbs); diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_bsg_event.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_bsg_event.c index a6d17b4e02..776cd57a8c 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_bsg_event.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_bsg_event.c @@ -386,13 +386,21 @@ TEST test_event_stacktrace(void) { PASS(); } -SUITE(event_mutators) { +SUITE(suite_event_mutators) { RUN_TEST(test_event_api_key); RUN_TEST(test_event_context); RUN_TEST(test_event_severity); RUN_TEST(test_event_unhandled); RUN_TEST(test_event_user); RUN_TEST(test_event_grouping_hash); + RUN_TEST(test_error_class); + RUN_TEST(test_error_message); + RUN_TEST(test_error_type); + RUN_TEST(test_event_metadata); + RUN_TEST(test_event_stacktrace); +} + +SUITE(suite_event_app_mutators) { RUN_TEST(test_app_binary_arch); RUN_TEST(test_app_build_uuid); RUN_TEST(test_app_id); @@ -404,6 +412,9 @@ SUITE(event_mutators) { RUN_TEST(test_app_duration_in_foreground); RUN_TEST(test_app_in_foreground); RUN_TEST(test_app_is_launching); +} + +SUITE(suite_event_device_mutators) { RUN_TEST(test_device_jailbroken); RUN_TEST(test_device_id); RUN_TEST(test_device_locale); @@ -414,9 +425,4 @@ SUITE(event_mutators) { RUN_TEST(test_device_orientation); RUN_TEST(test_device_time); RUN_TEST(test_device_os_name); - RUN_TEST(test_error_class); - RUN_TEST(test_error_message); - RUN_TEST(test_error_type); - RUN_TEST(test_event_metadata); - RUN_TEST(test_event_stacktrace); } 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 d67715a14c..e6b0e6975f 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 @@ -211,7 +211,7 @@ test_last_run_info_serialization(void) { env->next_event.app.is_launching = true; env->consecutive_launch_crashes = 7; bsg_update_next_run_info(env); - ASSERT_STR_EQ("consecutiveLaunchCrashes=7\ncrashed=true\ncrashedDuringLaunch=true\0", env->next_last_run_info); + ASSERT_STR_EQ("consecutiveLaunchCrashes=8\ncrashed=true\ncrashedDuringLaunch=true\0", env->next_last_run_info); free(env); PASS(); @@ -553,14 +553,8 @@ TEST test_migrate_app_v2(void) { PASS(); } -SUITE(serialize_utils) { - RUN_TEST(test_report_to_file); +SUITE(suite_json_serialization) { RUN_TEST(test_last_run_info_serialization); - RUN_TEST(test_file_to_report); - RUN_TEST(test_report_v1_migration); - RUN_TEST(test_report_v2_migration); - RUN_TEST(test_report_v3_migration); - RUN_TEST(test_report_v4_migration); RUN_TEST(test_session_handled_counts); RUN_TEST(test_context_to_json); RUN_TEST(test_grouping_hash_to_json); @@ -570,5 +564,17 @@ SUITE(serialize_utils) { RUN_TEST(test_custom_info_to_json); RUN_TEST(test_exception_to_json); RUN_TEST(test_breadcrumbs_to_json); +} + +SUITE(suite_struct_to_file) { + RUN_TEST(test_report_to_file); + RUN_TEST(test_file_to_report); +} + +SUITE(suite_struct_migration) { + RUN_TEST(test_report_v1_migration); + RUN_TEST(test_report_v2_migration); + RUN_TEST(test_report_v3_migration); + RUN_TEST(test_report_v4_migration); RUN_TEST(test_migrate_app_v2); } diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_utils_string.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_utils_string.c index a309773eb8..ce41e67237 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_utils_string.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_utils_string.c @@ -40,8 +40,7 @@ TEST length_empty_string(void) { PASS(); } - -SUITE(string_utils) { +SUITE(suite_string_utils) { RUN_TEST(test_copy_empty_string); RUN_TEST(test_copy_literal_string); RUN_TEST(length_empty_string); From 6b09dc7100fe2ff4f72eafa1169b654da4703e35 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Wed, 14 Jul 2021 16:10:16 +0100 Subject: [PATCH 05/11] test: avoid segfaults in struct migration setup --- .../src/test/cpp/test_utils_serialize.c | 203 ++++++++++++++++-- 1 file changed, 180 insertions(+), 23 deletions(-) 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 e6b0e6975f..60b7bfecbe 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 @@ -126,49 +126,161 @@ void generate_basic_report(bugsnag_event *event) { } bugsnag_report_v4 *bsg_generate_report_v4(void) { - bugsnag_report_v4 *report = calloc(1, sizeof(bugsnag_report_v4)); - generate_basic_report((bugsnag_event *) report); - return report; + bugsnag_report_v4 *event = calloc(1, sizeof(bugsnag_report_v4)); + strcpy(event->grouping_hash, "foo-hash"); + strcpy(event->api_key, "5d1e5fbd39a74caa1200142706a90b20"); + strcpy(event->context, "SomeActivity"); + strcpy(event->error.errorClass, "SIGBUS"); + strcpy(event->error.errorMessage, "POSIX is serious about oncoming traffic"); + event->error.stacktrace[0].frame_address = 454379; + event->error.stacktrace[1].frame_address = 342334; + event->error.frame_count = 2; + strcpy(event->error.type, "C"); + strcpy(event->error.stacktrace[0].method, "makinBacon"); + strcpy(event->app.id, "com.example.PhotoSnapPlus"); + strcpy(event->app.release_stage, "リリース"); + strcpy(event->app.version, "2.0.52"); + event->app.version_code = 57; + strcpy(event->app.build_uuid, "1234-9876-adfe"); + strcpy(event->device.manufacturer, "HI-TEC™"); + strcpy(event->device.model, "Rasseur"); + strcpy(event->device.locale, "en_AU#Melbun"); + strcpy(event->device.os_name, "android"); + strcpy(event->user.email, "fenton@io.example.com"); + strcpy(event->user.id, "fex"); + event->device.total_memory = 234678100; + event->app.duration = 6502; + bugsnag_event_add_metadata_bool(event, "metrics", "experimentX", false); + bugsnag_event_add_metadata_string(event, "metrics", "subject", "percy"); + bugsnag_event_add_metadata_string(event, "app", "weather", "rain"); + bugsnag_event_add_metadata_double(event, "metrics", "counter", 47.8); + + bugsnag_breadcrumb *crumb1 = init_breadcrumb("decrease torque", "Moving laterally 26º", + BSG_CRUMB_STATE); + bugsnag_breadcrumb *crumb2 = init_breadcrumb("enable blasters", "this is a drill.", + BSG_CRUMB_USER); + memcpy(&event->breadcrumbs[0], crumb1, sizeof(bugsnag_breadcrumb)); + memcpy(&event->breadcrumbs[1], crumb2, sizeof(bugsnag_breadcrumb)); + event->crumb_count = 2; + event->crumb_first_index = 0; + + event->handled_events = 1; + event->unhandled_events = 1; + strcpy(event->session_id, "f1ab"); + strcpy(event->session_start, "2019-03-19T12:58:19+00:00"); + + strcpy(event->notifier.version, "1.0"); + strcpy(event->notifier.url, "bugsnag.com"); + strcpy(event->notifier.name, "Test Notifier"); + return event; } bugsnag_report_v3 *bsg_generate_report_v3(void) { - bugsnag_report_v3 *report = calloc(1, sizeof(bugsnag_report_v3)); - generate_basic_report((bugsnag_event *) report); - return report; + bugsnag_report_v3 *event = calloc(1, sizeof(bugsnag_report_v3)); + strcpy(event->grouping_hash, "foo-hash"); + strcpy(event->context, "SomeActivity"); + strcpy(event->error.errorClass, "SIGBUS"); + strcpy(event->error.errorMessage, "POSIX is serious about oncoming traffic"); + event->error.stacktrace[0].frame_address = 454379; + event->error.stacktrace[1].frame_address = 342334; + event->error.frame_count = 2; + strcpy(event->error.type, "C"); + strcpy(event->error.stacktrace[0].method, "makinBacon"); + strcpy(event->app.id, "com.example.PhotoSnapPlus"); + strcpy(event->app.release_stage, "リリース"); + strcpy(event->app.version, "2.0.52"); + event->app.version_code = 57; + strcpy(event->app.build_uuid, "1234-9876-adfe"); + strcpy(event->device.manufacturer, "HI-TEC™"); + strcpy(event->device.model, "Rasseur"); + strcpy(event->device.locale, "en_AU#Melbun"); + strcpy(event->device.os_name, "android"); + strcpy(event->user.email, "fenton@io.example.com"); + strcpy(event->user.id, "fex"); + event->device.total_memory = 234678100; + event->app.duration = 6502; + bugsnag_event_add_metadata_bool(event, "metrics", "experimentX", false); + bugsnag_event_add_metadata_string(event, "metrics", "subject", "percy"); + bugsnag_event_add_metadata_string(event, "app", "weather", "rain"); + bugsnag_event_add_metadata_double(event, "metrics", "counter", 47.8); + + bugsnag_breadcrumb *crumb1 = init_breadcrumb("decrease torque", "Moving laterally 26º", + BSG_CRUMB_STATE); + bugsnag_breadcrumb *crumb2 = init_breadcrumb("enable blasters", "this is a drill.", + BSG_CRUMB_USER); + memcpy(&event->breadcrumbs[0], crumb1, sizeof(bugsnag_breadcrumb)); + memcpy(&event->breadcrumbs[1], crumb2, sizeof(bugsnag_breadcrumb)); + event->crumb_count = 2; + event->crumb_first_index = 0; + + event->handled_events = 1; + event->unhandled_events = 1; + strcpy(event->session_id, "f1ab"); + strcpy(event->session_start, "2019-03-19T12:58:19+00:00"); + + strcpy(event->notifier.version, "1.0"); + strcpy(event->notifier.url, "bugsnag.com"); + strcpy(event->notifier.name, "Test Notifier"); + return event; } bugsnag_report_v2 *bsg_generate_report_v2(void) { - bugsnag_report_v2 *report = calloc(1, sizeof(bugsnag_report_v2)); - generate_basic_report((bugsnag_event *) report); + bugsnag_report_v2 *event = calloc(1, sizeof(bugsnag_report_v2)); + strcpy(event->context, "SomeActivity"); + strcpy(event->app.id, "com.example.PhotoSnapPlus"); + strcpy(event->app.release_stage, "リリース"); + strcpy(event->app.version, "2.0.52"); + event->app.version_code = 57; + strcpy(event->app.build_uuid, "1234-9876-adfe"); + strcpy(event->device.manufacturer, "HI-TEC™"); + strcpy(event->device.model, "Rasseur"); + strcpy(event->device.locale, "en_AU#Melbun"); + strcpy(event->user.email, "fenton@io.example.com"); + strcpy(event->user.id, "fex"); + event->device.total_memory = 234678100; + event->app.duration = 6502; + bugsnag_event_add_metadata_bool(event, "metrics", "experimentX", false); + bugsnag_event_add_metadata_string(event, "metrics", "subject", "percy"); + bugsnag_event_add_metadata_string(event, "app", "weather", "rain"); + bugsnag_event_add_metadata_double(event, "metrics", "counter", 47.8); + + + event->handled_events = 1; + event->unhandled_events = 1; + strcpy(event->session_id, "f1ab"); + strcpy(event->session_start, "2019-03-19T12:58:19+00:00"); + + strcpy(event->notifier.version, "1.0"); + strcpy(event->notifier.url, "bugsnag.com"); + strcpy(event->notifier.name, "Test Notifier"); - strcpy(report->exception.name, "SIGBUS"); - strcpy(report->exception.message, "POSIX is serious about oncoming traffic"); - report->exception.stacktrace[0].frame_address = 454379; - report->exception.frame_count = 1; - strcpy(report->exception.type, "C"); - strcpy(report->exception.stacktrace[0].method, "makinBacon"); + strcpy(event->exception.name, "SIGBUS"); + strcpy(event->exception.message, "POSIX is serious about oncoming traffic"); + event->exception.stacktrace[0].frame_address = 454379; + event->exception.frame_count = 1; + strcpy(event->exception.type, "C"); + strcpy(event->exception.stacktrace[0].method, "makinBacon"); - strcpy(report->app.package_name, "com.example.foo"); - strcpy(report->app.version_name, "2.5"); + strcpy(event->app.package_name, "com.example.foo"); + strcpy(event->app.version_name, "2.5"); - bugsnag_breadcrumb_v1 *crumb1 = &report->breadcrumbs[0]; + bugsnag_breadcrumb_v1 *crumb1 = &event->breadcrumbs[0]; crumb1->type = BSG_CRUMB_STATE; strcpy(crumb1->timestamp, "2018-08-29T21:41:39Z"); strcpy(crumb1->name, "decrease torque"); strcpy(crumb1->metadata[0].key, "message"); strcpy(crumb1->metadata[0].value, "Moving laterally 26º"); - bugsnag_breadcrumb_v1 *crumb2 = &report->breadcrumbs[1]; + bugsnag_breadcrumb_v1 *crumb2 = &event->breadcrumbs[1]; crumb2->type = BSG_CRUMB_USER; strcpy(crumb2->timestamp, "2018-08-29T21:41:39Z"); strcpy(crumb2->name, "enable blasters"); strcpy(crumb2->metadata[0].key, "message"); strcpy(crumb2->metadata[0].value, "this is a drill."); - report->crumb_first_index = 0; - report->crumb_count = 2; - - return report; + event->crumb_first_index = 0; + event->crumb_count = 2; + return event; } bugsnag_report_v1 *bsg_generate_report_v1(void) { @@ -181,7 +293,52 @@ bugsnag_report_v1 *bsg_generate_report_v1(void) { bugsnag_event *bsg_generate_event(void) { bugsnag_event *report = calloc(1, sizeof(bugsnag_event)); - generate_basic_report(report); + strcpy(report->grouping_hash, "foo-hash"); + strcpy(report->api_key, "5d1e5fbd39a74caa1200142706a90b20"); + strcpy(report->context, "SomeActivity"); + strcpy(report->error.errorClass, "SIGBUS"); + strcpy(report->error.errorMessage, "POSIX is serious about oncoming traffic"); + report->error.stacktrace[0].frame_address = 454379; + report->error.stacktrace[1].frame_address = 342334; + report->error.frame_count = 2; + strcpy(report->error.type, "C"); + strcpy(report->error.stacktrace[0].method, "makinBacon"); + strcpy(report->app.id, "com.example.PhotoSnapPlus"); + strcpy(report->app.release_stage, "リリース"); + strcpy(report->app.version, "2.0.52"); + report->app.version_code = 57; + strcpy(report->app.build_uuid, "1234-9876-adfe"); + strcpy(report->device.manufacturer, "HI-TEC™"); + strcpy(report->device.model, "Rasseur"); + strcpy(report->device.locale, "en_AU#Melbun"); + strcpy(report->device.os_name, "android"); + strcpy(report->user.email, "fenton@io.example.com"); + strcpy(report->user.id, "fex"); + report->device.total_memory = 234678100; + report->app.duration = 6502; + bugsnag_event_add_metadata_bool(report, "metrics", "experimentX", false); + bugsnag_event_add_metadata_string(report, "metrics", "subject", "percy"); + bugsnag_event_add_metadata_string(report, "app", "weather", "rain"); + bugsnag_event_add_metadata_double(report, "metrics", "counter", 47.8); + + report->crumb_count = 0; + report->crumb_first_index = 0; + bugsnag_breadcrumb *crumb1 = init_breadcrumb("decrease torque", "Moving laterally 26º", + BSG_CRUMB_STATE); + bugsnag_event_add_breadcrumb(report, crumb1); + + bugsnag_breadcrumb *crumb2 = init_breadcrumb("enable blasters", "this is a drill.", + BSG_CRUMB_USER); + bugsnag_event_add_breadcrumb(report, crumb2); + + report->handled_events = 1; + report->unhandled_events = 1; + strcpy(report->session_id, "f1ab"); + strcpy(report->session_start, "2019-03-19T12:58:19+00:00"); + + strcpy(report->notifier.version, "1.0"); + strcpy(report->notifier.url, "bugsnag.com"); + strcpy(report->notifier.name, "Test Notifier"); report->unhandled_events = 2; return report; } From 475a5b722bfe660bb9c5b1d799caf6c4fa9afdd4 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Wed, 14 Jul 2021 16:13:37 +0100 Subject: [PATCH 06/11] test: update test code --- .../androidTest/java/com/bugsnag/android/ndk/VerifyUtils.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 index 43eca873be..dacc1234be 100644 --- 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 @@ -4,8 +4,10 @@ import java.lang.IllegalStateException internal fun verifyNativeRun(code: Int): Boolean { if (code != 0) { - throw IllegalStateException("Native test suite failed." + - " Filter the device logs by 'BugsnagNDKTest' to get the results.") + throw IllegalStateException( + "Native test suite failed." + + " Filter the device logs by 'BugsnagNDKTest' to get the results." + ) } else { return true } From 4b1de50aaf5f24e13385e699e462991d4c5d8c22 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Wed, 14 Jul 2021 16:23:04 +0100 Subject: [PATCH 07/11] ci: add instrumentation tests to ci --- .buildkite/pipeline.full.yml | 15 +++++++++++++++ .buildkite/pipeline.yml | 17 ++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/.buildkite/pipeline.full.yml b/.buildkite/pipeline.full.yml index 535bec7060..ab6011cac7 100644 --- a/.buildkite/pipeline.full.yml +++ b/.buildkite/pipeline.full.yml @@ -69,6 +69,21 @@ steps: concurrency: 9 concurrency_group: 'browserstack-app' + - label: ':android: NDK Instrumentation tests' + key: 'ndk-instrumentation-tests' + depends_on: + - "android-ci" + timeout_in_minutes: 30 + command: ./scripts/build-instrumentation-tests.sh && ./scripts/run-instrumentation-test.sh + plugins: + - docker-compose#v3.7.0: + run: android-ci + env: + INSTRUMENTATION_DEVICES: '["Google Pixel-7.1"]' + TEST_APK_LOCATION: 'bugsnag-plugin-android-ndk/build/outputs/apk/androidTest/debug/bugsnag-plugin-android-ndk-debug-androidTest.apk' + concurrency: 9 + concurrency_group: 'browserstack-app' + - label: ':android: Android 9 Instrumentation tests' depends_on: - "android-ci" diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index d0a685f200..17ace535b6 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -154,7 +154,7 @@ steps: command: './gradlew test' - label: ':android: Android 7 Instrumentation tests' - key: 'NDK-smoke-test' + key: 'core-instrumentation-tests' depends_on: - "android-ci" timeout_in_minutes: 30 @@ -168,6 +168,21 @@ steps: concurrency: 9 concurrency_group: 'browserstack-app' + - label: ':android: NDK Instrumentation tests' + key: 'ndk-instrumentation-tests' + depends_on: + - "android-ci" + timeout_in_minutes: 30 + command: ./scripts/build-instrumentation-tests.sh && ./scripts/run-instrumentation-test.sh + plugins: + - docker-compose#v3.7.0: + run: android-ci + env: + INSTRUMENTATION_DEVICES: '["Google Pixel-7.1"]' + TEST_APK_LOCATION: 'bugsnag-plugin-android-ndk/build/outputs/apk/androidTest/debug/bugsnag-plugin-android-ndk-debug-androidTest.apk' + concurrency: 9 + concurrency_group: 'browserstack-app' + - label: ':android: Performance benchmarks' key: 'perf-benchmarks' depends_on: From a5561dc57f6b5efab99fccf3ce74bab055235fa1 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Wed, 14 Jul 2021 17:36:59 +0100 Subject: [PATCH 08/11] test: reorganize ndk test cases --- .../ndk/AppMetadataSerializationTest.kt | 18 +- .../android/ndk/AppSerializationTest.kt | 18 +- .../ndk/BreadcrumbStateSerializationTest.kt | 4 +- .../android/ndk/ContextSerializationTest.kt | 18 +- .../ndk/CustomMetadataSerializationTest.kt | 18 +- .../android/ndk/DeviceSerializationTest.kt | 18 +- .../android/ndk/ExceptionSerializationTest.kt | 18 +- .../android/ndk/SessionSerializationTest.kt | 18 +- .../ndk/SeverityReasonSerializationTest.kt | 18 +- .../ndk/StackframeSerializationTest.kt | 18 +- .../android/ndk/UserSerializationTest.kt | 18 +- ....json => app_meta_data_serialization.json} | 0 ...lization_0.json => app_serialization.json} | 0 ...tion_0.json => context_serialization.json} | 0 ...on => custom_meta_data_serialization.json} | 0 ...ation_0.json => device_serialization.json} | 0 ...on_0.json => exception_serialization.json} | 0 ...tion_0.json => session_serialization.json} | 0 ...son => severity_reason_serialization.json} | 0 ...n_0.json => stackframe_serialization.json} | 0 ...ization_0.json => user_serialization.json} | 0 .../resources/user_serialization_1.json | 1 - .../src/test/cpp/main.c | 263 +++++------------- .../src/test/cpp/test_serializer.c | 66 ++--- .../src/test/cpp/test_serializer.h | 22 +- 25 files changed, 160 insertions(+), 376 deletions(-) rename bugsnag-plugin-android-ndk/src/androidTest/resources/{app_meta_data_serialization_0.json => app_meta_data_serialization.json} (100%) rename bugsnag-plugin-android-ndk/src/androidTest/resources/{app_serialization_0.json => app_serialization.json} (100%) rename bugsnag-plugin-android-ndk/src/androidTest/resources/{context_serialization_0.json => context_serialization.json} (100%) rename bugsnag-plugin-android-ndk/src/androidTest/resources/{custom_meta_data_serialization_0.json => custom_meta_data_serialization.json} (100%) rename bugsnag-plugin-android-ndk/src/androidTest/resources/{device_serialization_0.json => device_serialization.json} (100%) rename bugsnag-plugin-android-ndk/src/androidTest/resources/{exception_serialization_0.json => exception_serialization.json} (100%) rename bugsnag-plugin-android-ndk/src/androidTest/resources/{session_serialization_0.json => session_serialization.json} (100%) rename bugsnag-plugin-android-ndk/src/androidTest/resources/{severity_reason_serialization_0.json => severity_reason_serialization.json} (100%) rename bugsnag-plugin-android-ndk/src/androidTest/resources/{stackframe_serialization_0.json => stackframe_serialization.json} (100%) rename bugsnag-plugin-android-ndk/src/androidTest/resources/{user_serialization_0.json => user_serialization.json} (100%) delete mode 100644 bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_1.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 index 4396c007f0..2d050023b9 100644 --- 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 @@ -1,10 +1,8 @@ package com.bugsnag.android.ndk +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized -@RunWith(Parameterized::class) internal class AppMetadataSerializationTest { companion object { @@ -12,20 +10,14 @@ internal class AppMetadataSerializationTest { System.loadLibrary("bugsnag-ndk") System.loadLibrary("bugsnag-ndk-test") } - - @JvmStatic - @Parameterized.Parameters - fun testCases() = 0..0 } - external fun run(testCase: Int, expectedJson: String): Int - - @Parameterized.Parameter - lateinit var testCase: Number + external fun run(): String @Test fun testPassesNativeSuite() { - val expectedJson = loadJson("app_meta_data_serialization_$testCase.json") - verifyNativeRun(run(testCase.toInt(), expectedJson)) + val expected = loadJson("app_meta_data_serialization.json") + val json = run() + assertEquals(expected, 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 index 37ada307ae..bb67499cd2 100644 --- 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 @@ -1,10 +1,8 @@ package com.bugsnag.android.ndk +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized -@RunWith(Parameterized::class) internal class AppSerializationTest { companion object { @@ -12,20 +10,14 @@ internal class AppSerializationTest { System.loadLibrary("bugsnag-ndk") System.loadLibrary("bugsnag-ndk-test") } - - @JvmStatic - @Parameterized.Parameters - fun testCases() = 0..0 } - external fun run(testCase: Int, expectedJson: String): Int - - @Parameterized.Parameter - lateinit var testCase: Number + external fun run(): String @Test fun testPassesNativeSuite() { - val expectedJson = loadJson("app_serialization_$testCase.json") - verifyNativeRun(run(testCase.toInt(), expectedJson)) + val expected = loadJson("app_serialization.json") + val json = run() + assertEquals(expected, json) } } diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbStateSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbStateSerializationTest.kt index 2612e337aa..aa9de489ea 100644 --- a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbStateSerializationTest.kt +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/BreadcrumbStateSerializationTest.kt @@ -12,12 +12,12 @@ internal class BreadcrumbStateSerializationTest { } } - external fun serializeBreadcrumbs(): String + external fun run(): String @Test fun testBreadcrumbSerialization() { val expected = loadJson("breadcrumbs_serialization.json") - val json = serializeBreadcrumbs() + val json = run() assertEquals(expected, 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 index ecd3ce7a0a..969f25e7b6 100644 --- 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 @@ -1,10 +1,8 @@ package com.bugsnag.android.ndk +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized -@RunWith(Parameterized::class) internal class ContextSerializationTest { companion object { @@ -12,20 +10,14 @@ internal class ContextSerializationTest { System.loadLibrary("bugsnag-ndk") System.loadLibrary("bugsnag-ndk-test") } - - @JvmStatic - @Parameterized.Parameters - fun testCases() = 0..0 } - external fun run(testCase: Int, expectedJson: String): Int - - @Parameterized.Parameter - lateinit var testCase: Number + external fun run(): String @Test fun testPassesNativeSuite() { - val expectedJson = loadJson("context_serialization_$testCase.json") - verifyNativeRun(run(testCase.toInt(), expectedJson)) + val expected = loadJson("context_serialization.json") + val json = run() + assertEquals(expected, 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 index e04f5bd635..0d2c5d95f5 100644 --- 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 @@ -1,10 +1,8 @@ package com.bugsnag.android.ndk +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized -@RunWith(Parameterized::class) internal class CustomMetadataSerializationTest { companion object { @@ -12,20 +10,14 @@ internal class CustomMetadataSerializationTest { System.loadLibrary("bugsnag-ndk") System.loadLibrary("bugsnag-ndk-test") } - - @JvmStatic - @Parameterized.Parameters - fun testCases() = 0..0 } - external fun run(testCase: Int, expectedJson: String): Int - - @Parameterized.Parameter - lateinit var testCase: Number + external fun run(): String @Test fun testPassesNativeSuite() { - val expectedJson = loadJson("custom_meta_data_serialization_$testCase.json") - verifyNativeRun(run(testCase.toInt(), expectedJson)) + val expected = loadJson("custom_meta_data_serialization.json") + val json = run() + assertEquals(expected, 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 index ca04acb490..2953883f00 100644 --- 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 @@ -1,10 +1,8 @@ package com.bugsnag.android.ndk +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized -@RunWith(Parameterized::class) internal class DeviceSerializationTest { companion object { @@ -12,20 +10,14 @@ internal class DeviceSerializationTest { System.loadLibrary("bugsnag-ndk") System.loadLibrary("bugsnag-ndk-test") } - - @JvmStatic - @Parameterized.Parameters - fun testCases() = 0..0 } - external fun run(testCase: Int, expectedJson: String): Int - - @Parameterized.Parameter - lateinit var testCase: Number + external fun run(): String @Test fun testPassesNativeSuite() { - val expectedJson = loadJson("device_serialization_$testCase.json") - verifyNativeRun(run(testCase.toInt(), expectedJson)) + val expected = loadJson("device_serialization.json") + val json = run() + assertEquals(expected, 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 index 0b8bcc3a57..c187ac0f34 100644 --- 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 @@ -1,10 +1,8 @@ package com.bugsnag.android.ndk +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized -@RunWith(Parameterized::class) internal class ExceptionSerializationTest { companion object { @@ -12,20 +10,14 @@ internal class ExceptionSerializationTest { System.loadLibrary("bugsnag-ndk") System.loadLibrary("bugsnag-ndk-test") } - - @JvmStatic - @Parameterized.Parameters - fun testCases() = 0..0 } - external fun run(testCase: Int, expectedJson: String): Int - - @Parameterized.Parameter - lateinit var testCase: Number + external fun run(): String @Test fun testPassesNativeSuite() { - val expectedJson = loadJson("exception_serialization_$testCase.json") - verifyNativeRun(run(testCase.toInt(), expectedJson)) + val expected = loadJson("exception_serialization.json") + val json = run() + assertEquals(expected, 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 index d9124a5966..d21934e9d9 100644 --- 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 @@ -1,10 +1,8 @@ package com.bugsnag.android.ndk +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized -@RunWith(Parameterized::class) internal class SessionSerializationTest { companion object { @@ -12,20 +10,14 @@ internal class SessionSerializationTest { System.loadLibrary("bugsnag-ndk") System.loadLibrary("bugsnag-ndk-test") } - - @JvmStatic - @Parameterized.Parameters - fun testCases() = 0..0 } - external fun run(testCase: Int, expectedJson: String): Int - - @Parameterized.Parameter - lateinit var testCase: Number + external fun run(): String @Test fun testPassesNativeSuite() { - val expectedJson = loadJson("session_serialization_$testCase.json") - verifyNativeRun(run(testCase.toInt(), expectedJson)) + val expected = loadJson("session_serialization.json") + val json = run() + assertEquals(expected, json) } } diff --git a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/SeverityReasonSerializationTest.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/SeverityReasonSerializationTest.kt index 1a56386b0a..4fedf3c166 100644 --- a/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/SeverityReasonSerializationTest.kt +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/SeverityReasonSerializationTest.kt @@ -1,10 +1,8 @@ package com.bugsnag.android.ndk +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized -@RunWith(Parameterized::class) internal class SeverityReasonSerializationTest { companion object { @@ -12,20 +10,14 @@ internal class SeverityReasonSerializationTest { System.loadLibrary("bugsnag-ndk") System.loadLibrary("bugsnag-ndk-test") } - - @JvmStatic - @Parameterized.Parameters - fun testCases() = 0..0 } - external fun run(testCase: Int, expectedJson: String): Int - - @Parameterized.Parameter - lateinit var testCase: Number + external fun run(): String @Test fun testPassesNativeSuite() { - val expectedJson = loadJson("severity_reason_serialization_$testCase.json") - verifyNativeRun(run(testCase.toInt(), expectedJson)) + val expected = loadJson("severity_reason_serialization.json") + val json = run() + assertEquals(expected, 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 index 2c426ca562..783942452a 100644 --- 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 @@ -1,10 +1,8 @@ package com.bugsnag.android.ndk +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized -@RunWith(Parameterized::class) internal class StackframeSerializationTest { companion object { @@ -12,20 +10,14 @@ internal class StackframeSerializationTest { System.loadLibrary("bugsnag-ndk") System.loadLibrary("bugsnag-ndk-test") } - - @JvmStatic - @Parameterized.Parameters - fun testCases() = 0..0 } - external fun run(testCase: Int, expectedJson: String): Int - - @Parameterized.Parameter - lateinit var testCase: Number + external fun run(): String @Test fun testPassesNativeSuite() { - val expectedJson = loadJson("stackframe_serialization_$testCase.json") - verifyNativeRun(run(testCase.toInt(), expectedJson)) + val expected = loadJson("stackframe_serialization.json") + val json = run() + assertEquals(expected, json) } } 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 index 41b9302cbd..844e6873b7 100644 --- 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 @@ -1,10 +1,8 @@ package com.bugsnag.android.ndk +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized -@RunWith(Parameterized::class) internal class UserSerializationTest { companion object { @@ -12,20 +10,14 @@ internal class UserSerializationTest { System.loadLibrary("bugsnag-ndk") System.loadLibrary("bugsnag-ndk-test") } - - @JvmStatic - @Parameterized.Parameters - fun testCases() = (0..1) } - external fun run(testCase: Int, expectedJson: String): Int - - @Parameterized.Parameter - lateinit var testCase: Number + external fun run(): String @Test fun testPassesNativeSuite() { - val expectedJson = loadJson("user_serialization_$testCase.json") - verifyNativeRun(run(testCase.toInt(), expectedJson)) + val expected = loadJson("user_serialization.json") + val json = run() + assertEquals(expected, json) } } 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.json similarity index 100% rename from bugsnag-plugin-android-ndk/src/androidTest/resources/app_meta_data_serialization_0.json rename to bugsnag-plugin-android-ndk/src/androidTest/resources/app_meta_data_serialization.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/app_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/app_serialization.json similarity index 100% rename from bugsnag-plugin-android-ndk/src/androidTest/resources/app_serialization_0.json rename to bugsnag-plugin-android-ndk/src/androidTest/resources/app_serialization.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/context_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/context_serialization.json similarity index 100% rename from bugsnag-plugin-android-ndk/src/androidTest/resources/context_serialization_0.json rename to bugsnag-plugin-android-ndk/src/androidTest/resources/context_serialization.json 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.json similarity index 100% rename from bugsnag-plugin-android-ndk/src/androidTest/resources/custom_meta_data_serialization_0.json rename to bugsnag-plugin-android-ndk/src/androidTest/resources/custom_meta_data_serialization.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/device_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/device_serialization.json similarity index 100% rename from bugsnag-plugin-android-ndk/src/androidTest/resources/device_serialization_0.json rename to bugsnag-plugin-android-ndk/src/androidTest/resources/device_serialization.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/exception_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/exception_serialization.json similarity index 100% rename from bugsnag-plugin-android-ndk/src/androidTest/resources/exception_serialization_0.json rename to bugsnag-plugin-android-ndk/src/androidTest/resources/exception_serialization.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/session_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/session_serialization.json similarity index 100% rename from bugsnag-plugin-android-ndk/src/androidTest/resources/session_serialization_0.json rename to bugsnag-plugin-android-ndk/src/androidTest/resources/session_serialization.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/severity_reason_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/severity_reason_serialization.json similarity index 100% rename from bugsnag-plugin-android-ndk/src/androidTest/resources/severity_reason_serialization_0.json rename to bugsnag-plugin-android-ndk/src/androidTest/resources/severity_reason_serialization.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/stackframe_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/stackframe_serialization.json similarity index 100% rename from bugsnag-plugin-android-ndk/src/androidTest/resources/stackframe_serialization_0.json rename to bugsnag-plugin-android-ndk/src/androidTest/resources/stackframe_serialization.json diff --git a/bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_0.json b/bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization.json similarity index 100% rename from bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_0.json rename to bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization.json 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 deleted file mode 100644 index bb1f4bb2d2..0000000000 --- a/bugsnag-plugin-android-ndk/src/androidTest/resources/user_serialization_1.json +++ /dev/null @@ -1 +0,0 @@ -{"user":{"name":"Jamie","email":"jamie@bugsnag.com","id":"456"}} \ 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 ec8ff7be0e..2f3eff9790 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -89,96 +89,48 @@ JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeEventDeviceMutatorsTest return run_test_suite(suite_event_device_mutators); } -TEST test_user_serialization(test_case *test_case) { +JNIEXPORT jstring JNICALL Java_com_bugsnag_android_ndk_UserSerializationTest_run( + JNIEnv *env, jobject _this) { + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); + loadUserTestCase(event); JSON_Value *event_val = json_value_init_object(); - JSON_Object *event = json_value_get_object(event_val); - bugsnag_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 = calloc(1, 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(); + JSON_Object *event_obj = json_value_get_object(event_val); + bsg_serialize_user(event->user, event_obj); + char *string = json_serialize_to_string(event_val); + return (*env)->NewStringUTF(env, string); } -TEST test_app_serialization(test_case *test_case) { +JNIEXPORT jstring JNICALL Java_com_bugsnag_android_ndk_AppSerializationTest_run( + JNIEnv *env, jobject _this) { + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); + loadAppTestCase(event); 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 = calloc(1, 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(); + JSON_Object *event_obj = json_value_get_object(event_val); + bsg_serialize_app(event->app, event_obj); + char *string = json_serialize_to_string(event_val); + return (*env)->NewStringUTF(env, string); } -TEST test_app_meta_data_serialization(test_case *test_case) { +JNIEXPORT jstring JNICALL Java_com_bugsnag_android_ndk_AppMetadataSerializationTest_run( + JNIEnv *env, jobject _this) { + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); + loadAppMetadataTestCase(event); 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 = calloc(1, 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(); + JSON_Object *event_obj = json_value_get_object(event_val); + bsg_serialize_app_metadata(event->app, event_obj); + char *string = json_serialize_to_string(event_val); + return (*env)->NewStringUTF(env, string); } -TEST test_device_serialization(test_case *test_case) { +JNIEXPORT jstring JNICALL Java_com_bugsnag_android_ndk_DeviceSerializationTest_run( + JNIEnv *env, jobject _this) { + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); + loadDeviceTestCase(event); 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 = calloc(1, 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(); + JSON_Object *event_obj = json_value_get_object(event_val); + bsg_serialize_device(event->device, event_obj); + char *string = json_serialize_to_string(event_val); + return (*env)->NewStringUTF(env, string); } TEST test_custom_meta_data_serialization(test_case *test_case) { @@ -190,94 +142,54 @@ TEST test_custom_meta_data_serialization(test_case *test_case) { 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 = calloc(1, 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(); +JNIEXPORT jstring JNICALL Java_com_bugsnag_android_ndk_CustomMetadataSerializationTest_run( + JNIEnv *env, jobject _this) { + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); + loadCustomMetadataTestCase(event); + JSON_Value *event_val = json_value_init_object(); + JSON_Object *event_obj = json_value_get_object(event_val); + bsg_serialize_custom_metadata(event->metadata, event_obj); + char *string = json_serialize_to_string(event_val); + return (*env)->NewStringUTF(env, string); } -TEST test_context_serialization(test_case *test_case) { +JNIEXPORT jstring JNICALL Java_com_bugsnag_android_ndk_ContextSerializationTest_run( + JNIEnv *env, jobject _this) { + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); + loadContextTestCase(event); JSON_Value *event_val = json_value_init_object(); JSON_Object *event_obj = json_value_get_object(event_val); - bugsnag_event *event = test_case->data_ptr; bsg_serialize_context(event, event_obj); - free(event); - 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 = calloc(1, 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(); + char *string = json_serialize_to_string(event_val); + return (*env)->NewStringUTF(env, string); } -TEST test_severity_reason_serialization(test_case *test_case) { +JNIEXPORT jstring JNICALL Java_com_bugsnag_android_ndk_SeverityReasonSerializationTest_run( + JNIEnv *env, jobject _this) { + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); + loadSeverityReasonTestCase(event); JSON_Value *event_val = json_value_init_object(); JSON_Object *event_obj = json_value_get_object(event_val); - bugsnag_event *event = test_case->data_ptr; bsg_serialize_severity_reason(event, event_obj); - free(event); - return validate_serialized_json(test_case, event_val); + char *string = json_serialize_to_string(event_val); + return (*env)->NewStringUTF(env, string); } -JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_SeverityReasonSerializationTest_run( - JNIEnv *_env, jobject _this, jint num, jstring expected_json) { - int argc = 0; - char *argv[] = {}; - test_case *test_case = calloc(1, sizeof(test_case)); - test_case->data_ptr = loadSeverityReasonTestCase(num); - - char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); - test_case->expected_json = str; - GREATEST_MAIN_BEGIN(); - RUN_TEST1(test_severity_reason_serialization, test_case); - GREATEST_MAIN_END(); -} - -TEST test_session_serialization(test_case *test_case) { +JNIEXPORT jstring JNICALL Java_com_bugsnag_android_ndk_SessionSerializationTest_run( + JNIEnv *env, jobject _this) { + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); + loadSessionTestCase(event); JSON_Value *event_val = json_value_init_object(); JSON_Object *event_obj = json_value_get_object(event_val); - bugsnag_event *event = test_case->data_ptr; bsg_serialize_session(event, event_obj); - free(event); - 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 = calloc(1, 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(); + char *string = json_serialize_to_string(event_val); + return (*env)->NewStringUTF(env, string); } JNIEXPORT jstring JNICALL -Java_com_bugsnag_android_ndk_BreadcrumbStateSerializationTest_serializeBreadcrumbs(JNIEnv *env, - jobject thiz) { +Java_com_bugsnag_android_ndk_BreadcrumbStateSerializationTest_run(JNIEnv *env, + jobject thiz) { bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); - memset(event, 0, sizeof(bugsnag_event)); loadBreadcrumbsTestCase(event); JSON_Value *eventVal = json_value_init_array(); JSON_Array *eventAry = json_value_get_array(eventVal); @@ -286,52 +198,27 @@ Java_com_bugsnag_android_ndk_BreadcrumbStateSerializationTest_serializeBreadcrum return (*env)->NewStringUTF(env, string); } -TEST test_stackframe_serialization(test_case *test_case) { +JNIEXPORT jstring JNICALL Java_com_bugsnag_android_ndk_StackframeSerializationTest_run( + JNIEnv *env, jobject _this) { + bugsnag_stackframe *frame = loadStackframeTestCase(); JSON_Value *event_val = json_value_init_array(); - JSON_Array *event = json_value_get_array(event_val); - bugsnag_stackframe *frame = test_case->data_ptr; - bsg_serialize_stackframe(frame, event); - free(frame); - return validate_serialized_json(test_case, event_val); + JSON_Array *event_obj = json_value_get_array(event_val); + bsg_serialize_stackframe(frame, event_obj); + char *string = json_serialize_to_string(event_val); + return (*env)->NewStringUTF(env, string); } -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 = calloc(1, 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(); -} - -TEST test_exception_serialization(test_case *test_case) { +JNIEXPORT jstring JNICALL Java_com_bugsnag_android_ndk_ExceptionSerializationTest_run( + JNIEnv *env, jobject _this) { + bugsnag_event *event = calloc(1, sizeof(bugsnag_event)); + loadExceptionTestCase(event); 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_serialize_error(event->error, exception, stacktrace); + char *string = json_serialize_to_string(event_val); + return (*env)->NewStringUTF(env, string); - bsg_error *exc = test_case->data_ptr; - bsg_serialize_error(*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 = calloc(1, 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 c4f7a3a46d..930bf749de 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c @@ -13,25 +13,15 @@ enum greatest_test_res validate_serialized_json(const test_case *test_case, PASS(); } -bugsnag_user * loadUserTestCase(jint num) { - bugsnag_user *user; - - if (num == 0) { - user = calloc(1, sizeof(bugsnag_user)); - strcpy(user->name, "Fenton"); - strcpy(user->email, "fenton@io.example.com"); - strcpy(user->id, "1234"); - } else { - user = calloc(1, sizeof(bugsnag_user)); - strcpy(user->name, "Jamie"); - strcpy(user->email, "jamie@bugsnag.com"); - strcpy(user->id, "456"); - } - return user; +void loadUserTestCase(bugsnag_event *event) { + bugsnag_user *user = &event->user; + strcpy(user->name, "Fenton"); + strcpy(user->email, "fenton@io.example.com"); + strcpy(user->id, "1234"); } -bsg_app_info * loadAppTestCase(jint num) { - bsg_app_info *app = calloc(1, sizeof(bsg_app_info)); +void loadAppTestCase(bugsnag_event *event) { + bsg_app_info *app = &event->app; strcpy(app->id, "com.bugsnag.example"); strcpy(app->release_stage, "prod"); strcpy(app->type, "android"); @@ -46,16 +36,14 @@ bsg_app_info * loadAppTestCase(jint num) { app->in_foreground = true; app->is_launching = true; strcpy(app->binary_arch, "x86"); - return app; } -bsg_app_info * loadAppMetadataTestCase(jint num) { - bsg_app_info *app = loadAppTestCase(num); - return app; +void loadAppMetadataTestCase(bugsnag_event *event) { + loadAppTestCase(event); } -bsg_device_info * loadDeviceTestCase(jint num) { - bsg_device_info *device = calloc(1, sizeof(bsg_device_info)); +void loadDeviceTestCase(bugsnag_event *event) { + bsg_device_info *device = &event->device; device->api_level = 29; bsg_strncpy_safe(device->cpu_abi[0].value, "x86", sizeof(device->cpu_abi[0].value)); device->cpu_abi_count = 1; @@ -72,11 +60,10 @@ bsg_device_info * loadDeviceTestCase(jint num) { strcpy(device->os_version, "8.1"); strcpy(device->os_name, "android"); device->total_memory = 512340922; - return device; } -bugsnag_metadata * loadCustomMetadataTestCase(jint num) { - bugsnag_metadata *data = calloc(1, sizeof(bugsnag_metadata)); +void loadCustomMetadataTestCase(bugsnag_event *event) { + bugsnag_metadata *data = &event->metadata; data->value_count = 4; data->values[0].type = BSG_METADATA_CHAR_VALUE; @@ -97,34 +84,27 @@ bugsnag_metadata * loadCustomMetadataTestCase(jint num) { data->values[3].type = BSG_METADATA_NONE_VALUE; strcpy(data->values[3].section, "custom"); strcpy(data->values[3].name, "none"); - return data; } -bugsnag_event * loadContextTestCase(jint num) { - bugsnag_event *data = calloc(1, sizeof(bugsnag_event)); - strcpy(data->context, "CustomContext"); - strcpy(data->app.active_screen, "ExampleActivity"); - return data; +void loadContextTestCase(bugsnag_event *event) { + strcpy(event->context, "CustomContext"); + strcpy(event->app.active_screen, "ExampleActivity"); } -bugsnag_event * loadSeverityReasonTestCase(jint num) { - bugsnag_event *data = calloc(1, sizeof(bugsnag_event)); +void loadSeverityReasonTestCase(bugsnag_event *data) { data->unhandled = true; data->severity = BSG_SEVERITY_ERR; strcpy(data->error.errorClass, "SIGABRT"); - return data; } -bugsnag_event * loadSessionTestCase(jint num) { - bugsnag_event *data = calloc(1, sizeof(bugsnag_event)); +void loadSessionTestCase(bugsnag_event *data) { strcpy(data->session_id, "123"); strcpy(data->session_start, "2018-10-08T12:07:09Z"); data->handled_events = 2; data->unhandled_events = 1; - return data; } -bugsnag_event *loadBreadcrumbsTestCase(bugsnag_event *event) { +void loadBreadcrumbsTestCase(bugsnag_event *event) { bugsnag_breadcrumb *crumb = calloc(1, sizeof(bugsnag_breadcrumb)); memset(crumb, 0, sizeof(bugsnag_breadcrumb)); event->crumb_count = 4; @@ -184,10 +164,9 @@ bugsnag_event *loadBreadcrumbsTestCase(bugsnag_event *event) { data->values[0].type = BSG_METADATA_NONE_VALUE; strcpy(data->values[0].section, "custom"); strcpy(data->values[0].name, "none"); - return event; } -bugsnag_stackframe * loadStackframeTestCase(jint num) { +bugsnag_stackframe *loadStackframeTestCase() { bugsnag_stackframe *data = calloc(1, sizeof(bugsnag_stackframe)); data->frame_address = 0x20000000; data->symbol_address = 0x16000000; @@ -198,8 +177,8 @@ bugsnag_stackframe * loadStackframeTestCase(jint num) { return data; } -bsg_error * loadExceptionTestCase(jint num) { - bsg_error *data = calloc(1, sizeof(bsg_error)); +void loadExceptionTestCase(bugsnag_event *event) { + bsg_error *data = &event->error; strcpy(data->errorClass, "signal"); strcpy(data->errorMessage, "whoops something went wrong"); strcpy(data->type, "c"); @@ -210,5 +189,4 @@ bsg_error * loadExceptionTestCase(jint num) { data->stacktrace[0].line_number= 52; strcpy(data->stacktrace[0].filename, "foo.c"); strcpy(data->stacktrace[0].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 d0d276f59a..96e4eeeddc 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.h @@ -12,14 +12,14 @@ typedef struct { enum greatest_test_res validate_serialized_json(const test_case *test_case, JSON_Value *event_val); -bugsnag_user * loadUserTestCase(jint num); -bsg_app_info * loadAppTestCase(jint num); -bsg_app_info * loadAppMetadataTestCase(jint num); -bsg_device_info * loadDeviceTestCase(jint num); -bugsnag_metadata * loadCustomMetadataTestCase(jint num); -bugsnag_event * loadContextTestCase(jint num); -bugsnag_event * loadSeverityReasonTestCase(jint num); -bugsnag_event * loadSessionTestCase(jint num); -bugsnag_event *loadBreadcrumbsTestCase(bugsnag_event *event); -bugsnag_stackframe * loadStackframeTestCase(jint num); -bsg_error * loadExceptionTestCase(jint num); +void loadUserTestCase(bugsnag_event *event); +void loadAppTestCase(bugsnag_event *event); +void loadAppMetadataTestCase(bugsnag_event *event); +void loadDeviceTestCase(bugsnag_event *event); +void loadCustomMetadataTestCase(bugsnag_event *event); +void loadContextTestCase(bugsnag_event *event); +void loadSessionTestCase(bugsnag_event *event); +void loadSeverityReasonTestCase(bugsnag_event *event); +void loadBreadcrumbsTestCase(bugsnag_event *event); +bugsnag_stackframe *loadStackframeTestCase(); +void loadExceptionTestCase(bugsnag_event *event); From 112d922e2d8ebaf6d163f8166dd5f85cce0cc718 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 15 Jul 2021 10:55:43 +0100 Subject: [PATCH 09/11] fix: ensure correct value always collected for activeScreen --- CHANGELOG.md | 3 +++ bugsnag-android-core/detekt-baseline.xml | 2 +- .../bugsnag/android/AppDataCollectorTest.kt | 23 +++++++++++++++++-- .../com/bugsnag/android/AppDataCollector.kt | 3 +-- .../main/java/com/bugsnag/android/Client.java | 2 +- .../android/AppDataCollectorForegroundTest.kt | 1 - .../AppDataCollectorSerializationTest.kt | 1 - .../android/AppMetadataSerializationTest.kt | 4 +--- 8 files changed, 28 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44fdfbee70..301159dc2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ * Prefer `calloc()` to `malloc()` in NDK code [#1320](https://github.com/bugsnag/bugsnag-android/pull/1320) +* Ensure correct value always collected for activeScreen + [#1322](https://github.com/bugsnag/bugsnag-android/pull/1322) + ## 5.10.0 (2021-07-14) ### Enhancements diff --git a/bugsnag-android-core/detekt-baseline.xml b/bugsnag-android-core/detekt-baseline.xml index 0dee9006b2..d222bee612 100644 --- a/bugsnag-android-core/detekt-baseline.xml +++ b/bugsnag-android-core/detekt-baseline.xml @@ -4,7 +4,7 @@ ImplicitDefaultLocale:DeliveryHeaders.kt$String.format("%02x", byte) LongParameterList:App.kt$App$( /** * The architecture of the running application binary */ var binaryArch: String?, /** * The package name of the application */ var id: String?, /** * The release stage set in [Configuration.releaseStage] */ var releaseStage: String?, /** * The version of the application set in [Configuration.version] */ var version: String?, /** The revision ID from the manifest (React Native apps only) */ var codeBundleId: String?, /** * The unique identifier for the build of the application set in [Configuration.buildUuid] */ var buildUuid: String?, /** * The application type set in [Configuration#version] */ var type: String?, /** * The version code of the application set in [Configuration.versionCode] */ var versionCode: Number? ) - LongParameterList:AppDataCollector.kt$AppDataCollector$( appContext: Context, private val packageManager: PackageManager?, private val config: ImmutableConfig, private val sessionTracker: SessionTracker, private val activityManager: ActivityManager?, private val launchCrashTracker: LaunchCrashTracker, private val contextState: ContextState, private val logger: Logger ) + LongParameterList:AppDataCollector.kt$AppDataCollector$( appContext: Context, private val packageManager: PackageManager?, private val config: ImmutableConfig, private val sessionTracker: SessionTracker, private val activityManager: ActivityManager?, private val launchCrashTracker: LaunchCrashTracker, private val logger: Logger ) LongParameterList:AppWithState.kt$AppWithState$( binaryArch: String?, id: String?, releaseStage: String?, version: String?, codeBundleId: String?, buildUuid: String?, type: String?, versionCode: Number?, /** * The number of milliseconds the application was running before the event occurred */ var duration: Number?, /** * The number of milliseconds the application was running in the foreground before the * event occurred */ var durationInForeground: Number?, /** * Whether the application was in the foreground when the event occurred */ var inForeground: Boolean?, /** * Whether the application was launching when the event occurred */ var isLaunching: Boolean? ) LongParameterList:AppWithState.kt$AppWithState$( config: ImmutableConfig, binaryArch: String?, id: String?, releaseStage: String?, version: String?, codeBundleId: String?, duration: Number?, durationInForeground: Number?, inForeground: Boolean?, isLaunching: Boolean? ) LongParameterList:Device.kt$Device$( buildInfo: DeviceBuildInfo, /** * The Application Binary Interface used */ var cpuAbi: Array<String>?, /** * Whether the device has been jailbroken */ var jailbroken: Boolean?, /** * A UUID generated by Bugsnag and used for the individual application on a device */ var id: String?, /** * The IETF language tag of the locale used */ var locale: String?, /** * The total number of bytes of memory on the device */ var totalMemory: Long?, /** * A collection of names and their versions of the primary languages, frameworks or * runtimes that the application is running on */ var runtimeVersions: MutableMap<String, Any>? ) diff --git a/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataCollectorTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataCollectorTest.kt index 4c0870ee59..b004736ea2 100644 --- a/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataCollectorTest.kt +++ b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataCollectorTest.kt @@ -48,7 +48,6 @@ class AppDataCollectorTest { client.sessionTracker, am, client.launchCrashTracker, - client.contextState, NoopLogger ) val app = collector.getAppDataMetadata() @@ -56,6 +55,27 @@ class AppDataCollectorTest { assertEquals("com.bugsnag.android.core.test", app["processName"] as String) } + @Test + fun testActiveScreenValue() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + `when`(am.isBackgroundRestricted).thenReturn(false) + } + + val collector = AppDataCollector( + context, + context.packageManager, + client.immutableConfig, + client.sessionTracker, + am, + client.launchCrashTracker, + NoopLogger + ) + client.context = "Some Custom Context" + client.sessionTracker.updateForegroundTracker("MyActivity", true, 0L) + val app = collector.getAppDataMetadata() + assertEquals("MyActivity", app["activeScreen"] as String) + } + /** * The flag is set in the app metadata if the user has enabled background restrictions */ @@ -71,7 +91,6 @@ class AppDataCollectorTest { client.sessionTracker, am, client.launchCrashTracker, - client.contextState, NoopLogger ) val app = collector.getAppDataMetadata() diff --git a/bugsnag-android-core/src/main/java/com/bugsnag/android/AppDataCollector.kt b/bugsnag-android-core/src/main/java/com/bugsnag/android/AppDataCollector.kt index 1d6125c2b1..e3f3a50762 100644 --- a/bugsnag-android-core/src/main/java/com/bugsnag/android/AppDataCollector.kt +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/AppDataCollector.kt @@ -20,7 +20,6 @@ internal class AppDataCollector( private val sessionTracker: SessionTracker, private val activityManager: ActivityManager?, private val launchCrashTracker: LaunchCrashTracker, - private val contextState: ContextState, private val logger: Logger ) { var codeBundleId: String? = null @@ -51,7 +50,7 @@ internal class AppDataCollector( fun getAppDataMetadata(): MutableMap { val map = HashMap() map["name"] = appName - map["activeScreen"] = contextState.getContext() + map["activeScreen"] = sessionTracker.contextActivity map["memoryUsage"] = getMemoryUsage() map["lowMemory"] = isLowMemory() diff --git a/bugsnag-android-core/src/main/java/com/bugsnag/android/Client.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Client.java index 60ff02e874..205e42c165 100644 --- a/bugsnag-android-core/src/main/java/com/bugsnag/android/Client.java +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/Client.java @@ -166,7 +166,7 @@ public Unit invoke(Boolean hasConnection, String networkState) { launchCrashTracker = new LaunchCrashTracker(immutableConfig); appDataCollector = new AppDataCollector(appContext, appContext.getPackageManager(), - immutableConfig, sessionTracker, am, launchCrashTracker, contextState, logger); + immutableConfig, sessionTracker, am, launchCrashTracker, logger); // load the device + user information SharedPrefMigrator sharedPrefMigrator = new SharedPrefMigrator(appContext); diff --git a/bugsnag-android-core/src/test/java/com/bugsnag/android/AppDataCollectorForegroundTest.kt b/bugsnag-android-core/src/test/java/com/bugsnag/android/AppDataCollectorForegroundTest.kt index 24cd8ec3e8..1a3d483ee0 100644 --- a/bugsnag-android-core/src/test/java/com/bugsnag/android/AppDataCollectorForegroundTest.kt +++ b/bugsnag-android-core/src/test/java/com/bugsnag/android/AppDataCollectorForegroundTest.kt @@ -42,7 +42,6 @@ class AppDataCollectorForegroundTest { sessionTracker, null, launchCrashTracker, - ContextState(), NoopLogger ) } diff --git a/bugsnag-android-core/src/test/java/com/bugsnag/android/AppDataCollectorSerializationTest.kt b/bugsnag-android-core/src/test/java/com/bugsnag/android/AppDataCollectorSerializationTest.kt index 3b1643142e..d5620c39b7 100644 --- a/bugsnag-android-core/src/test/java/com/bugsnag/android/AppDataCollectorSerializationTest.kt +++ b/bugsnag-android-core/src/test/java/com/bugsnag/android/AppDataCollectorSerializationTest.kt @@ -51,7 +51,6 @@ internal class AppDataCollectorSerializationTest { sessionTracker, am, launchCrashTracker, - ContextState(), NoopLogger ) appData.codeBundleId = "foo-99" diff --git a/bugsnag-android-core/src/test/java/com/bugsnag/android/AppMetadataSerializationTest.kt b/bugsnag-android-core/src/test/java/com/bugsnag/android/AppMetadataSerializationTest.kt index 91292e002b..5c87ad95e7 100644 --- a/bugsnag-android-core/src/test/java/com/bugsnag/android/AppMetadataSerializationTest.kt +++ b/bugsnag-android-core/src/test/java/com/bugsnag/android/AppMetadataSerializationTest.kt @@ -39,8 +39,7 @@ internal class AppMetadataSerializationTest { `when`(context.packageName).thenReturn("com.example.foo") // populate metadata fields - val contextState = ContextState() - contextState.setAutomaticContext("MyActivity") + `when`(sessionTracker.contextActivity).thenReturn("MyActivity") `when`(pm.getApplicationLabel(any())).thenReturn("MyApp") `when`(pm.getApplicationInfo(any(), anyInt())).thenReturn(ApplicationInfo()) @@ -52,7 +51,6 @@ internal class AppMetadataSerializationTest { sessionTracker, am, launchCrashTracker, - contextState, NoopLogger ) appData.codeBundleId = "foo-99" From 38fd31a38c843006387b9784c35c844a54b2839c Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 15 Jul 2021 11:57:48 +0100 Subject: [PATCH 10/11] v5.10.1 --- CHANGELOG.md | 2 +- .../src/main/java/com/bugsnag/android/Notifier.kt | 2 +- gradle.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 301159dc2a..bac92b14f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## TBD +## 5.10.1 (2021-07-15) ### Bug fixes diff --git a/bugsnag-android-core/src/main/java/com/bugsnag/android/Notifier.kt b/bugsnag-android-core/src/main/java/com/bugsnag/android/Notifier.kt index 2f95382a26..5302719044 100644 --- a/bugsnag-android-core/src/main/java/com/bugsnag/android/Notifier.kt +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/Notifier.kt @@ -7,7 +7,7 @@ import java.io.IOException */ class Notifier @JvmOverloads constructor( var name: String = "Android Bugsnag Notifier", - var version: String = "5.10.0", + var version: String = "5.10.1", var url: String = "https://bugsnag.com" ) : JsonStream.Streamable { diff --git a/gradle.properties b/gradle.properties index edf316893a..7190e84d2c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ org.gradle.jvmargs=-Xmx4096m # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects org.gradle.parallel=true -VERSION_NAME=5.10.0 +VERSION_NAME=5.10.1 GROUP=com.bugsnag POM_SCM_URL=https://github.com/bugsnag/bugsnag-android POM_SCM_CONNECTION=scm:git@github.com:bugsnag/bugsnag-android.git From 7e0f05c8a073f07087958dd2689d12e3f337cbb9 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Thu, 15 Jul 2021 13:23:39 +0100 Subject: [PATCH 11/11] ci: remove unnecessary dupe step --- .buildkite/pipeline.full.yml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/.buildkite/pipeline.full.yml b/.buildkite/pipeline.full.yml index ab6011cac7..535bec7060 100644 --- a/.buildkite/pipeline.full.yml +++ b/.buildkite/pipeline.full.yml @@ -69,21 +69,6 @@ steps: concurrency: 9 concurrency_group: 'browserstack-app' - - label: ':android: NDK Instrumentation tests' - key: 'ndk-instrumentation-tests' - depends_on: - - "android-ci" - timeout_in_minutes: 30 - command: ./scripts/build-instrumentation-tests.sh && ./scripts/run-instrumentation-test.sh - plugins: - - docker-compose#v3.7.0: - run: android-ci - env: - INSTRUMENTATION_DEVICES: '["Google Pixel-7.1"]' - TEST_APK_LOCATION: 'bugsnag-plugin-android-ndk/build/outputs/apk/androidTest/debug/bugsnag-plugin-android-ndk-debug-androidTest.apk' - concurrency: 9 - concurrency_group: 'browserstack-app' - - label: ':android: Android 9 Instrumentation tests' depends_on: - "android-ci"