172 lines
5.5 KiB
Kotlin
172 lines
5.5 KiB
Kotlin
package com.rukira.wowbackup.update
|
|
|
|
import com.sun.net.httpserver.HttpServer
|
|
import kotlinx.coroutines.runBlocking
|
|
import java.net.InetSocketAddress
|
|
import kotlin.test.AfterTest
|
|
import kotlin.test.BeforeTest
|
|
import kotlin.test.Test
|
|
import kotlin.test.assertEquals
|
|
import kotlin.test.assertNotNull
|
|
import kotlin.test.assertNull
|
|
|
|
class UpdateCheckerTest {
|
|
|
|
private lateinit var server: HttpServer
|
|
private var serverPort: Int = 0
|
|
|
|
@BeforeTest
|
|
fun setUp() {
|
|
server = HttpServer.create(InetSocketAddress("127.0.0.1", 0), 0)
|
|
serverPort = server.address.port
|
|
server.start()
|
|
}
|
|
|
|
@AfterTest
|
|
fun tearDown() {
|
|
server.stop(0)
|
|
}
|
|
|
|
@Test
|
|
fun testUpdateAvailableWhenRemoteIsNewer() = runBlocking {
|
|
val jsonResponse = """
|
|
{
|
|
"id": 5,
|
|
"tag_name": "v1.0.2",
|
|
"name": "WoW Backup v1.0.2",
|
|
"html_url": "https://git.asarius.site/rukira/wow-backup/releases/tag/v1.0.2"
|
|
}
|
|
""".trimIndent()
|
|
|
|
server.createContext("/releases/latest") { exchange ->
|
|
exchange.responseHeaders.add("Content-Type", "application/json")
|
|
val bytes = jsonResponse.toByteArray()
|
|
exchange.sendResponseHeaders(200, bytes.size.toLong())
|
|
exchange.responseBody.write(bytes)
|
|
exchange.close()
|
|
}
|
|
|
|
val checker = UpdateChecker(
|
|
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
|
|
fallbackUrl = "https://git.asarius.site/rukira/wow-backup/releases",
|
|
)
|
|
|
|
val result = checker.checkForUpdate(currentVersion = "1.0.1")
|
|
assertNotNull(result)
|
|
assertEquals("1.0.2", result.latestVersion)
|
|
assertEquals("https://git.asarius.site/rukira/wow-backup/releases/tag/v1.0.2", result.releaseUrl)
|
|
}
|
|
|
|
@Test
|
|
fun testNoUpdateWhenUpToDate() = runBlocking {
|
|
val jsonResponse = """
|
|
{
|
|
"id": 5,
|
|
"tag_name": "v1.0.2",
|
|
"name": "WoW Backup v1.0.2",
|
|
"html_url": "https://git.asarius.site/rukira/wow-backup/releases/tag/v1.0.2"
|
|
}
|
|
""".trimIndent()
|
|
|
|
server.createContext("/releases/latest") { exchange ->
|
|
exchange.responseHeaders.add("Content-Type", "application/json")
|
|
val bytes = jsonResponse.toByteArray()
|
|
exchange.sendResponseHeaders(200, bytes.size.toLong())
|
|
exchange.responseBody.write(bytes)
|
|
exchange.close()
|
|
}
|
|
|
|
val checker = UpdateChecker(
|
|
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
|
|
)
|
|
|
|
val result = checker.checkForUpdate(currentVersion = "1.0.2")
|
|
assertNull(result)
|
|
}
|
|
|
|
@Test
|
|
fun testNoUpdateWhenRunningNewerVersion() = runBlocking {
|
|
val jsonResponse = """
|
|
{
|
|
"id": 5,
|
|
"tag_name": "v1.0.2",
|
|
"name": "WoW Backup v1.0.2",
|
|
"html_url": "https://git.asarius.site/rukira/wow-backup/releases/tag/v1.0.2"
|
|
}
|
|
""".trimIndent()
|
|
|
|
server.createContext("/releases/latest") { exchange ->
|
|
exchange.responseHeaders.add("Content-Type", "application/json")
|
|
val bytes = jsonResponse.toByteArray()
|
|
exchange.sendResponseHeaders(200, bytes.size.toLong())
|
|
exchange.responseBody.write(bytes)
|
|
exchange.close()
|
|
}
|
|
|
|
val checker = UpdateChecker(
|
|
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
|
|
)
|
|
|
|
val result = checker.checkForUpdate(currentVersion = "2.0.0")
|
|
assertNull(result)
|
|
}
|
|
|
|
@Test
|
|
fun testHttpErrorGracefullyReturnsNull() = runBlocking {
|
|
server.createContext("/releases/latest") { exchange ->
|
|
exchange.sendResponseHeaders(404, 0)
|
|
exchange.close()
|
|
}
|
|
|
|
val checker = UpdateChecker(
|
|
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
|
|
)
|
|
|
|
val result = checker.checkForUpdate(currentVersion = "1.0.0")
|
|
assertNull(result)
|
|
}
|
|
|
|
@Test
|
|
fun testMalformedJsonGracefullyReturnsNull() = runBlocking {
|
|
server.createContext("/releases/latest") { exchange ->
|
|
val bytes = "Not valid JSON".toByteArray()
|
|
exchange.sendResponseHeaders(200, bytes.size.toLong())
|
|
exchange.responseBody.write(bytes)
|
|
exchange.close()
|
|
}
|
|
|
|
val checker = UpdateChecker(
|
|
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
|
|
)
|
|
|
|
val result = checker.checkForUpdate(currentVersion = "1.0.0")
|
|
assertNull(result)
|
|
}
|
|
|
|
@Test
|
|
fun testFallbackUrlUsedWhenHtmlUrlMissing() = runBlocking {
|
|
val jsonResponse = """
|
|
{
|
|
"id": 5,
|
|
"tag_name": "v1.0.2",
|
|
"name": "WoW Backup v1.0.2"
|
|
}
|
|
""".trimIndent()
|
|
|
|
server.createContext("/releases/latest") { exchange ->
|
|
val bytes = jsonResponse.toByteArray()
|
|
exchange.sendResponseHeaders(200, bytes.size.toLong())
|
|
exchange.responseBody.write(bytes)
|
|
exchange.close()
|
|
}
|
|
|
|
val checker = UpdateChecker(
|
|
apiUrl = "http://127.0.0.1:$serverPort/releases/latest",
|
|
fallbackUrl = "https://git.asarius.site/rukira/wow-backup/releases",
|
|
)
|
|
|
|
val result = checker.checkForUpdate(currentVersion = "1.0.0")
|
|
assertNotNull(result)
|
|
assertEquals("https://git.asarius.site/rukira/wow-backup/releases", result.releaseUrl)
|
|
}
|
|
}
|