Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ kotlin {

val kotlinVersion: String by project
val coroutinesVersion: String by project
val mockServerVersion: String by project

sourceSets {
val commonMain by getting {
Expand Down Expand Up @@ -127,6 +128,7 @@ kotlin {
api("org.jetbrains.kotlin:kotlin-test-junit5:$kotlinVersion")
implementation("org.junit.jupiter:junit-jupiter:$junitVersion")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-debug:$coroutinesVersion")
implementation("org.mock-server:mockserver-netty:$mockServerVersion")
}
}

Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ coroutinesVersion=1.6.4
junitVersion=5.9.2
ktlintVersion=0.48.1
kotestVersion=5.5.4
mockServerVersion=5.15.0

# elasticurl only
kotlinxCliVersion=0.3.2
Expand Down
120 changes: 0 additions & 120 deletions src/common/test/aws/sdk/kotlin/crt/http/HttpRequestResponseTest.kt

This file was deleted.

130 changes: 130 additions & 0 deletions src/jvm/test/aws/sdk/kotlin/crt/http/HttpRequestResponseTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/

package aws.sdk.kotlin.crt.http

import aws.sdk.kotlin.crt.runSuspendTest
import aws.sdk.kotlin.crt.util.Digest
import aws.sdk.kotlin.crt.util.encodeToHex
import org.junit.jupiter.api.AfterAll
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.TestInstance
import org.mockserver.client.MockServerClient
import org.mockserver.integration.ClientAndServer
import org.mockserver.model.HttpRequest.request
import org.mockserver.model.HttpResponse.response
import kotlin.test.*

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class HttpRequestResponseTest : HttpClientTest() {
private val TEST_DOC_LINE =
"This is a sample to prove that http downloads and uploads work. It doesn't really matter what's in here, we mainly just need to verify the downloads and uploads work."
private val TEST_DOC_SHA256 = "c7fdb5314b9742467b16bd5ea2f8012190b5e2c44a005f7984f89aab58219534"

lateinit var mockServer: MockServerClient
lateinit var url: String

@BeforeAll
fun setup() {
mockServer = ClientAndServer.startClientAndServer(0)
url = "http://localhost:${mockServer.port}"
}

@AfterAll
fun tearDown() {
mockServer.close()
}

// no body request
private suspend fun testSimpleRequest(verb: String, path: String, expectedStatus: Int) {
val expectedRequest = request().withMethod(verb).withPath(path)
val unhandledRequest = request()

// Set up the expected case
mockServer.`when`(expectedRequest)
.respond(response().withStatusCode(expectedStatus))

// Unhandled requests
mockServer.`when`(unhandledRequest).respond(response().withStatusCode(500))

try {
val response = roundTrip(url = url + path, verb = verb)
assertEquals(
expectedStatus,
response.statusCode,
"[$url]: expected http status ($expectedStatus) does not match",
)
} catch (ex: Exception) {
fail("[$url]: failed to round trip request: $ex")
} finally {
// Clean up
mockServer.clear(expectedRequest)
mockServer.clear(unhandledRequest)
}
}

@Test
fun testHttpGet() = runSuspendTest {
testSimpleRequest("GET", "/get", 200)
testSimpleRequest("GET", "/post", 405)
testSimpleRequest("GET", "/put", 405)
testSimpleRequest("GET", "/delete", 405)
}

@Test
fun testHttpPost() = runSuspendTest {
testSimpleRequest("POST", "/get", 405)
testSimpleRequest("POST", "/post", 200)
testSimpleRequest("POST", "/put", 405)
testSimpleRequest("POST", "/delete", 405)
}

@Test
fun testHttpPut() = runSuspendTest {
testSimpleRequest("PUT", "/get", 405)
testSimpleRequest("PUT", "/post", 405)
testSimpleRequest("PUT", "/put", 200)
testSimpleRequest("PUT", "/delete", 405)
}

@Test
fun testHttpDelete() = runSuspendTest {
testSimpleRequest("DELETE", "/get", 405)
testSimpleRequest("DELETE", "/post", 405)
testSimpleRequest("DELETE", "/put", 405)
testSimpleRequest("DELETE", "/delete", 200)
}

@Test
fun testHttpDownload() = runSuspendTest {
val response = roundTrip(url = "https://aws-crt-test-stuff.s3.amazonaws.com/http_test_doc.txt", verb = "GET")
assertEquals(200, response.statusCode, "expected http status does not match")
assertNotNull(response.body)

assertEquals(TEST_DOC_SHA256, Digest.sha256(response.body).encodeToHex())
}

@Test
fun testHttpUpload() = runSuspendTest {
val bodyToSend = TEST_DOC_LINE

// Set up mock server
val expectedRequest = request().withMethod("PUT").withPath("/anything")
mockServer.`when`(expectedRequest)
.respond(response().withStatusCode(200).withBody(bodyToSend))

val response = try {
roundTrip(url = "$url/anything", verb = "PUT", body = bodyToSend)
} finally {
mockServer.clear(expectedRequest)
}

assertEquals(200, response.statusCode, "expected http status does not match")
assertNotNull(response.body, "expected a response body for http upload")

val bodyText = response.body.decodeToString()
assertEquals(bodyToSend, bodyText)
}
}