@@ -5,12 +5,10 @@ import io.ably.lib.realtime.Channel
55import io.ably.lib.realtime.ChannelState
66import io.ably.lib.realtime.ChannelStateListener
77import io.ably.lib.realtime.CompletionListener
8- import io.ably.lib.transport.ConnectionManager
8+ import io.ably.lib.realtime.ConnectionEvent
9+ import io.ably.lib.realtime.ConnectionStateListener
910import io.ably.lib.types.*
10- import io.mockk.every
11- import io.mockk.mockk
12- import io.mockk.slot
13- import io.mockk.verify
11+ import io.mockk.*
1412import kotlinx.coroutines.test.runTest
1513import org.junit.Assert.*
1614import org.junit.Test
@@ -21,13 +19,10 @@ class HelpersTest {
2119 // sendAsync
2220 @Test
2321 fun testSendAsyncShouldQueueAccordingToClientOptions () = runTest {
24- val adapter = mockk< ObjectsAdapter >(relaxed = true )
25- val connManager = mockk< ConnectionManager >(relaxed = true )
22+ val adapter = getMockObjectsAdapter( )
23+ val connManager = adapter.connectionManager
2624 val clientOptions = ClientOptions ().apply { queueMessages = false }
2725
28- every { adapter.connection } returns mockk(relaxed = true ) {
29- setPrivateField(" connectionManager" , connManager)
30- }
3126 every { adapter.clientOptions } returns clientOptions
3227
3328 every { connManager.send(any(), any(), any()) } answers {
@@ -46,13 +41,10 @@ class HelpersTest {
4641
4742 @Test
4843 fun testSendAsyncErrorPropagatesAblyException () = runTest {
49- val adapter = mockk< ObjectsAdapter >(relaxed = true )
50- val connManager = mockk< ConnectionManager >(relaxed = true )
44+ val adapter = getMockObjectsAdapter( )
45+ val connManager = adapter.connectionManager
5146 val clientOptions = ClientOptions ()
5247
53- every { adapter.connection } returns mockk(relaxed = true ) {
54- setPrivateField(" connectionManager" , connManager)
55- }
5648 every { adapter.clientOptions } returns clientOptions
5749
5850 every { connManager.send(any(), any(), any()) } answers {
@@ -67,15 +59,59 @@ class HelpersTest {
6759 assertEquals(40000 , ex.errorInfo.code)
6860 }
6961
62+ @Test
63+ fun testRetrieveObjectsGCGracePeriodImmediateInvokesBlock () {
64+ val adapter = getMockObjectsAdapter()
65+ val connManager = adapter.connectionManager
66+ connManager.setPrivateField(" objectsGCGracePeriod" , 123L )
67+
68+ var value: Long? = null
69+ adapter.retrieveObjectsGCGracePeriod { v -> value = v }
70+
71+ assertEquals(123L , value)
72+ verify(exactly = 0 ) { adapter.connection.once(ConnectionEvent .connected, any()) }
73+ }
74+
75+ @Test
76+ fun testRetrieveObjectsGCGracePeriodDeferredInvokesOnConnectedWithValue () {
77+ val adapter = getMockObjectsAdapter()
78+ val connManager = adapter.connectionManager
79+
80+ var value: Long? = null
81+ every { adapter.connection.once(ConnectionEvent .connected, any()) } answers {
82+ val listener = secondArg<ConnectionStateListener >()
83+ connManager.setPrivateField(" objectsGCGracePeriod" , 456L )
84+ listener.onConnectionStateChanged(mockk(relaxed = true ))
85+ }
86+
87+ adapter.retrieveObjectsGCGracePeriod { v -> value = v }
88+
89+ assertEquals(456L , value)
90+ verify(exactly = 1 ) { adapter.connection.once(ConnectionEvent .connected, any()) }
91+ }
92+
93+ @Test
94+ fun testRetrieveObjectsGCGracePeriodDeferredInvokesOnConnectedWithNull () {
95+ val adapter = getMockObjectsAdapter()
96+
97+ var value: Long? = null
98+ every { adapter.connection.once(ConnectionEvent .connected, any()) } answers {
99+ val listener = secondArg<ConnectionStateListener >()
100+ listener.onConnectionStateChanged(mockk(relaxed = true ))
101+ }
102+
103+ adapter.retrieveObjectsGCGracePeriod { v -> value = v }
104+
105+ assertNull(value)
106+ verify(exactly = 1 ) { adapter.connection.once(ConnectionEvent .connected, any()) }
107+ }
108+
70109 @Test
71110 fun testSendAsyncThrowsWhenConnectionManagerThrows () = runTest {
72- val adapter = mockk< ObjectsAdapter >(relaxed = true )
73- val connManager = mockk< ConnectionManager >(relaxed = true )
111+ val adapter = getMockObjectsAdapter( )
112+ val connManager = adapter.connectionManager
74113 val clientOptions = ClientOptions ()
75114
76- every { adapter.connection } returns mockk(relaxed = true ) {
77- setPrivateField(" connectionManager" , connManager)
78- }
79115 every { adapter.clientOptions } returns clientOptions
80116
81117 every { connManager.send(any(), any(), any()) } throws RuntimeException (" send failed hard" )
@@ -251,25 +287,25 @@ class HelpersTest {
251287 verify(exactly = 1 ) { channel.once(any()) }
252288 }
253289
254- @Test
255- fun testEnsureAttachedAttachingButReceivesNonAttachedEmitsError () = runTest {
256- val adapter = mockk<ObjectsAdapter >(relaxed = true )
257- val channel = mockk<Channel >(relaxed = true )
258- every { adapter.getChannel(" ch" ) } returns channel
259- channel.state = ChannelState .attaching
260- every { channel.once(any()) } answers {
261- val listener = firstArg<ChannelStateListener >()
262- val stateChange = mockk<ChannelStateListener .ChannelStateChange >(relaxed = true ) {
263- setPrivateField(" current" , ChannelState .suspended)
264- setPrivateField(" reason" , clientError(" Not attached" ).errorInfo)
265- }
266- listener.onChannelStateChanged(stateChange)
267- }
268- val ex = assertFailsWith<AblyException > { adapter.ensureAttached(" ch" ) }
269- assertEquals(ErrorCode .ChannelStateError .code, ex.errorInfo.code)
270- assertTrue(ex.errorInfo.message.contains(" Not attached" ))
271- verify(exactly = 1 ) { channel.once(any()) }
272- }
290+ @Test
291+ fun testEnsureAttachedAttachingButReceivesNonAttachedEmitsError () = runTest {
292+ val adapter = mockk<ObjectsAdapter >(relaxed = true )
293+ val channel = mockk<Channel >(relaxed = true )
294+ every { adapter.getChannel(" ch" ) } returns channel
295+ channel.state = ChannelState .attaching
296+ every { channel.once(any()) } answers {
297+ val listener = firstArg<ChannelStateListener >()
298+ val stateChange = mockk<ChannelStateListener .ChannelStateChange >(relaxed = true ) {
299+ setPrivateField(" current" , ChannelState .suspended)
300+ setPrivateField(" reason" , clientError(" Not attached" ).errorInfo)
301+ }
302+ listener.onChannelStateChanged(stateChange)
303+ }
304+ val ex = assertFailsWith<AblyException > { adapter.ensureAttached(" ch" ) }
305+ assertEquals(ErrorCode .ChannelStateError .code, ex.errorInfo.code)
306+ assertTrue(ex.errorInfo.message.contains(" Not attached" ))
307+ verify(exactly = 1 ) { channel.once(any()) }
308+ }
273309
274310 @Test
275311 fun testEnsureAttachedThrowsForInvalidState () = runTest {
@@ -350,11 +386,8 @@ class HelpersTest {
350386 // throwIfUnpublishableState
351387 @Test
352388 fun testThrowIfUnpublishableStateInactiveConnection () {
353- val adapter = mockk<ObjectsAdapter >(relaxed = true )
354- val connManager = mockk<ConnectionManager >(relaxed = true )
355- every { adapter.connection } returns mockk(relaxed = true ) {
356- setPrivateField(" connectionManager" , connManager)
357- }
389+ val adapter = getMockObjectsAdapter()
390+ val connManager = adapter.connectionManager
358391 every { connManager.isActive } returns false
359392 every { connManager.stateErrorInfo } returns serverError(" not active" ).errorInfo
360393
@@ -365,11 +398,8 @@ class HelpersTest {
365398
366399 @Test
367400 fun testThrowIfUnpublishableStateChannelFailed () {
368- val adapter = mockk<ObjectsAdapter >(relaxed = true )
369- val connManager = mockk<ConnectionManager >(relaxed = true )
370- every { adapter.connection } returns mockk(relaxed = true ) {
371- setPrivateField(" connectionManager" , connManager)
372- }
401+ val adapter = getMockObjectsAdapter()
402+ val connManager = adapter.connectionManager
373403 every { connManager.isActive } returns true
374404 val channel = mockk<Channel >(relaxed = true )
375405 every { adapter.getChannel(" ch" ) } returns channel
0 commit comments