|
17 | 17 | * Bug fixes, suggestions and comments should be sent to [email protected] |
18 | 18 | */ |
19 | 19 |
|
| 20 | +import ch.cyberduck.core.Acl; |
20 | 21 | import ch.cyberduck.core.AlphanumericRandomStringService; |
21 | 22 | import ch.cyberduck.core.DisabledLoginCallback; |
22 | 23 | import ch.cyberduck.core.Path; |
@@ -50,41 +51,94 @@ public void testGetMetadataBucket() throws Exception { |
50 | 51 | public void testGetMetadataFile() throws Exception { |
51 | 52 | final Path container = new Path("versioning-test-eu-central-1-cyberduck", EnumSet.of(Path.Type.volume, Path.Type.directory)); |
52 | 53 | final Path test = new Path(container, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file)); |
53 | | - new S3TouchFeature(session, new S3AccessControlListFeature(session)).touch(test, new TransferStatus().withMetadata(Collections.singletonMap("app", "cyberduck"))); |
| 54 | + new S3TouchFeature(session, new S3AccessControlListFeature(session)).touch(test, new TransferStatus() |
| 55 | + .withMetadata(Collections.singletonMap("app", "cyberduck")) |
| 56 | + .withMime("text/plain")); |
54 | 57 | final Map<String, String> metadata = new S3MetadataFeature(session, new S3AccessControlListFeature(session)).getMetadata(test); |
55 | 58 | new S3DefaultDeleteFeature(session).delete(Collections.singletonList(test), new DisabledLoginCallback(), new Delete.DisabledCallback()); |
56 | 59 | assertFalse(metadata.isEmpty()); |
57 | 60 | assertTrue(metadata.containsKey("app")); |
58 | 61 | assertEquals("cyberduck", metadata.get("app")); |
| 62 | + assertTrue(metadata.containsKey("Content-Type")); |
| 63 | + assertEquals("text/plain", metadata.get("Content-Type")); |
59 | 64 | assertFalse(metadata.containsKey(Constants.KEY_FOR_USER_METADATA)); |
60 | 65 | assertFalse(metadata.containsKey(Constants.KEY_FOR_SERVICE_METADATA)); |
61 | 66 | assertFalse(metadata.containsKey(Constants.KEY_FOR_COMPLETE_METADATA)); |
62 | 67 | } |
63 | 68 |
|
| 69 | + @Test |
| 70 | + public void testSetMetadataHttpHeaders() throws Exception { |
| 71 | + final Path container = new Path("versioning-test-eu-central-1-cyberduck", EnumSet.of(Path.Type.volume, Path.Type.directory)); |
| 72 | + final Path test = new S3TouchFeature(session, new S3AccessControlListFeature(session)).touch( |
| 73 | + new Path(container, UUID.randomUUID().toString(), EnumSet.of(Path.Type.file)), new TransferStatus()); |
| 74 | + final S3MetadataFeature feature = new S3MetadataFeature(session, new S3AccessControlListFeature(session)); |
| 75 | + final Map<String, String> metadata = feature.getMetadata(test); |
| 76 | + |
| 77 | + metadata.put("Content-Disposition", "attachment"); |
| 78 | + feature.setMetadata(test, metadata); |
| 79 | + assertTrue(feature.getMetadata(test).containsKey("Content-Disposition")); |
| 80 | + metadata.put("Cache-Control", "public,max-age=1"); |
| 81 | + feature.setMetadata(test, metadata); |
| 82 | + assertTrue(feature.getMetadata(test).containsKey("Cache-Control")); |
| 83 | + metadata.put("Content-Type", "text/html"); |
| 84 | + feature.setMetadata(test, metadata); |
| 85 | + assertTrue(feature.getMetadata(test).containsKey("Content-Type")); |
| 86 | + |
| 87 | + new S3DefaultDeleteFeature(session).delete(Collections.singletonList(test), new DisabledLoginCallback(), new Delete.DisabledCallback()); |
| 88 | + } |
| 89 | + |
64 | 90 | @Test |
65 | 91 | public void testSetMetadataFileLeaveOtherFeatures() throws Exception { |
66 | | - final Path container = new Path("test-eu-central-1-cyberduck", EnumSet.of(Path.Type.volume, Path.Type.directory)); |
| 92 | + final Path container = new Path("versioning-test-eu-central-1-cyberduck", EnumSet.of(Path.Type.volume, Path.Type.directory)); |
67 | 93 | final Path test = new Path(container, UUID.randomUUID().toString(), EnumSet.of(Path.Type.file)); |
68 | | - new S3TouchFeature(session, new S3AccessControlListFeature(session)).touch(test, new TransferStatus()); |
| 94 | + final S3AccessControlListFeature acls = new S3AccessControlListFeature(session); |
| 95 | + new S3TouchFeature(session, acls).touch(test, new TransferStatus()); |
| 96 | + final S3MetadataFeature feature = new S3MetadataFeature(session, acls); |
| 97 | + final Map<String, String> reference = feature.getMetadata(test); |
| 98 | + |
69 | 99 | final String v = UUID.randomUUID().toString(); |
70 | | - final S3StorageClassFeature storage = new S3StorageClassFeature(session, new S3AccessControlListFeature(session)); |
| 100 | + |
| 101 | + final Acl acl = acls.getPermission(test); |
| 102 | + acl.addAll(new Acl.GroupUser(Acl.GroupUser.EVERYONE), new Acl.Role(Acl.Role.READ)); |
| 103 | + acl.addAll(new Acl.GroupUser(Acl.GroupUser.AUTHENTICATED), new Acl.Role(Acl.Role.READ)); |
| 104 | + acls.setPermission(test, acl); |
| 105 | + assertEquals(reference, feature.getMetadata(test)); |
| 106 | + |
| 107 | + final S3StorageClassFeature storage = new S3StorageClassFeature(session, acls); |
71 | 108 | storage.setClass(test, S3Object.STORAGE_CLASS_REDUCED_REDUNDANCY); |
72 | 109 | assertEquals(S3Object.STORAGE_CLASS_REDUCED_REDUNDANCY, storage.getClass(test)); |
| 110 | + assertEquals(reference, feature.getMetadata(test)); |
73 | 111 |
|
74 | | - final S3EncryptionFeature encryption = new S3EncryptionFeature(session, new S3AccessControlListFeature(session)); |
| 112 | + final S3EncryptionFeature encryption = new S3EncryptionFeature(session, acls); |
75 | 113 | encryption.setEncryption(test, S3EncryptionFeature.SSE_AES256); |
76 | 114 | assertEquals("AES256", encryption.getEncryption(test).algorithm); |
| 115 | + assertEquals(reference, feature.getMetadata(test)); |
77 | 116 |
|
78 | | - final S3MetadataFeature feature = new S3MetadataFeature(session, new S3AccessControlListFeature(session)); |
79 | 117 | feature.setMetadata(test, Collections.singletonMap("Test", v)); |
80 | 118 | final Map<String, String> metadata = feature.getMetadata(test); |
81 | 119 | assertFalse(metadata.isEmpty()); |
82 | 120 | assertTrue(metadata.containsKey("test")); |
83 | 121 | assertEquals(v, metadata.get("test")); |
| 122 | + assertEquals(reference.size() + 1, metadata.size()); |
84 | 123 |
|
85 | 124 | assertEquals(S3Object.STORAGE_CLASS_REDUCED_REDUNDANCY, storage.getClass(test)); |
86 | 125 | assertEquals("AES256", encryption.getEncryption(test).algorithm); |
| 126 | + assertEquals(acl, acls.getPermission(test)); |
| 127 | + |
| 128 | + new S3DefaultDeleteFeature(session).delete(Collections.singletonList(test), new DisabledLoginCallback(), new Delete.DisabledCallback()); |
| 129 | + } |
87 | 130 |
|
| 131 | + @Test |
| 132 | + public void testSetDuplicateHeaderDifferentCapitalization() throws Exception { |
| 133 | + final Path container = new Path("versioning-test-eu-central-1-cyberduck", EnumSet.of(Path.Type.volume, Path.Type.directory)); |
| 134 | + final Path test = new Path(container, UUID.randomUUID().toString(), EnumSet.of(Path.Type.file)); |
| 135 | + new S3TouchFeature(session, new S3AccessControlListFeature(session)).touch(test, new TransferStatus()); |
| 136 | + final S3MetadataFeature feature = new S3MetadataFeature(session, new S3AccessControlListFeature(session)); |
| 137 | + assertTrue(feature.getMetadata(test).containsKey("Content-Type")); |
| 138 | + feature.setMetadata(test, Collections.singletonMap("Content-type", "text/plain")); |
| 139 | + final Map<String, String> metadata = feature.getMetadata(test); |
| 140 | + assertTrue(metadata.containsKey("Content-Type")); |
| 141 | + assertEquals("text/plain", metadata.get("Content-Type")); |
88 | 142 | new S3DefaultDeleteFeature(session).delete(Collections.singletonList(test), new DisabledLoginCallback(), new Delete.DisabledCallback()); |
89 | 143 | } |
90 | 144 | } |
0 commit comments