Skip to content

Commit 29b2ff0

Browse files
committed
Fix tests
1 parent 6ecd31e commit 29b2ff0

File tree

2 files changed

+75
-85
lines changed

2 files changed

+75
-85
lines changed

sentry-android-core/src/main/java/io/sentry/android/core/ApplicationExitInfoEventProcessor.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -730,15 +730,17 @@ private void setDefaultAnrFingerprint(
730730
// sentry does not yet have a capability to provide default server-side fingerprint rules,
731731
// so we're doing this on the SDK side to group background and foreground ANRs separately
732732
// even if they have similar stacktraces.
733-
if (event.getFingerprints() == null) {
734-
if (options.isEnableAnrProfiling() && hasOnlySystemFrames(event)) {
735-
// If profiling did not identify any app frames, we want to statically group these events
736-
// to avoid ANR noise due to {{ default }} stacktrace grouping
737-
event.setFingerprints(
738-
Arrays.asList(
739-
"system-frames-only-anr", isBackgroundAnr ? "background-anr" : "foreground-anr"));
740-
return;
741-
}
733+
if (event.getFingerprints() != null) {
734+
return;
735+
}
736+
737+
if (options.isEnableAnrProfiling() && hasOnlySystemFrames(event)) {
738+
// If profiling did not identify any app frames, we want to statically group these events
739+
// to avoid ANR noise due to {{ default }} stacktrace grouping
740+
event.setFingerprints(
741+
Arrays.asList(
742+
"system-frames-only-anr", isBackgroundAnr ? "background-anr" : "foreground-anr"));
743+
} else {
742744
event.setFingerprints(
743745
Arrays.asList("{{ default }}", isBackgroundAnr ? "background-anr" : "foreground-anr"));
744746
}

sentry-android-core/src/test/java/io/sentry/android/core/anr/AnrStackTraceConverterTest.kt

Lines changed: 64 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -6,50 +6,44 @@ import org.junit.Test
66
class AnrStackTraceConverterTest {
77
@Test
88
fun testConvertSimpleStackTrace() {
9-
// Create a simple stack trace
109
val elements =
1110
arrayOf(
1211
StackTraceElement("com.example.MyClass", "method1", "MyClass.java", 42),
1312
StackTraceElement("com.example.AnotherClass", "method2", "AnotherClass.java", 100),
1413
)
1514

1615
val anrStackTrace = AnrStackTrace(1000, elements)
17-
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList<AnrStackTrace?>()
16+
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList()
1817
anrStackTraces.add(anrStackTrace)
1918

20-
// Convert to profile
2119
val profile = StackTraceConverter.convert(AnrProfile(anrStackTraces))
2220

23-
// Verify profile structure
2421
Assert.assertNotNull(profile)
25-
Assert.assertEquals(1, profile.getSamples().size.toLong())
26-
Assert.assertEquals(2, profile.getFrames().size.toLong())
27-
Assert.assertEquals(1, profile.getStacks().size.toLong())
28-
29-
// Verify frames
30-
val frame0 = profile.getFrames().get(0)
31-
Assert.assertEquals("MyClass.java", frame0.getFilename())
32-
Assert.assertEquals("method1", frame0.getFunction())
33-
Assert.assertEquals("com.example.MyClass", frame0.getModule())
34-
Assert.assertEquals(42, frame0.getLineno())
35-
36-
val frame1 = profile.getFrames().get(1)
37-
Assert.assertEquals("AnotherClass.java", frame1.getFilename())
38-
Assert.assertEquals("method2", frame1.getFunction())
39-
Assert.assertEquals("com.example.AnotherClass", frame1.getModule())
40-
Assert.assertEquals(100, frame1.getLineno())
41-
42-
// Verify stack
43-
val stack = profile.getStacks().get(0)
44-
Assert.assertEquals(2, stack.size.toLong())
45-
Assert.assertEquals(0, (stack.get(0) as Int).toLong())
46-
Assert.assertEquals(1, (stack.get(1) as Int).toLong())
47-
48-
// Verify sample
49-
val sample = profile.getSamples().get(0)
50-
Assert.assertEquals(0, sample.getStackId().toLong())
51-
Assert.assertEquals("0", sample.getThreadId())
52-
Assert.assertEquals(1.0, sample.getTimestamp(), 0.001) // 1000ms = 1s
22+
Assert.assertEquals(1, profile.samples.size)
23+
Assert.assertEquals(2, profile.frames.size)
24+
Assert.assertEquals(1, profile.stacks.size)
25+
26+
val frame0 = profile.frames[0]
27+
Assert.assertEquals("MyClass.java", frame0.filename)
28+
Assert.assertEquals("method1", frame0.function)
29+
Assert.assertEquals("com.example.MyClass", frame0.module)
30+
Assert.assertEquals(42, frame0.lineno)
31+
32+
val frame1 = profile.frames[1]
33+
Assert.assertEquals("AnotherClass.java", frame1.filename)
34+
Assert.assertEquals("method2", frame1.function)
35+
Assert.assertEquals("com.example.AnotherClass", frame1.module)
36+
Assert.assertEquals(100, frame1.lineno)
37+
38+
val stack = profile.stacks[0]
39+
Assert.assertEquals(2, stack.size)
40+
Assert.assertEquals(0, (stack[0] as Int))
41+
Assert.assertEquals(1, (stack[1] as Int))
42+
43+
val sample = profile.samples[0]
44+
Assert.assertEquals(0, sample.stackId)
45+
Assert.assertEquals("0", sample.threadId)
46+
Assert.assertEquals(1.0, sample.timestamp, 0.001) // 1000ms = 1s
5347
}
5448

5549
@Test
@@ -67,27 +61,27 @@ class AnrStackTraceConverterTest {
6761
StackTraceElement("com.example.ThirdClass", "method3", "ThirdClass.java", 200),
6862
)
6963

70-
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList<AnrStackTrace?>()
64+
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList()
7165
anrStackTraces.add(AnrStackTrace(1000, elements1))
7266
anrStackTraces.add(AnrStackTrace(2000, elements2))
7367

7468
// Convert to profile
7569
val profile = StackTraceConverter.convert(AnrProfile(anrStackTraces))
7670

7771
// Should have 3 frames total (dedup removes duplicate)
78-
Assert.assertEquals(3, profile.getFrames().size.toLong())
72+
Assert.assertEquals(3, profile.frames.size)
7973

8074
// First sample uses stack [0, 1]
81-
val stack1 = profile.getStacks().get(0)
82-
Assert.assertEquals(2, stack1.size.toLong())
83-
Assert.assertEquals(0, (stack1.get(0) as Int).toLong())
84-
Assert.assertEquals(1, (stack1.get(1) as Int).toLong())
75+
val stack1 = profile.stacks[0]
76+
Assert.assertEquals(2, stack1.size)
77+
Assert.assertEquals(0, (stack1[0] as Int))
78+
Assert.assertEquals(1, (stack1[1] as Int))
8579

8680
// Second sample uses stack [0, 2] (frame 0 reused)
87-
val stack2 = profile.getStacks().get(1)
88-
Assert.assertEquals(2, stack2.size.toLong())
89-
Assert.assertEquals(0, (stack2.get(0) as Int).toLong())
90-
Assert.assertEquals(2, (stack2.get(1) as Int).toLong())
81+
val stack2 = profile.stacks[1]
82+
Assert.assertEquals(2, stack2.size)
83+
Assert.assertEquals(0, (stack2[0] as Int))
84+
Assert.assertEquals(2, (stack2[1] as Int))
9185
}
9286

9387
@Test
@@ -99,111 +93,105 @@ class AnrStackTraceConverterTest {
9993
StackTraceElement("com.example.AnotherClass", "method2", "AnotherClass.java", 100),
10094
)
10195

102-
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList<AnrStackTrace?>()
96+
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList()
10397
anrStackTraces.add(AnrStackTrace(1000, elements))
10498
anrStackTraces.add(AnrStackTrace(2000, elements.clone()))
10599

106-
// Convert to profile
107100
val profile = StackTraceConverter.convert(AnrProfile(anrStackTraces))
108101

109102
// Should have 2 frames and 1 stack (dedup stack)
110-
Assert.assertEquals(2, profile.getFrames().size.toLong())
111-
Assert.assertEquals(1, profile.getStacks().size.toLong())
103+
Assert.assertEquals(2, profile.frames.size)
104+
Assert.assertEquals(1, profile.stacks.size)
112105

113106
// Both samples should reference the same stack
114-
Assert.assertEquals(0, profile.getSamples().get(0).getStackId().toLong())
115-
Assert.assertEquals(0, profile.getSamples().get(1).getStackId().toLong())
107+
Assert.assertEquals(0, profile.samples[0].stackId)
108+
Assert.assertEquals(0, profile.samples[1].stackId)
116109
}
117110

118111
@Test
119112
fun testTimestampConversion() {
120113
val elements = arrayOf(StackTraceElement("com.example.MyClass", "method1", "MyClass.java", 42))
121114

122-
// Test various timestamps
123115
val timestampsMs = longArrayOf(1000, 1500, 5000)
124-
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList<AnrStackTrace?>()
116+
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList()
125117

126118
for (ts in timestampsMs) {
127119
anrStackTraces.add(AnrStackTrace(ts, elements))
128120
}
129121

130122
val profile = StackTraceConverter.convert(AnrProfile(anrStackTraces))
131123

132-
// Verify timestamps are converted from ms to seconds
133-
Assert.assertEquals(1.0, profile.getSamples().get(0).getTimestamp(), 0.001)
134-
Assert.assertEquals(1.5, profile.getSamples().get(1).getTimestamp(), 0.001)
135-
Assert.assertEquals(5.0, profile.getSamples().get(2).getTimestamp(), 0.001)
124+
Assert.assertEquals(1.0, profile.samples[0].timestamp, 0.001)
125+
Assert.assertEquals(1.5, profile.samples[1].timestamp, 0.001)
126+
Assert.assertEquals(5.0, profile.samples[2].timestamp, 0.001)
136127
}
137128

138129
@Test
139130
fun testNativeMethodHandling() {
140-
// Create a native method stack trace
141131
val elements = arrayOf(StackTraceElement("java.lang.System", "doSomething", null, -2))
142132

143-
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList<AnrStackTrace?>()
133+
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList()
144134
anrStackTraces.add(AnrStackTrace(1000, elements))
145135

146136
val profile = StackTraceConverter.convert(AnrProfile(anrStackTraces))
147137

148-
val frame = profile.getFrames().get(0)
138+
val frame = profile.frames[0]
149139
Assert.assertTrue(frame.isNative()!!)
150140
}
151141

152142
@Test
153143
fun testThreadMetadata() {
154144
val elements = arrayOf(StackTraceElement("com.example.MyClass", "method1", "MyClass.java", 42))
155145

156-
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList<AnrStackTrace?>()
146+
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList()
157147
anrStackTraces.add(AnrStackTrace(1000, elements))
158148

159149
val profile = StackTraceConverter.convert(AnrProfile(anrStackTraces))
160150

161-
// Verify thread metadata
162-
val threadMetadata = profile.getThreadMetadata().get("0")
151+
val threadMetadata = profile.threadMetadata["0"]
163152
Assert.assertNotNull(threadMetadata)
164-
Assert.assertEquals("main", threadMetadata!!.getName())
165-
Assert.assertEquals(Thread.NORM_PRIORITY.toLong(), threadMetadata.getPriority().toLong())
153+
Assert.assertEquals("main", threadMetadata!!.name)
154+
Assert.assertEquals(Thread.NORM_PRIORITY, threadMetadata.priority)
166155
}
167156

168157
@Test
169158
fun testEmptyStackTraceList() {
170-
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList<AnrStackTrace?>()
159+
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList()
171160

172161
val profile = StackTraceConverter.convert(AnrProfile(anrStackTraces))
173162

174-
// Should return empty profile with thread metadata
175163
Assert.assertNotNull(profile)
176-
Assert.assertEquals(0, profile.getSamples().size.toLong())
177-
Assert.assertEquals(0, profile.getFrames().size.toLong())
178-
Assert.assertEquals(0, profile.getStacks().size.toLong())
179-
Assert.assertTrue(profile.getThreadMetadata().containsKey("0"))
164+
Assert.assertEquals(0, profile.samples.size)
165+
Assert.assertEquals(0, profile.frames.size)
166+
Assert.assertEquals(0, profile.stacks.size)
167+
Assert.assertTrue(profile.threadMetadata.containsKey("0"))
180168
}
181169

182170
@Test
183171
fun testSampleProperties() {
184172
val elements = arrayOf(StackTraceElement("com.example.MyClass", "method1", "MyClass.java", 42))
185173

186-
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList<AnrStackTrace?>()
174+
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList()
187175
anrStackTraces.add(AnrStackTrace(12345, elements))
188176

189177
val profile = StackTraceConverter.convert(AnrProfile(anrStackTraces))
190178

191-
val sample = profile.getSamples().get(0)
192-
Assert.assertEquals("0", sample.getThreadId())
193-
Assert.assertEquals(0, sample.getStackId().toLong())
194-
Assert.assertEquals(12.345, sample.getTimestamp(), 0.001)
179+
val sample = profile.samples[0]
180+
Assert.assertEquals("0", sample.threadId)
181+
Assert.assertEquals(0, sample.stackId)
182+
Assert.assertEquals(12.345, sample.timestamp, 0.001)
195183
}
196184

197185
@Test
198186
fun testInAppFrameFlag() {
199187
val elements = arrayOf(StackTraceElement("com.example.MyClass", "method1", "MyClass.java", 42))
200188

201-
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList<AnrStackTrace?>()
189+
val anrStackTraces: MutableList<AnrStackTrace?> = ArrayList()
202190
anrStackTraces.add(AnrStackTrace(1000, elements))
203191

204192
val profile = StackTraceConverter.convert(AnrProfile(anrStackTraces))
205193

206-
val frame = profile.getFrames().get(0)
207-
Assert.assertTrue(frame.isInApp()!!)
194+
val frame = profile.frames[0]
195+
Assert.assertNull(frame.isInApp())
208196
}
209197
}

0 commit comments

Comments
 (0)