Skip to content

CLDSRV-898: CompleteMultipartUpload checksums #6166

Open
leif-scality wants to merge 8 commits intodevelopment/9.4from
improvement/CLDSRV-898-complete-mpu-checksums
Open

CLDSRV-898: CompleteMultipartUpload checksums #6166
leif-scality wants to merge 8 commits intodevelopment/9.4from
improvement/CLDSRV-898-complete-mpu-checksums

Conversation

@leif-scality
Copy link
Copy Markdown
Contributor

  • Calculate and stores the final checksum when FULL_OBJECT (COMPOSITE are going to be stored by https://scality.atlassian.net/browse/S3C-10399)
  • Calculate and compare the final object checksum with the one sent by the headers
  • Check that all parts have the correct checksum and checksum type

@bert-e
Copy link
Copy Markdown
Contributor

bert-e commented May 7, 2026

Hello leif-scality,

My role is to assist you with the merge of this
pull request. Please type @bert-e help to get information
on this process, or consult the user documentation.

Available options
name description privileged authored
/after_pull_request Wait for the given pull request id to be merged before continuing with the current one.
/bypass_author_approval Bypass the pull request author's approval
/bypass_build_status Bypass the build and test status
/bypass_commit_size Bypass the check on the size of the changeset TBA
/bypass_incompatible_branch Bypass the check on the source branch prefix
/bypass_jira_check Bypass the Jira issue check
/bypass_peer_approval Bypass the pull request peers' approval
/bypass_leader_approval Bypass the pull request leaders' approval
/approve Instruct Bert-E that the author has approved the pull request. ✍️
/create_pull_requests Allow the creation of integration pull requests.
/create_integration_branches Allow the creation of integration branches.
/no_octopus Prevent Wall-E from doing any octopus merge and use multiple consecutive merge instead
/unanimity Change review acceptance criteria from one reviewer at least to all reviewers
/wait Instruct Bert-E not to run until further notice.
Available commands
name description privileged
/help Print Bert-E's manual in the pull request.
/status Print Bert-E's current status in the pull request TBA
/clear Remove all comments from Bert-E from the history TBA
/retry Re-start a fresh build TBA
/build Re-start a fresh build TBA
/force_reset Delete integration branches & pull requests, and restart merge process from the beginning.
/reset Try to remove integration branches unless there are commits on them which do not appear on the source branch.

Status report is not available.

@bert-e
Copy link
Copy Markdown
Contributor

bert-e commented May 7, 2026

Incorrect fix version

The Fix Version/s in issue CLDSRV-898 contains:

  • None

Considering where you are trying to merge, I ignored possible hotfix versions and I expected to find:

  • 9.4.0

Please check the Fix Version/s of CLDSRV-898, or the target
branch of this pull request.

];

describe(label, () => {
it('accepts when every part includes the matching checksum', () => {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test names using it() should start with should (e.g. should accept when every part includes the matching checksum). Multiple tests in this file use verb-first naming like accepts..., returns..., rejects..., does not....

— Claude Code

assert(got.value.endsWith('-3'),
`expected -N suffix, got ${got.value}`);
// computeCompositeMPUChecksum's deterministic output for these
// exact placeholder digests:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move require('crypto') and require('.../validateChecksums') to the top of the file. crypto is already imported at line 2 and algorithms at line 18 — these inner requires are unnecessary duplicates.

— Claude Code

});
});
});
}); No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing newline at end of file.

— Claude Code

module.exports = completeMultipartUpload;
module.exports.validatePerPartChecksums = validatePerPartChecksums;
module.exports.computeFinalChecksum = computeFinalChecksum;
module.exports.validateExpectedFinalChecksum = validateExpectedFinalChecksum; No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing newline at end of file.

— Claude Code

@leif-scality leif-scality force-pushed the improvement/CLDSRV-898-complete-mpu-checksums branch from 3a4f7e2 to 223fb7f Compare May 7, 2026 21:41
@claude
Copy link
Copy Markdown

claude Bot commented May 7, 2026

  • Missing newline at end of file in lib/api/completeMultipartUpload.js and tests/unit/api/apiUtils/integrity/crcCombine.js
    - Add a trailing newline to both files
    - require() calls inside test functions in tests/unit/api/completeMultipartUpload.js (lines 542, 567-568)
    - Move to top of file; crypto and algorithms are already imported there
    - Test names in tests/unit/api/completeMultipartUpload.js don't start with should
    - Prefix it() descriptions with should per project convention

    Review by Claude Code

];

describe(label, () => {
it('accepts when every part includes the matching checksum', () => {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Multiple it() test names in this file do not start with "should" (e.g. line 108 "accepts when every part...", line 120 "returns BadDigest when...", line 357 "accepts CompleteMPU when...", line 413 "rejects CompleteMPU with..."). Per project convention, it() names should start with "should".

— Claude Code

// exact placeholder digests:
const expected = require('crypto').createHash('sha256')
.update(Buffer.concat([d1, d2, d3].map(x => Buffer.from(x, 'base64'))))
.digest('base64');
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

require() calls inside it() blocks. crypto is already imported at line 2 and algorithms at line 18. These should be removed in favor of the top-level imports.

Same pattern repeats at lines 568-569 (crypto2/algorithms re-imported) and line 659 (require('crypto') inline).

— Claude Code

module.exports = completeMultipartUpload;
module.exports.validatePerPartChecksums = validatePerPartChecksums;
module.exports.computeFinalChecksum = computeFinalChecksum;
module.exports.validateExpectedFinalChecksum = validateExpectedFinalChecksum; No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing trailing newline at end of file.

— Claude Code

});
});
});
}); No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing trailing newline at end of file.

— Claude Code

Comment thread package.json
"@hapi/joi": "^17.1.1",
"@smithy/node-http-handler": "^3.0.0",
"arsenal": "git+https://github.com/scality/Arsenal#8.4.1",
"arsenal": "git+https://github.com/scality/Arsenal#improvement/ARSN-580-handle-checksums-in-complete-mpu",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

arsenal is pinned to a branch (improvement/ARSN-580-handle-checksums-in-complete-mpu) instead of a tag. Git-based dependencies must pin to a tag for reproducible builds. Replace with the actual release tag once the Arsenal changes are tagged.

— Claude Code

@claude
Copy link
Copy Markdown

claude Bot commented May 7, 2026

  • arsenal dependency pinned to a branch instead of a tag (package.json:36). Must be pinned to a release tag before merge.
    - Replace branch ref with a versioned tag once the Arsenal PR is merged and tagged.
    - Multiple it() test names in tests/unit/api/completeMultipartUpload.js do not start with "should" (project convention).
    - Prefix test descriptions with "should" (e.g. "should accept when every part...").
    - require() calls inside it() blocks in tests/unit/api/completeMultipartUpload.js (lines 545, 568-569, 659). crypto and algorithms are already imported at the top of the file.
    - Remove inline require() calls and use the existing top-level imports.
    - Missing trailing newline at end of lib/api/completeMultipartUpload.js and tests/unit/api/apiUtils/integrity/crcCombine.js.
    - Add trailing newline.

    Review by Claude Code

@codecov
Copy link
Copy Markdown

codecov Bot commented May 7, 2026

❌ 23 Tests Failed:

Tests completed Failed Passed Skipped
3517 23 3494 0
View the top 3 failed test(s) by shortest run time
should overwrite an object::MPU with x-scal-s3-version-id header With v4 signature with cold storage location should overwrite an object
Stack Traces | 0.07s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'last-modified': '2026-05-07T22:01:25.592Z',
    'md-model-version': 7,
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite an object::MPU with x-scal-s3-version-id header With default signature with cold storage location should overwrite an object
Stack Traces | 0.074s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'last-modified': '2026-05-07T22:01:21.938Z',
    'md-model-version': 7,
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite the current version if empty version id header::MPU with x-scal-s3-version-id header With v4 signature with cold storage location should overwrite the current version if empty version id header
Stack Traces | 0.076s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'last-modified': '2026-05-07T22:01:25.945Z',
    'md-model-version': 7,
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite the current null version after bucket version enabled::MPU with x-scal-s3-version-id header With v4 signature with cold storage location should overwrite the current null version after bucket version enabled
Stack Traces | 0.077s run time
Objects should be deeply equal
should overwrite the current version if empty version id header::MPU with x-scal-s3-version-id header With default signature with cold storage location should overwrite the current version if empty version id header
Stack Traces | 0.079s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'last-modified': '2026-05-07T22:01:22.296Z',
    'md-model-version': 7,
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite a version::MPU with x-scal-s3-version-id header With default signature with cold storage location should overwrite a version
Stack Traces | 0.08s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'last-modified': '2026-05-07T22:01:22.120Z',
    'md-model-version': 7,
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite the current null version after bucket version enabled::MPU with x-scal-s3-version-id header With default signature with cold storage location should overwrite the current null version after bucket version enabled
Stack Traces | 0.08s run time
Objects should be deeply equal
should overwrite a version::MPU with x-scal-s3-version-id header With v4 signature with cold storage location should overwrite a version
Stack Traces | 0.081s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'last-modified': '2026-05-07T22:01:25.767Z',
    'md-model-version': 7,
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite the current version::MPU with x-scal-s3-version-id header With default signature with cold storage location should overwrite the current version
Stack Traces | 0.088s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'creation-time': '2026-05-07T22:01:23.273Z',
    'last-modified': '2026-05-07T22:01:23.280Z',
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite the current version::MPU with x-scal-s3-version-id header With v4 signature with cold storage location should overwrite the current version
Stack Traces | 0.088s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'creation-time': '2026-05-07T22:01:26.886Z',
    'last-modified': '2026-05-07T22:01:26.894Z',
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite the lastest version and keep nullVersionId::MPU with x-scal-s3-version-id header With v4 signature with cold storage location should overwrite the lastest version and keep nullVersionId
Stack Traces | 0.092s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'creation-time': '2026-05-07T22:01:26.304Z',
    'last-modified': '2026-05-07T22:01:26.326Z',
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite a non-current null version::MPU with x-scal-s3-version-id header With v4 signature with cold storage location should overwrite a non-current null version
Stack Traces | 0.095s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'last-modified': '2026-05-07T22:01:26.111Z',
    'md-model-version': 7,
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    isNull: true,
    key: 'object1putversion',
should overwrite a non-current version::MPU with x-scal-s3-version-id header With default signature with cold storage location should overwrite a non-current version
Stack Traces | 0.095s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'creation-time': '2026-05-07T22:01:23.083Z',
    'last-modified': '2026-05-07T22:01:23.090Z',
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite the current version after bucket version suspended::MPU with x-scal-s3-version-id header With v4 signature with cold storage location should overwrite the current version after bucket version suspended
Stack Traces | 0.095s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'creation-time': '2026-05-07T22:01:27.070Z',
    'last-modified': '2026-05-07T22:01:27.078Z',
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite a non-current null version::MPU with x-scal-s3-version-id header With default signature with cold storage location should overwrite a non-current null version
Stack Traces | 0.096s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'last-modified': '2026-05-07T22:01:22.465Z',
    'md-model-version': 7,
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    isNull: true,
    key: 'object1putversion',
should overwrite a non-current version::MPU with x-scal-s3-version-id header With v4 signature with cold storage location should overwrite a non-current version
Stack Traces | 0.096s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'creation-time': '2026-05-07T22:01:26.695Z',
    'last-modified': '2026-05-07T22:01:26.703Z',
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite the current version after bucket version suspended::MPU with x-scal-s3-version-id header With default signature with cold storage location should overwrite the current version after bucket version suspended
Stack Traces | 0.096s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'creation-time': '2026-05-07T22:01:23.460Z',
    'last-modified': '2026-05-07T22:01:23.467Z',
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite a current null version::MPU with x-scal-s3-version-id header With v4 signature with cold storage location should overwrite a current null version
Stack Traces | 0.097s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'creation-time': '2026-05-07T22:01:26.498Z',
    'last-modified': '2026-05-07T22:01:26.515Z',
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    isNull: true,
    key: 'object1putversion',
should overwrite the lastest version and keep nullVersionId::MPU with x-scal-s3-version-id header With default signature with cold storage location should overwrite the lastest version and keep nullVersionId
Stack Traces | 0.098s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'creation-time': '2026-05-07T22:01:22.659Z',
    'last-modified': '2026-05-07T22:01:22.683Z',
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    key: 'object1putversion',
    location: [
should overwrite a current null version::MPU with x-scal-s3-version-id header With default signature with cold storage location should overwrite a current null version
Stack Traces | 0.121s run time
Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines

  {
    'content-length': 4,
    'content-md5': 'd41d8cd98f00b204e9800998ecf8427e',
    'creation-time': '2026-05-07T22:01:22.871Z',
    'last-modified': '2026-05-07T22:01:22.890Z',
...
    checksum: {
+     checksumAlgorithm: 'crc64nvme',
-     checksumAlgorithm: 'crc32',
      checksumType: 'FULL_OBJECT',
+     checksumValue: 'y/j5Wg1tzZs='
-     checksumValue: 'AAAAAA=='
    },
    dataStoreName: 'us-east-1',
    isDeleteMarker: false,
    isNull: true,
    key: 'object1putversion',
should complete a multipart upload on real AWS location with bucketMatch set to false::Multipart Upload API with AWS Backend should complete a multipart upload on real AWS location with bucketMatch set to false
Stack Traces | 60s run time
Timeout of 60000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (.../tests/multipleBackend/multipartUpload.js)
should complete MPU on AWS with same key as object put to file::Multipart Upload API with AWS Backend should complete MPU on AWS with same key as object put to file
Stack Traces | 60s run time
Timeout of 60000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (.../tests/multipleBackend/multipartUpload.js)
should complete a multipart upload on real AWS::Multipart Upload API with AWS Backend should complete a multipart upload on real AWS
Stack Traces | 60s run time
Timeout of 60000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (.../tests/multipleBackend/multipartUpload.js)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants