Skip to content

Commit 4f2f2f5

Browse files
Merge remote-tracking branch 'origin/improvement/CLDSRV-724-versionning-related-functional-tests' into test/sylvain/sdk-migration
2 parents 84669aa + 49c2391 commit 4f2f2f5

23 files changed

+3208
-3279
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"@aws-sdk/signature-v4": "^3.374.0",
2828
"@azure/storage-blob": "^12.28.0",
2929
"@hapi/joi": "^17.1.1",
30+
"@smithy/node-http-handler": "^3.0.0",
3031
"arsenal": "git+https://github.com/scality/Arsenal#8.2.43",
3132
"async": "2.6.4",
3233
"bucketclient": "scality/bucketclient#8.2.7",
Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,56 @@
1-
const { S3 } = require('aws-sdk');
1+
const { S3Client } = require('@aws-sdk/client-s3');
2+
const { HttpRequest } = require('@smithy/protocol-http');
23
const querystring = require('querystring');
34

45
const getConfig = require('../../test/support/config');
56

6-
const config = getConfig('default', { signatureVersion: 'v4' });
7-
const s3 = new S3(config);
7+
const config = getConfig('default');
8+
const customRequestMiddleware = buildParams => next => async args => {
89

9-
function customS3Request(action, params, buildParams, callback) {
10-
const method = action.bind(s3);
11-
const request = method(params);
1210
const { headers, query } = buildParams;
13-
// modify underlying http request object created by aws sdk
14-
request.on('build', () => {
15-
Object.assign(request.httpRequest.headers, headers);
16-
if (query) {
17-
const qs = querystring.stringify(query);
18-
// NOTE: that this relies on there not being a query string in the
19-
// first place; if there is a qs then we have to search for ? and
20-
// append &qs at the end of the string, if ? is not followed by ''
21-
request.httpRequest.path = `${request.httpRequest.path}?${qs}`;
22-
}
23-
});
24-
request.on('success', response => {
25-
const resData = {
26-
statusCode: response.httpResponse.statusCode,
27-
headers: response.httpResponse.headers,
28-
body: response.httpResponse.body.toString('utf8'),
29-
};
30-
callback(null, resData);
31-
});
32-
request.on('error', err => {
33-
const resData = {
34-
statusCode: request.response.httpResponse.statusCode,
35-
headers: request.response.httpResponse.headers,
36-
body: request.response.httpResponse.body.toString('utf8'),
37-
};
38-
callback(err, resData);
11+
12+
const prevReq = args.request;
13+
const base = prevReq instanceof HttpRequest ? prevReq : new HttpRequest(prevReq);
14+
15+
let newHeaders = base.headers || {};
16+
if (headers) {
17+
newHeaders = { ...newHeaders, ...headers };
18+
}
19+
20+
let newQuery = base.query || {};
21+
if (query) {
22+
const extra = querystring.parse(querystring.stringify(query));
23+
newQuery = { ...newQuery, ...extra };
24+
}
25+
26+
const newReq = new HttpRequest({
27+
...base,
28+
headers: newHeaders,
29+
query: newQuery,
3930
});
40-
request.send();
31+
32+
return next({ ...args, request: newReq });
33+
};
34+
35+
async function customS3Request(CommandClass, params, buildParams) {
36+
const customS3 = new S3Client({ ...config });
37+
38+
customS3.middlewareStack.add(
39+
customRequestMiddleware(buildParams),
40+
{ step: 'build', name: 'customRequestMiddleware', tags: ['CUSTOM'] }
41+
);
42+
43+
const command = new CommandClass(params);
44+
const response = await customS3.send(command);
45+
46+
const resData = {
47+
statusCode: 200,
48+
headers: response.$metadata?.httpHeaders || {},
49+
body: JSON.stringify(response),
50+
};
51+
52+
return resData;
53+
4154
}
4255

4356
module.exports = customS3Request;

tests/functional/aws-node-sdk/test/multipleBackend/delete/deleteAwsVersioning.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ function _getAssertDeleted(s3, params, cb) {
150150
});
151151
}
152152

153+
// Update AWS S3 direct calls
153154
function _awsGetAssertDeleted(params, cb) {
154155
const { key, versionId, errorCode } = params;
155156
return getAwsRetry({ key, versionId }, 0, err => {

tests/functional/aws-node-sdk/test/object/bigMpu.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ describe('large mpu', function tester() {
9393
itSkipIfAWS('should intiate, put parts and complete mpu ' +
9494
`with ${partCount} parts`, done => {
9595
process.stdout.write('***Running large MPU test***\n');
96-
let uploadId;
96+
let uploadId;
9797
return waterfall([
9898
next => {
9999
s3.send(new CreateMultipartUploadCommand({ Bucket: bucket, Key: key }))
@@ -140,6 +140,7 @@ describe('large mpu', function tester() {
140140
.then(data => {
141141
assert.strictEqual(data.ETag,
142142
`"${finalETag}-${partCount}"`);
143+
process.stdout.write('get object successful\n');
143144
return next();
144145
})
145146
.catch(err => next(err));

tests/functional/aws-node-sdk/test/object/mpu.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
const assert = require('assert');
23
const {
34
CreateBucketCommand,
Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
const assert = require('assert');
2-
const async = require('async');
2+
const {
3+
CreateBucketCommand,
4+
PutBucketVersioningCommand,
5+
DeleteBucketCommand,
6+
PutObjectCommand,
7+
DeleteObjectCommand,
8+
} = require('@aws-sdk/client-s3');
39

410
const withV4 = require('../support/withV4');
511
const BucketUtility = require('../../lib/utility/bucket-util');
@@ -12,11 +18,7 @@ const key = 'anObject';
1218

1319
function checkError(err, code) {
1420
assert.notEqual(err, null, 'Expected failure but got success');
15-
assert.strictEqual(err.code, code);
16-
}
17-
18-
function checkNoError(err) {
19-
assert.ifError(err, `Expected success, got error ${JSON.stringify(err)}`);
21+
assert.strictEqual(err.Code, code);
2022
}
2123

2224
describe('aws-node-sdk test delete bucket', () => {
@@ -25,72 +27,70 @@ describe('aws-node-sdk test delete bucket', () => {
2527
const s3 = bucketUtil.s3;
2628

2729
// setup test
28-
beforeEach(done => {
29-
async.waterfall([
30-
next => s3.createBucket({ Bucket: bucketName },
31-
err => next(err)),
32-
next => s3.putBucketVersioning({
33-
Bucket: bucketName,
34-
VersioningConfiguration: {
35-
Status: 'Enabled',
36-
},
37-
}, err => next(err)),
38-
], done);
30+
beforeEach(async () => {
31+
await s3.send(new CreateBucketCommand({ Bucket: bucketName }));
32+
await s3.send(new PutBucketVersioningCommand({
33+
Bucket: bucketName,
34+
VersioningConfiguration: {
35+
Status: 'Enabled',
36+
},
37+
}));
3938
});
4039

4140
// empty and delete bucket after testing if bucket exists
4241
afterEach(done => {
4342
removeAllVersions({ Bucket: bucketName }, err => {
44-
if (err && err.code === 'NoSuchBucket') {
43+
if (err?.name === 'NoSuchBucket') {
4544
return done();
46-
} else if (err) {
47-
return done(err);
4845
}
49-
return s3.deleteBucket({ Bucket: bucketName }, done);
46+
return s3.send(new DeleteBucketCommand({ Bucket: bucketName }))
47+
.then(() => done()).catch(err => {
48+
if (err.name === 'NoSuchBucket') {
49+
return done();
50+
}
51+
return done(err);
52+
});
5053
});
5154
});
5255

5356
it('should be able to delete empty bucket with version enabled',
54-
done => {
55-
s3.deleteBucket({ Bucket: bucketName }, err => {
56-
checkNoError(err);
57-
return done();
58-
});
57+
async () => {
58+
await s3.send(new DeleteBucketCommand({ Bucket: bucketName }));
5959
});
6060

6161
it('should return error 409 BucketNotEmpty if trying to delete bucket' +
62-
' containing delete marker', done => {
63-
s3.deleteObject({ Bucket: bucketName, Key: key }, err => {
64-
if (err) {
65-
return done(err);
66-
}
67-
return s3.deleteBucket({ Bucket: bucketName }, err => {
68-
checkError(err, 'BucketNotEmpty');
69-
return done();
70-
});
71-
});
62+
' containing delete marker', async () => {
63+
await s3.send(new DeleteObjectCommand({ Bucket: bucketName, Key: key }));
64+
65+
try {
66+
await s3.send(new DeleteBucketCommand({ Bucket: bucketName }));
67+
assert.fail('Expected BucketNotEmpty error but got success');
68+
} catch (err) {
69+
checkError(err, 'BucketNotEmpty');
70+
}
7271
});
7372

7473
it('should return error 409 BucketNotEmpty if trying to delete bucket' +
75-
' containing version and delete marker', done => {
76-
async.waterfall([
77-
next => s3.putObject({ Bucket: bucketName, Key: key },
78-
err => next(err)),
79-
next => s3.deleteObject({ Bucket: bucketName, Key: key },
80-
err => next(err)),
81-
next => s3.deleteBucket({ Bucket: bucketName }, err => {
82-
checkError(err, 'BucketNotEmpty');
83-
return next();
84-
}),
85-
], done);
74+
' containing version and delete marker', async () => {
75+
await s3.send(new PutObjectCommand({ Bucket: bucketName, Key: key }));
76+
await s3.send(new DeleteObjectCommand({ Bucket: bucketName, Key: key }));
77+
78+
try {
79+
await s3.send(new DeleteBucketCommand({ Bucket: bucketName }));
80+
assert.fail('Expected BucketNotEmpty error but got success');
81+
} catch (err) {
82+
checkError(err, 'BucketNotEmpty');
83+
}
8684
});
8785

8886
it('should return error 404 NoSuchBucket if the bucket name is invalid',
89-
done => {
90-
s3.deleteBucket({ Bucket: 'bucketA' }, err => {
87+
async () => {
88+
try {
89+
await s3.send(new DeleteBucketCommand({ Bucket: 'bucketA' }));
90+
assert.fail('Expected NoSuchBucket error but got success');
91+
} catch (err) {
9192
checkError(err, 'NoSuchBucket');
92-
return done();
93-
});
93+
}
9494
});
9595
});
9696
});

0 commit comments

Comments
 (0)