Skip to content

Commit 1a6742c

Browse files
43jayclaude
andcommitted
review-feedback: Fix meta_length omitted from Perfetto envelope header
In SentryEnvelopeItemHeader.serialize(), meta_length was being evaluated before length. For Perfetto profile chunks, the metaLength value is only populated as a side effect of materializing the payload, which the length computation triggers. Added a regression test that drives header.serialize() directly without first touching item.data. Also renamed the existing test to describe what it actually covers (payload layout), since the old name overpromised header coverage. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 0c7f8fd commit 1a6742c

2 files changed

Lines changed: 37 additions & 2 deletions

File tree

sentry/src/main/java/io/sentry/SentryEnvelopeItemHeader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,11 +216,11 @@ public void serialize(final @NotNull ObjectWriter writer, final @NotNull ILogger
216216
if (itemCount != null) {
217217
writer.name(JsonKeys.ITEM_COUNT).value(itemCount);
218218
}
219+
writer.name(JsonKeys.LENGTH).value(getLength());
219220
final @Nullable Integer resolvedMetaLength = getMetaLength();
220221
if (resolvedMetaLength != null) {
221222
writer.name(JsonKeys.META_LENGTH).value(resolvedMetaLength);
222223
}
223-
writer.name(JsonKeys.LENGTH).value(getLength());
224224
if (unknown != null) {
225225
for (String key : unknown.keySet()) {
226226
Object value = unknown.get(key);

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

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import java.io.File
1414
import java.io.IOException
1515
import java.io.InputStreamReader
1616
import java.io.OutputStreamWriter
17+
import java.io.StringWriter
1718
import java.nio.charset.Charset
1819
import java.nio.file.Files
1920
import java.util.concurrent.Callable
@@ -24,6 +25,7 @@ import kotlin.test.assertFailsWith
2425
import kotlin.test.assertFalse
2526
import kotlin.test.assertNotNull
2627
import kotlin.test.assertNull
28+
import kotlin.test.assertTrue
2729
import org.junit.Assert.assertArrayEquals
2830
import org.junit.Rule
2931
import org.junit.rules.TemporaryFolder
@@ -598,7 +600,7 @@ class SentryEnvelopeItemTest {
598600
}
599601

600602
@Test
601-
fun `fromPerfettoProfileChunk creates single item with meta_length header`() {
603+
fun `fromPerfettoProfileChunk produces concatenated JSON+binary payload`() {
602604
val traceFile = tmpDir.newFile("trace.pftrace")
603605
val traceBytes = byteArrayOf(0x50, 0x65, 0x72, 0x66) // "Perf"
604606
traceFile.writeBytes(traceBytes)
@@ -640,6 +642,39 @@ class SentryEnvelopeItemTest {
640642
assertFalse(traceFile.exists())
641643
}
642644

645+
@Test
646+
fun `fromPerfettoProfileChunk header serializes with meta_length`() {
647+
val traceFile = tmpDir.newFile("trace.pftrace")
648+
traceFile.writeBytes(byteArrayOf(0x50, 0x65, 0x72, 0x66))
649+
650+
val profileChunk =
651+
ProfileChunk.Builder(
652+
SentryId(),
653+
SentryId(),
654+
emptyMap(),
655+
traceFile,
656+
SentryNanotimeDate(),
657+
ProfileChunk.PLATFORM_ANDROID,
658+
)
659+
.setContentType("perfetto")
660+
.build(fixture.options)
661+
662+
val item = SentryEnvelopeItem.fromPerfettoProfileChunk(profileChunk, fixture.serializer)
663+
664+
// Serialize the header without pre-materializing item.data.
665+
val sw = StringWriter()
666+
val writer = JsonObjectWriter(sw, 100)
667+
item.header.serialize(writer, mock<ILogger>())
668+
669+
val json = sw.toString()
670+
val metaLength = item.header.metaLength!!
671+
assertTrue(metaLength > 0, "expected positive meta_length, was $metaLength")
672+
assertTrue(
673+
json.contains("\"meta_length\":$metaLength"),
674+
"expected meta_length=$metaLength in header JSON, was: $json",
675+
)
676+
}
677+
643678
@Test
644679
fun `fromPerfettoProfileChunk with missing file throws`() {
645680
val traceFile = File("nonexistent.pftrace")

0 commit comments

Comments
 (0)