Replace khttp test library with a fork that is available on maven central

This commit is contained in:
Torsten Grote
2022-10-31 13:53:06 -03:00
parent 02f2fdd4a1
commit 904355b0a6
4 changed files with 100 additions and 57 deletions

View File

@@ -37,9 +37,9 @@ dependencies {
testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion" testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
testImplementation 'io.mockk:mockk:1.10.4' testImplementation 'io.mockk:mockk:1.12.4'
testImplementation 'org.skyscreamer:jsonassert:1.5.0' testImplementation 'org.skyscreamer:jsonassert:1.5.0'
testImplementation 'khttp:khttp:0.1.0' testImplementation "com.squareup.okhttp3:okhttp:4.10.0"
kaptTest "com.google.dagger:dagger-compiler:$daggerVersion" kaptTest "com.google.dagger:dagger-compiler:$daggerVersion"
} }

View File

@@ -2,7 +2,11 @@ package org.briarproject.briar.headless
import io.javalin.Javalin import io.javalin.Javalin
import io.javalin.core.util.Header.AUTHORIZATION import io.javalin.core.util.Header.AUTHORIZATION
import khttp.responses.Response import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import org.briarproject.bramble.BrambleCoreEagerSingletons import org.briarproject.bramble.BrambleCoreEagerSingletons
import org.briarproject.bramble.api.crypto.CryptoComponent import org.briarproject.bramble.api.crypto.CryptoComponent
import org.briarproject.briar.BriarCoreEagerSingletons import org.briarproject.briar.BriarCoreEagerSingletons
@@ -22,6 +26,7 @@ abstract class IntegrationTest {
private val dataDir = File("tmp") private val dataDir = File("tmp")
private val client: OkHttpClient = OkHttpClient()
protected lateinit var api: Javalin protected lateinit var api: Javalin
protected lateinit var crypto: CryptoComponent protected lateinit var crypto: CryptoComponent
protected lateinit var testDataCreator: TestDataCreator protected lateinit var testDataCreator: TestDataCreator
@@ -48,34 +53,55 @@ abstract class IntegrationTest {
dataDir.deleteRecursively() dataDir.deleteRecursively()
} }
protected fun get(url: String): Response { protected fun get(url: String, authToken: String = token): Response {
return khttp.get(url, getAuthTokenHeader(token)) val request: Request = Request.Builder()
.url(url)
.header(AUTHORIZATION, "Bearer $authToken")
.build()
return client.newCall(request).execute()
} }
protected fun getWithWrongToken(url: String): Response { protected fun getWithWrongToken(url: String): Response {
return khttp.get(url, getAuthTokenHeader("wrongToken")) return get(url, "wrongToken")
} }
protected fun post(url: String, data: String): Response { protected fun post(url: String, data: String, authToken: String = token): Response {
return khttp.post(url, getAuthTokenHeader(token), data = data) val json = "application/json; charset=utf-8".toMediaType()
val body = data.toRequestBody(json)
val request: Request = Request.Builder()
.url(url)
.header(AUTHORIZATION, "Bearer $authToken")
.post(body)
.build()
return client.newCall(request).execute()
} }
protected fun postWithWrongToken(url: String): Response { protected fun postWithWrongToken(url: String): Response {
return khttp.post(url, getAuthTokenHeader("wrongToken"), data = "") return post(url, data = "", authToken = "wrongToken")
} }
protected fun delete(url: String): Response { protected fun delete(url: String, authToken: String = token): Response {
return khttp.delete(url, getAuthTokenHeader(token)) val request: Request = Request.Builder()
.url(url)
.header(AUTHORIZATION, "Bearer $authToken")
.delete()
.build()
return client.newCall(request).execute()
} }
protected fun delete(url: String, data: String): Response { protected fun delete(url: String, data: String, authToken: String = token): Response {
return khttp.delete(url, getAuthTokenHeader(token), data = data) val json = "application/json; charset=utf-8".toMediaType()
val body = data.toRequestBody(json)
val request: Request = Request.Builder()
.url(url)
.header(AUTHORIZATION, "Bearer $authToken")
.delete(body)
.build()
return client.newCall(request).execute()
} }
protected fun deleteWithWrongToken(url: String): Response { protected fun deleteWithWrongToken(url: String): Response {
return khttp.delete(url, getAuthTokenHeader("wrongToken")) return delete(url, authToken = "wrongToken")
} }
private fun getAuthTokenHeader(token: String) = mapOf(Pair(AUTHORIZATION, "Bearer $token"))
} }

View File

@@ -1,26 +1,39 @@
package org.briarproject.briar.headless.contact package org.briarproject.briar.headless.contact
import okhttp3.Response
import org.briarproject.bramble.api.contact.HandshakeLinkConstants.BASE32_LINK_BYTES import org.briarproject.bramble.api.contact.HandshakeLinkConstants.BASE32_LINK_BYTES
import org.briarproject.briar.headless.IntegrationTest import org.briarproject.briar.headless.IntegrationTest
import org.briarproject.briar.headless.url import org.briarproject.briar.headless.url
import org.briarproject.briar.test.BriarTestUtils.getRealHandshakeLink import org.briarproject.briar.test.BriarTestUtils.getRealHandshakeLink
import org.json.JSONArray
import org.json.JSONObject
import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
class ContactControllerIntegrationTest : IntegrationTest() { class ContactControllerIntegrationTest : IntegrationTest() {
/**
* Can only be called once.
*/
private val Response.jsonArray: JSONArray get() = JSONArray(body?.use { it.string() })
/**
* Can only be called once.
*/
private val Response.jsonObject: JSONObject get() = JSONObject(body?.use { it.string() })
@Test @Test
fun `returning list of contacts needs authentication token`() { fun `returning list of contacts needs authentication token`() {
val response = getWithWrongToken("$url/contacts") val response = getWithWrongToken("$url/contacts")
assertEquals(401, response.statusCode) assertEquals(401, response.code)
} }
@Test @Test
fun `returns list of contacts`() { fun `returns list of contacts`() {
// retrieve empty list of contacts // retrieve empty list of contacts
var response = get("$url/contacts") var response = get("$url/contacts")
assertEquals(200, response.statusCode) assertEquals(200, response.code)
assertEquals(0, response.jsonArray.length()) assertEquals(0, response.jsonArray.length())
// add one test contact // add one test contact
@@ -29,9 +42,10 @@ class ContactControllerIntegrationTest : IntegrationTest() {
// retrieve list with one test contact // retrieve list with one test contact
response = get("$url/contacts") response = get("$url/contacts")
assertEquals(200, response.statusCode) assertEquals(200, response.code)
assertEquals(1, response.jsonArray.length()) val jsonArray = response.jsonArray
val contact = response.jsonArray.getJSONObject(0) assertEquals(1, jsonArray.length())
val contact = jsonArray.getJSONObject(0)
val author = contact.getJSONObject("author") val author = contact.getJSONObject("author")
assertEquals(testContactName, author.getString("name")) assertEquals(testContactName, author.getString("name"))
} }
@@ -39,7 +53,7 @@ class ContactControllerIntegrationTest : IntegrationTest() {
@Test @Test
fun `returns own handshake link`() { fun `returns own handshake link`() {
val response = get("$url/contacts/add/link") val response = get("$url/contacts/add/link")
assertEquals(200, response.statusCode) assertEquals(200, response.code)
val link = response.jsonObject.getString("link") val link = response.jsonObject.getString("link")
assertTrue(link.startsWith("briar://")) assertTrue(link.startsWith("briar://"))
assertEquals(BASE32_LINK_BYTES + 8, link.length) assertEquals(BASE32_LINK_BYTES + 8, link.length)
@@ -48,14 +62,14 @@ class ContactControllerIntegrationTest : IntegrationTest() {
@Test @Test
fun `returning own handshake link needs authentication token`() { fun `returning own handshake link needs authentication token`() {
val response = getWithWrongToken("$url/contacts/add/link") val response = getWithWrongToken("$url/contacts/add/link")
assertEquals(401, response.statusCode) assertEquals(401, response.code)
} }
@Test @Test
fun `returns list of pending contacts`() { fun `returns list of pending contacts`() {
// retrieve empty list of pending contacts // retrieve empty list of pending contacts
var response = get("$url/contacts/add/pending") var response = get("$url/contacts/add/pending")
assertEquals(200, response.statusCode) assertEquals(200, response.code)
assertEquals(0, response.jsonArray.length()) assertEquals(0, response.jsonArray.length())
// add one pending contact // add one pending contact
@@ -65,37 +79,38 @@ class ContactControllerIntegrationTest : IntegrationTest() {
"alias": "$alias" "alias": "$alias"
}""" }"""
response = post("$url/contacts/add/pending", json) response = post("$url/contacts/add/pending", json)
assertEquals(200, response.statusCode) assertEquals(200, response.code)
// get added contact as only list item // get added contact as only list item
response = get("$url/contacts/add/pending") response = get("$url/contacts/add/pending")
assertEquals(200, response.statusCode) assertEquals(200, response.code)
assertEquals(1, response.jsonArray.length()) val jsonArray = response.jsonArray
val jsonObject = response.jsonArray.getJSONObject(0) assertEquals(1, jsonArray.length())
val jsonObject = jsonArray.getJSONObject(0)
assertEquals(alias, jsonObject.getJSONObject("pendingContact").getString("alias")) assertEquals(alias, jsonObject.getJSONObject("pendingContact").getString("alias"))
// remove pending contact again // remove pending contact again
val idString = jsonObject.getJSONObject("pendingContact").getString("pendingContactId") val idString = jsonObject.getJSONObject("pendingContact").getString("pendingContactId")
val deleteJson = """{"pendingContactId": "$idString"}""" val deleteJson = """{"pendingContactId": "$idString"}"""
response = delete("$url/contacts/add/pending", deleteJson) response = delete("$url/contacts/add/pending", data = deleteJson)
assertEquals(200, response.statusCode) assertEquals(200, response.code)
// list of pending contacts should be empty now // list of pending contacts should be empty now
response = get("$url/contacts/add/pending") response = get("$url/contacts/add/pending")
assertEquals(200, response.statusCode) assertEquals(200, response.code)
assertEquals(0, response.jsonArray.length()) assertEquals(0, response.jsonArray.length())
} }
@Test @Test
fun `returning list of pending contacts needs authentication token`() { fun `returning list of pending contacts needs authentication token`() {
val response = getWithWrongToken("$url/contacts/add/pending") val response = getWithWrongToken("$url/contacts/add/pending")
assertEquals(401, response.statusCode) assertEquals(401, response.code)
} }
@Test @Test
fun `adding a pending contact needs authentication token`() { fun `adding a pending contact needs authentication token`() {
val response = postWithWrongToken("$url/contacts/add/pending") val response = postWithWrongToken("$url/contacts/add/pending")
assertEquals(401, response.statusCode) assertEquals(401, response.code)
} }
@Test @Test
@@ -106,7 +121,7 @@ class ContactControllerIntegrationTest : IntegrationTest() {
"alias": "$alias" "alias": "$alias"
}""" }"""
val response = post("$url/contacts/add/pending", json) val response = post("$url/contacts/add/pending", json)
assertEquals(400, response.statusCode) assertEquals(400, response.code)
assertEquals("INVALID_LINK", response.jsonObject.getString("error")) assertEquals("INVALID_LINK", response.jsonObject.getString("error"))
} }
@@ -118,7 +133,7 @@ class ContactControllerIntegrationTest : IntegrationTest() {
"alias": "$alias" "alias": "$alias"
}""" }"""
val response = post("$url/contacts/add/pending", json) val response = post("$url/contacts/add/pending", json)
assertEquals(400, response.statusCode) assertEquals(400, response.code)
assertEquals("INVALID_PUBLIC_KEY", response.jsonObject.getString("error")) assertEquals("INVALID_PUBLIC_KEY", response.jsonObject.getString("error"))
} }
@@ -130,36 +145,37 @@ class ContactControllerIntegrationTest : IntegrationTest() {
"alias": "$alias" "alias": "$alias"
}""" }"""
var response = post("$url/contacts/add/pending", json) var response = post("$url/contacts/add/pending", json)
assertEquals(200, response.statusCode) assertEquals(200, response.code)
val pendingContactId = response.jsonObject.getString("pendingContactId") val pendingContactId = response.jsonObject.getString("pendingContactId")
response = post("$url/contacts/add/pending", json) response = post("$url/contacts/add/pending", json)
assertEquals(403, response.statusCode) assertEquals(403, response.code)
assertEquals("PENDING_EXISTS", response.jsonObject.getString("error")) val jsonObject = response.jsonObject
assertEquals(pendingContactId, response.jsonObject.getString("pendingContactId")) assertEquals("PENDING_EXISTS", jsonObject.getString("error"))
assertEquals(alias, response.jsonObject.getString("pendingContactAlias")) assertEquals(pendingContactId, jsonObject.getString("pendingContactId"))
assertEquals(alias, jsonObject.getString("pendingContactAlias"))
} }
@Test @Test
fun `removing a pending contact needs authentication token`() { fun `removing a pending contact needs authentication token`() {
val response = deleteWithWrongToken("$url/contacts/add/pending") val response = deleteWithWrongToken("$url/contacts/add/pending")
assertEquals(401, response.statusCode) assertEquals(401, response.code)
} }
@Test @Test
fun `deleting a contact needs authentication token`() { fun `deleting a contact needs authentication token`() {
val response = deleteWithWrongToken("$url/contacts/1") val response = deleteWithWrongToken("$url/contacts/1")
assertEquals(401, response.statusCode) assertEquals(401, response.code)
} }
@Test @Test
fun `deleting real and non-existing contact`() { fun `deleting real and non-existing contact`() {
var response = delete("$url/contacts/1") var response = delete("$url/contacts/1")
assertEquals(200, response.statusCode) assertEquals(200, response.code)
response = delete("$url/contacts/1") response = delete("$url/contacts/1")
assertEquals(404, response.statusCode) assertEquals(404, response.code)
} }
} }

View File

@@ -16,22 +16,24 @@ dependencyVerification {
'com.google.guava:guava:27.1-jre:guava-27.1-jre.jar:4a5aa70cc968a4d137e599ad37553e5cfeed2265e8c193476d7119036c536fe7', 'com.google.guava:guava:27.1-jre:guava-27.1-jre.jar:4a5aa70cc968a4d137e599ad37553e5cfeed2265e8c193476d7119036c536fe7',
'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava:listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99', 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava:listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99',
'com.google.j2objc:j2objc-annotations:1.1:j2objc-annotations-1.1.jar:2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6', 'com.google.j2objc:j2objc-annotations:1.1:j2objc-annotations-1.1.jar:2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6',
'com.squareup.okhttp3:okhttp:4.10.0:okhttp-4.10.0.jar:7580f14fa1691206e37081ad3f92063b1603b328da0bb316f2fef02e0562e7ec',
'com.squareup.okio:okio-jvm:3.0.0:okio-jvm-3.0.0.jar:be64a0cc1f28ea9cd5c970dd7e7557af72c808d738c495b397bf897c9921e907',
'com.squareup.okio:okio:3.0.0:okio-metadata-3.0.0.jar:dcbe63ed43b2c90c325e9e6a0863e2e7605980bff5e728c6de1088be5574979e',
'com.squareup:javapoet:1.11.1:javapoet-1.11.1.jar:9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90', 'com.squareup:javapoet:1.11.1:javapoet-1.11.1.jar:9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90',
'com.vaadin.external.google:android-json:0.0.20131108.vaadin1:android-json-0.0.20131108.vaadin1.jar:dfb7bae2f404cfe0b72b4d23944698cb716b7665171812a0a4d0f5926c0fac79', 'com.vaadin.external.google:android-json:0.0.20131108.vaadin1:android-json-0.0.20131108.vaadin1.jar:dfb7bae2f404cfe0b72b4d23944698cb716b7665171812a0a4d0f5926c0fac79',
'io.javalin:javalin:3.5.0:javalin-3.5.0.jar:6618f99ad4c241eefcaf3a02c85adc52ec346c9710e8eb5a3f1a916e3d7acec4', 'io.javalin:javalin:3.5.0:javalin-3.5.0.jar:6618f99ad4c241eefcaf3a02c85adc52ec346c9710e8eb5a3f1a916e3d7acec4',
'io.mockk:mockk-agent-api:1.10.4:mockk-agent-api-1.10.4.jar:8deb59189b48d5870a746f954ca681424040544812c7ae295f3bef87a9499cfe', 'io.mockk:mockk-agent-api:1.12.4:mockk-agent-api-1.12.4.jar:6eb3407b1f88c0c0ced9636f82874100786b74b3b06c4354c4d85229779fdec8',
'io.mockk:mockk-agent-common:1.10.4:mockk-agent-common-1.10.4.jar:13b81a3297a3c15ed9f62b838aaede20347018f07c30cad2ca74a4dd99786f8f', 'io.mockk:mockk-agent-common:1.12.4:mockk-agent-common-1.12.4.jar:427d071ec7a85f105c152a51a89738d8ee52954130e5c09500837dfbe3549329',
'io.mockk:mockk-agent-jvm:1.10.4:mockk-agent-jvm-1.10.4.jar:51eb22de58c44f140384e61878e8c0da0fcf80c60a139d28ef7b027ea4bc2042', 'io.mockk:mockk-agent-jvm:1.12.4:mockk-agent-jvm-1.12.4.jar:840c11f2e0a14d35e229c2b6018273f4623c7f619ebf9701164bb9c2db99c098',
'io.mockk:mockk-common:1.10.4:mockk-common-1.10.4.jar:aaf3cc99442100767dc72776f250113f992facfb43bf6ba9a5282d1c8aaecd00', 'io.mockk:mockk-common:1.12.4:mockk-common-1.12.4.jar:16f1ba4738535458cb91fa1a759794f6618a6f9f1ae1d149e79b48cc06ea5e7b',
'io.mockk:mockk-dsl-jvm:1.10.4:mockk-dsl-jvm-1.10.4.jar:2432e2d0dfd31c3cb33e12137b8c712358cb0c4cddbd27b5bd6c55db2068e1a1', 'io.mockk:mockk-dsl-jvm:1.12.4:mockk-dsl-jvm-1.12.4.jar:faee4b52def68fa182f89d23c2a45f2246ef88b6b1ba98346aa85f57e5ed630f',
'io.mockk:mockk-dsl:1.10.4:mockk-dsl-1.10.4.jar:b97d750bebfd7da92a020f5417deface710c58802a78a8fff68661f77eaa3037', 'io.mockk:mockk-dsl:1.12.4:mockk-dsl-1.12.4.jar:7fc96f9ed5118c915a3890ba2e4090c9b283ae7bdc37ab83885415bdf77650e4',
'io.mockk:mockk:1.10.4:mockk-1.10.4.jar:e26d4eb8c9c0c5ac00acb9bfeedfe0feb10055bf7e80db57539936413ea38f7c', 'io.mockk:mockk:1.12.4:mockk-1.12.4.jar:2c34a3690b958a3cf38b82d0f4910dc9992fb078dce6f56d71498293557bf805',
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f', 'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', 'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
'javax.servlet:javax.servlet-api:3.1.0:javax.servlet-api-3.1.0.jar:af456b2dd41c4e82cf54f3e743bc678973d9fe35bd4d3071fa05c7e5333b8482', 'javax.servlet:javax.servlet-api:3.1.0:javax.servlet-api-3.1.0.jar:af456b2dd41c4e82cf54f3e743bc678973d9fe35bd4d3071fa05c7e5333b8482',
'khttp:khttp:0.1.0:khttp-0.1.0.jar:48ab3bd22e461f2c2e74e3446d8f9568e24aab157f61fdc85ded6c0bfbe9a926', 'net.bytebuddy:byte-buddy-agent:1.12.6:byte-buddy-agent-1.12.6.jar:9b29421fe4650b75fc3ed53590f914c54f932e334b3506cc00296dff73024183',
'net.bytebuddy:byte-buddy-agent:1.10.14:byte-buddy-agent-1.10.14.jar:30272167eceb1cb68fa84730a12d1abfd1daed6ae0c19fdefee47a9a9a0cfd33', 'net.bytebuddy:byte-buddy:1.12.6:byte-buddy-1.12.6.jar:211918dc24f0fdef4335ce8af40ef5616e15e818b962a21146397c7701eb75a7',
'net.bytebuddy:byte-buddy:1.10.14:byte-buddy-1.10.14.jar:0e6b935bfcb3e451d525956acad53ec86ff916d714abdbd32b3d2039771896f8',
'net.java.dev.jna:jna:5.6.0:jna-5.6.0.jar:5557e235a8aa2f9766d5dc609d67948f2a8832c2d796cea9ef1d6cbe0b3b7eaf', 'net.java.dev.jna:jna:5.6.0:jna-5.6.0.jar:5557e235a8aa2f9766d5dc609d67948f2a8832c2d796cea9ef1d6cbe0b3b7eaf',
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd', 'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
'org.apiguardian:apiguardian-api:1.1.0:apiguardian-api-1.1.0.jar:a9aae9ff8ae3e17a2a18f79175e82b16267c246fbbd3ca9dfbbb290b08dcfdd4', 'org.apiguardian:apiguardian-api:1.1.0:apiguardian-api-1.1.0.jar:a9aae9ff8ae3e17a2a18f79175e82b16267c246fbbd3ca9dfbbb290b08dcfdd4',
@@ -57,7 +59,7 @@ dependencyVerification {
'org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10:kotlin-compiler-embeddable-1.7.10.jar:470ba8941794f818a34b0a8f387ee27e44268e95a108322d18d9749ae345e22b', 'org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10:kotlin-compiler-embeddable-1.7.10.jar:470ba8941794f818a34b0a8f387ee27e44268e95a108322d18d9749ae345e22b',
'org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10:kotlin-daemon-embeddable-1.7.10.jar:77c5f3ab1ed653a899e96835937a9daf3a46e496fdfa6915ff6d20b2953619a4', 'org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10:kotlin-daemon-embeddable-1.7.10.jar:77c5f3ab1ed653a899e96835937a9daf3a46e496fdfa6915ff6d20b2953619a4',
'org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.7.10:kotlin-klib-commonizer-embeddable-1.7.10.jar:1c2550f1e7ec4d1590aacddd7852b90a4cf05de6e66cee31ad747c8dc0834e33', 'org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.7.10:kotlin-klib-commonizer-embeddable-1.7.10.jar:1c2550f1e7ec4d1590aacddd7852b90a4cf05de6e66cee31ad747c8dc0834e33',
'org.jetbrains.kotlin:kotlin-reflect:1.4.20:kotlin-reflect-1.4.20.jar:3b7c82def79fb96c4579d40a47e37dec872f9f8209ee0da3ce828c39dba612e1', 'org.jetbrains.kotlin:kotlin-reflect:1.6.0:kotlin-reflect-1.6.0.jar:c6161884209221db7f5ddb031bb480a3c46bb90d5b65d7cc0167b149aaa9c494',
'org.jetbrains.kotlin:kotlin-reflect:1.7.10:kotlin-reflect-1.7.10.jar:187c5e5a588a6ed18c3a41b54df138a5944121bdb396be1c3fa4abee67397955', 'org.jetbrains.kotlin:kotlin-reflect:1.7.10:kotlin-reflect-1.7.10.jar:187c5e5a588a6ed18c3a41b54df138a5944121bdb396be1c3fa4abee67397955',
'org.jetbrains.kotlin:kotlin-script-runtime:1.7.10:kotlin-script-runtime-1.7.10.jar:84bfc2aa4eec6768113930cdaef8b5b9f59ac4138fbca3b11300fff4d076950c', 'org.jetbrains.kotlin:kotlin-script-runtime:1.7.10:kotlin-script-runtime-1.7.10.jar:84bfc2aa4eec6768113930cdaef8b5b9f59ac4138fbca3b11300fff4d076950c',
'org.jetbrains.kotlin:kotlin-scripting-common:1.7.10:kotlin-scripting-common-1.7.10.jar:c3a346f38a3d6e242f2316c5a7a4a6b526f2cc42b44ebd40654a0f885cbc4940', 'org.jetbrains.kotlin:kotlin-scripting-common:1.7.10:kotlin-scripting-common-1.7.10.jar:c3a346f38a3d6e242f2316c5a7a4a6b526f2cc42b44ebd40654a0f885cbc4940',
@@ -69,13 +71,12 @@ dependencyVerification {
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10:kotlin-stdlib-jdk8-1.7.10.jar:8aafdd60c94f454c92e5066d266a5ed53ecc63c78f623b3fd9db56fea4032873', 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10:kotlin-stdlib-jdk8-1.7.10.jar:8aafdd60c94f454c92e5066d266a5ed53ecc63c78f623b3fd9db56fea4032873',
'org.jetbrains.kotlin:kotlin-stdlib:1.7.10:kotlin-stdlib-1.7.10.jar:e771fe74250a943e8f6346713201ff1d8cb95c3a5d1a91a22b65a9e04f6a8901', 'org.jetbrains.kotlin:kotlin-stdlib:1.7.10:kotlin-stdlib-1.7.10.jar:e771fe74250a943e8f6346713201ff1d8cb95c3a5d1a91a22b65a9e04f6a8901',
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478', 'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
'org.json:json:20150729:json-20150729.jar:38c21b9c3d6d24919cd15d027d20afab0a019ac9205f7ed9083b32bdd42a2353',
'org.junit.jupiter:junit-jupiter-api:5.5.2:junit-jupiter-api-5.5.2.jar:249a2fdbd3931987c0298d00ca08ed248496e0fc11e0463c08c4f82e0cc79b1c', 'org.junit.jupiter:junit-jupiter-api:5.5.2:junit-jupiter-api-5.5.2.jar:249a2fdbd3931987c0298d00ca08ed248496e0fc11e0463c08c4f82e0cc79b1c',
'org.junit.jupiter:junit-jupiter-engine:5.5.2:junit-jupiter-engine-5.5.2.jar:6d777da9876e2ef7a0336e8f098f8d74a5a64f810aa3a4a2f5f3b766ce97837b', 'org.junit.jupiter:junit-jupiter-engine:5.5.2:junit-jupiter-engine-5.5.2.jar:6d777da9876e2ef7a0336e8f098f8d74a5a64f810aa3a4a2f5f3b766ce97837b',
'org.junit.jupiter:junit-jupiter-params:5.5.2:junit-jupiter-params-5.5.2.jar:fd49c7fd9d0f7f1e5b5f6982254cee79177fa2e76a37fdee0466e64f975567b5', 'org.junit.jupiter:junit-jupiter-params:5.5.2:junit-jupiter-params-5.5.2.jar:fd49c7fd9d0f7f1e5b5f6982254cee79177fa2e76a37fdee0466e64f975567b5',
'org.junit.platform:junit-platform-commons:1.5.2:junit-platform-commons-1.5.2.jar:fc44afdfc0f20c85e71a66e7943281aef3bc1e0fd62d2d69a36cb6901e682c10', 'org.junit.platform:junit-platform-commons:1.5.2:junit-platform-commons-1.5.2.jar:fc44afdfc0f20c85e71a66e7943281aef3bc1e0fd62d2d69a36cb6901e682c10',
'org.junit.platform:junit-platform-engine:1.5.2:junit-platform-engine-1.5.2.jar:ff20ba4ad8c00ef17baef9c55512f9c02d9a68740f7f1ac01a9a6aa0239931f8', 'org.junit.platform:junit-platform-engine:1.5.2:junit-platform-engine-1.5.2.jar:ff20ba4ad8c00ef17baef9c55512f9c02d9a68740f7f1ac01a9a6aa0239931f8',
'org.objenesis:objenesis:3.1:objenesis-3.1.jar:cdb3d038c188de6f46ffd5cd930be2d5e5dba59c53b26437995d534e3db2fb80', 'org.objenesis:objenesis:3.2:objenesis-3.2.jar:03d960bd5aef03c653eb000413ada15eb77cdd2b8e4448886edf5692805e35f3',
'org.opentest4j:opentest4j:1.2.0:opentest4j-1.2.0.jar:58812de60898d976fb81ef3b62da05c6604c18fd4a249f5044282479fc286af2', 'org.opentest4j:opentest4j:1.2.0:opentest4j-1.2.0.jar:58812de60898d976fb81ef3b62da05c6604c18fd4a249f5044282479fc286af2',
'org.skyscreamer:jsonassert:1.5.0:jsonassert-1.5.0.jar:a310bc79c3f4744e2b2e993702fcebaf3696fec0063643ffdc6b49a8fb03ef39', 'org.skyscreamer:jsonassert:1.5.0:jsonassert-1.5.0.jar:a310bc79c3f4744e2b2e993702fcebaf3696fec0063643ffdc6b49a8fb03ef39',
'org.slf4j:slf4j-api:1.7.30:slf4j-api-1.7.30.jar:cdba07964d1bb40a0761485c6b1e8c2f8fd9eb1d19c53928ac0d7f9510105c57', 'org.slf4j:slf4j-api:1.7.30:slf4j-api-1.7.30.jar:cdba07964d1bb40a0761485c6b1e8c2f8fd9eb1d19c53928ac0d7f9510105c57',