Files
Stuart Lang 83aafc0325 fix(cloudwatch): return empty CompositeAlarms and LogAlarms from DescribeAlarms (#6363)
* fix(cloudwatch): return empty CompositeAlarms and LogAlarms from DescribeAlarms

AWS sends every alarm collection even when it is empty. Floci only sent
MetricAlarms, so the AWS CLI's text output printed a leading None line
for each missing paginator result key.

Closes #6362

* test(cloudwatch): check empty alarm collections in sdk-test-python instead of bats

Drop the new AWS CLI bats file and assert the empty CompositeAlarms and
LogAlarms lists in the existing describe_alarms test, as boto3 leaves an
absent list out of the response.

(cherry picked from commit 42f5019231b446c727d6c94def9d1445263de2d7)
2026-10-24 22:19:09 -04:00
..
2026-09-22 08:57:00 -04:00
2026-09-22 08:57:00 -04:00
2026-09-22 08:57:00 -04:00
2026-09-22 08:57:00 -04:00
2026-09-22 08:57:00 -04:00

sdk-test-python

Compatibility tests for Floci using boto3 (1.37.1).

Services Covered

Group Description
ssm Parameter Store — put, get, label, history, path, tags
sqs Queues, send/receive/delete, DLQ, visibility
sns Topics, subscriptions, publish, SQS delivery
s3 Buckets, objects, tagging, copy, batch delete
s3-cors CORS configuration
s3-notifications S3 → SQS event notifications
dynamodb Tables, CRUD, batch, TTL, tags
lambda Create/invoke/update/delete functions
iam Users, roles, policies, access keys
sts GetCallerIdentity, AssumeRole, GetSessionToken
secretsmanager Create/get/put/list/delete secrets, versioning, tags
kms Keys, aliases, encrypt/decrypt, data keys, sign/verify
kinesis Streams, shards, PutRecord/GetRecords
cloudwatch-metrics PutMetricData, ListMetrics, GetMetricStatistics, alarms
cloudformation-naming Auto physical name generation, explicit name precedence, cross-reference
cognito User pools, clients, AdminCreateUser, InitiateAuth, GetUser

Requirements

  • Python 3.9+
  • pip

Running

pip install -r requirements.txt

# All groups
pytest tests/ --junit-xml=test-results/junit.xml

# Specific tests
pytest tests/test_s3.py

# Via just (from compatibility-tests/)
just test-python

Configuration

Variable Default Description
FLOCI_ENDPOINT http://localhost:4566 Floci emulator endpoint

AWS credentials are always test / test / us-east-1.

Opt-in metric filter replay against AWS

tests/metric_filter_replay.py is a standalone script, not a test: pytest does not collect it, and tests/test_metric_filter_replay.py checks its logic offline with the network blocked. It does not change conftest.py, and FLOCI_TARGET=aws does not select real AWS.

From the repository root, with the declared requirements installed:

python -m pytest compatibility-tests/sdk-test-python/tests/test_metric_filter_replay.py

# Against a local Floci
python compatibility-tests/sdk-test-python/tests/metric_filter_replay.py \
  --endpoint http://127.0.0.1:4566 --region eu-west-1 \
  --timeout 30 --stable-seconds 2 --poll-interval 1

Real AWS mode requires all three safety arguments. It creates billable CloudWatch metrics and a tagged log group, and metric series cannot be deleted; they remain until AWS ages them out.

python compatibility-tests/sdk-test-python/tests/metric_filter_replay.py \
  --aws --profile YOUR_DISPOSABLE_TEST_PROFILE --region eu-west-1 \
  --ack-live-writes I_ACCEPT_AWS_WRITES

Only commercial AWS regions are accepted, the clients pin the official regional endpoints, and the group is deleted in finally only after its ownership tag is verified. A cleanup failure exits nonzero and prints the group name. Credentials, account ids, profile names and raw service errors are never printed.

The expected values come from tests/fixtures/metric-filter-publishing-aws.json, a byte-identical copy of the root fixture src/test/resources/cloudwatchlogs/metric-filter-publishing-aws.json; the root CloudWatchLogsMetricFilterFixturePackagingTest fails when either SDK module copy drifts. The replay ingests each scenario into its own backdated minute, runs the quiet-default scenario last with no later ingestion, and accepts a result only after every expected series, absent series and the idle minute after the quiet one have stayed stable for a full window (AWS defaults: 240 second deadline, 30 second window). Output is JSON lines of observations, not a regenerated fixture.

Docker

docker build -t floci-sdk-python .
docker run --rm --network host floci-sdk-python

# Custom endpoint (macOS/Windows)
docker run --rm -e FLOCI_ENDPOINT=http://host.docker.internal:4566 floci-sdk-python