Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 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
1 change: 1 addition & 0 deletions services/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ subprojects {
implementation(libraries.kotlin.test.junit5)
implementation(project(":tests:e2e-test-util"))
implementation(libraries.slf4j.simple)
implementation(libraries.smithy.kotlin.http.test)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this be scoped down using if (project.name == "route53") { ... }? Similar to how we do it for other services.

}
}

Expand Down
168 changes: 168 additions & 0 deletions services/route53/e2eTest/src/Route53UriTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
package aws.sdk.kotlin.services.route53

import aws.sdk.kotlin.runtime.auth.credentials.StaticCredentialsProvider
import aws.smithy.kotlin.runtime.auth.awscredentials.Credentials
import aws.smithy.kotlin.runtime.client.ProtocolRequestInterceptorContext
import aws.smithy.kotlin.runtime.http.interceptors.HttpInterceptor
import aws.smithy.kotlin.runtime.http.request.HttpRequest
import aws.smithy.kotlin.runtime.httptest.TestEngine
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.fail

class Route53UriTest {
/**
* Validates that HostedZoneId isn't trimmed when not prefixed
*/
@Test
fun listResourceRecordSetsNoTrim() = runTest {
Route53Client {
region = "us-east-1"
httpClient = TestEngine()
interceptors = mutableListOf(
AssertUrlInterceptor(
expectedUrl = "/0000-00-00/hostedzone/IDOFMYHOSTEDZONE/rrset",
),
)
credentialsProvider = StaticCredentialsProvider(Credentials("AKID", "SECRETAK"))
}.use { client ->
client.listResourceRecordSets {
hostedZoneId = "IDOFMYHOSTEDZONE"
}
}
}

/**
* Validates that HostedZoneId is trimmed
*/
@Test
fun listResourceRecordSetsTrim() = runTest {
Route53Client {
region = "us-east-1"
httpClient = TestEngine()
interceptors = mutableListOf(
AssertUrlInterceptor(
expectedUrl = "/0000-00-00/hostedzone/IDOFMYHOSTEDZONE/rrset",
),
)
credentialsProvider = StaticCredentialsProvider(Credentials("AKID", "SECRETAK"))
}.use { client ->
client.listResourceRecordSets {
hostedZoneId = "hostedzone/IDOFMYHOSTEDZONE"
}
}
}

/**
* Validates that HostedZoneId is trimmed even with a leading slash
*/
@Test
fun listResourceRecordSetsTrimLeadingSlash() = runTest {
Route53Client {
region = "us-east-1"
httpClient = TestEngine()
interceptors = mutableListOf(
AssertUrlInterceptor(
expectedUrl = "/0000-00-00/hostedzone/IDOFMYHOSTEDZONE/rrset",
),
)
credentialsProvider = StaticCredentialsProvider(Credentials("AKID", "SECRETAK"))
}.use { client ->
client.listResourceRecordSets {
hostedZoneId = "/hostedzone/IDOFMYHOSTEDZONE"
}
}
}

/**
* Validates that HostedZoneId isn't over-trimmed
*/
@Test
fun listResourceRecordSetsTrimMultiSlash() = runTest {
Route53Client {
region = "us-east-1"
httpClient = TestEngine()
interceptors = mutableListOf(
AssertUrlInterceptor(
expectedUrl = "/0000-00-00/hostedzone/IDOFMY%2FHOSTEDZONE/rrset",
),
)
credentialsProvider = StaticCredentialsProvider(Credentials("AKID", "SECRETAK"))
}.use { client ->
client.listResourceRecordSets {
hostedZoneId = "/hostedzone/IDOFMY/HOSTEDZONE"
}
}
}

/**
* This test validates that change id is correctly trimmed
*/
@Test
fun getChangeTrimChangeId() = runTest {
Route53Client {
region = "us-east-1"
httpClient = TestEngine()
interceptors = mutableListOf(
AssertUrlInterceptor(
expectedUrl = "/0000-00-00/change/SOMECHANGEID",
),
)
credentialsProvider = StaticCredentialsProvider(Credentials("AKID", "SECRETAK"))
}.use { client ->
client.getChange {
id = "/change/SOMECHANGEID"
}
}
}

/**
* This test validates that delegation set id is correctly trimmed
*/
@Test
fun getReusableDelegationSetTrimDelegationSetId() = runTest {
Route53Client {
region = "us-east-1"
httpClient = TestEngine()
interceptors = mutableListOf(
AssertUrlInterceptor(
expectedUrl = "/0000-00-00/delegationset/DELEGATIONSETID",
),
)
credentialsProvider = StaticCredentialsProvider(Credentials("AKID", "SECRETAK"))
}.use { client ->
client.getReusableDelegationSet {
id = "/delegationset/DELEGATIONSETID"
}
}
}

/**
* Model version can change the URL used as it's included in the URL.
* This interceptor removes the model version from the expected and actual URLs.
* Then performs an equality assertion between the two.
*
* https://github.com/awslabs/aws-sdk-kotlin/issues/1370
*/
private class AssertUrlInterceptor(private val expectedUrl: String) : HttpInterceptor {
override fun readBeforeTransmit(context: ProtocolRequestInterceptorContext<Any, HttpRequest>) {
val actualUrl = context.protocolRequest.url.path.toString()

val parsedActualUrl = removeModelVersion(actualUrl)
val parsedExpectedUrl = removeModelVersion(expectedUrl)

assertEquals(parsedExpectedUrl, parsedActualUrl)
}

private fun removeModelVersion(url: String) =
try {
url.replaceFirst(
Regex("^/\\d{4}-\\d{2}-\\d{2}/"),
"//",
)
} catch (e: Exception) {
fail("The URL '$url' is not in the expected format", e)
}
}
}
81 changes: 0 additions & 81 deletions services/route53/model/route53-tests.smithy

This file was deleted.

Loading