David Liu

tests for signal client message flow

... ... @@ -4,15 +4,19 @@ import com.google.protobuf.util.JsonFormat
import io.livekit.android.util.toOkioByteString
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.async
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.TestCoroutineScope
import kotlinx.coroutines.test.runBlockingTest
import kotlinx.serialization.json.Json
import livekit.LivekitRtc
import okhttp3.*
import org.junit.After
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.mockito.Mockito
import org.mockito.kotlin.argThat
import org.webrtc.SessionDescription
@ExperimentalCoroutinesApi
class SignalClientTest {
... ... @@ -22,6 +26,9 @@ class SignalClientTest {
lateinit var listener: SignalClient.Listener
lateinit var okHttpClient: OkHttpClient
lateinit var coroutineDispatcher: TestCoroutineDispatcher
lateinit var coroutineScope: TestCoroutineScope
class MockWebsocketFactory : WebSocket.Factory {
lateinit var ws: WebSocket
lateinit var request: Request
... ... @@ -34,6 +41,8 @@ class SignalClientTest {
@Before
fun setup() {
coroutineDispatcher = TestCoroutineDispatcher()
coroutineScope = TestCoroutineScope(coroutineDispatcher)
wsFactory = MockWebsocketFactory()
okHttpClient = Mockito.mock(OkHttpClient::class.java)
client = SignalClient(
... ... @@ -43,11 +52,17 @@ class SignalClientTest {
Json,
useJson = false,
okHttpClient = okHttpClient,
ioDispatcher = coroutineDispatcher
)
listener = Mockito.mock(SignalClient.Listener::class.java)
client.listener = listener
}
@After
fun tearDown() {
coroutineScope.cleanupTestCoroutines()
}
private fun createOpenResponse(request: Request): Response {
return Response.Builder()
.request(request)
... ... @@ -59,13 +74,11 @@ class SignalClientTest {
@Test
fun joinAndResponse() {
val job = TestCoroutineScope().async {
client.join("http://www.example.com", "", null)
val job = coroutineScope.async {
client.join(EXAMPLE_URL, "", null)
}
client.onOpen(
wsFactory.ws,
createOpenResponse(wsFactory.request)
)
client.onOpen(wsFactory.ws, createOpenResponse(wsFactory.request))
client.onMessage(wsFactory.ws, JOIN.toOkioByteString())
runBlockingTest {
... ... @@ -76,21 +89,55 @@ class SignalClientTest {
@Test
fun reconnect() {
val job = TestCoroutineScope().async {
client.reconnect("http://www.example.com", "")
val job = coroutineScope.async {
client.reconnect(EXAMPLE_URL, "")
}
client.onOpen(
wsFactory.ws,
createOpenResponse(wsFactory.request)
)
client.onOpen(wsFactory.ws, createOpenResponse(wsFactory.request))
runBlockingTest {
job.await()
}
}
@Test
fun listenerNotCalledUntilOnReady() {
val listener = Mockito.mock(SignalClient.Listener::class.java)
client.listener = listener
val job = coroutineScope.async {
client.join(EXAMPLE_URL, "", null)
}
client.onOpen(wsFactory.ws, createOpenResponse(wsFactory.request))
client.onMessage(wsFactory.ws, JOIN.toOkioByteString())
client.onMessage(wsFactory.ws, OFFER.toOkioByteString())
runBlockingTest { job.await() }
Mockito.verifyNoInteractions(listener)
}
@Test
fun listenerCalledAfterOnReady() {
val listener = Mockito.mock(SignalClient.Listener::class.java)
client.listener = listener
val job = coroutineScope.async {
client.join(EXAMPLE_URL, "", null)
}
client.onOpen(wsFactory.ws, createOpenResponse(wsFactory.request))
client.onMessage(wsFactory.ws, JOIN.toOkioByteString())
client.onMessage(wsFactory.ws, OFFER.toOkioByteString())
runBlockingTest { job.await() }
client.onReady()
Mockito.verify(listener)
.onOffer(argThat { type == SessionDescription.Type.OFFER && description == OFFER.offer.sdp })
}
// mock data
companion object {
private val EXAMPLE_URL = "http://www.example.com"
private const val EXAMPLE_URL = "http://www.example.com"
private val JOIN = with(LivekitRtc.SignalResponse.newBuilder()) {
join = with(joinBuilder) {
... ... @@ -103,5 +150,13 @@ class SignalClientTest {
}
build()
}
private val OFFER = with(LivekitRtc.SignalResponse.newBuilder()) {
offer = with(offerBuilder) {
sdp = ""
type = "offer"
build()
}
build()
}
}
}
\ No newline at end of file
... ...