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: diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e077a140c..bac92b14f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 5.10.1 (2021-07-15) + +### Bug fixes + +* 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/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/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" 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 ad6ee448ad..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 @@ -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 run(): 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 = 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/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 5438014243..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,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(NativeJsonSerializeTest::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/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/java/com/bugsnag/android/ndk/VerifyUtils.kt b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/VerifyUtils.kt index bffb938ccb..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,7 +4,10 @@ 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/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/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/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/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); diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c index d5cdd6c393..2f3eff9790 100644 --- a/bugsnag-plugin-android-ndk/src/test/cpp/main.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/main.c @@ -10,115 +10,127 @@ #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(string_utils); - RUN_SUITE(serialize_utils); - RUN_SUITE(breadcrumbs); - RUN_SUITE(event_mutators); + RUN_SUITE(test_suite); GREATEST_MAIN_END(); } -TEST test_user_serialization(test_case *test_case) { - JSON_Value *event_val = json_value_init_object(); - JSON_Object *event = json_value_get_object(event_val); - 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) { +/** + * 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[] = {}; - test_case *test_case = malloc(sizeof(test_case)); - test_case->data_ptr = loadUserTestCase(num); - - char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); - test_case->expected_json = str; GREATEST_MAIN_BEGIN(); - RUN_TEST1(test_user_serialization, test_case); + RUN_TEST(test); GREATEST_MAIN_END(); } -TEST test_app_serialization(test_case *test_case) { - JSON_Value *event_val = json_value_init_object(); - JSON_Object *event = json_value_get_object(event_val); - bsg_app_info *app = test_case->data_ptr; - bsg_serialize_app(*app, event); - free(app); - return validate_serialized_json(test_case, event_val); +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeStringTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_string_utils); } -JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_AppSerializationTest_run( - JNIEnv *_env, jobject _this, jint num, jstring expected_json) { - int argc = 0; - char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); - test_case->data_ptr = loadAppTestCase(num); +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeJsonSerializeTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_json_serialization); +} - 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(); +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeStructToFileTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_struct_to_file); } -TEST test_app_meta_data_serialization(test_case *test_case) { - JSON_Value *event_val = json_value_init_object(); - JSON_Object *event = json_value_get_object(event_val); - bsg_app_info *app = test_case->data_ptr; - bsg_serialize_app_metadata(*app, event); - free(app); - return validate_serialized_json(test_case, event_val); +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeStructMigrationTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_struct_migration); } -JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_AppMetadataSerializationTest_run( - JNIEnv *_env, jobject _this, jint num, jstring expected_json) { - int argc = 0; - char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); - test_case->data_ptr = loadAppMetadataTestCase(num); +JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_NativeBreadcrumbTest_run( + JNIEnv *_env, jobject _this) { + return run_test_suite(suite_breadcrumbs); +} - 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(); +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_device_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); - bsg_device_info *device = test_case->data_ptr; - bsg_serialize_device(*device, event); - free(device); - return validate_serialized_json(test_case, event_val); + 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); } -JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_DeviceSerializationTest_run( - JNIEnv *_env, jobject _this, jint num, jstring expected_json) { - int argc = 0; - char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); - test_case->data_ptr = loadDeviceTestCase(num); +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_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); +} - 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(); +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_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); +} + +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_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) { @@ -130,158 +142,83 @@ 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 = malloc(sizeof(test_case)); - test_case->data_ptr = loadCustomMetadataTestCase(num); - - char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); - test_case->expected_json = str; - GREATEST_MAIN_BEGIN(); - RUN_TEST1(test_custom_meta_data_serialization, test_case); - GREATEST_MAIN_END(); +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 = malloc(sizeof(test_case)); - test_case->data_ptr = loadContextTestCase(num); - - char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); - test_case->expected_json = str; - GREATEST_MAIN_BEGIN(); - RUN_TEST1(test_context_serialization, test_case); - GREATEST_MAIN_END(); + 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 = malloc(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); + char *string = json_serialize_to_string(event_val); + return (*env)->NewStringUTF(env, string); } -JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_SessionSerializationTest_run( - JNIEnv *_env, jobject _this, jint num, jstring expected_json) { - int argc = 0; - char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); - test_case->data_ptr = loadSessionTestCase(num); - - char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); - test_case->expected_json = str; - GREATEST_MAIN_BEGIN(); - RUN_TEST1(test_session_serialization, test_case); - GREATEST_MAIN_END(); +JNIEXPORT jstring JNICALL +Java_com_bugsnag_android_ndk_BreadcrumbStateSerializationTest_run(JNIEnv *env, + jobject thiz) { + bugsnag_event *event = calloc(1, 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_breadcrumbs_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_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); + 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_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(); -} - -TEST test_stackframe_serialization(test_case *test_case) { - JSON_Value *event_val = json_value_init_array(); - JSON_Array *event = json_value_get_array(event_val); - bugsnag_stackframe *frame = test_case->data_ptr; - bsg_serialize_stackframe(frame, event); - free(frame); - return validate_serialized_json(test_case, event_val); -} - -JNIEXPORT int JNICALL Java_com_bugsnag_android_ndk_StackframeSerializationTest_run( - JNIEnv *_env, jobject _this, jint num, jstring expected_json) { - int argc = 0; - char *argv[] = {}; - test_case *test_case = malloc(sizeof(test_case)); - test_case->data_ptr = loadStackframeTestCase(num); - - char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); - test_case->expected_json = str; - GREATEST_MAIN_BEGIN(); - RUN_TEST1(test_stackframe_serialization, test_case); - GREATEST_MAIN_END(); -} - -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 = malloc(sizeof(test_case)); - test_case->data_ptr = loadExceptionTestCase(num); - - char *str = (char *) (*_env)->GetStringUTFChars(_env, expected_json, 0); - test_case->expected_json = str; - GREATEST_MAIN_BEGIN(); - RUN_TEST1(test_exception_serialization, test_case); - GREATEST_MAIN_END(); } diff --git a/bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c index 6553ab9228..4cfb584fe5 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); @@ -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_serializer.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_serializer.c index 951968bc27..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 = malloc(sizeof(bugsnag_user)); - strcpy(user->name, "Fenton"); - strcpy(user->email, "fenton@io.example.com"); - strcpy(user->id, "1234"); - } else { - user = malloc(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 = malloc(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 = malloc(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 = malloc(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,42 +84,36 @@ 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 = malloc(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 = malloc(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 = malloc(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(jint num) { - bugsnag_event *event = malloc(sizeof(bugsnag_event)); - - // ensure that serialization loop is covered by test +void loadBreadcrumbsTestCase(bugsnag_event *event) { + 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; + // 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"); @@ -183,11 +164,10 @@ bugsnag_event * loadBreadcrumbsTestCase(jint num) { 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 *data = malloc(sizeof(bugsnag_stackframe)); +bugsnag_stackframe *loadStackframeTestCase() { + bugsnag_stackframe *data = calloc(1, sizeof(bugsnag_stackframe)); data->frame_address = 0x20000000; data->symbol_address = 0x16000000; data->load_address = 0x12000000; @@ -197,8 +177,8 @@ bugsnag_stackframe * loadStackframeTestCase(jint num) { return data; } -bsg_error * loadExceptionTestCase(jint num) { - bsg_error *data = malloc(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"); @@ -209,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 4f29f6796e..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(jint num); -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); 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..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); - 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(report->app.package_name, "com.example.foo"); - strcpy(report->app.version_name, "2.5"); + event->handled_events = 1; + event->unhandled_events = 1; + strcpy(event->session_id, "f1ab"); + strcpy(event->session_start, "2019-03-19T12:58:19+00:00"); - bugsnag_breadcrumb_v1 *crumb1 = &report->breadcrumbs[0]; + strcpy(event->notifier.version, "1.0"); + strcpy(event->notifier.url, "bugsnag.com"); + strcpy(event->notifier.name, "Test Notifier"); + + 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(event->app.package_name, "com.example.foo"); + strcpy(event->app.version_name, "2.5"); + + 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; } @@ -192,13 +349,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 @@ -211,14 +368,14 @@ 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(); } 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 +389,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 +409,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 +433,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 +487,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 +519,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 +675,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; @@ -553,14 +710,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 +721,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); 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