You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.3 KiB
66 lines
2.3 KiB
/* |
|
* Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. |
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. |
|
*/ |
|
|
|
package org.jetbrains.compose.desktop.ui.tooling.preview.rpc |
|
|
|
import org.jetbrains.compose.desktop.ui.tooling.preview.rpc.utils.* |
|
import org.junit.jupiter.api.* |
|
import java.net.ServerSocket |
|
import java.util.concurrent.atomic.* |
|
import kotlin.concurrent.thread |
|
|
|
internal class PreviewHostTest { |
|
private lateinit var serverSocket: ServerSocket |
|
|
|
@BeforeEach |
|
internal fun setUp() { |
|
serverSocket = ServerSocket(0, 0, localhost) |
|
serverSocket.soTimeout = 10.secondsAsMillis |
|
} |
|
|
|
@AfterEach |
|
internal fun tearDown() { |
|
serverSocket.close() |
|
} |
|
|
|
@Test |
|
fun connectNormallyAndStop() { |
|
withPreviewHostConnection { connection -> |
|
connection.receiveCommand { command -> |
|
check(command.type == Command.Type.ATTACH) { |
|
"First received command is not ${Command.Type.ATTACH}: ${command.asString()}" |
|
} |
|
} |
|
} |
|
} |
|
|
|
private fun withPreviewHostConnection(doWithConnection: (RemoteConnection) -> Unit) { |
|
val isServerConnectionClosed = AtomicBoolean(false) |
|
val serverThread = thread { |
|
val socket = serverSocket.accept() |
|
val logger = TestLogger() |
|
val connection = RemoteConnectionImpl(socket, logger, onClose = { |
|
isServerConnectionClosed.set(true) |
|
}) |
|
doWithConnection(connection) |
|
connection.close() |
|
} |
|
val serverThreadFailure = AtomicReference<Throwable>(null) |
|
serverThread.setUncaughtExceptionHandler { t, e -> |
|
serverThreadFailure.set(e) |
|
} |
|
|
|
val previewHostProcess = TestPreviewProcess(serverSocket.localPort) |
|
previewHostProcess.start() |
|
|
|
serverThread.join(10L.secondsAsMillis) |
|
val serverFailure = serverThreadFailure.get() |
|
check(serverFailure == null) { "Unexpected server failure: $serverFailure" } |
|
check(!serverThread.isAlive) { "Server thread should not be alive at this point" } |
|
check(isServerConnectionClosed.get()) { "Server connection was not closed" } |
|
|
|
previewHostProcess.finish() |
|
} |
|
}
|
|
|