Skip to content

Commit

Permalink
misc: make route 53 uri tests resilient to model version changes (#1540)
Browse files Browse the repository at this point in the history
  • Loading branch information
0marperez authored Feb 28, 2025
1 parent e6bcbce commit 4167a27
Show file tree
Hide file tree
Showing 3 changed files with 174 additions and 81 deletions.
6 changes: 6 additions & 0 deletions services/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,12 @@ subprojects {
}
}

if (project.name == "route53") {
dependencies {
implementation(libraries.smithy.kotlin.http.test) // needed for URI E2E tests
}
}

// Run the tests with the classpath containing the compile dependencies (including 'main'),
// runtime dependencies, and the outputs of this compilation:
classpath = compileDependencyFiles + runtimeDependencyFiles + output.allOutputs
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.

0 comments on commit 4167a27

Please sign in to comment.