Network/test/dorkboxTest/network/DisconnectReconnectTest.kt

359 lines
9.4 KiB
Kotlin
Raw Normal View History

package dorkboxTest.network
import dorkbox.network.Client
import dorkbox.network.Server
import dorkbox.network.aeron.AeronDriver
import dorkbox.network.connection.Connection
import kotlinx.atomicfu.atomic
import kotlinx.coroutines.delay
import org.junit.Assert
import org.junit.Test
import java.io.IOException
class DisconnectReconnectTest : BaseTest() {
private val reconnectCount = atomic(0)
@Test
fun reconnectClient() {
run {
val configuration = serverConfig()
val server: Server<Connection> = Server(configuration)
addEndPoint(server)
2020-09-02 03:18:10 +02:00
server.bind()
server.onConnect {
logger.error("Disconnecting after 2 seconds.")
delay(2000)
logger.error("Disconnecting....")
close()
}
}
run {
val config = clientConfig()
val client: Client<Connection> = Client(config)
addEndPoint(client)
client.onDisconnect {
logger.error("Disconnected!")
2020-08-27 02:34:36 +02:00
val count = reconnectCount.getAndIncrement()
if (count == 3) {
logger.error("Shutting down")
stopEndPoints()
}
else {
logger.error("Reconnecting: $count")
try {
client.connect(LOOPBACK)
} catch (e: IOException) {
e.printStackTrace()
}
}
}
2021-04-30 18:22:38 +02:00
client.connect(LOOPBACK)
}
waitForThreads(0)
System.err.println("Connection count (after reconnecting) is: " + reconnectCount.value)
Assert.assertEquals(4, reconnectCount.value)
}
@Test
fun reconnectClientViaClientClose() {
run {
val configuration = serverConfig() {
aeronDirectoryForceUnique = true
}
val server: Server<Connection> = Server(configuration)
addEndPoint(server)
server.bind()
}
run {
val config = clientConfig() {
aeronDirectoryForceUnique = true
}
val client: Client<Connection> = Client(config)
addEndPoint(client)
client.onConnect {
logger.error("Disconnecting after 2 seconds.")
delay(2000)
logger.error("Disconnecting....")
client.close()
}
client.onDisconnect {
logger.error("Disconnected!")
val count = reconnectCount.getAndIncrement()
if (count == 3) {
logger.error("Shutting down")
stopEndPoints()
}
else {
logger.error("Reconnecting: $count")
try {
client.connect(LOOPBACK)
} catch (e: IOException) {
e.printStackTrace()
}
}
}
client.connect(LOOPBACK)
}
waitForThreads(0)
System.err.println("Connection count (after reconnecting) is: " + reconnectCount.value)
Assert.assertEquals(4, reconnectCount.value)
}
2021-04-30 18:22:38 +02:00
interface CloseIface {
suspend fun close()
}
class CloseImpl : CloseIface {
override suspend fun close() {
// the connection specific one is called instead
}
suspend fun close(connection: Connection) {
connection.close()
}
}
@Test
fun reconnectRmiClient() {
val CLOSE_ID = 33
run {
val config = serverConfig()
2021-07-02 11:40:20 +02:00
config.serialization.rmi.register(CloseIface::class.java)
2021-04-30 18:22:38 +02:00
val server: Server<Connection> = Server(config)
addEndPoint(server)
server.bind()
server.onConnect {
logger.error("Disconnecting after 2 seconds.")
2021-04-30 18:22:38 +02:00
delay(2000)
logger.error("Disconnecting via RMI ....")
val closerObject = rmi.get<CloseIface>(CLOSE_ID)
2021-04-30 18:22:38 +02:00
closerObject.close()
}
}
run {
val config = clientConfig()
2021-07-02 11:40:20 +02:00
config.serialization.rmi.register(CloseIface::class.java, CloseImpl::class.java)
2021-04-30 18:22:38 +02:00
val client: Client<Connection> = Client(config)
addEndPoint(client)
2021-07-02 11:40:20 +02:00
client.onConnect {
rmi.save(CloseImpl(), CLOSE_ID)
}
2021-04-30 18:22:38 +02:00
client.onDisconnect {
logger.error("Disconnected!")
2021-04-30 18:22:38 +02:00
val count = reconnectCount.getAndIncrement()
if (count == 3) {
logger.error("Shutting down")
2021-04-30 18:22:38 +02:00
stopEndPoints()
}
else {
logger.error("Reconnecting: $count")
2021-04-30 18:22:38 +02:00
try {
client.connect(LOOPBACK)
} catch (e: IOException) {
e.printStackTrace()
}
}
}
2021-04-30 18:22:38 +02:00
client.connect(LOOPBACK)
}
2021-04-30 18:22:38 +02:00
waitForThreads(0)
2020-09-10 14:40:09 +02:00
System.err.println("Connection count (after reconnecting) is: " + reconnectCount.value)
Assert.assertEquals(4, reconnectCount.value)
}
@Test
fun manualMediaDriverAndReconnectClient() {
// NOTE: once a config is assigned to a driver, the config cannot be changed
val aeronDriver = AeronDriver(serverConfig())
aeronDriver.start()
run {
val serverConfiguration = serverConfig()
val server: Server<Connection> = Server(serverConfiguration)
addEndPoint(server)
server.bind()
server.onConnect {
logger.error("Disconnecting after 2 seconds.")
delay(2000)
logger.error("Disconnecting....")
close()
}
}
run {
val config = clientConfig()
val client: Client<Connection> = Client(config)
addEndPoint(client)
client.onDisconnect {
logger.error("Disconnected!")
val count = reconnectCount.getAndIncrement()
if (count == 3) {
logger.error("Shutting down")
stopEndPoints()
}
else {
logger.error("Reconnecting: $count")
try {
client.connect(LOOPBACK)
} catch (e: IOException) {
e.printStackTrace()
}
}
}
2021-04-30 18:22:38 +02:00
client.connect(LOOPBACK)
}
waitForThreads()
2021-04-30 18:22:38 +02:00
aeronDriver.close()
System.err.println("Connection count (after reconnecting) is: " + reconnectCount.value)
Assert.assertEquals(4, reconnectCount.value)
}
2020-09-10 14:40:09 +02:00
@Test
fun reconnectWithFallbackClient() {
2021-04-30 18:22:38 +02:00
// this tests IPC with fallback to UDP (because the server has IPC disabled, and the client has it enabled)
2020-09-10 14:40:09 +02:00
run {
val config = serverConfig()
config.enableIpc = false
val server: Server<Connection> = Server(config)
addEndPoint(server)
server.bind()
server.onConnect {
logger.error("Disconnecting after 2 seconds.")
2020-09-10 14:40:09 +02:00
delay(2000)
logger.error("Disconnecting....")
close()
2020-09-10 14:40:09 +02:00
}
}
run {
val config = clientConfig()
config.enableIpc = true
val client: Client<Connection> = Client(config)
addEndPoint(client)
client.onDisconnect {
logger.error("Disconnected!")
2020-09-10 14:40:09 +02:00
val count = reconnectCount.getAndIncrement()
if (count == 3) {
logger.error("Shutting down")
2020-09-10 14:40:09 +02:00
stopEndPoints()
}
else {
logger.error("Reconnecting: $count")
2020-09-10 14:40:09 +02:00
try {
client.connect(LOOPBACK)
} catch (e: IOException) {
e.printStackTrace()
}
}
}
2021-04-30 18:22:38 +02:00
client.connect(LOOPBACK)
2020-09-10 14:40:09 +02:00
}
waitForThreads()
System.err.println("Connection count (after reconnecting) is: " + reconnectCount.value)
Assert.assertEquals(4, reconnectCount.value)
}
@Test
fun disconnectedMediaDriver() {
val server: Server<Connection>
run {
val config = serverConfig()
config.enableIpc = false
config.aeronDirectoryForceUnique = true
server = Server(config)
addEndPoint(server)
server.bind()
server.onConnect {
logger.error("Connected!")
}
}
val client: Client<Connection>
run {
val config = clientConfig()
config.enableIpc = false
config.aeronDirectoryForceUnique = true
client = Client(config)
addEndPoint(client)
client.onConnect {
logger.error("Connected!")
}
client.onDisconnect {
stopEndPoints()
}
2021-04-30 18:22:38 +02:00
client.connect(LOOPBACK)
}
server.close()
waitForThreads()
}
}