|
1 | 1 | package com.bugsnag.android |
2 | 2 |
|
3 | 3 | import org.junit.Assert.assertEquals |
| 4 | +import org.junit.Assert.assertNull |
4 | 5 | import org.junit.Assert.assertTrue |
5 | | -import org.junit.Before |
6 | 6 | import org.junit.Test |
7 | 7 | import java.util.HashMap |
8 | 8 |
|
9 | 9 | class ErrorDeserializerTest { |
10 | 10 |
|
11 | | - private val map = HashMap<String, Any>() |
12 | | - |
13 | | - /** |
14 | | - * Generates a map for verifying the serializer |
15 | | - */ |
16 | | - @Before |
17 | | - fun setup() { |
| 11 | + private fun createErrorMap() = HashMap<String, Any>().apply { |
18 | 12 | val frame = HashMap<String, Any>() |
19 | 13 | frame["method"] = "foo()" |
20 | 14 | frame["file"] = "Bar.kt" |
21 | 15 | frame["lineNumber"] = 29 |
22 | 16 | frame["inProject"] = true |
23 | | - map["stacktrace"] = listOf(frame) |
24 | | - map["errorClass"] = "BrowserException" |
25 | | - map["errorMessage"] = "whoops!" |
26 | | - map["type"] = "reactnativejs" |
| 17 | + this["stacktrace"] = listOf(frame) |
| 18 | + this["errorClass"] = "BrowserException" |
| 19 | + this["errorMessage"] = "whoops!" |
| 20 | + this["type"] = "reactnativejs" |
27 | 21 | } |
28 | 22 |
|
| 23 | + private fun createNativeStackFrames(): List<Map<String, Any>> = listOf( |
| 24 | + mapOf( |
| 25 | + "methodName" to "nativeMethod1", |
| 26 | + "lineNumber" to 100, |
| 27 | + "fileName" to "Native.java", |
| 28 | + "className" to "com.reactnativetest.Native" |
| 29 | + ), |
| 30 | + mapOf( |
| 31 | + "methodName" to "nativeMethod2", |
| 32 | + "lineNumber" to 200, |
| 33 | + "fileName" to "NativeHelper.kt", |
| 34 | + "className" to "com.example.NativeHelper" |
| 35 | + ) |
| 36 | + ) |
| 37 | + |
29 | 38 | @Test |
30 | | - fun deserialize() { |
31 | | - val error = ErrorDeserializer(StackframeDeserializer(), object : Logger {}).deserialize(map) |
| 39 | + fun deserializeWithoutNativeStack() { |
| 40 | + val map = createErrorMap() |
| 41 | + val packages = listOf("com.reactnativetest") |
| 42 | + val cfg = TestData.generateConfig() |
| 43 | + val nativeStackDeserializer = NativeStackDeserializer(packages, cfg) |
| 44 | + val errorDeserializer = ErrorDeserializer( |
| 45 | + StackframeDeserializer(), |
| 46 | + nativeStackDeserializer, |
| 47 | + object : Logger {} |
| 48 | + ) |
| 49 | + val error = errorDeserializer.deserialize(map) |
| 50 | + |
32 | 51 | assertEquals("BrowserException", error.errorClass) |
33 | 52 | assertEquals("whoops!", error.errorMessage) |
34 | 53 | assertEquals(ErrorType.REACTNATIVEJS, error.type) |
| 54 | + assertEquals(1, error.stacktrace.size) |
| 55 | + |
| 56 | + val jsFrame = error.stacktrace[0] |
| 57 | + assertEquals("foo()", jsFrame.method) |
| 58 | + assertEquals("Bar.kt", jsFrame.file) |
| 59 | + assertEquals(29, jsFrame.lineNumber) |
| 60 | + assertTrue(jsFrame.inProject as Boolean) |
| 61 | + } |
| 62 | + |
| 63 | + @Test |
| 64 | + fun deserializeWithNativeStack() { |
| 65 | + val map = createErrorMap() |
| 66 | + map["nativeStack"] = createNativeStackFrames() |
| 67 | + |
| 68 | + val packages = listOf("com.reactnativetest") |
| 69 | + val cfg = TestData.generateConfig() |
| 70 | + val nativeStackDeserializer = NativeStackDeserializer(packages, cfg) |
| 71 | + val errorDeserializer = ErrorDeserializer(StackframeDeserializer(), nativeStackDeserializer, object : Logger {}) |
| 72 | + val error = errorDeserializer.deserialize(map) |
| 73 | + |
| 74 | + assertEquals("BrowserException", error.errorClass) |
| 75 | + assertEquals("whoops!", error.errorMessage) |
| 76 | + assertEquals(ErrorType.REACTNATIVEJS, error.type) |
| 77 | + |
| 78 | + // Should have 3 frames total: 2 native frames + 1 JS frame |
| 79 | + assertEquals(3, error.stacktrace.size) |
| 80 | + |
| 81 | + // Native frames should be at the start (indices 0 and 1) |
| 82 | + val firstNativeFrame = error.stacktrace[0] |
| 83 | + assertEquals("com.reactnativetest.Native.nativeMethod1", firstNativeFrame.method) |
| 84 | + assertEquals("Native.java", firstNativeFrame.file) |
| 85 | + assertEquals(100, firstNativeFrame.lineNumber) |
| 86 | + assertTrue(firstNativeFrame.inProject!!) |
| 87 | + assertEquals(ErrorType.ANDROID, firstNativeFrame.type) |
| 88 | + |
| 89 | + val secondNativeFrame = error.stacktrace[1] |
| 90 | + assertEquals("com.example.NativeHelper.nativeMethod2", secondNativeFrame.method) |
| 91 | + assertEquals("NativeHelper.kt", secondNativeFrame.file) |
| 92 | + assertEquals(200, secondNativeFrame.lineNumber) |
| 93 | + assertNull(secondNativeFrame.inProject) |
| 94 | + assertEquals(ErrorType.ANDROID, secondNativeFrame.type) |
35 | 95 |
|
36 | | - val frame = error.stacktrace[0] |
37 | | - assertEquals("foo()", frame.method) |
38 | | - assertEquals("Bar.kt", frame.file) |
39 | | - assertEquals(29, frame.lineNumber) |
40 | | - assertTrue(frame.inProject as Boolean) |
| 96 | + // Original JS frame should now be at index 2 |
| 97 | + val jsFrame = error.stacktrace[2] |
| 98 | + assertEquals("foo()", jsFrame.method) |
| 99 | + assertEquals("Bar.kt", jsFrame.file) |
| 100 | + assertEquals(29, jsFrame.lineNumber) |
| 101 | + assertTrue(jsFrame.inProject as Boolean) |
41 | 102 | } |
42 | 103 | } |
0 commit comments