Skip to content

Commit 356ddda

Browse files
committed
mark consumed afterwards instead of before
1 parent d710cca commit 356ddda

2 files changed

Lines changed: 72 additions & 7 deletions

File tree

sentry/src/main/java/io/sentry/JsonObjectReader.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,9 @@ public JsonObjectReader(Reader in) {
5656

5757
@Override
5858
public float nextFloat() throws IOException {
59+
final double value = jsonReader.nextDouble();
5960
markValueConsumed();
60-
return (float) jsonReader.nextDouble();
61+
return (float) value;
6162
}
6263

6364
@Override
@@ -302,38 +303,43 @@ public boolean hasNext() throws IOException {
302303

303304
@Override
304305
public int nextInt() throws IOException {
306+
final int value = jsonReader.nextInt();
305307
markValueConsumed();
306-
return jsonReader.nextInt();
308+
return value;
307309
}
308310

309311
@Override
310312
public long nextLong() throws IOException {
313+
final long value = jsonReader.nextLong();
311314
markValueConsumed();
312-
return jsonReader.nextLong();
315+
return value;
313316
}
314317

315318
@Override
316319
public String nextString() throws IOException {
320+
final String value = jsonReader.nextString();
317321
markValueConsumed();
318-
return jsonReader.nextString();
322+
return value;
319323
}
320324

321325
@Override
322326
public boolean nextBoolean() throws IOException {
327+
final boolean value = jsonReader.nextBoolean();
323328
markValueConsumed();
324-
return jsonReader.nextBoolean();
329+
return value;
325330
}
326331

327332
@Override
328333
public double nextDouble() throws IOException {
334+
final double value = jsonReader.nextDouble();
329335
markValueConsumed();
330-
return jsonReader.nextDouble();
336+
return value;
331337
}
332338

333339
@Override
334340
public void nextNull() throws IOException {
335-
markValueConsumed();
336341
jsonReader.nextNull();
342+
markValueConsumed();
337343
}
338344

339345
@Override

sentry/src/test/java/io/sentry/JsonObjectReaderTest.kt

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,19 @@ class JsonObjectReaderTest {
5151
nextName()
5252
}
5353

54+
private fun <T> assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
55+
badValue: String,
56+
goodValue: String,
57+
expectedValue: T,
58+
deserializer: JsonDeserializer<T>,
59+
) {
60+
val actual =
61+
getValuesReader("{\"bad\": $badValue, \"good\": $goodValue}")
62+
.nextMapOrNull(fixture.logger, deserializer)
63+
64+
assertEquals(mapOf("good" to expectedValue), actual)
65+
}
66+
5467
// nextStringOrNull
5568

5669
@Test
@@ -313,6 +326,52 @@ class JsonObjectReaderTest {
313326
assertEquals(emptyMap(), actual)
314327
}
315328

329+
@Test(timeout = 1000L)
330+
fun `nextMapOrNull recovers after failed primitive reads`() {
331+
assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
332+
badValue = "true",
333+
goodValue = "2",
334+
expectedValue = 2,
335+
deserializer = JsonDeserializer { reader, _ -> reader.nextInt() },
336+
)
337+
assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
338+
badValue = "true",
339+
goodValue = "2",
340+
expectedValue = 2L,
341+
deserializer = JsonDeserializer { reader, _ -> reader.nextLong() },
342+
)
343+
assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
344+
badValue = "true",
345+
goodValue = "\"two\"",
346+
expectedValue = "two",
347+
deserializer = JsonDeserializer { reader, _ -> reader.nextString() },
348+
)
349+
assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
350+
badValue = "1",
351+
goodValue = "false",
352+
expectedValue = false,
353+
deserializer = JsonDeserializer { reader, _ -> reader.nextBoolean() },
354+
)
355+
assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
356+
badValue = "true",
357+
goodValue = "2.5",
358+
expectedValue = 2.5,
359+
deserializer = JsonDeserializer { reader, _ -> reader.nextDouble() },
360+
)
361+
assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
362+
badValue = "true",
363+
goodValue = "null",
364+
expectedValue = Unit,
365+
deserializer = JsonDeserializer { reader, _ -> reader.nextNull() },
366+
)
367+
assertNextMapOrNullRecoversAfterFailedPrimitiveRead(
368+
badValue = "true",
369+
goodValue = "2.5",
370+
expectedValue = 2.5f,
371+
deserializer = JsonDeserializer { reader, _ -> reader.nextFloat() },
372+
)
373+
}
374+
316375
@Test(timeout = 1000L)
317376
fun `nextMapOrNull keeps values before a failing value`() {
318377
val actual =

0 commit comments

Comments
 (0)