feat(example): Add packet log and UI improvements (#4455)

Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit is contained in:
James Rich 2026-02-05 07:24:15 -06:00 committed by GitHub
parent c44d2f3268
commit f1520eb383
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 258 additions and 97 deletions

View file

@ -24,7 +24,7 @@ import okio.ByteString.Companion.toByteString
@Suppress("unused") // These are extension functions meant to be imported elsewhere
fun <T : Message<T, *>> ProtoAdapter<T>.decodeOrNull(bytes: ByteString?, logger: Logger? = null): T? {
if (bytes == null || bytes.size == 0) return null
if (bytes == null) return null
return runCatching { decode(bytes) }
.onFailure { exception -> logger?.e(exception) { "Failed to decode proto message" } }
.getOrNull()
@ -40,7 +40,7 @@ fun <T : Message<T, *>> ProtoAdapter<T>.decodeOrNull(bytes: ByteString?, logger:
* @return The decoded message, or null if bytes is null or decoding fails
*/
fun <T : Message<T, *>> ProtoAdapter<T>.decodeOrNull(bytes: ByteArray?, logger: Logger? = null): T? {
if (bytes == null || bytes.isEmpty()) return null
if (bytes == null) return null
return decodeOrNull(bytes.toByteString(), logger)
}

View file

@ -74,12 +74,14 @@ class WireExtensionsTest {
}
@Test
fun `decodeOrNull with empty ByteString returns null`() {
fun `decodeOrNull with empty ByteString returns empty message`() {
// Act
val result = Position.ADAPTER.decodeOrNull(ByteString.EMPTY, testLogger)
// Assert
assertNull(result)
assertNotNull(result)
// An empty position should have null/default values
assertNull(result!!.latitude_i)
}
@Test
@ -107,18 +109,20 @@ class WireExtensionsTest {
}
@Test
fun `decodeOrNull with empty ByteArray returns null`() {
fun `decodeOrNull with empty ByteArray returns empty message`() {
// Act
val result = Position.ADAPTER.decodeOrNull(ByteArray(0), testLogger)
// Assert
assertNull(result)
assertNotNull(result)
assertNull(result!!.latitude_i)
}
@Test
fun `decodeOrNull with invalid data returns null`() {
// Arrange
val invalidBytes = byteArrayOfInts(0xFF, 0xFF, 0xFF, 0xFF).toByteString()
// A single byte 0xFF is an invalid field tag (field 0 is reserved and tags are varints)
val invalidBytes = ByteString.of(0xFF.toByte())
// Act - should not throw, should return null
val result = Position.ADAPTER.decodeOrNull(invalidBytes, testLogger)