Skip to content

Commit f7c8f82

Browse files
authored
kn/misc: enable various ignored tests (#1257)
1 parent ad639f2 commit f7c8f82

File tree

19 files changed

+183
-179
lines changed

19 files changed

+183
-179
lines changed

.github/workflows/artifact-size-metrics.yml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,25 @@ jobs:
4545
steps:
4646
- name: Checkout Sources
4747
uses: actions/checkout@v4
48-
- name: Configure JDK
49-
uses: actions/setup-java@v3
50-
with:
51-
distribution: 'corretto'
52-
java-version: 17
53-
cache: 'gradle'
48+
49+
- name: Setup build
50+
uses: .github/actions/setup-build
51+
5452
- name: Configure AWS Credentials
5553
uses: aws-actions/configure-aws-credentials@v4
5654
with:
5755
role-to-assume: ${{ secrets.CI_AWS_ROLE_ARN }}
5856
aws-region: us-west-2
57+
5958
- name: Configure Gradle
6059
uses: awslabs/aws-kotlin-repo-tools/.github/actions/configure-gradle@main
60+
6161
- name: Generate Artifact Size Metrics
6262
run: ./gradlew -Paws.kotlin.native=false artifactSizeMetrics
63+
6364
- name: Analyze Artifact Size Metrics
6465
run: ./gradlew analyzeArtifactSizeMetrics
66+
6567
- name: Show Results
6668
uses: actions/github-script@v7
6769
with:

runtime/auth/aws-signing-crt/api/aws-signing-crt.api

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
public final class aws/smithy/kotlin/runtime/auth/awssigning/crt/CrtAwsSigner : aws/smithy/kotlin/runtime/auth/awssigning/AwsSigner {
1+
public final class aws/smithy/kotlin/runtime/auth/awssigning/crt/CrtAwsSigner : aws/sdk/kotlin/crt/WithCrt, aws/smithy/kotlin/runtime/auth/awssigning/AwsSigner {
22
public static final field INSTANCE Laws/smithy/kotlin/runtime/auth/awssigning/crt/CrtAwsSigner;
33
public fun sign (Laws/smithy/kotlin/runtime/http/request/HttpRequest;Laws/smithy/kotlin/runtime/auth/awssigning/AwsSigningConfig;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
44
public fun signChunk ([B[BLaws/smithy/kotlin/runtime/auth/awssigning/AwsSigningConfig;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;

runtime/auth/aws-signing-crt/jvmAndNative/src/aws/smithy/kotlin/runtime/auth/awssigning/crt/CrtAwsSigner.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package aws.smithy.kotlin.runtime.auth.awssigning.crt
66

7+
import aws.sdk.kotlin.crt.WithCrt
78
import aws.smithy.kotlin.runtime.auth.awscredentials.Credentials
89
import aws.smithy.kotlin.runtime.auth.awssigning.*
910
import aws.smithy.kotlin.runtime.crt.toSignableCrtRequest
@@ -24,7 +25,7 @@ import aws.sdk.kotlin.crt.http.Headers as CrtHeaders
2425

2526
private const val S3_EXPRESS_HEADER_NAME = "X-Amz-S3session-Token"
2627

27-
public object CrtAwsSigner : AwsSigner {
28+
public object CrtAwsSigner : AwsSigner, WithCrt() {
2829
override suspend fun sign(request: HttpRequest, config: AwsSigningConfig): AwsSigningResult<HttpRequest> {
2930
val isUnsigned = config.hashSpecification is HashSpecification.UnsignedPayload
3031
val isAwsChunked = request.headers.contains("Content-Encoding", "aws-chunked")

runtime/auth/aws-signing-default/api/aws-signing-default.api

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public final class aws/smithy/kotlin/runtime/auth/awssigning/DefaultAwsSignerBui
55
public final fun setTelemetryProvider (Laws/smithy/kotlin/runtime/telemetry/TelemetryProvider;)V
66
}
77

8-
public final class aws/smithy/kotlin/runtime/auth/awssigning/DefaultAwsSignerKt {
8+
public final class aws/smithy/kotlin/runtime/auth/awssigning/DefaultAwsSignerJVMKt {
99
public static final fun DefaultAwsSigner (Lkotlin/jvm/functions/Function1;)Laws/smithy/kotlin/runtime/auth/awssigning/AwsSigner;
1010
public static final fun getDefaultAwsSigner ()Laws/smithy/kotlin/runtime/auth/awssigning/AwsSigner;
1111
}

runtime/auth/aws-signing-default/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,11 @@ kotlin {
2525
all {
2626
languageSettings.optIn("aws.smithy.kotlin.runtime.InternalApi")
2727
}
28+
29+
nativeMain {
30+
dependencies {
31+
implementation(project(":runtime:auth:aws-signing-crt"))
32+
}
33+
}
2834
}
2935
}

runtime/auth/aws-signing-default/common/src/aws/smithy/kotlin/runtime/auth/awssigning/DefaultAwsSigner.kt

Lines changed: 1 addition & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -4,136 +4,5 @@
44
*/
55
package aws.smithy.kotlin.runtime.auth.awssigning
66

7-
import aws.smithy.kotlin.runtime.ExperimentalApi
8-
import aws.smithy.kotlin.runtime.http.Headers
9-
import aws.smithy.kotlin.runtime.http.request.HttpRequest
10-
import aws.smithy.kotlin.runtime.telemetry.TelemetryProvider
11-
import aws.smithy.kotlin.runtime.telemetry.logging.logger
12-
import aws.smithy.kotlin.runtime.time.TimestampFormat
13-
import kotlin.coroutines.coroutineContext
14-
157
/** The default implementation of [AwsSigner] */
16-
public val DefaultAwsSigner: AwsSigner = DefaultAwsSignerImpl()
17-
18-
/** Creates a customized instance of [AwsSigner] */
19-
@Suppress("ktlint:standard:function-naming")
20-
public fun DefaultAwsSigner(block: DefaultAwsSignerBuilder.() -> Unit): AwsSigner =
21-
DefaultAwsSignerBuilder().apply(block).build()
22-
23-
/** A builder class for creating instances of [AwsSigner] using the default implementation */
24-
public class DefaultAwsSignerBuilder {
25-
public var telemetryProvider: TelemetryProvider? = null
26-
27-
public fun build(): AwsSigner = DefaultAwsSignerImpl(
28-
telemetryProvider = telemetryProvider,
29-
)
30-
}
31-
32-
private val AwsSigningAlgorithm.signatureCalculator
33-
get() = when (this) {
34-
AwsSigningAlgorithm.SIGV4 -> SignatureCalculator.SigV4
35-
AwsSigningAlgorithm.SIGV4_ASYMMETRIC -> SignatureCalculator.SigV4a
36-
}
37-
38-
@OptIn(ExperimentalApi::class)
39-
internal class DefaultAwsSignerImpl(
40-
private val canonicalizer: Canonicalizer = Canonicalizer.Default,
41-
private val requestMutator: RequestMutator = RequestMutator.Default,
42-
private val telemetryProvider: TelemetryProvider? = null,
43-
) : AwsSigner {
44-
override suspend fun sign(request: HttpRequest, config: AwsSigningConfig): AwsSigningResult<HttpRequest> {
45-
val logger = telemetryProvider?.loggerProvider?.getOrCreateLogger("DefaultAwsSigner")
46-
?: coroutineContext.logger<DefaultAwsSignerImpl>()
47-
48-
val canonical = canonicalizer.canonicalRequest(request, config)
49-
if (config.logRequest) {
50-
logger.trace { "Canonical request:\n${canonical.requestString}" }
51-
}
52-
53-
val signatureCalculator = config.algorithm.signatureCalculator
54-
55-
val stringToSign = signatureCalculator.stringToSign(canonical.requestString, config)
56-
logger.trace { "String to sign:\n$stringToSign" }
57-
58-
val signingKey = signatureCalculator.signingKey(config)
59-
60-
val signature = signatureCalculator.calculate(signingKey, stringToSign)
61-
logger.debug { "Calculated signature: $signature" }
62-
63-
val signedRequest = requestMutator.appendAuth(config, canonical, signature)
64-
65-
return AwsSigningResult(signedRequest, signature.encodeToByteArray())
66-
}
67-
68-
override suspend fun signChunk(
69-
chunkBody: ByteArray,
70-
prevSignature: ByteArray,
71-
config: AwsSigningConfig,
72-
): AwsSigningResult<Unit> {
73-
val logger = telemetryProvider?.loggerProvider?.getOrCreateLogger("DefaultAwsSigner")
74-
?: coroutineContext.logger<DefaultAwsSignerImpl>()
75-
76-
val signatureCalculator = config.algorithm.signatureCalculator
77-
78-
val stringToSign = signatureCalculator.chunkStringToSign(chunkBody, prevSignature, config)
79-
logger.trace { "Chunk string to sign:\n$stringToSign" }
80-
81-
val signingKey = signatureCalculator.signingKey(config)
82-
83-
val signature = signatureCalculator.calculate(signingKey, stringToSign)
84-
logger.debug { "Calculated chunk signature: $signature" }
85-
86-
return AwsSigningResult(Unit, signature.encodeToByteArray())
87-
}
88-
89-
override suspend fun signChunkTrailer(
90-
trailingHeaders: Headers,
91-
prevSignature: ByteArray,
92-
config: AwsSigningConfig,
93-
): AwsSigningResult<Unit> {
94-
val logger = telemetryProvider?.loggerProvider?.getOrCreateLogger("DefaultAwsSigner")
95-
?: coroutineContext.logger<DefaultAwsSignerImpl>()
96-
97-
val signatureCalculator = config.algorithm.signatureCalculator
98-
99-
// FIXME - can we share canonicalization code more than we are..., also this reduce is inefficient.
100-
// canonicalize the headers
101-
val trailingHeadersBytes = trailingHeaders.entries().sortedBy { e -> e.key.lowercase() }
102-
.map { e ->
103-
buildString {
104-
append(e.key.lowercase())
105-
append(":")
106-
append(e.value.joinToString(",") { v -> v.trim() })
107-
append("\n")
108-
}.encodeToByteArray()
109-
}.reduce { acc, bytes -> acc + bytes }
110-
111-
val stringToSign = signatureCalculator.chunkTrailerStringToSign(trailingHeadersBytes, prevSignature, config)
112-
logger.trace { "Chunk trailer string to sign:\n$stringToSign" }
113-
114-
val signingKey = signatureCalculator.signingKey(config)
115-
116-
val signature = signatureCalculator.calculate(signingKey, stringToSign)
117-
logger.debug { "Calculated chunk signature: $signature" }
118-
119-
return AwsSigningResult(Unit, signature.encodeToByteArray())
120-
}
121-
}
122-
123-
/**
124-
* Formats a credential scope consisting of a signing date, region (SigV4 only), service, and a signature type
125-
*/
126-
internal val AwsSigningConfig.credentialScope: String
127-
get() = run {
128-
val signingDate = signingDate.format(TimestampFormat.ISO_8601_CONDENSED_DATE)
129-
return when (algorithm) {
130-
AwsSigningAlgorithm.SIGV4 -> "$signingDate/$region/$service/aws4_request"
131-
AwsSigningAlgorithm.SIGV4_ASYMMETRIC -> "$signingDate/$service/aws4_request"
132-
}
133-
}
134-
135-
/**
136-
* Formats the value for a credential header/parameter
137-
*/
138-
internal fun credentialValue(config: AwsSigningConfig): String =
139-
"${config.credentials.accessKeyId}/${config.credentialScope}"
8+
public expect val DefaultAwsSigner: AwsSigner

runtime/auth/aws-signing-default/common/src/aws/smithy/kotlin/runtime/auth/awssigning/RequestMutator.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package aws.smithy.kotlin.runtime.auth.awssigning
66

77
import aws.smithy.kotlin.runtime.http.request.HttpRequest
8+
import aws.smithy.kotlin.runtime.time.TimestampFormat
89

910
/**
1011
* An object that can mutate requests to include signing attributes.
@@ -55,3 +56,21 @@ internal class DefaultRequestMutator : RequestMutator {
5556
return canonical.request.build()
5657
}
5758
}
59+
60+
/**
61+
* Formats a credential scope consisting of a signing date, region (SigV4 only), service, and a signature type
62+
*/
63+
internal val AwsSigningConfig.credentialScope: String
64+
get() {
65+
val signingDate = signingDate.format(TimestampFormat.ISO_8601_CONDENSED_DATE)
66+
return when (algorithm) {
67+
AwsSigningAlgorithm.SIGV4 -> "$signingDate/$region/$service/aws4_request"
68+
AwsSigningAlgorithm.SIGV4_ASYMMETRIC -> "$signingDate/$service/aws4_request"
69+
}
70+
}
71+
72+
/**
73+
* Formats the value for a credential header/parameter
74+
*/
75+
internal fun credentialValue(config: AwsSigningConfig): String =
76+
"${config.credentials.accessKeyId}/${config.credentialScope}"
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package aws.smithy.kotlin.runtime.auth.awssigning
6+
7+
import aws.smithy.kotlin.runtime.ExperimentalApi
8+
import aws.smithy.kotlin.runtime.http.Headers
9+
import aws.smithy.kotlin.runtime.http.request.HttpRequest
10+
import aws.smithy.kotlin.runtime.telemetry.TelemetryProvider
11+
import aws.smithy.kotlin.runtime.telemetry.logging.logger
12+
import kotlin.coroutines.coroutineContext
13+
14+
/** The default implementation of [AwsSigner] */
15+
public actual val DefaultAwsSigner: AwsSigner = DefaultAwsSignerImpl()
16+
17+
/** Creates a customized instance of [AwsSigner] */
18+
@Suppress("ktlint:standard:function-naming")
19+
public fun DefaultAwsSigner(block: DefaultAwsSignerBuilder.() -> Unit): AwsSigner =
20+
DefaultAwsSignerBuilder().apply(block).build()
21+
22+
/** A builder class for creating instances of [AwsSigner] using the default implementation */
23+
public class DefaultAwsSignerBuilder {
24+
public var telemetryProvider: TelemetryProvider? = null
25+
26+
public fun build(): AwsSigner = DefaultAwsSignerImpl(
27+
telemetryProvider = telemetryProvider,
28+
)
29+
}
30+
31+
private val AwsSigningAlgorithm.signatureCalculator
32+
get() = when (this) {
33+
AwsSigningAlgorithm.SIGV4 -> SignatureCalculator.SigV4
34+
AwsSigningAlgorithm.SIGV4_ASYMMETRIC -> SignatureCalculator.SigV4a
35+
}
36+
37+
@OptIn(ExperimentalApi::class)
38+
internal class DefaultAwsSignerImpl(
39+
private val canonicalizer: Canonicalizer = Canonicalizer.Default,
40+
private val requestMutator: RequestMutator = RequestMutator.Default,
41+
private val telemetryProvider: TelemetryProvider? = null,
42+
) : AwsSigner {
43+
override suspend fun sign(request: HttpRequest, config: AwsSigningConfig): AwsSigningResult<HttpRequest> {
44+
val logger = telemetryProvider?.loggerProvider?.getOrCreateLogger("DefaultAwsSigner")
45+
?: coroutineContext.logger<DefaultAwsSignerImpl>()
46+
47+
val canonical = canonicalizer.canonicalRequest(request, config)
48+
if (config.logRequest) {
49+
logger.trace { "Canonical request:\n${canonical.requestString}" }
50+
}
51+
52+
val signatureCalculator = config.algorithm.signatureCalculator
53+
54+
val stringToSign = signatureCalculator.stringToSign(canonical.requestString, config)
55+
logger.trace { "String to sign:\n$stringToSign" }
56+
57+
val signingKey = signatureCalculator.signingKey(config)
58+
59+
val signature = signatureCalculator.calculate(signingKey, stringToSign)
60+
logger.debug { "Calculated signature: $signature" }
61+
62+
val signedRequest = requestMutator.appendAuth(config, canonical, signature)
63+
64+
return AwsSigningResult(signedRequest, signature.encodeToByteArray())
65+
}
66+
67+
override suspend fun signChunk(
68+
chunkBody: ByteArray,
69+
prevSignature: ByteArray,
70+
config: AwsSigningConfig,
71+
): AwsSigningResult<Unit> {
72+
val logger = telemetryProvider?.loggerProvider?.getOrCreateLogger("DefaultAwsSigner")
73+
?: coroutineContext.logger<DefaultAwsSignerImpl>()
74+
75+
val signatureCalculator = config.algorithm.signatureCalculator
76+
77+
val stringToSign = signatureCalculator.chunkStringToSign(chunkBody, prevSignature, config)
78+
logger.trace { "Chunk string to sign:\n$stringToSign" }
79+
80+
val signingKey = signatureCalculator.signingKey(config)
81+
82+
val signature = signatureCalculator.calculate(signingKey, stringToSign)
83+
logger.debug { "Calculated chunk signature: $signature" }
84+
85+
return AwsSigningResult(Unit, signature.encodeToByteArray())
86+
}
87+
88+
override suspend fun signChunkTrailer(
89+
trailingHeaders: Headers,
90+
prevSignature: ByteArray,
91+
config: AwsSigningConfig,
92+
): AwsSigningResult<Unit> {
93+
val logger = telemetryProvider?.loggerProvider?.getOrCreateLogger("DefaultAwsSigner")
94+
?: coroutineContext.logger<DefaultAwsSignerImpl>()
95+
96+
val signatureCalculator = config.algorithm.signatureCalculator
97+
98+
// FIXME - can we share canonicalization code more than we are..., also this reduce is inefficient.
99+
// canonicalize the headers
100+
val trailingHeadersBytes = trailingHeaders.entries().sortedBy { e -> e.key.lowercase() }
101+
.map { e ->
102+
buildString {
103+
append(e.key.lowercase())
104+
append(":")
105+
append(e.value.joinToString(",") { v -> v.trim() })
106+
append("\n")
107+
}.encodeToByteArray()
108+
}.reduce { acc, bytes -> acc + bytes }
109+
110+
val stringToSign = signatureCalculator.chunkTrailerStringToSign(trailingHeadersBytes, prevSignature, config)
111+
logger.trace { "Chunk trailer string to sign:\n$stringToSign" }
112+
113+
val signingKey = signatureCalculator.signingKey(config)
114+
115+
val signature = signatureCalculator.calculate(signingKey, stringToSign)
116+
logger.debug { "Calculated chunk signature: $signature" }
117+
118+
return AwsSigningResult(Unit, signature.encodeToByteArray())
119+
}
120+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package aws.smithy.kotlin.runtime.auth.awssigning
6+
7+
import aws.smithy.kotlin.runtime.auth.awssigning.crt.CrtAwsSigner
8+
9+
/** The default implementation of [AwsSigner] */
10+
public actual val DefaultAwsSigner: AwsSigner = CrtAwsSigner

runtime/auth/aws-signing-tests/common/src/aws/smithy/kotlin/runtime/auth/awssigning/tests/AwsChunkedByteReadChannelTestBase.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package aws.smithy.kotlin.runtime.auth.awssigning.tests
77

8-
import aws.smithy.kotlin.runtime.IgnoreNative
98
import aws.smithy.kotlin.runtime.auth.awssigning.*
109
import aws.smithy.kotlin.runtime.auth.awssigning.internal.CHUNK_SIZE_BYTES
1110
import aws.smithy.kotlin.runtime.io.*
@@ -18,7 +17,6 @@ import kotlin.test.*
1817
import kotlin.time.Duration.Companion.milliseconds
1918

2019
abstract class AwsChunkedByteReadChannelTestBase : AwsChunkedTestBase(AwsChunkedReaderFactory.Channel) {
21-
@IgnoreNative // FIXME Re-enable after Kotlin/Native Implementation
2220
@Test
2321
fun testSlowProducerMultipleChunksPartialLast(): TestResult = runTest {
2422
val numChunks = 6

0 commit comments

Comments
 (0)