blob: 1aaf9526fa8e09820f5ec39022e3b6eea2fb4e1a [file] [log] [blame]
package com.google.android.connecteddevice.transport
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.android.connecteddevice.util.ThreadSafeCallbacks
import com.google.common.truth.Truth.assertThat
import com.google.common.util.concurrent.MoreExecutors.directExecutor
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.never
import com.nhaarman.mockitokotlin2.verify
import java.util.UUID
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ConnectionProtocolTest {
private lateinit var testProtocol: TestConnectionProtocol
private val mockDataReceivedListener: ConnectionProtocol.DataReceivedListener = mock()
private val mockDisconnectedListener: ConnectionProtocol.DeviceDisconnectedListener = mock()
private val mockMaxDataSizeChangedListener: ConnectionProtocol.DeviceMaxDataSizeChangedListener =
mock()
@Before
fun setUp() {
testProtocol = TestConnectionProtocol()
}
@Test
fun registerDataReceivedListener_invokeListenerWithCall() {
val testProtocolId = "testProtocolId"
val testData = "testData".toByteArray()
testProtocol.registerDataReceivedListener(
testProtocolId,
mockDataReceivedListener,
directExecutor()
)
testProtocol.invokeDataReceivedListeners(testProtocolId, testData)
verify(mockDataReceivedListener).onDataReceived(testProtocolId, testData)
}
@Test
fun registerDataReceivedListener_invokeListenerWithMissedData() {
val testProtocolId = "testProtocolId"
val testData = "testData".toByteArray()
testProtocol.notifyDataReceived(testProtocolId, testData)
testProtocol.registerDataReceivedListener(
testProtocolId,
mockDataReceivedListener,
directExecutor()
)
verify(mockDataReceivedListener).onDataReceived(testProtocolId, testData)
}
@Test
fun registerDataReceivedListener_deliveredMissedDataCleared() {
val testProtocolId = "testProtocolId"
val testData = "testData".toByteArray()
testProtocol.notifyDataReceived(testProtocolId, testData)
testProtocol.registerDataReceivedListener(
testProtocolId,
mockDataReceivedListener,
directExecutor()
)
val mockSecondDataReceivedListener: ConnectionProtocol.DataReceivedListener = mock()
testProtocol.registerDataReceivedListener(
testProtocolId,
mockSecondDataReceivedListener,
directExecutor()
)
verify(mockDataReceivedListener).onDataReceived(testProtocolId, testData)
verify(mockSecondDataReceivedListener, never()).onDataReceived(testProtocolId, testData)
}
@Test
fun unregisterDataReceivedListener_doNotInvokeListenerWithCall() {
val testProtocolId = "testProtocolId"
val testData = "testData".toByteArray()
testProtocol.registerDataReceivedListener(
testProtocolId,
mockDataReceivedListener,
directExecutor()
)
testProtocol.unregisterDataReceivedListener(testProtocolId, mockDataReceivedListener)
testProtocol.invokeDataReceivedListeners(testProtocolId, testData)
verify(mockDataReceivedListener, never()).onDataReceived(testProtocolId, testData)
}
@Test
fun unregisterDataReceivedListener_invalidListener_doNotThrowException() {
testProtocol.unregisterDataReceivedListener("testProtocolId", mockDataReceivedListener)
}
@Test
fun unregisterDataReceivedListener_onLastListenerUnregistered_keyCleared() {
val testProtocolId = "testProtocolId"
testProtocol.registerDataReceivedListener(
testProtocolId,
mockDataReceivedListener,
directExecutor()
)
testProtocol.unregisterDataReceivedListener(testProtocolId, mockDataReceivedListener)
assertThat(testProtocol.dataReceivedListenerList).doesNotContainKey(testProtocolId)
}
@Test
fun registerDeviceDisconnectListener_invokeListenerWithCall() {
val testProtocolId = "testProtocolId"
testProtocol.registerDeviceDisconnectedListener(
testProtocolId,
mockDisconnectedListener,
directExecutor()
)
testProtocol.invokeDeviceDisconnectedListeners(testProtocolId)
verify(mockDisconnectedListener).onDeviceDisconnected(testProtocolId)
}
@Test
fun unregisterDeviceDisconnectListener_doNotInvokeListenerWithCall() {
val testProtocolId = "testProtocolId"
testProtocol.registerDeviceDisconnectedListener(
testProtocolId,
mockDisconnectedListener,
directExecutor()
)
testProtocol.unregisterDeviceDisconnectListener(testProtocolId, mockDisconnectedListener)
testProtocol.invokeDeviceDisconnectedListeners(testProtocolId)
verify(mockDisconnectedListener, never()).onDeviceDisconnected(testProtocolId)
}
@Test
fun unregisterDeviceDisconnectListener_invalidListener_doNotThrowException() {
testProtocol.unregisterDeviceDisconnectListener("testProtocolId", mockDisconnectedListener)
}
@Test
fun unregisterDeviceDisconnectListener_onLastListenerUnregistered_keyCleared() {
val testProtocolId = "testProtocolId"
testProtocol.registerDeviceDisconnectedListener(
testProtocolId,
mockDisconnectedListener,
directExecutor()
)
testProtocol.unregisterDeviceDisconnectListener(testProtocolId, mockDisconnectedListener)
assertThat(testProtocol.deviceDisconnectedListenerList).doesNotContainKey(testProtocolId)
}
@Test
fun registerDeviceMaxDataSizeChangedListener_invokeListenerWithCall() {
val testProtocolId = "testProtocolId"
val testSize = 20
testProtocol.registerDeviceMaxDataSizeChangedListener(
testProtocolId,
mockMaxDataSizeChangedListener,
directExecutor()
)
testProtocol.invokeDeviceMaxDataSizeChangedListener(testProtocolId, testSize)
verify(mockMaxDataSizeChangedListener).onDeviceMaxDataSizeChanged(testProtocolId, testSize)
}
@Test
fun unregisterDeviceMaxDataSizeChangedListener_doNotInvokeListenerWithCall() {
val testProtocolId = "testProtocolId"
val testSize = 20
testProtocol.registerDeviceMaxDataSizeChangedListener(
testProtocolId,
mockMaxDataSizeChangedListener,
directExecutor()
)
testProtocol.unregisterDeviceMaxDataSizeChangedListener(
testProtocolId,
mockMaxDataSizeChangedListener
)
testProtocol.invokeDeviceMaxDataSizeChangedListener(testProtocolId, testSize)
verify(mockMaxDataSizeChangedListener, never())
.onDeviceMaxDataSizeChanged(testProtocolId, testSize)
}
@Test
fun unregisterDeviceMaxDataSizeChangedListener_invalidListener_doNotThrowException() {
testProtocol.unregisterDeviceMaxDataSizeChangedListener(
"testProtocolId",
mockMaxDataSizeChangedListener
)
}
@Test
fun unregisterDeviceMaxDataSizeChangedListener_onLastListenerUnregistered_keyCleared() {
val testProtocolId = "testProtocolId"
testProtocol.registerDeviceMaxDataSizeChangedListener(
testProtocolId,
mockMaxDataSizeChangedListener,
directExecutor()
)
testProtocol.unregisterDeviceMaxDataSizeChangedListener(
testProtocolId,
mockMaxDataSizeChangedListener
)
assertThat(testProtocol.maxDataSizeChangedListenerList).doesNotContainKey(testProtocolId)
}
@Test
fun reset_clearListeners() {
val testProtocolId = "testProtocolId"
val testData = "testData".toByteArray()
val testSize = 20
testProtocol.registerDataReceivedListener(
testProtocolId,
mockDataReceivedListener,
directExecutor()
)
testProtocol.registerDeviceDisconnectedListener(
testProtocolId,
mockDisconnectedListener,
directExecutor()
)
testProtocol.registerDeviceMaxDataSizeChangedListener(
testProtocolId,
mockMaxDataSizeChangedListener,
directExecutor()
)
testProtocol.reset()
testProtocol.invokeDataReceivedListeners(testProtocolId, testData)
testProtocol.invokeDeviceDisconnectedListeners(testProtocolId)
testProtocol.invokeDeviceMaxDataSizeChangedListener(testProtocolId, testSize)
verify(mockDisconnectedListener, never()).onDeviceDisconnected(testProtocolId)
verify(mockDataReceivedListener, never()).onDataReceived(testProtocolId, testData)
verify(mockMaxDataSizeChangedListener, never())
.onDeviceMaxDataSizeChanged(testProtocolId, testSize)
}
@Test
fun reset_clearMissedData() {
val testProtocolId = "testProtocolId"
val testData = "testData".toByteArray()
testProtocol.notifyDataReceived(testProtocolId, testData)
testProtocol.reset()
testProtocol.registerDataReceivedListener(
testProtocolId,
mockDataReceivedListener,
directExecutor()
)
verify(mockDataReceivedListener, never()).onDataReceived(testProtocolId, testData)
}
class TestConnectionProtocol : ConnectionProtocol() {
override val isDeviceVerificationRequired = false
val deviceDisconnectedListenerList:
MutableMap<String, ThreadSafeCallbacks<DeviceDisconnectedListener>> =
deviceDisconnectedListeners
val dataReceivedListenerList: MutableMap<String, ThreadSafeCallbacks<DataReceivedListener>> =
dataReceivedListeners
val maxDataSizeChangedListenerList:
MutableMap<String, ThreadSafeCallbacks<DeviceMaxDataSizeChangedListener>> =
maxDataSizeChangedListeners
override fun startAssociationDiscovery(
name: String,
callback: DiscoveryCallback,
identifier: UUID
) {}
override fun startConnectionDiscovery(
id: UUID,
challenge: ConnectChallenge,
callback: DiscoveryCallback
) {}
override fun stopAssociationDiscovery() {}
override fun stopConnectionDiscovery(id: UUID) {}
override fun sendData(protocolId: String, data: ByteArray, callback: DataSendCallback?) {}
override fun disconnectDevice(protocolId: String) {}
override fun getMaxWriteSize(protocolId: String): Int {
return 0
}
fun invokeDataReceivedListeners(protocolId: String, data: ByteArray) {
dataReceivedListeners[protocolId]?.invoke { it.onDataReceived(protocolId, data) }
}
fun invokeDeviceDisconnectedListeners(protocolId: String) {
deviceDisconnectedListeners[protocolId]?.invoke { it.onDeviceDisconnected(protocolId) }
}
fun invokeDeviceMaxDataSizeChangedListener(protocolId: String, maxBytes: Int) {
maxDataSizeChangedListeners[protocolId]?.invoke {
it.onDeviceMaxDataSizeChanged(protocolId, maxBytes)
}
}
}
}