davidliu
Committed by GitHub

Fix NPE when streaming text (#670)

* Fix NPE in when streaming text

* spotless and changeset
  1 +---
  2 +"client-sdk-android": patch
  3 +---
  4 +
  5 +Fix NPE when streaming text
@@ -98,7 +98,9 @@ constructor( @@ -98,7 +98,9 @@ constructor(
98 textHeader = with(DataStream.TextHeader.newBuilder()) { 98 textHeader = with(DataStream.TextHeader.newBuilder()) {
99 this.operationType = info.operationType.toProto() 99 this.operationType = info.operationType.toProto()
100 this.version = info.version 100 this.version = info.version
101 - this.replyToStreamId = info.replyToStreamId 101 + if (info.replyToStreamId != null) {
  102 + this.replyToStreamId = info.replyToStreamId
  103 + }
102 this.addAllAttachedStreamIds(info.attachedStreamIds) 104 this.addAllAttachedStreamIds(info.attachedStreamIds)
103 this.generated = info.generated 105 this.generated = info.generated
104 build() 106 build()
@@ -99,4 +99,60 @@ class RoomOutgoingDataStreamMockE2ETest : MockE2ETest() { @@ -99,4 +99,60 @@ class RoomOutgoingDataStreamMockE2ETest : MockE2ETest() {
99 assertTrue(reason.isNullOrEmpty()) 99 assertTrue(reason.isNullOrEmpty())
100 } 100 }
101 } 101 }
  102 +
  103 + @Test
  104 + fun textStream() = runTest {
  105 + connect()
  106 +
  107 + // Remote participant to send data to
  108 + wsFactory.listener.onMessage(
  109 + wsFactory.ws,
  110 + TestData.PARTICIPANT_JOIN.toOkioByteString(),
  111 + )
  112 +
  113 + val text = "test_text"
  114 + val job = launch {
  115 + val sender = room.localParticipant.streamText(
  116 + StreamTextOptions(
  117 + topic = "topic",
  118 + attributes = mapOf("hello" to "world"),
  119 + streamId = "stream_id",
  120 + destinationIdentities = listOf(Participant.Identity(TestData.REMOTE_PARTICIPANT.identity)),
  121 + operationType = TextStreamInfo.OperationType.CREATE,
  122 + version = 0,
  123 + attachedStreamIds = emptyList(),
  124 + replyToStreamId = null,
  125 + totalSize = 3,
  126 + ),
  127 + )
  128 + sender.write(text)
  129 + sender.close()
  130 + }
  131 +
  132 + job.join()
  133 +
  134 + val buffers = pubDataChannel.sentBuffers
  135 +
  136 + println(buffers)
  137 + assertEquals(3, buffers.size)
  138 +
  139 + val headerPacket = LivekitModels.DataPacket.parseFrom(ByteString.copyFrom(buffers[0].data))
  140 + assertTrue(headerPacket.hasStreamHeader())
  141 +
  142 + with(headerPacket.streamHeader) {
  143 + assertTrue(hasTextHeader())
  144 + }
  145 +
  146 + val payloadPacket = LivekitModels.DataPacket.parseFrom(ByteString.copyFrom(buffers[1].data))
  147 + assertTrue(payloadPacket.hasStreamChunk())
  148 + with(payloadPacket.streamChunk) {
  149 + assertEquals(text, content.toStringUtf8())
  150 + }
  151 +
  152 + val trailerPacket = LivekitModels.DataPacket.parseFrom(ByteString.copyFrom(buffers[2].data))
  153 + assertTrue(trailerPacket.hasStreamTrailer())
  154 + with(trailerPacket.streamTrailer) {
  155 + assertTrue(reason.isNullOrEmpty())
  156 + }
  157 + }
102 } 158 }