RoomReconnectionMockE2ETest.kt
4.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
* Copyright 2023-2024 LiveKit, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.livekit.android.room
import io.livekit.android.MockE2ETest
import io.livekit.android.mock.MockAudioStreamTrack
import io.livekit.android.room.track.LocalAudioTrack
import io.livekit.android.util.toPBByteString
import kotlinx.coroutines.ExperimentalCoroutinesApi
import livekit.LivekitRtc
import livekit.org.webrtc.PeerConnection
import org.junit.Assert
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
/**
* For tests that only target one reconnection type.
*
* Tests that cover all connection types should be put in [RoomReconnectionTypesMockE2ETest].
*/
@ExperimentalCoroutinesApi
@RunWith(RobolectricTestRunner::class)
class RoomReconnectionMockE2ETest : MockE2ETest() {
private fun reconnectWebsocket() {
wsFactory.listener.onOpen(wsFactory.ws, createOpenResponse(wsFactory.request))
val softReconnectParam = wsFactory.request.url
.queryParameter(SignalClient.CONNECT_QUERY_RECONNECT)
?.toIntOrNull()
?: 0
if (softReconnectParam == 0) {
simulateMessageFromServer(SignalClientTest.JOIN)
} else {
simulateMessageFromServer(SignalClientTest.RECONNECT)
}
}
@Test
fun softReconnectSendsSyncState() = runTest {
room.setReconnectionType(ReconnectType.FORCE_SOFT_RECONNECT)
connect()
disconnectPeerConnection()
// Wait so that the reconnect job properly starts first.
testScheduler.advanceTimeBy(1000)
reconnectWebsocket()
connectPeerConnection()
testScheduler.advanceUntilIdle()
val sentRequests = wsFactory.ws.sentRequests
val sentSyncState = sentRequests.any { requestString ->
val sentRequest = LivekitRtc.SignalRequest.newBuilder()
.mergeFrom(requestString.toPBByteString())
.build()
return@any sentRequest.hasSyncState()
}
Assert.assertTrue(sentSyncState)
}
@Test
fun softReconnectConfiguration() = runTest {
room.setReconnectionType(ReconnectType.FORCE_SOFT_RECONNECT)
connect()
disconnectPeerConnection()
// Wait so that the reconnect job properly starts first.
testScheduler.advanceTimeBy(1000)
reconnectWebsocket()
connectPeerConnection()
val rtcConfig = getSubscriberPeerConnection().rtcConfig
assertEquals(PeerConnection.IceTransportsType.RELAY, rtcConfig.iceTransportsType)
val sentIceServers = SignalClientTest.RECONNECT.reconnect.iceServersList
.map { server -> server.toWebrtc() }
assertEquals(sentIceServers, rtcConfig.iceServers)
}
@Test
fun fullReconnectRepublishesTracks() = runTest {
room.setReconnectionType(ReconnectType.FORCE_FULL_RECONNECT)
connect()
// publish track
room.localParticipant.publishAudioTrack(
LocalAudioTrack(
"",
MockAudioStreamTrack(id = SignalClientTest.LOCAL_TRACK_PUBLISHED.trackPublished.cid),
),
)
disconnectPeerConnection()
// Wait so that the reconnect job properly starts first.
testScheduler.advanceTimeBy(1000)
reconnectWebsocket()
connectPeerConnection()
testScheduler.advanceUntilIdle()
val sentRequests = wsFactory.ws.sentRequests
val sentAddTrack = sentRequests.any { requestString ->
val sentRequest = LivekitRtc.SignalRequest.newBuilder()
.mergeFrom(requestString.toPBByteString())
.build()
return@any sentRequest.hasAddTrack()
}
println(sentRequests)
Assert.assertTrue(sentAddTrack)
}
}