|
1 | 1 | const assert = require('assert'); |
| 2 | +const { models } = require('arsenal'); |
| 3 | +const { ObjectMD, ObjectMDChecksum } = models; |
| 4 | +const { algorithms } = require('../../../lib/api/apiUtils/integrity/validateChecksums'); |
2 | 5 |
|
3 | 6 | const { bucketPut } = require('../../../lib/api/bucketPut'); |
4 | 7 | const { cleanup, DummyRequestLogger, makeAuthInfo } = require('../helpers'); |
@@ -565,6 +568,104 @@ describe('objectHead API', () => { |
565 | 568 | }); |
566 | 569 | }); |
567 | 570 |
|
| 571 | + describe('x-amz-checksum-mode', () => { |
| 572 | + const checksumAlgorithms = [ |
| 573 | + { name: 'sha256', header: 'x-amz-checksum-sha256' }, |
| 574 | + { name: 'sha1', header: 'x-amz-checksum-sha1' }, |
| 575 | + { name: 'crc32', header: 'x-amz-checksum-crc32' }, |
| 576 | + { name: 'crc32c', header: 'x-amz-checksum-crc32c' }, |
| 577 | + { name: 'crc64nvme', header: 'x-amz-checksum-crc64nvme' }, |
| 578 | + ]; |
| 579 | + |
| 580 | + // Digests of postBody ("I am a body") for each algorithm, computed once. |
| 581 | + const expectedDigests = {}; |
| 582 | + |
| 583 | + before(done => { |
| 584 | + Promise.all(checksumAlgorithms.map(async ({ name }) => { |
| 585 | + expectedDigests[name] = await algorithms[name].digest(postBody); |
| 586 | + })).then(() => done(), done); |
| 587 | + }); |
| 588 | + |
| 589 | + checksumAlgorithms.forEach(({ name, header }) => { |
| 590 | + it(`should return ${header} and x-amz-checksum-type when mode is ENABLED`, done => { |
| 591 | + const md = new ObjectMD(mdColdHelper.baseMd) |
| 592 | + .setChecksum(new ObjectMDChecksum(name, expectedDigests[name], 'FULL_OBJECT')); |
| 593 | + mdColdHelper.putBucketMock(bucketName, null, () => |
| 594 | + mdColdHelper.putObjectMock(bucketName, objectName, md, () => { |
| 595 | + const req = { |
| 596 | + bucketName, |
| 597 | + namespace, |
| 598 | + objectKey: objectName, |
| 599 | + headers: { 'x-amz-checksum-mode': 'ENABLED' }, |
| 600 | + url: `/${bucketName}/${objectName}`, |
| 601 | + }; |
| 602 | + objectHead(authInfo, req, log, (err, res) => { |
| 603 | + assert.ifError(err); |
| 604 | + assert.strictEqual(res[header], expectedDigests[name]); |
| 605 | + assert.strictEqual(res['x-amz-checksum-type'], 'FULL_OBJECT'); |
| 606 | + done(); |
| 607 | + }); |
| 608 | + })); |
| 609 | + }); |
| 610 | + }); |
| 611 | + |
| 612 | + it('should not return checksum headers when mode is ENABLED but object has no checksum', done => { |
| 613 | + mdColdHelper.putBucketMock(bucketName, null, () => |
| 614 | + mdColdHelper.putObjectMock(bucketName, objectName, undefined, () => { |
| 615 | + const req = { |
| 616 | + bucketName, |
| 617 | + namespace, |
| 618 | + objectKey: objectName, |
| 619 | + headers: { 'x-amz-checksum-mode': 'ENABLED' }, |
| 620 | + url: `/${bucketName}/${objectName}`, |
| 621 | + }; |
| 622 | + objectHead(authInfo, req, log, (err, res) => { |
| 623 | + assert.ifError(err); |
| 624 | + checksumAlgorithms.forEach(({ header }) => |
| 625 | + assert.strictEqual(res[header], undefined)); |
| 626 | + assert.strictEqual(res['x-amz-checksum-type'], undefined); |
| 627 | + done(); |
| 628 | + }); |
| 629 | + })); |
| 630 | + }); |
| 631 | + |
| 632 | + it('should not return checksum headers when x-amz-checksum-mode is not set', done => { |
| 633 | + const md = new ObjectMD(mdColdHelper.baseMd) |
| 634 | + .setChecksum(new ObjectMDChecksum('sha256', expectedDigests.sha256, 'FULL_OBJECT')); |
| 635 | + mdColdHelper.putBucketMock(bucketName, null, () => |
| 636 | + mdColdHelper.putObjectMock(bucketName, objectName, md, () => { |
| 637 | + const req = { |
| 638 | + bucketName, |
| 639 | + namespace, |
| 640 | + objectKey: objectName, |
| 641 | + headers: {}, |
| 642 | + url: `/${bucketName}/${objectName}`, |
| 643 | + }; |
| 644 | + objectHead(authInfo, req, log, (err, res) => { |
| 645 | + assert.ifError(err); |
| 646 | + checksumAlgorithms.forEach(({ header }) => |
| 647 | + assert.strictEqual(res[header], undefined)); |
| 648 | + assert.strictEqual(res['x-amz-checksum-type'], undefined); |
| 649 | + done(); |
| 650 | + }); |
| 651 | + })); |
| 652 | + }); |
| 653 | + |
| 654 | + it('should return InvalidArgument when x-amz-checksum-mode is not ENABLED', done => { |
| 655 | + const req = { |
| 656 | + bucketName, |
| 657 | + namespace, |
| 658 | + objectKey: objectName, |
| 659 | + headers: { 'x-amz-checksum-mode': 'DISABLED' }, |
| 660 | + url: `/${bucketName}/${objectName}`, |
| 661 | + }; |
| 662 | + objectHead(authInfo, req, log, err => { |
| 663 | + assert.strictEqual(err.is.InvalidArgument, true); |
| 664 | + done(); |
| 665 | + }); |
| 666 | + }); |
| 667 | + }); |
| 668 | + |
568 | 669 | [ |
569 | 670 | { |
570 | 671 | name: 'should return content-length of 0 when requesting part 1 of empty object', |
|
0 commit comments