Skip to content

Commit 9b4a5e8

Browse files
committed
[ECO-4943] review fixes
1 parent 8d136b2 commit 9b4a5e8

File tree

3 files changed

+45
-12
lines changed

3 files changed

+45
-12
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ publish.properties
9696
/.idea/jarRepositories.xml
9797
/.idea/misc.xml
9898
/.idea/shelf
99-
/.idea/uiDesigner.xml
10099

101100
# general
102101
**/.DS_Store

chat-android/src/main/java/com/ably/chat/Messages.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ internal class DefaultMessages(
227227
channelStateListener = ChannelStateListener {
228228
if (!it.resumed) updateChannelSerialsAfterDiscontinuity()
229229
}
230-
channel.on(ChannelState.attached, channelStateListener)
230+
channel.on(channelStateListener)
231231
}
232232

233233
override fun subscribe(listener: Messages.Listener): MessagesSubscription {
@@ -247,7 +247,7 @@ internal class DefaultMessages(
247247
metadata = data.metadata,
248248
headers = pubSubMessage.extras.asJsonObject().get("headers")?.toMap() ?: mapOf(),
249249
)
250-
emitMessage(chatMessage)
250+
listener.onEvent(MessageEvent(type = MessageEventType.Created, message = chatMessage))
251251
}
252252

253253
channel.subscribe(MessageEventType.Created.eventName, messageListener)
@@ -319,10 +319,6 @@ internal class DefaultMessages(
319319
}
320320
}
321321

322-
private fun emitMessage(message: Message) {
323-
listeners.keys.forEach { listener -> listener.onEvent(MessageEvent(type = MessageEventType.Created, message = message)) }
324-
}
325-
326322
private fun updateChannelSerialsAfterDiscontinuity() {
327323
val deferredChannelSerial = DeferredValue<String>()
328324
associateWithCurrentChannelSerial(deferredChannelSerial)

chat-android/src/test/java/com/ably/chat/MessagesTest.kt

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.ably.chat
33
import com.google.gson.JsonObject
44
import io.ably.lib.realtime.AblyRealtime.Channels
55
import io.ably.lib.realtime.Channel
6+
import io.ably.lib.realtime.ChannelBase
67
import io.ably.lib.realtime.ChannelState
78
import io.ably.lib.realtime.ChannelStateListener
89
import io.ably.lib.realtime.buildChannelStateChange
@@ -14,6 +15,8 @@ import io.mockk.mockk
1415
import io.mockk.slot
1516
import io.mockk.spyk
1617
import io.mockk.verify
18+
import java.lang.reflect.Field
19+
import java.util.HashMap
1720
import kotlinx.coroutines.runBlocking
1821
import kotlinx.coroutines.test.runTest
1922
import org.junit.Assert.assertEquals
@@ -36,14 +39,10 @@ class MessagesTest {
3639
fun setUp() {
3740
every { realtimeChannels.get(any(), any()) } returns realtimeChannel
3841

39-
every { realtimeChannel.on(ChannelState.attached, capture(channelStateListenerSlot)) } answers {
42+
every { realtimeChannel.on(capture(channelStateListenerSlot)) } answers {
4043
println("Channel state listener registered")
4144
}
4245

43-
every { realtimeChannel.once(ChannelState.attached, capture(channelStateOnceSlot)) } answers {
44-
println("Channel state once listener registered")
45-
}
46-
4746
messages = DefaultMessages(
4847
roomId = "room1",
4948
realtimeChannels = realtimeChannels,
@@ -185,4 +184,43 @@ class MessagesTest {
185184

186185
assertEquals("channel-serial-2", subscription1.fromSerialProvider().await())
187186
}
187+
188+
@Test
189+
fun `subscription should invoke once for each incoming message`() = runTest {
190+
val listener1 = mockk<Messages.Listener>(relaxed = true)
191+
val listener2 = mockk<Messages.Listener>(relaxed = true)
192+
193+
messages.subscribe(listener1)
194+
195+
messages.channel.channelMulticaster.onMessage(buildDummyPubSubMessage())
196+
197+
verify(exactly = 1) { listener1.onEvent(any()) }
198+
199+
messages.subscribe(listener2)
200+
201+
messages.channel.channelMulticaster.onMessage(buildDummyPubSubMessage())
202+
203+
verify(exactly = 2) { listener1.onEvent(any()) }
204+
verify(exactly = 1) { listener2.onEvent(any()) }
205+
}
206+
}
207+
208+
private val Channel.channelMulticaster: ChannelBase.MessageListener get() {
209+
val field: Field = (ChannelBase::class.java).getDeclaredField("eventListeners")
210+
field.isAccessible = true
211+
val eventListeners = field.get(this) as HashMap<*, *>
212+
return eventListeners["message.created"] as ChannelBase.MessageListener
213+
}
214+
215+
private fun buildDummyPubSubMessage() = PubSubMessage().apply {
216+
data = JsonObject().apply {
217+
addProperty("text", "dummy text")
218+
}
219+
clientId = "dummy"
220+
timestamp = 1000L
221+
extras = MessageExtras(
222+
JsonObject().apply {
223+
addProperty("timeserial", "abcdefghij@1672531200000-123")
224+
},
225+
)
188226
}

0 commit comments

Comments
 (0)