@@ -38,6 +38,8 @@ const dir_content_type = 'application/x-directory';
38
38
const stream_content_type = 'application/octet-stream' ;
39
39
40
40
const DEFAULT_FS_CONFIG = get_process_fs_context ( ) ;
41
+ const empty_data = crypto . randomBytes ( 0 ) ;
42
+ const empty_stream = ( ) => buffer_utils . buffer_to_read_stream ( empty_data ) ;
41
43
42
44
function make_dummy_object_sdk ( config_root ) {
43
45
return {
@@ -1357,7 +1359,6 @@ mocha.describe('namespace_fs copy object', function() {
1357
1359
const copy_xattr = { } ;
1358
1360
const copy_key_1 = 'copy_key_1' ;
1359
1361
const data = crypto . randomBytes ( 100 ) ;
1360
- const empty_data = crypto . randomBytes ( 0 ) ;
1361
1362
1362
1363
mocha . before ( async function ( ) {
1363
1364
const upload_res = await ns_tmp . upload_object ( {
@@ -1497,7 +1498,7 @@ mocha.describe('namespace_fs copy object', function() {
1497
1498
res = await ns_tmp . upload_object ( {
1498
1499
bucket : upload_bkt ,
1499
1500
key,
1500
- source_stream : buffer_utils . buffer_to_read_stream ( empty_data ) ,
1501
+ source_stream : empty_stream ( ) ,
1501
1502
size : 0 ,
1502
1503
} , dummy_object_sdk ) ;
1503
1504
xattr = await get_xattr ( file_path ) ;
@@ -1524,7 +1525,7 @@ mocha.describe('namespace_fs copy object', function() {
1524
1525
bucket : upload_bkt ,
1525
1526
key : key ,
1526
1527
xattr : md1 ,
1527
- source_stream : buffer_utils . buffer_to_read_stream ( empty_data ) ,
1528
+ source_stream : empty_stream ( ) ,
1528
1529
size : 0
1529
1530
} , dummy_object_sdk ) ;
1530
1531
const file_path = ns_tmp_bucket_path + '/' + key ;
@@ -1652,7 +1653,7 @@ mocha.describe('namespace_fs copy object', function() {
1652
1653
await ns_tmp . upload_object ( {
1653
1654
bucket : upload_bkt ,
1654
1655
key : src_key ,
1655
- source_stream : buffer_utils . buffer_to_read_stream ( empty_data ) ,
1656
+ source_stream : empty_stream ( ) ,
1656
1657
size : 0 ,
1657
1658
xattr : md1
1658
1659
} , dummy_object_sdk ) ;
@@ -1686,7 +1687,72 @@ mocha.describe('namespace_fs copy object', function() {
1686
1687
assert . deepStrictEqual ( xattr , { ...add_user_prefix ( copy_read_md_res . xattr ) , [ XATTR_DIR_CONTENT ] : `${ copy_read_md_res . size } ` } ) ;
1687
1688
assert . deepStrictEqual ( md1 , copy_read_md_res . xattr ) ;
1688
1689
assert . equal ( dir_content_type , copy_read_md_res . content_type ) ;
1690
+ } ) ;
1691
+
1692
+ mocha . it ( `copy object link - with new content type and xattr - should not change` , async function ( ) {
1693
+ const bucket = upload_bkt ;
1694
+ const src_key = 'obj_src1' ;
1695
+ const dst_key = 'obj_dst_link_and_sc' ;
1696
+
1697
+ await ns_tmp . upload_object ( { bucket, key : src_key , source_stream : empty_stream ( ) , size : 0 , xattr : md1 } , dummy_object_sdk ) ;
1698
+ const read_md_res = await ns_tmp . read_object_md ( { bucket, key : src_key } , dummy_object_sdk ) ;
1699
+
1700
+ assert . deepStrictEqual ( md1 , read_md_res . xattr ) ;
1701
+ assert . equal ( stream_content_type , read_md_res . content_type ) ;
1702
+ const new_xattr = { 'copy_new_xattr_key' : 'copy_new_xattr_val' } ;
1703
+
1704
+ const copy_source = { bucket, key : src_key } ;
1705
+ await ns_tmp . upload_object ( {
1706
+ bucket,
1707
+ key : dst_key ,
1708
+ copy_source,
1709
+ size : 0 ,
1710
+ xattr_copy : true ,
1711
+ content_type : dir_content_type ,
1712
+ xattr : new_xattr
1713
+ } , dummy_object_sdk ) ;
1689
1714
1715
+ const dst_md_res = await ns_tmp . read_object_md ( { bucket, key : dst_key } , dummy_object_sdk ) ;
1716
+ const src_md_res = await ns_tmp . read_object_md ( { bucket, key : src_key } , dummy_object_sdk ) ;
1717
+
1718
+ // on link - content type and xattr should not be changed on src and dst
1719
+ assert . deepStrictEqual ( md1 , src_md_res . xattr ) ;
1720
+ assert . equal ( stream_content_type , src_md_res . content_type ) ;
1721
+ assert . deepStrictEqual ( md1 , dst_md_res . xattr ) ;
1722
+ assert . equal ( stream_content_type , dst_md_res . content_type ) ;
1723
+
1724
+ } ) ;
1725
+
1726
+ mocha . it ( `copy object fallback - with new content type and xattr` , async function ( ) {
1727
+ const bucket = upload_bkt ;
1728
+ const src_key = 'obj_src1' ;
1729
+ const dst_key = 'obj_dst_fallback_and_sc' ;
1730
+ // force fallback copy using versioning enabled/suspended
1731
+ ns_tmp . versioning = 'SUSPENDED' ;
1732
+ await ns_tmp . upload_object ( { bucket, key : src_key , source_stream : empty_stream ( ) , size : 0 , xattr : md1 } , dummy_object_sdk ) ;
1733
+ const read_md_res = await ns_tmp . read_object_md ( { bucket, key : src_key } , dummy_object_sdk ) ;
1734
+
1735
+ assert . deepStrictEqual ( md1 , read_md_res . xattr ) ;
1736
+ assert . equal ( stream_content_type , read_md_res . content_type ) ;
1737
+
1738
+ const copy_source = { bucket, key : src_key } ;
1739
+ const new_xattr = { 'copy_new_xattr_key' : 'copy_new_xattr_val' } ;
1740
+ await ns_tmp . upload_object ( { bucket, key : dst_key , copy_source : copy_source , size : 0 ,
1741
+ xattr_copy : false ,
1742
+ content_type : dir_content_type ,
1743
+ xattr : new_xattr ,
1744
+ } , dummy_object_sdk ) ;
1745
+
1746
+ const dst_md_res = await ns_tmp . read_object_md ( { bucket, key : dst_key } , dummy_object_sdk ) ;
1747
+ const src_md_res = await ns_tmp . read_object_md ( { bucket, key : src_key } , dummy_object_sdk ) ;
1748
+
1749
+ // on fallback - content type and xattr should be changed on dst but not on src
1750
+ new_xattr [ s3_utils . XATTR_SORT_SYMBOL ] = true ;
1751
+ assert . deepStrictEqual ( md1 , src_md_res . xattr ) ;
1752
+ assert . equal ( stream_content_type , src_md_res . content_type ) ;
1753
+ assert . deepStrictEqual ( new_xattr , dst_md_res . xattr ) ;
1754
+ assert . equal ( dir_content_type , dst_md_res . content_type ) ;
1755
+ assert . deepStrictEqual ( md1 , read_md_res . xattr ) ;
1690
1756
} ) ;
1691
1757
1692
1758
mocha . after ( async function ( ) {
0 commit comments