Skip to content

Commit c58d6e6

Browse files
committed
Add tests for EC2Metadata and IMDSCredentialsResolver classes
1 parent d83df6c commit c58d6e6

File tree

1 file changed

+64
-2
lines changed
  • packages/smithy-aws-core/tests/unit/credentials_resolvers

1 file changed

+64
-2
lines changed

packages/smithy-aws-core/tests/unit/credentials_resolvers/test_imds.py

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,20 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
# pyright: reportPrivateUsage=false
5+
import json
56
import pytest
67
import time
8+
from datetime import datetime, timezone
79
from smithy_core.retries import SimpleRetryStrategy
810
from smithy_core import URI
9-
from smithy_aws_core.credentials_resolvers.imds import Config, Token, TokenCache
11+
from smithy_http.aio import HTTPRequest
12+
from smithy_aws_core.credentials_resolvers.imds import (
13+
Config,
14+
Token,
15+
TokenCache,
16+
EC2Metadata,
17+
IMDSCredentialsResolver,
18+
)
1019
from unittest.mock import MagicMock, AsyncMock
1120

1221

@@ -112,4 +121,57 @@ async def test_token_cache_get_token():
112121
token_cache._refresh.assert_awaited()
113122

114123

115-
# TODO: Add tests for EC2Metadata and IMDSCredentialsResolver
124+
async def test_ec2_metadata_get():
125+
# Test EC2Metadata.get() method to retrieve metadata from IMDS
126+
http_client = AsyncMock()
127+
config = Config()
128+
response = AsyncMock()
129+
response.consume_body_async.return_value = b"metadata-response"
130+
http_client.send.return_value = response
131+
132+
ec2_metadata = EC2Metadata(http_client, config)
133+
ec2_metadata._token_cache.get_token = AsyncMock(
134+
return_value=Token("mocked-token", config.token_ttl)
135+
)
136+
137+
result = await ec2_metadata.get(path="/test-path")
138+
assert result == "metadata-response"
139+
140+
request = http_client.send.call_args.kwargs["request"]
141+
assert isinstance(request, HTTPRequest)
142+
assert request.destination.path == "/test-path"
143+
assert request.method == "GET"
144+
assert request.fields["x-aws-ec2-metadata-token"].values == ["mocked-token"]
145+
146+
147+
async def test_imds_credentials_resolver():
148+
# Test IMDSCredentialsResolver retrieving credentials
149+
http_client = AsyncMock()
150+
config = Config()
151+
ec2_metadata = AsyncMock()
152+
resolver = IMDSCredentialsResolver(http_client, config)
153+
resolver._ec2_metadata_client = ec2_metadata
154+
155+
# Mock EC2Metadata client get responses
156+
ec2_metadata.get.side_effect = [
157+
"test-profile",
158+
json.dumps(
159+
{
160+
"AccessKeyId": "test-access-key",
161+
"SecretAccessKey": "test-secret-key",
162+
"Token": "test-session-token",
163+
"AccountId": "test-account",
164+
"Expiration": "2025-03-13T07:28:47Z",
165+
}
166+
),
167+
]
168+
169+
credentials = await resolver.get_identity(identity_properties=MagicMock())
170+
assert credentials.access_key_id == "test-access-key"
171+
assert credentials.secret_access_key == "test-secret-key"
172+
assert credentials.session_token == "test-session-token"
173+
assert credentials.account_id == "test-account"
174+
assert credentials.expiration == datetime(
175+
2025, 3, 13, 7, 28, 47, tzinfo=timezone.utc
176+
)
177+
ec2_metadata.get.assert_awaited()

0 commit comments

Comments
 (0)