From c67e0ef533d9b16aa6ad06136bc718141126d7a4 Mon Sep 17 00:00:00 2001 From: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Date: Wed, 7 May 2025 20:30:45 +0000 Subject: [PATCH 1/4] test(client-s3): integration for config 'authSchemePreference' --- .../test/unit/authSchemePreference.spec.ts | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 clients/client-s3/test/unit/authSchemePreference.spec.ts diff --git a/clients/client-s3/test/unit/authSchemePreference.spec.ts b/clients/client-s3/test/unit/authSchemePreference.spec.ts new file mode 100644 index 000000000000..c3f233f63816 --- /dev/null +++ b/clients/client-s3/test/unit/authSchemePreference.spec.ts @@ -0,0 +1,48 @@ +import { describe, expect, test as it } from "vitest"; + +import { S3 } from "../../src/S3"; +import "../../../../packages/signature-v4-crt/src/index"; + +describe("authSchemePreference", () => { + const credentials = { accessKeyId: "key", secretAccessKey: "secret" }; + const Bucket = `arn:aws:s3-outposts:us-west-2:123456789012:outpost/op-01234567890123456/accesspoint/abc-111`; + const Key = "key"; + const Body = "body"; + + const SIGNATURE_PREFIX = { + sigv4: "AWS4-HMAC-SHA256", + sigv4a: "AWS4-ECDSA-P256-SHA256", + }; + + const interceptorMiddleware = (next, context) => (args) => { + // middleware intercept the request and return it early + const request = args.request; + return Promise.resolve({ + output: { + $metadata: { attempts: 0, httpStatusCode: 200 }, + request, + context, + }, + response: {}, + }); + }; + + const getAuthorizationHeader = (headers: Record) => + headers["authorization"] || headers["Authorization"]; + + it.each([ + ["sigv4a", undefined], + ["sigv4a", ["sigv3"]], + ["sigv4", ["sigv4"]], + ["sigv4", ["sigv4", "sigv4a"]], + ["sigv4a", ["sigv4a"]], + ["sigv4a", ["sigv4a", "sigv4"]], + ])("selects '%s' when authSchemePreference: %s", async (output, authSchemePreference) => { + const client = new S3({ credentials, authSchemePreference }); + client.middlewareStack.add(interceptorMiddleware, { step: "finalizeRequest", priority: "low" }); + const result: any = await client.putObject({ Bucket, Key, Body }); + + const authorizationHeader = getAuthorizationHeader(result.request.headers); + expect(authorizationHeader.startsWith(SIGNATURE_PREFIX[output])).toBe(true); + }); +}); From f1d3da88994d7f63ec06d2ede1a3f9e7f6f14663 Mon Sep 17 00:00:00 2001 From: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Date: Wed, 7 May 2025 21:32:35 +0000 Subject: [PATCH 2/4] test(client-s3): move authSchemePreference to integ --- clients/client-s3/package.json | 2 ++ .../authSchemePreference.integ.spec.ts} | 0 clients/client-s3/vitest.config.integ.ts | 8 ++++++++ 3 files changed, 10 insertions(+) rename clients/client-s3/test/{unit/authSchemePreference.spec.ts => integ/authSchemePreference.integ.spec.ts} (100%) create mode 100644 clients/client-s3/vitest.config.integ.ts diff --git a/clients/client-s3/package.json b/clients/client-s3/package.json index d915ed92efc2..cbd330662538 100644 --- a/clients/client-s3/package.json +++ b/clients/client-s3/package.json @@ -15,6 +15,8 @@ "test": "yarn g:vitest run", "test:browser": "node ./test/browser-build/esbuild && yarn g:vitest run -c vitest.config.browser.ts", "test:browser:watch": "node ./test/browser-build/esbuild && yarn g:vitest watch -c vitest.config.browser.ts", + "test:integration": "yarn g:vitest run -c vitest.config.integ.ts", + "test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.ts", "test:e2e": "yarn g:vitest run -c vitest.config.e2e.ts && yarn test:browser", "test:e2e:watch": "yarn g:vitest watch -c vitest.config.e2e.ts", "test:watch": "yarn g:vitest watch" diff --git a/clients/client-s3/test/unit/authSchemePreference.spec.ts b/clients/client-s3/test/integ/authSchemePreference.integ.spec.ts similarity index 100% rename from clients/client-s3/test/unit/authSchemePreference.spec.ts rename to clients/client-s3/test/integ/authSchemePreference.integ.spec.ts diff --git a/clients/client-s3/vitest.config.integ.ts b/clients/client-s3/vitest.config.integ.ts new file mode 100644 index 000000000000..5802db1ac64a --- /dev/null +++ b/clients/client-s3/vitest.config.integ.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + include: ["**/*.integ.spec.ts"], + environment: "node", + }, +}); From 4fd82035c908eac8078dd2940390dea867d705e3 Mon Sep 17 00:00:00 2001 From: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Date: Wed, 7 May 2025 21:33:35 +0000 Subject: [PATCH 3/4] test(client-s3): use package imports in integ test --- .../client-s3/test/integ/authSchemePreference.integ.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/client-s3/test/integ/authSchemePreference.integ.spec.ts b/clients/client-s3/test/integ/authSchemePreference.integ.spec.ts index c3f233f63816..139dff7e350f 100644 --- a/clients/client-s3/test/integ/authSchemePreference.integ.spec.ts +++ b/clients/client-s3/test/integ/authSchemePreference.integ.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, test as it } from "vitest"; -import { S3 } from "../../src/S3"; -import "../../../../packages/signature-v4-crt/src/index"; +import { S3 } from "@aws-sdk/client-s3"; +import "@aws-sdk/signature-v4-crt"; describe("authSchemePreference", () => { const credentials = { accessKeyId: "key", secretAccessKey: "secret" }; From b60b2b22b145c695ad50c1ff93381088a9f3a770 Mon Sep 17 00:00:00 2001 From: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Date: Wed, 7 May 2025 23:50:29 +0000 Subject: [PATCH 4/4] test(client-s3): add types --- .../test/integ/authSchemePreference.integ.spec.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/clients/client-s3/test/integ/authSchemePreference.integ.spec.ts b/clients/client-s3/test/integ/authSchemePreference.integ.spec.ts index 139dff7e350f..ba547c9a26c3 100644 --- a/clients/client-s3/test/integ/authSchemePreference.integ.spec.ts +++ b/clients/client-s3/test/integ/authSchemePreference.integ.spec.ts @@ -1,3 +1,4 @@ +import { FinalizeRequestMiddleware } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { S3 } from "@aws-sdk/client-s3"; @@ -9,20 +10,16 @@ describe("authSchemePreference", () => { const Key = "key"; const Body = "body"; - const SIGNATURE_PREFIX = { + const SIGNATURE_PREFIX: Record = { sigv4: "AWS4-HMAC-SHA256", sigv4a: "AWS4-ECDSA-P256-SHA256", }; - const interceptorMiddleware = (next, context) => (args) => { + const interceptorMiddleware: FinalizeRequestMiddleware = (next, context) => (args) => { // middleware intercept the request and return it early const request = args.request; return Promise.resolve({ - output: { - $metadata: { attempts: 0, httpStatusCode: 200 }, - request, - context, - }, + output: { $metadata: { attempts: 0, httpStatusCode: 200 }, request, context }, response: {}, }); };