Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 34 additions & 34 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,33 +22,33 @@
"osls": "./bin/serverless.js"
},
"dependencies": {
"@aws-sdk/client-api-gateway": "^3.588.0",
"@aws-sdk/client-apigatewayv2": "^3.588.0",
"@aws-sdk/client-cloudformation": "^3.588.0",
"@aws-sdk/client-cloudwatch": "^3.588.0",
"@aws-sdk/client-cloudwatch-logs": "^3.588.0",
"@aws-sdk/client-cognito-identity-provider": "^3.588.0",
"@aws-sdk/client-dynamodb": "^3.588.0",
"@aws-sdk/client-ecr": "^3.588.0",
"@aws-sdk/client-eventbridge": "^3.588.0",
"@aws-sdk/client-iam": "^3.588.0",
"@aws-sdk/client-iot": "^3.588.0",
"@aws-sdk/client-iot-data-plane": "^3.588.0",
"@aws-sdk/client-kinesis": "^3.588.0",
"@aws-sdk/client-lambda": "^3.588.0",
"@aws-sdk/client-s3": "^3.588.0",
"@aws-sdk/client-sns": "^3.588.0",
"@aws-sdk/client-sqs": "^3.588.0",
"@aws-sdk/client-ssm": "^3.588.0",
"@aws-sdk/client-sts": "^3.588.0",
"@aws-sdk/lib-dynamodb": "^3.588.0",
"@aws-sdk/lib-storage": "^3.588.0",
"@aws-sdk/credential-providers": "^3.588.0",
"@aws-sdk/client-api-gateway": "^3.975.0",
"@aws-sdk/client-apigatewayv2": "^3.975.0",
"@aws-sdk/client-cloudformation": "^3.975.0",
"@aws-sdk/client-cloudwatch": "^3.975.0",
"@aws-sdk/client-cloudwatch-logs": "^3.975.0",
"@aws-sdk/client-cognito-identity-provider": "^3.975.0",
"@aws-sdk/client-dynamodb": "^3.975.0",
"@aws-sdk/client-ecr": "^3.975.0",
"@aws-sdk/client-eventbridge": "^3.975.0",
"@aws-sdk/client-iam": "^3.975.0",
"@aws-sdk/client-iot": "^3.975.0",
"@aws-sdk/client-iot-data-plane": "^3.975.0",
"@aws-sdk/client-kinesis": "^3.975.0",
"@aws-sdk/client-lambda": "^3.975.0",
"@aws-sdk/client-s3": "^3.975.0",
"@aws-sdk/client-sns": "^3.975.0",
"@aws-sdk/client-sqs": "^3.975.0",
"@aws-sdk/client-ssm": "^3.975.0",
"@aws-sdk/client-sts": "^3.975.0",
"@aws-sdk/credential-providers": "^3.975.0",
"@aws-sdk/lib-dynamodb": "^3.975.0",
"@aws-sdk/lib-storage": "^3.975.0",
"@serverless/utils": "^6.13.1",
"ajv": "^8.12.0",
"ajv-formats": "^2.1.1",
"archiver": "^7.0.1",
"aws-sdk": "^2.1692.0",
"aws-sdk": "^2.1693.0",
"bluebird": "^3.7.2",
"cachedir": "^2.3.0",
"chalk": "^4.1.2",
Expand Down Expand Up @@ -98,7 +98,6 @@
},
"devDependencies": {
"@serverless/eslint-config": "^5.1.0",
"@serverless/test": "^11.1.1",
"adm-zip": "^0.5.10",
"aws4": "^1.12.0",
"chai": "^4.3.7",
Expand All @@ -108,13 +107,14 @@
"git-list-updated": "^1.2.1",
"husky": "^4.3.8",
"jszip": "^3.10.1",
"lint-staged": "^13.2.2",
"lint-staged": "^16.2.7",
"log": "^6.3.1",
"log-node": "^8.0.3",
"mocha": "^9.2.2",
"minimist": "^1.2.8",
"mocha": "^11.7.5",
"mock-require": "^3.0.3",
"ncjsm": "^4.3.2",
"pkg": "^5.8.1",
"p-limit": "^3.1.0",
"prettier": "^2.8.8",
"proxyquire": "^2.1.3",
"semver-regex": "^3.1.4",
Expand Down Expand Up @@ -171,10 +171,10 @@
"mocha": {
"require": [
"./test/mocha-patch",
"@serverless/test/setup/log",
"@serverless/test/setup/mock-homedir",
"@serverless/test/setup/mock-cwd",
"@serverless/test/setup/restore-env"
"./test/lib/setup/log",
"./test/lib/setup/mock-homedir",
"./test/lib/setup/mock-cwd",
"./test/lib/setup/restore-env"
],
"timeout": 60000
},
Expand All @@ -188,9 +188,9 @@
},
"scripts": {
"integration-test-cleanup": "node test/utils/aws-cleanup.js",
"integration-test-run-all": "mocha-isolated --pass-through-aws-creds --skip-fs-cleanup-check --max-workers=20 \"test/integration/**/*.test.js\"",
"integration-test-run-all": "node test/lib/bin/mocha-isolated.js --pass-through-aws-creds --skip-fs-cleanup-check --max-workers=20 \"test/integration/**/*.test.js\"",
"integration-test-run-basic": "mocha test/integration-basic.test.js",
"integration-test-run-package": "mocha-isolated --skip-fs-cleanup-check test/integration-package/**/*.tests.js",
"integration-test-run-package": "node test/lib/bin/mocha-isolated.js --skip-fs-cleanup-check test/integration-package/**/*.tests.js",
"integration-test-setup": "node ./scripts/test/integration-setup/index.js",
"integration-test-teardown": "node ./scripts/test/integration-teardown.js",
"lint": "eslint .",
Expand All @@ -203,7 +203,7 @@
"prettify:updated": "pipe-git-updated --ext=css --ext=html --ext=js --ext=json --ext=md --ext=yaml --ext=yml --base=main -- prettier --write",
"test": "mocha \"test/unit/**/*.test.js\"",
"test:ci": "npm run prettier-check:updated && npm run lint:updated && npm run test:isolated",
"test:isolated": "mocha-isolated \"test/unit/**/*.test.js\""
"test:isolated": "node test/lib/bin/mocha-isolated.js \"test/unit/**/*.test.js\""
},
"engines": {
"node": ">=12.0"
Expand Down
2 changes: 1 addition & 1 deletion scripts/test/integration-setup/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require('essentials');
require('log-node')();

const log = require('log').get('serverless');
const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../../test/lib/aws-request');
const fsp = require('fs').promises;
const path = require('path');
const CloudFormationService = require('aws-sdk').CloudFormation;
Expand Down
2 changes: 1 addition & 1 deletion scripts/test/integration-teardown.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require('essentials');
require('log-node')();

const log = require('log').get('serverless');
const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../test/lib/aws-request');
const CloudFormationService = require('aws-sdk').CloudFormation;
const EC2Service = require('aws-sdk').EC2;
const KafkaService = require('aws-sdk').Kafka;
Expand Down
2 changes: 1 addition & 1 deletion test/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ npm test

All new tests should be configured with help of [runServerless](./utils/run-serverless.js) util - it's the only way to test functionality against completely intialized `serverless` instance, and it's the only scenario that reflects real world usage.

Check documentation of `runServerless` at [@serverless/test/docs/run-serverless](https://github.com/serverless/test/blob/main/docs/run-serverless.md#run-serverless). Note that `runServerless` as configured at `./utils/run-serverless.js` supports two additional options (`fixture` and `configExt`), which provides out of a box setup to run _Serverless_ instance against prepared fixture with eventually extended service configuration
The `runServerless` util (inlined from @serverless/test) is configured at `./utils/run-serverless.js` and supports two additional options (`fixture` and `configExt`), which provides out of a box setup to run _Serverless_ instance against prepared fixture with eventually extended service configuration

As `runServerless` tests are expensive, it's good to ensure a _minimal_ count of `runServerless` runs to test given scope of problems. Ideally with one service example we should cover most of the test cases we can (good example of such approach is [ALB health check tests](https://github.com/serverless/serverless/blob/80e70e7affd54418361c4d54bdef1561af6b8826/lib/plugins/aws/package/compile/events/alb/lib/healthCheck.test.js#L18-L127))

Expand Down
2 changes: 1 addition & 1 deletion test/fixtures/cli/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
'use strict';

module.exports = require('@serverless/test/setup-fixtures-engine')(__dirname);
module.exports = require('../../lib/setup-fixtures-engine')(__dirname);
2 changes: 1 addition & 1 deletion test/fixtures/programmatic/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
'use strict';

module.exports = require('@serverless/test/setup-fixtures-engine')(__dirname);
module.exports = require('../../lib/setup-fixtures-engine')(__dirname);
6 changes: 3 additions & 3 deletions test/integration-basic.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ const stripAnsi = require('strip-ansi');
const { expect } = require('chai');
const log = require('log').get('serverless:test');
const spawn = require('child-process-ext/spawn');
const resolveAwsEnv = require('@serverless/test/resolve-aws-env');
const hasFailed = require('@serverless/test/has-failed');
const awsRequest = require('@serverless/test/aws-request');
const resolveAwsEnv = require('./lib/resolve-aws-env');
const hasFailed = require('./lib/has-failed');
const awsRequest = require('./lib/aws-request');
const CloudFormationService = require('aws-sdk').CloudFormation;
const { getTmpDirPath } = require('./utils/fs');

Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/api-gateway-external.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

const { expect } = require('chai');
const log = require('log').get('serverless:test');
const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../lib/aws-request');
const CloudFormationService = require('aws-sdk').CloudFormation;
const fixtures = require('../../fixtures/programmatic');

Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/api-gateway.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

const { expect } = require('chai');
const log = require('log').get('serverless:test');
const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../lib/aws-request');
const CloudFormationService = require('aws-sdk').CloudFormation;
const fixtures = require('../../fixtures/programmatic');

Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/cognito-user-pool.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

const { expect } = require('chai');
const log = require('log').get('serverless:test');
const hasFailed = require('@serverless/test/has-failed');
const hasFailed = require('../../lib/has-failed');
const fixtures = require('../../fixtures/programmatic');

const {
Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/custom-deployment-bucket.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
const uuid = require('uuid');
const { expect } = require('chai');
const fixtures = require('../../fixtures/programmatic');
const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../lib/aws-request');
const S3Service = require('aws-sdk').S3;
const { deployService, removeService } = require('../../utils/integration');
const { createBucket, deleteBucket } = require('../../utils/s3');
Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/function-url.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use strict';

const { expect } = require('chai');
const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../lib/aws-request');
const CloudFormationService = require('aws-sdk').CloudFormation;
const fixtures = require('../../fixtures/programmatic');
const aws4 = require('aws4');
Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/function.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use strict';

const { expect } = require('chai');
const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../lib/aws-request');
const LambdaService = require('aws-sdk').Lambda;
const fixtures = require('../../fixtures/programmatic');
const { confirmCloudWatchLogs } = require('../../utils/misc');
Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/http-api.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

const { expect } = require('chai');
const log = require('log').get('serverless:test');
const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../lib/aws-request');
const CloudFormationService = require('aws-sdk').CloudFormation;
const CognitoIdentityServiceProviderService = require('aws-sdk').CognitoIdentityServiceProvider;
const ApiGatewayV2Service = require('aws-sdk').ApiGatewayV2;
Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/infra-dependent/active-mq.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const {
SHARED_INFRA_TESTS_ACTIVE_MQ_CREDENTIALS_NAME,
} = require('../../../utils/cloudformation');

const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../../lib/aws-request');
const LambdaService = require('aws-sdk').Lambda;
const MQService = require('aws-sdk').MQ;
const SecretsManagerService = require('aws-sdk').SecretsManager;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const { expect } = require('chai');
const log = require('log').get('serverless:test');
const fixtures = require('../../../fixtures/programmatic');

const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../../lib/aws-request');
const LambdaService = require('aws-sdk').Lambda;
const crypto = require('crypto');
const { deployService, removeService } = require('../../../utils/integration');
Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/infra-dependent/msk.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const {
getDependencyStackOutputMap,
} = require('../../../utils/cloudformation');

const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../../lib/aws-request');
const LambdaService = require('aws-sdk').Lambda;
const KafkaService = require('aws-sdk').Kafka;
const crypto = require('crypto');
Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/infra-dependent/rabbit-mq.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const {
SHARED_INFRA_TESTS_RABBITMQ_CREDENTIALS_NAME,
} = require('../../../utils/cloudformation');

const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../../lib/aws-request');
const LambdaService = require('aws-sdk').Lambda;
const MQService = require('aws-sdk').MQ;
const SecretsManagerService = require('aws-sdk').SecretsManager;
Expand Down
4 changes: 2 additions & 2 deletions test/integration/aws/iot-fleet-provisioning.test.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
'use strict';

const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../lib/aws-request');
const CloudFormationService = require('aws-sdk').CloudFormation;
const IotService = require('aws-sdk').Iot;
const LambdaService = require('aws-sdk').Lambda;
const hasFailed = require('@serverless/test/has-failed');
const hasFailed = require('../../lib/has-failed');
const { expect } = require('chai');
const fixtures = require('../../fixtures/programmatic');
const { deployService, removeService } = require('../../utils/integration');
Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/sqs.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use strict';

const { expect } = require('chai');
const hasFailed = require('@serverless/test/has-failed');
const hasFailed = require('../../lib/has-failed');
const log = require('log').get('serverless:test');
const fixtures = require('../../fixtures/programmatic');

Expand Down
2 changes: 1 addition & 1 deletion test/integration/aws/websocket.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

const WebSocket = require('ws');
const { expect } = require('chai');
const awsRequest = require('@serverless/test/aws-request');
const awsRequest = require('../../lib/aws-request');
const CloudFormationService = require('aws-sdk').CloudFormation;
const log = require('log').get('serverless:test');
const wait = require('timers-ext/promise/sleep');
Expand Down
60 changes: 60 additions & 0 deletions test/lib/aws-request.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
'use strict';

const isPlainObject = require('type/plain-object/is');
const isThenable = require('type/thenable/is');
const ensureConstructor = require('type/constructor/ensure');
const ensurePlainObject = require('type/plain-object/ensure');
const memoizeWeak = require('memoizee/weak');
const awsLog = require('log').get('aws');
const wait = require('timers-ext/promise/sleep');

const getClientInstance = memoizeWeak(
(Client, options) => {
const params = { region: 'us-east-1', ...options };
return new Client(params);
},
{ normalizer: (ignore, [options]) => JSON.stringify(options) }
);

const resolveClientData = (clientOrClientConfig) => {
if (isPlainObject(clientOrClientConfig)) {
return [
ensureConstructor(clientOrClientConfig.client),
ensurePlainObject(clientOrClientConfig.params, { default: {} }),
];
}
return [ensureConstructor(clientOrClientConfig), {}];
};

let lastAwsRequestId = 0;
module.exports = function awsRequest(clientOrClientConfig, method, ...args) {
const requestId = ++lastAwsRequestId;
awsLog.debug('[%d] %O %s %O', requestId, clientOrClientConfig, method, args);
const instance = getClientInstance(...resolveClientData(clientOrClientConfig));
const response = instance[method](...args);
const promise = isThenable(response) ? response : response.promise();
return promise.then(
(result) => {
awsLog.debug('[%d] %O', requestId, result);
return result;
},
(error) => {
awsLog.debug('[%d] %O', requestId, error);
const shouldRetry = (() => {
if (error.statusCode === 403) return false;
if (error.retryable) return true;
if (error.Reason === 'CallerRateLimitExceeded') return true;
if (error.message.includes('Rate exceeded')) return true;
if (error.message.includes('Too Many Requests')) return true;
return false;
})();
if (shouldRetry) {
awsLog.debug('[%d] retry', requestId);
return wait(4000 + Math.random() * 3000).then(() =>
awsRequest(clientOrClientConfig, method, ...args)
);
}
throw error;
}
);
};
Loading