diff --git a/blob/blob-aws/src/test/java/com/salesforce/multicloudj/blob/aws/AwsBlobStoreIT.java b/blob/blob-aws/src/test/java/com/salesforce/multicloudj/blob/aws/AwsBlobStoreIT.java
index 23c26b414..fce8f0c20 100644
--- a/blob/blob-aws/src/test/java/com/salesforce/multicloudj/blob/aws/AwsBlobStoreIT.java
+++ b/blob/blob-aws/src/test/java/com/salesforce/multicloudj/blob/aws/AwsBlobStoreIT.java
@@ -63,6 +63,11 @@ public AbstractBlobStore createBlobStore(
return createBlobStore(bucketNameToUse, credentialsOverrider);
}
+ @Override
+ public boolean isObjectLockSupported() {
+ return true;
+ }
+
private AbstractBlobStore createBlobStore(
final String bucketName, final CredentialsOverrider credentialsOverrider) {
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-delete-0.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-delete-0.json
new file mode 100644
index 000000000..11ed6fe5b
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-delete-0.json
@@ -0,0 +1,22 @@
+{
+ "id" : "5698f91f-fb33-4776-bedf-e65046e855ec",
+ "name" : "AwsBlobStoreIT_testGetObjectLock_afterUploadWithRetentionCompliance-DELETE-0",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/objectlock/retention-compliance",
+ "method" : "DELETE"
+ },
+ "response" : {
+ "status" : 204,
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-delete-marker" : "true",
+ "x-amz-request-id" : "4D2FZ3K2FAHC4NA0",
+ "x-amz-id-2" : "FH8bBH9YhEfVFTfLlWlJ5XHpdY54eT28Fb75z3842e557KSz221IxilDlX8xcq3+T+pysCQYED4ZJWwdBS7TTAAUCt9UK8xm",
+ "x-amz-version-id" : "Wcl46YWohnfme.wPJHzRlIStohxDEOtq",
+ "Date" : "Tue, 10 Mar 2026 16:18:32 GMT"
+ }
+ },
+ "uuid" : "5698f91f-fb33-4776-bedf-e65046e855ec",
+ "persistent" : true,
+ "insertionIndex" : 600
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-1.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-1.json
new file mode 100644
index 000000000..3c6291123
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-1.json
@@ -0,0 +1,21 @@
+{
+ "id" : "d347659c-5a3c-4fc8-b762-cbc659db862f",
+ "name" : "AwsBlobStoreIT_testGetObjectLock_afterUploadWithRetentionCompliance-GET-1",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/objectlock/retention-compliance?legal-hold",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "base64Body" : "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExlZ2FsSG9sZCB4bWxucz0iaHR0cDovL3MzLmFtYXpvbmF3cy5jb20vZG9jLzIwMDYtMDMtMDEvIj48U3RhdHVzPk9GRjwvU3RhdHVzPjwvTGVnYWxIb2xkPg==",
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-request-id" : "4D2B85GHY6590P53",
+ "x-amz-id-2" : "307GDQtwiRYN+bfeMLaezt7y6XzLj65HzEwvWToGP3Psyu9IEWal7IoQf7IKOkBxyuOffstlt99e6rmFODGTnn2OQPq020b8",
+ "Date" : "Tue, 10 Mar 2026 16:18:32 GMT"
+ }
+ },
+ "uuid" : "d347659c-5a3c-4fc8-b762-cbc659db862f",
+ "persistent" : true,
+ "insertionIndex" : 601
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-2.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-2.json
new file mode 100644
index 000000000..b5fdd7a41
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-2.json
@@ -0,0 +1,21 @@
+{
+ "id" : "95d63c37-f950-4888-acfa-534a9fd7c3fa",
+ "name" : "AwsBlobStoreIT_testGetObjectLock_afterUploadWithRetentionCompliance-GET-2",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/objectlock/retention-compliance?retention",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "base64Body" : "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPFJldGVudGlvbiB4bWxucz0iaHR0cDovL3MzLmFtYXpvbmF3cy5jb20vZG9jLzIwMDYtMDMtMDEvIj48TW9kZT5DT01QTElBTkNFPC9Nb2RlPjxSZXRhaW5VbnRpbERhdGU+MjAyNi0wMy0xMVQxNTo0NzoyNS41MTJaPC9SZXRhaW5VbnRpbERhdGU+PC9SZXRlbnRpb24+",
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-request-id" : "4HYQ7JFFWFQZZRTB",
+ "x-amz-id-2" : "62M42VJRPEmEuYoDhJmuYVlO8P67Q4j7CH543j6JBcvKJaUnFG85HdWksroM0Q+hdQW/VPrYqgPZinVKC60nyuGrQSjBmOpG",
+ "Date" : "Tue, 10 Mar 2026 16:18:31 GMT"
+ }
+ },
+ "uuid" : "95d63c37-f950-4888-acfa-534a9fd7c3fa",
+ "persistent" : true,
+ "insertionIndex" : 602
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-put-3.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-put-3.json
new file mode 100644
index 000000000..2ab872ae9
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-put-3.json
@@ -0,0 +1,28 @@
+{
+ "id" : "36c0110e-2f3b-45c0-8ac8-fa58a72c252d",
+ "name" : "AwsBlobStoreIT_testGetObjectLock_afterUploadWithRetentionCompliance-PUT-3",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/objectlock/retention-compliance",
+ "method" : "PUT",
+ "bodyPatterns" : [ {
+ "binaryEqualTo" : "T2JqZWN0IGxvY2sgcmV0ZW50aW9uIGNvbXBsaWFuY2UgdGVzdA=="
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "headers" : {
+ "Server" : "AmazonS3",
+ "ETag" : "\"a0d246afc0f8baf1e7dd602c80efd967\"",
+ "x-amz-checksum-type" : "FULL_OBJECT",
+ "x-amz-request-id" : "4HYQDD20GF2X48A5",
+ "x-amz-checksum-crc32c" : "4z8aNg==",
+ "x-amz-server-side-encryption" : "AES256",
+ "x-amz-id-2" : "FieLviYJIUnvJJpzcWvPahzS2rpJhmLJKlhX8L8PPj06Vpw5H3hWevDMEMlnuBQpil8vFCEJFltftsJElzW/ztGFTFQEh+r8",
+ "x-amz-version-id" : "qeEgCuuJTDNRMqIIut.sJOq4qQ_hqj_o",
+ "Date" : "Tue, 10 Mar 2026 16:18:31 GMT"
+ }
+ },
+ "uuid" : "36c0110e-2f3b-45c0-8ac8-fa58a72c252d",
+ "persistent" : true,
+ "insertionIndex" : 603
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-delete-0.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-delete-0.json
new file mode 100644
index 000000000..c47382e37
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-delete-0.json
@@ -0,0 +1,22 @@
+{
+ "id" : "7aab7223-09da-4de4-9b5e-7749aa198d80",
+ "name" : "AwsBlobStoreIT_testGetObjectLock_afterUploadWithRetentionGovernance-DELETE-0",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/objectlock/retention-governance",
+ "method" : "DELETE"
+ },
+ "response" : {
+ "status" : 204,
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-delete-marker" : "true",
+ "x-amz-request-id" : "P52H89R4YZ09ZMWQ",
+ "x-amz-id-2" : "GRLW1/MApGDGE52h82c1xo2A7y/P2EmgsnlKCcNVdeDi9AnjdDYC4nFlErppHWL+laBMwQuFKoV3+gmWozon6RFGvqXphr3T",
+ "x-amz-version-id" : "1JYG_UsFaA7fg7Bdv0Q8Yv_3pPR690Zq",
+ "Date" : "Tue, 10 Mar 2026 16:18:34 GMT"
+ }
+ },
+ "uuid" : "7aab7223-09da-4de4-9b5e-7749aa198d80",
+ "persistent" : true,
+ "insertionIndex" : 605
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-1.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-1.json
new file mode 100644
index 000000000..893402f63
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-1.json
@@ -0,0 +1,21 @@
+{
+ "id" : "16961e0e-fc8d-4b56-8580-be6f47012ddf",
+ "name" : "AwsBlobStoreIT_testGetObjectLock_afterUploadWithRetentionGovernance-GET-1",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/objectlock/retention-governance?legal-hold",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "base64Body" : "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPExlZ2FsSG9sZCB4bWxucz0iaHR0cDovL3MzLmFtYXpvbmF3cy5jb20vZG9jLzIwMDYtMDMtMDEvIj48U3RhdHVzPk9GRjwvU3RhdHVzPjwvTGVnYWxIb2xkPg==",
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-request-id" : "P52ZNTKZC412VW3J",
+ "x-amz-id-2" : "swL/EkEpNq/mErdPQ7ZckqM72t7+RGtj91/qgs/kSpeyRCgSAUwCfFAdIAWInSiyvZOFmIKXo+sm62dqvcOdnyLxEy1p1r+u",
+ "Date" : "Tue, 10 Mar 2026 16:18:34 GMT"
+ }
+ },
+ "uuid" : "16961e0e-fc8d-4b56-8580-be6f47012ddf",
+ "persistent" : true,
+ "insertionIndex" : 606
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-2.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-2.json
new file mode 100644
index 000000000..3a8d977cb
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-2.json
@@ -0,0 +1,21 @@
+{
+ "id" : "c3125b36-f844-4823-abf6-f32db316e309",
+ "name" : "AwsBlobStoreIT_testGetObjectLock_afterUploadWithRetentionGovernance-GET-2",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/objectlock/retention-governance?retention",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "base64Body" : "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPFJldGVudGlvbiB4bWxucz0iaHR0cDovL3MzLmFtYXpvbmF3cy5jb20vZG9jLzIwMDYtMDMtMDEvIj48TW9kZT5HT1ZFUk5BTkNFPC9Nb2RlPjxSZXRhaW5VbnRpbERhdGU+MjAyNi0wMy0xMVQxNTo0NzoyOC4yNTJaPC9SZXRhaW5VbnRpbERhdGU+PC9SZXRlbnRpb24+",
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-request-id" : "P52RJVCPG0CZZYCH",
+ "x-amz-id-2" : "BY0fe52vgnvtw+1LSE22XF858XPfcNYoLyH+bViW/LlPQLcz0tS7fBqB5Mj/D20UTKpaCSTTFSF6NK1znVByM3PXoCogk8Wl",
+ "Date" : "Tue, 10 Mar 2026 16:18:34 GMT"
+ }
+ },
+ "uuid" : "c3125b36-f844-4823-abf6-f32db316e309",
+ "persistent" : true,
+ "insertionIndex" : 607
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-put-3.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-put-3.json
new file mode 100644
index 000000000..29f5c1656
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-put-3.json
@@ -0,0 +1,28 @@
+{
+ "id" : "56057ab4-4c0b-491e-b103-b47a011b7eaa",
+ "name" : "AwsBlobStoreIT_testGetObjectLock_afterUploadWithRetentionGovernance-PUT-3",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/objectlock/retention-governance",
+ "method" : "PUT",
+ "bodyPatterns" : [ {
+ "binaryEqualTo" : "T2JqZWN0IGxvY2sgcmV0ZW50aW9uIGdvdmVybmFuY2UgdGVzdA=="
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "headers" : {
+ "Server" : "AmazonS3",
+ "ETag" : "\"7e7cee74a915a322ef6c75c3ab034d4f\"",
+ "x-amz-checksum-type" : "FULL_OBJECT",
+ "x-amz-request-id" : "2AEBTWVXZJZDK8MX",
+ "x-amz-checksum-crc32c" : "s67YvA==",
+ "x-amz-server-side-encryption" : "AES256",
+ "x-amz-id-2" : "1Xu1BSTHb1oc2kkioH9eCw6fe37ZxhCNp6ihC7CguujRLB5d3oEAnVFzHGDR9bVFnrrBkdGiKwkq9JRHcWHtk0mQNsMIkFBW",
+ "x-amz-version-id" : "npddx0hlKXfv38pdT3eAx8rnRseb1tTw",
+ "Date" : "Tue, 10 Mar 2026 16:18:33 GMT"
+ }
+ },
+ "uuid" : "56057ab4-4c0b-491e-b103-b47a011b7eaa",
+ "persistent" : true,
+ "insertionIndex" : 608
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-delete-0.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-delete-0.json
new file mode 100644
index 000000000..1ce0f63db
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-delete-0.json
@@ -0,0 +1,22 @@
+{
+ "id" : "b04c635b-781f-48e7-8689-bb07670e6f89",
+ "name" : "AwsBlobStoreIT_testGetObjectLock_objectWithoutLock_returnsNullOrNoRetention-DELETE-0",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/objectlock/no-lock",
+ "method" : "DELETE"
+ },
+ "response" : {
+ "status" : 204,
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-delete-marker" : "true",
+ "x-amz-request-id" : "DZ1JAWS4PRP76KGB",
+ "x-amz-id-2" : "Z6rbynsol+rE8M7js4/spMVHi/mxwMmj+2CEou2aAXYcuTLa2+MQTO/7LTve6Tjy2YNHYJdkekVM2zOj67/oLhyPNB+uCW1C",
+ "x-amz-version-id" : "bLYMFSF7JpfhYZgrgqFxEGLtKC4UYW2K",
+ "Date" : "Tue, 10 Mar 2026 16:18:30 GMT"
+ }
+ },
+ "uuid" : "b04c635b-781f-48e7-8689-bb07670e6f89",
+ "persistent" : true,
+ "insertionIndex" : 596
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-1.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-1.json
new file mode 100644
index 000000000..85bdc89ce
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-1.json
@@ -0,0 +1,22 @@
+{
+ "id" : "2be5a1bf-f7c1-44e1-a19c-7637bcf7a342",
+ "name" : "AwsBlobStoreIT_testGetObjectLock_objectWithoutLock_returnsNullOrNoRetention-GET-1",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/objectlock/no-lock?retention",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 404,
+ "body" : "\nNoSuchObjectLockConfigurationThe specified object does not have a ObjectLock configurationQ1ZDKSZKG7BEC0R5SmI82WQ8Lq+Uv2Rs+fQOQSi8VOn3Ecm63tHWlgQ5B1nu3Dj7LvOVVZPzXC8Ua5kqsMohxy3dz/O0BcwBEt4dCXQKy+ZCbUW2",
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-request-id" : "Q1ZDKSZKG7BEC0R5",
+ "x-amz-id-2" : "SmI82WQ8Lq+Uv2Rs+fQOQSi8VOn3Ecm63tHWlgQ5B1nu3Dj7LvOVVZPzXC8Ua5kqsMohxy3dz/O0BcwBEt4dCXQKy+ZCbUW2",
+ "Date" : "Tue, 10 Mar 2026 16:18:28 GMT",
+ "Content-Type" : "application/xml"
+ }
+ },
+ "uuid" : "2be5a1bf-f7c1-44e1-a19c-7637bcf7a342",
+ "persistent" : true,
+ "insertionIndex" : 597
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-put-2.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-put-2.json
new file mode 100644
index 000000000..3780952b1
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-put-2.json
@@ -0,0 +1,28 @@
+{
+ "id" : "1a9977f6-cef9-4873-93c8-9171d69c3575",
+ "name" : "AwsBlobStoreIT_testGetObjectLock_objectWithoutLock_returnsNullOrNoRetention-PUT-2",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/objectlock/no-lock",
+ "method" : "PUT",
+ "bodyPatterns" : [ {
+ "binaryEqualTo" : "T2JqZWN0IHdpdGhvdXQgbG9jayB0ZXN0"
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "headers" : {
+ "Server" : "AmazonS3",
+ "ETag" : "\"fdd2c398fd6d009c474f1f9a02d38ec5\"",
+ "x-amz-checksum-crc64nvme" : "59pOl5UH6tE=",
+ "x-amz-checksum-type" : "FULL_OBJECT",
+ "x-amz-request-id" : "Q1ZFTE54XYYCE66N",
+ "x-amz-server-side-encryption" : "AES256",
+ "x-amz-id-2" : "q/ldnpEroFP3VnJA7aDKa76pTTtcxIe+l5EDpQb4NNaJqJf56hH3BOVFReQ/Xp2/D6IY4xn/f5eNIOYquA3c7FJkZuGMKhU3",
+ "x-amz-version-id" : "QXlZRw2uXCUJYEzz5X2vHNqHLzKHTDiG",
+ "Date" : "Tue, 10 Mar 2026 16:18:29 GMT"
+ }
+ },
+ "uuid" : "1a9977f6-cef9-4873-93c8-9171d69c3575",
+ "persistent" : true,
+ "insertionIndex" : 598
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-delete-0.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-delete-0.json
new file mode 100644
index 000000000..4ae8b1e73
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-delete-0.json
@@ -0,0 +1,22 @@
+{
+ "id" : "ceb402f6-7fd0-49c5-9523-dcfff33b6d7a",
+ "name" : "AwsBlobStoreIT_testTagging_withObjectLock-DELETE-0",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/blob-for-tagging-objectlock-fake",
+ "method" : "DELETE"
+ },
+ "response" : {
+ "status" : 204,
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-delete-marker" : "true",
+ "x-amz-request-id" : "ZWFX6GM2DS0TJJYY",
+ "x-amz-id-2" : "v/lRQx93LzTp/XGBtY37DZoInz3nmB/zxkFbRfvrExYEKxzhyrKAKpyU6ThnWF2xlI9IiJu6PeI=",
+ "x-amz-version-id" : "ZDqKG3qCaHH1_CpIbICrGEr48It7R36a",
+ "Date" : "Tue, 10 Mar 2026 14:31:06 GMT"
+ }
+ },
+ "uuid" : "ceb402f6-7fd0-49c5-9523-dcfff33b6d7a",
+ "persistent" : true,
+ "insertionIndex" : 581
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-delete-1.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-delete-1.json
new file mode 100644
index 000000000..1542ce675
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-delete-1.json
@@ -0,0 +1,22 @@
+{
+ "id" : "84a5d2ae-59b0-4ae2-8e1b-30b0f926a7f9",
+ "name" : "AwsBlobStoreIT_testTagging_withObjectLock-DELETE-1",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/blob-for-tagging-objectlock",
+ "method" : "DELETE"
+ },
+ "response" : {
+ "status" : 204,
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-delete-marker" : "true",
+ "x-amz-request-id" : "ZWFZQ7RBNPDAC6WB",
+ "x-amz-id-2" : "ChQNGnpYPgS/+kFUysSUOYfpiUURiWwlhd+MvXtIKI0tBzb0DXvV17AWj/GGPStcnpK4UbpfYRc=",
+ "x-amz-version-id" : "P9BwaDOYao458KmcNZC3LKfLUH5rILtE",
+ "Date" : "Tue, 10 Mar 2026 14:31:06 GMT"
+ }
+ },
+ "uuid" : "84a5d2ae-59b0-4ae2-8e1b-30b0f926a7f9",
+ "persistent" : true,
+ "insertionIndex" : 582
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-get-3.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-get-3.json
new file mode 100644
index 000000000..f9e9d42c6
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-get-3.json
@@ -0,0 +1,36 @@
+{
+ "id" : "3774a5b0-976c-4b51-a263-da7dd54f1815",
+ "name" : "AwsBlobStoreIT_testTagging_withObjectLock-GET-3",
+ "request" : {
+ "urlPath" : "/chameleon-jcloud-versioned/conformance-tests/blob-for-tagging-objectlock",
+ "method" : "GET",
+ "headers" : {
+ "X-Query-Param-Count" : {
+ "equalTo" : "1"
+ }
+ },
+ "queryParameters" : {
+ "tagging" : {
+ "hasExactly" : [ {
+ "equalTo" : ""
+ } ]
+ }
+ }
+ },
+ "response" : {
+ "status" : 200,
+ "base64Body" : "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPFRhZ2dpbmcgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PFRhZ1NldD48VGFnPjxLZXk+dGFnMzwvS2V5PjxWYWx1ZT52YWx1ZTM8L1ZhbHVlPjwvVGFnPjwvVGFnU2V0PjwvVGFnZ2luZz4=",
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-request-id" : "VB6M98NS5W9JQWTQ",
+ "x-amz-id-2" : "7+EQcsGim9gW3ym9g+wzskzlCURkC/uFFl/TG3OqDa3rTA9hVRLpKYpco8Bn7WI4NtzSFjfmH5w=",
+ "x-amz-version-id" : "dgo9JT5pJMrdh0InTb0FVinbLxRovWYO",
+ "Date" : "Tue, 10 Mar 2026 14:31:05 GMT"
+ }
+ },
+ "uuid" : "3774a5b0-976c-4b51-a263-da7dd54f1815",
+ "persistent" : true,
+ "scenarioName" : "scenario-1-chameleon-jcloud-versioned-conformance-tests-blob-for-tagging-objectlock",
+ "requiredScenarioState" : "scenario-1-chameleon-jcloud-versioned-conformance-tests-blob-for-tagging-objectlock-2",
+ "insertionIndex" : 584
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-get-5.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-get-5.json
new file mode 100644
index 000000000..a22df201a
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-get-5.json
@@ -0,0 +1,37 @@
+{
+ "id" : "e85417ba-0bed-46ae-bbd7-f0131c4748c0",
+ "name" : "AwsBlobStoreIT_testTagging_withObjectLock-GET-5",
+ "request" : {
+ "urlPath" : "/chameleon-jcloud-versioned/conformance-tests/blob-for-tagging-objectlock",
+ "method" : "GET",
+ "headers" : {
+ "X-Query-Param-Count" : {
+ "equalTo" : "1"
+ }
+ },
+ "queryParameters" : {
+ "tagging" : {
+ "hasExactly" : [ {
+ "equalTo" : ""
+ } ]
+ }
+ }
+ },
+ "response" : {
+ "status" : 200,
+ "base64Body" : "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPFRhZ2dpbmcgeG1sbnM9Imh0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLyI+PFRhZ1NldD48VGFnPjxLZXk+dGFnMTwvS2V5PjxWYWx1ZT52YWx1ZTE8L1ZhbHVlPjwvVGFnPjwvVGFnU2V0PjwvVGFnZ2luZz4=",
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-request-id" : "R92F5ZGF8DE057KY",
+ "x-amz-id-2" : "Hxy8ZKlPSfT0vKQ7krCewYOBL8H8jXGy/NQMHb44lYAFlQxGFWNIol07LEan7QD/vKOYNEhzPNE=",
+ "x-amz-version-id" : "dgo9JT5pJMrdh0InTb0FVinbLxRovWYO",
+ "Date" : "Tue, 10 Mar 2026 14:31:04 GMT"
+ }
+ },
+ "uuid" : "e85417ba-0bed-46ae-bbd7-f0131c4748c0",
+ "persistent" : true,
+ "scenarioName" : "scenario-1-chameleon-jcloud-versioned-conformance-tests-blob-for-tagging-objectlock",
+ "requiredScenarioState" : "Started",
+ "newScenarioState" : "scenario-1-chameleon-jcloud-versioned-conformance-tests-blob-for-tagging-objectlock-2",
+ "insertionIndex" : 586
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-put-2.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-put-2.json
new file mode 100644
index 000000000..696eb16f3
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-put-2.json
@@ -0,0 +1,40 @@
+{
+ "id" : "ac4fd716-2577-4128-b7ea-d84280547ca9",
+ "name" : "AwsBlobStoreIT_testTagging_withObjectLock-PUT-2",
+ "request" : {
+ "urlPath" : "/chameleon-jcloud-versioned/conformance-tests/blob-for-tagging-objectlock-fake",
+ "method" : "PUT",
+ "headers" : {
+ "X-Query-Param-Count" : {
+ "equalTo" : "1"
+ }
+ },
+ "queryParameters" : {
+ "tagging" : {
+ "hasExactly" : [ {
+ "equalTo" : ""
+ } ]
+ }
+ },
+ "bodyPatterns" : [ {
+ "equalToXml" : "tag5value5"
+ } ]
+ },
+ "response" : {
+ "status" : 405,
+ "body" : "\nMethodNotAllowedThe specified method is not allowed against this resource.PUTDeleteMarkerZWFNBDC50V7SCY39wKF+pc/FDDfMPKHCBdyxwEfAvn+Nc7FZmOeQcKcBp51oguPGZncY5ynLg5aghuDGMFOLbA53ui0=",
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-delete-marker" : "true",
+ "x-amz-request-id" : "ZWFNBDC50V7SCY39",
+ "x-amz-id-2" : "wKF+pc/FDDfMPKHCBdyxwEfAvn+Nc7FZmOeQcKcBp51oguPGZncY5ynLg5aghuDGMFOLbA53ui0=",
+ "x-amz-version-id" : "usJvHYtD04RwhO5YCbrOCJRGtbxzoDvr",
+ "Date" : "Tue, 10 Mar 2026 14:31:04 GMT",
+ "Content-Type" : "application/xml",
+ "Allow" : "DELETE"
+ }
+ },
+ "uuid" : "ac4fd716-2577-4128-b7ea-d84280547ca9",
+ "persistent" : true,
+ "insertionIndex" : 583
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-put-4.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-put-4.json
new file mode 100644
index 000000000..0f0a57334
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-put-4.json
@@ -0,0 +1,36 @@
+{
+ "id" : "681ceff6-af6a-451c-8993-6331338f3ac9",
+ "name" : "AwsBlobStoreIT_testTagging_withObjectLock-PUT-4",
+ "request" : {
+ "urlPath" : "/chameleon-jcloud-versioned/conformance-tests/blob-for-tagging-objectlock",
+ "method" : "PUT",
+ "headers" : {
+ "X-Query-Param-Count" : {
+ "equalTo" : "1"
+ }
+ },
+ "queryParameters" : {
+ "tagging" : {
+ "hasExactly" : [ {
+ "equalTo" : ""
+ } ]
+ }
+ },
+ "bodyPatterns" : [ {
+ "equalToXml" : "tag3value3"
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "headers" : {
+ "Server" : "AmazonS3",
+ "x-amz-request-id" : "VB6JX4H228VGPRV0",
+ "x-amz-id-2" : "N/CpMe0XpxnsN3c+mLTJTeX1TpWSMehRWFd8xPCcLPKz6Rib7F5KO2BPxDF9bAMrf75YJgqzOx8=",
+ "x-amz-version-id" : "dgo9JT5pJMrdh0InTb0FVinbLxRovWYO",
+ "Date" : "Tue, 10 Mar 2026 14:31:05 GMT"
+ }
+ },
+ "uuid" : "681ceff6-af6a-451c-8993-6331338f3ac9",
+ "persistent" : true,
+ "insertionIndex" : 585
+}
\ No newline at end of file
diff --git a/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-put-6.json b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-put-6.json
new file mode 100644
index 000000000..61e080346
--- /dev/null
+++ b/blob/blob-aws/src/test/resources/mappings/awsblobstoreit_testtagging_withobjectlock-put-6.json
@@ -0,0 +1,28 @@
+{
+ "id" : "93ddf6b7-e8e4-4709-ac5c-28b0380efb34",
+ "name" : "AwsBlobStoreIT_testTagging_withObjectLock-PUT-6",
+ "request" : {
+ "url" : "/chameleon-jcloud-versioned/conformance-tests/blob-for-tagging-objectlock",
+ "method" : "PUT",
+ "bodyPatterns" : [ {
+ "binaryEqualTo" : "VGFnZ2luZyB3aXRoIG9iamVjdCBsb2NrIHRlc3QgZGF0YQ=="
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "headers" : {
+ "Server" : "AmazonS3",
+ "ETag" : "\"7e1a180edde38beb3774924b70dcbfc7\"",
+ "x-amz-checksum-crc64nvme" : "JKlh1dpuZzw=",
+ "x-amz-checksum-type" : "FULL_OBJECT",
+ "x-amz-request-id" : "R924N65GRQ2MSA0Q",
+ "x-amz-server-side-encryption" : "AES256",
+ "x-amz-id-2" : "8UK1qHUXZKzId8afR8rI9AU10erB19Y4TbFaiz/F/663RUFPPzXus08vtv05ztL0lxvyiuSeS8g=",
+ "x-amz-version-id" : "dgo9JT5pJMrdh0InTb0FVinbLxRovWYO",
+ "Date" : "Tue, 10 Mar 2026 14:31:04 GMT"
+ }
+ },
+ "uuid" : "93ddf6b7-e8e4-4709-ac5c-28b0380efb34",
+ "persistent" : true,
+ "insertionIndex" : 587
+}
\ No newline at end of file
diff --git a/blob/blob-client/src/test/java/com/salesforce/multicloudj/blob/client/AbstractBlobStoreIT.java b/blob/blob-client/src/test/java/com/salesforce/multicloudj/blob/client/AbstractBlobStoreIT.java
index 0053f1d84..79f6a68eb 100644
--- a/blob/blob-client/src/test/java/com/salesforce/multicloudj/blob/client/AbstractBlobStoreIT.java
+++ b/blob/blob-client/src/test/java/com/salesforce/multicloudj/blob/client/AbstractBlobStoreIT.java
@@ -17,8 +17,11 @@
import com.salesforce.multicloudj.blob.driver.MultipartUpload;
import com.salesforce.multicloudj.blob.driver.MultipartUploadRequest;
import com.salesforce.multicloudj.blob.driver.MultipartUploadResponse;
+import com.salesforce.multicloudj.blob.driver.ObjectLockConfiguration;
+import com.salesforce.multicloudj.blob.driver.ObjectLockInfo;
import com.salesforce.multicloudj.blob.driver.PresignedOperation;
import com.salesforce.multicloudj.blob.driver.PresignedUrlRequest;
+import com.salesforce.multicloudj.blob.driver.RetentionMode;
import com.salesforce.multicloudj.blob.driver.UploadPartResponse;
import com.salesforce.multicloudj.blob.driver.UploadRequest;
import com.salesforce.multicloudj.blob.driver.UploadResponse;
@@ -76,6 +79,14 @@ public interface Harness extends AutoCloseable {
AbstractBlobStore createBlobStore(
boolean useValidBucket, boolean useValidCredentials, boolean useVersionedBucket);
+ /**
+ * Whether this provider supports object lock (WORM). When false, object lock conformance
+ * tests are skipped.
+ */
+ default boolean isObjectLockSupported() {
+ return false;
+ }
+
// provide the BlobClient endpoint in provider
String getEndpoint();
@@ -2035,6 +2046,145 @@ public TestConfig(
}
}
+ /** Fixed retainUntil for object lock tests so WireMock replay matches recorded request body. */
+ private static final Instant OBJECT_LOCK_RETAIN_UNTIL_GOVERNANCE =
+ Instant.parse("2026-03-11T15:47:28.252Z");
+ private static final Instant OBJECT_LOCK_RETAIN_UNTIL_COMPLIANCE =
+ Instant.parse("2026-03-11T15:47:25.512Z");
+
+ @Test
+ public void testGetObjectLock_afterUploadWithRetentionGovernance() throws IOException {
+ Assumptions.assumeTrue(
+ harness.isObjectLockSupported(), "Object lock not supported by this provider");
+
+ String key = "conformance-tests/objectlock/retention-governance";
+ byte[] content = "Object lock retention governance test".getBytes(StandardCharsets.UTF_8);
+ Instant retainUntil = OBJECT_LOCK_RETAIN_UNTIL_GOVERNANCE;
+
+ AbstractBlobStore blobStore = harness.createBlobStore(true, true, true);
+ BucketClient bucketClient = new BucketClient(blobStore);
+
+ try {
+ ObjectLockConfiguration lockConfig =
+ ObjectLockConfiguration.builder()
+ .mode(RetentionMode.GOVERNANCE)
+ .retainUntilDate(retainUntil)
+ .legalHold(false)
+ .build();
+ try (InputStream inputStream = new ByteArrayInputStream(content)) {
+ bucketClient.upload(
+ new UploadRequest.Builder()
+ .withKey(key)
+ .withContentLength(content.length)
+ .withObjectLock(lockConfig)
+ .withChecksumValue(harness.computeChecksum(content))
+ .build(),
+ inputStream);
+ }
+
+ ObjectLockInfo info = bucketClient.getObjectLock(key, null);
+ Assertions.assertNotNull(
+ info, "getObjectLock should return non-null for object with retention");
+ Assertions.assertEquals(RetentionMode.GOVERNANCE, info.getMode());
+ Assertions.assertFalse(info.isLegalHold());
+ } finally {
+ safeDeleteBlobs(bucketClient, key);
+ }
+ }
+
+ @Test
+ public void testGetObjectLock_afterUploadWithRetentionCompliance() throws IOException {
+ Assumptions.assumeTrue(
+ harness.isObjectLockSupported(), "Object lock not supported by this provider");
+
+ String key = "conformance-tests/objectlock/retention-compliance";
+ byte[] content = "Object lock retention compliance test".getBytes(StandardCharsets.UTF_8);
+ Instant retainUntil = OBJECT_LOCK_RETAIN_UNTIL_COMPLIANCE;
+
+ AbstractBlobStore blobStore = harness.createBlobStore(true, true, true);
+ BucketClient bucketClient = new BucketClient(blobStore);
+
+ try {
+ ObjectLockConfiguration lockConfig =
+ ObjectLockConfiguration.builder()
+ .mode(RetentionMode.COMPLIANCE)
+ .retainUntilDate(retainUntil)
+ .legalHold(false)
+ .build();
+ try (InputStream inputStream = new ByteArrayInputStream(content)) {
+ bucketClient.upload(
+ new UploadRequest.Builder()
+ .withKey(key)
+ .withContentLength(content.length)
+ .withObjectLock(lockConfig)
+ .withChecksumValue(harness.computeChecksum(content))
+ .build(),
+ inputStream);
+ }
+
+ ObjectLockInfo info = bucketClient.getObjectLock(key, null);
+ Assertions.assertNotNull(
+ info, "getObjectLock should return non-null for object with retention");
+ Assertions.assertEquals(RetentionMode.COMPLIANCE, info.getMode());
+ Assertions.assertFalse(info.isLegalHold());
+ } finally {
+ safeDeleteBlobs(bucketClient, key);
+ }
+ }
+
+ @Test
+ public void testGetObjectLock_objectWithoutLock_returnsNullOrNoRetention() throws IOException {
+ Assumptions.assumeTrue(
+ harness.isObjectLockSupported(), "Object lock not supported by this provider");
+
+ String key = "conformance-tests/objectlock/no-lock";
+ byte[] content = "Object without lock test".getBytes(StandardCharsets.UTF_8);
+
+ AbstractBlobStore blobStore = harness.createBlobStore(true, true, true);
+ BucketClient bucketClient = new BucketClient(blobStore);
+
+ try {
+ try (InputStream inputStream = new ByteArrayInputStream(content)) {
+ bucketClient.upload(
+ new UploadRequest.Builder()
+ .withKey(key)
+ .withContentLength(content.length)
+ .build(),
+ inputStream);
+ }
+
+ // Provider may return null, return ObjectLockInfo with no retention/hold, or throw
+ // (e.g. AWS S3 when object has no lock)
+ try {
+ ObjectLockInfo info = bucketClient.getObjectLock(key, null);
+ if (info != null) {
+ Assertions.assertNull(info.getMode(), "Object without lock should have null mode");
+ Assertions.assertNull(
+ info.getRetainUntilDate(), "Object without lock should have null retainUntilDate");
+ Assertions.assertFalse(
+ info.isLegalHold(), "Object without lock should have legalHold false");
+ }
+ } catch (Exception e) {
+ // Acceptable: some providers (e.g. AWS S3) throw when object has no object lock config
+ }
+ } finally {
+ safeDeleteBlobs(bucketClient, key);
+ }
+ }
+
+ @Test
+ public void testGetObjectLock_nonexistentKey_throws() {
+ Assumptions.assumeTrue(
+ harness.isObjectLockSupported(), "Object lock not supported by this provider");
+
+ AbstractBlobStore blobStore = harness.createBlobStore(true, true, true);
+ BucketClient bucketClient = new BucketClient(blobStore);
+
+ Assertions.assertThrows(
+ Exception.class,
+ () -> bucketClient.getObjectLock("conformance-tests/objectlock/nonexistent", null));
+ }
+
@Test
public void testGetVersionedMetadata() throws IOException {
@@ -2736,6 +2886,63 @@ public void testTagging() throws IOException {
}
}
+ /**
+ * Conformance test for tagging on an object-lock-enabled bucket. Same flow as testTagging but
+ * uses a blob store configured for object lock (e.g. versioned/object-lock bucket). Skipped if
+ * the provider does not support object lock.
+ */
+ @Test
+ public void testTagging_withObjectLock() throws IOException {
+ Assumptions.assumeTrue(
+ harness.isObjectLockSupported(), "Object lock not supported by this provider");
+
+ AbstractBlobStore blobStore = harness.createBlobStore(true, true, true);
+ BucketClient bucketClient = new BucketClient(blobStore);
+
+ String key = "conformance-tests/blob-for-tagging-objectlock";
+ try {
+ String defaultTestData = "Tagging with object lock test data";
+ byte[] utf8BlobBytes = defaultTestData.getBytes(StandardCharsets.UTF_8);
+ Map tags = Map.of("tag1", "value1");
+
+ try (InputStream inputStream = new ByteArrayInputStream(utf8BlobBytes)) {
+ UploadRequest request =
+ new UploadRequest.Builder()
+ .withKey(key)
+ .withContentLength(utf8BlobBytes.length)
+ .withTags(tags)
+ .build();
+ bucketClient.upload(request, inputStream);
+ }
+
+ Map tagResults = bucketClient.getTags(key);
+ Assertions.assertEquals(
+ tags, tagResults, "testTagging_withObjectLock: Tags did not match what was uploaded");
+
+ Map tags2 = Map.of("tag3", "value3");
+ bucketClient.setTags(key, tags2);
+ tagResults = bucketClient.getTags(key);
+ Assertions.assertEquals(
+ tags2,
+ tagResults,
+ "testTagging_withObjectLock: Tags did not match what was overwriting");
+
+ boolean failed = false;
+ try {
+ Map tags3 = Map.of("tag5", "value5");
+ bucketClient.setTags(key + "-fake", tags3);
+ } catch (Throwable t) {
+ failed = true;
+ }
+ Assertions.assertTrue(
+ failed,
+ "testTagging_withObjectLock: Succeeded in writing tags to non-existent blob");
+ } finally {
+ safeDeleteBlobs(bucketClient, key);
+ safeDeleteBlobs(bucketClient, key + "-fake");
+ }
+ }
+
private static final String PRESIGNED_BLOB_UPLOAD_PREFIX =
"conformance-tests/presignedUploadUrls/";
private static final String PRESIGNED_BLOB_DOWNLOAD_PREFIX =
diff --git a/blob/blob-gcp/src/test/java/com/salesforce/multicloudj/blob/gcp/GcpBlobStoreIT.java b/blob/blob-gcp/src/test/java/com/salesforce/multicloudj/blob/gcp/GcpBlobStoreIT.java
index 2a51d48b9..ed08db4ab 100644
--- a/blob/blob-gcp/src/test/java/com/salesforce/multicloudj/blob/gcp/GcpBlobStoreIT.java
+++ b/blob/blob-gcp/src/test/java/com/salesforce/multicloudj/blob/gcp/GcpBlobStoreIT.java
@@ -62,6 +62,11 @@ public AbstractBlobStore createBlobStore(
}
}
+ @Override
+ public boolean isObjectLockSupported() {
+ return true;
+ }
+
private AbstractBlobStore createBlobStore(
final String bucketName, final Credentials credentials) {
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-delete-0.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-delete-0.json
new file mode 100644
index 000000000..190ee5b65
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-delete-0.json
@@ -0,0 +1,25 @@
+{
+ "id" : "61de1d30-9841-4e7d-9f00-89022cb04d1d",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionCompliance-DELETE-0",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-compliance",
+ "method" : "DELETE"
+ },
+ "response" : {
+ "status" : 204,
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "X-GUploader-UploadID" : "AGQBYWxRTAORbebksvipBSIeB-vXCZv-bVmHKUCA6z-UvlgeNfJzG1j8AQU4pXtuyC7xYLeebgY4AdQ",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:07 GMT",
+ "Content-Type" : "application/json"
+ }
+ },
+ "uuid" : "61de1d30-9841-4e7d-9f00-89022cb04d1d",
+ "persistent" : true,
+ "insertionIndex" : 945
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-1.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-1.json
new file mode 100644
index 000000000..28532e391
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-1.json
@@ -0,0 +1,25 @@
+{
+ "id" : "82653c71-b408-4b20-9622-8526ac9df671",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionCompliance-GET-1",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?maxResults=1&projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#objects\",\n \"nextPageToken\": \"Cidjb25mb3JtYW5jZS10ZXN0cy9vYmplY3Rsb2NrL2xlZ2FsLWhvbGQ=\",\n \"items\": [\n {\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/legal-hold/1770354569251017\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Flegal-hold\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Flegal-hold?generation=1770354569251017&alt=media\",\n \"name\": \"conformance-tests/objectlock/legal-hold\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1770354569251017\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"27\",\n \"md5Hash\": \"TRQZ8WSU+pMmjJZKRHoHBw==\",\n \"crc32c\": \"8r/jMg==\",\n \"etag\": \"CMmR6NmMxJIDEAE=\",\n \"temporaryHold\": true,\n \"timeCreated\": \"2026-02-06T05:09:29.301Z\",\n \"updated\": \"2026-02-06T05:09:29.301Z\",\n \"timeStorageClassUpdated\": \"2026-02-06T05:09:29.301Z\",\n \"timeFinalized\": \"2026-02-06T05:09:29.301Z\"\n }\n ]\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "X-GUploader-UploadID" : "AGQBYWwdD-fn9Vm9D0kBYIozJluM_3fZGr_1yZrzwzVjyEaCRGXxi6UHU6USA1k9ZiVDalbx23qEHcE",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:06 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:06 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "82653c71-b408-4b20-9622-8526ac9df671",
+ "persistent" : true,
+ "insertionIndex" : 946
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-2.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-2.json
new file mode 100644
index 000000000..b56df7e6c
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-2.json
@@ -0,0 +1,28 @@
+{
+ "id" : "80a9fc34-9fa7-4f3e-a420-2b9f3017cd49",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionCompliance-GET-2",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-compliance?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/retention-compliance/1773239466514044\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-compliance\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-compliance?generation=1773239466514044&alt=media\",\n \"name\": \"conformance-tests/objectlock/retention-compliance\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239466514044\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"37\",\n \"md5Hash\": \"oNJGr8D4uvHn3WAsgO/ZZw==\",\n \"crc32c\": \"4z8aNg==\",\n \"etag\": \"CPysg+SHmJMDEAE=\",\n \"temporaryHold\": false,\n \"retentionExpirationTime\": \"2026-03-11T15:47:25.512Z\",\n \"retention\": {\n \"retainUntilTime\": \"2026-03-11T15:47:25.512Z\",\n \"mode\": \"Locked\"\n },\n \"timeCreated\": \"2026-03-11T14:31:06.572Z\",\n \"updated\": \"2026-03-11T14:31:06.572Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:06.572Z\",\n \"timeFinalized\": \"2026-03-11T14:31:06.572Z\"\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "ETag" : "CPysg+SHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWxAX62fCh6CRjKHqYdZH4jnQQ9vP6WMLC09_gCriqDd9-FyBPwVNxJ_PGoCfK8mQGlOM61hbU8",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:06 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:06 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "80a9fc34-9fa7-4f3e-a420-2b9f3017cd49",
+ "persistent" : true,
+ "scenarioName" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-retention-compliance",
+ "requiredScenarioState" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-retention-compliance-2",
+ "insertionIndex" : 947
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-3.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-3.json
new file mode 100644
index 000000000..d70fd95ca
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-get-3.json
@@ -0,0 +1,29 @@
+{
+ "id" : "f4f9f982-0ef5-4393-9c07-e42e114082c6",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionCompliance-GET-3",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-compliance?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/retention-compliance/1773239466514044\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-compliance\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-compliance?generation=1773239466514044&alt=media\",\n \"name\": \"conformance-tests/objectlock/retention-compliance\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239466514044\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"37\",\n \"md5Hash\": \"oNJGr8D4uvHn3WAsgO/ZZw==\",\n \"crc32c\": \"4z8aNg==\",\n \"etag\": \"CPysg+SHmJMDEAE=\",\n \"temporaryHold\": false,\n \"retentionExpirationTime\": \"2026-03-11T15:47:25.512Z\",\n \"retention\": {\n \"retainUntilTime\": \"2026-03-11T15:47:25.512Z\",\n \"mode\": \"Locked\"\n },\n \"timeCreated\": \"2026-03-11T14:31:06.572Z\",\n \"updated\": \"2026-03-11T14:31:06.572Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:06.572Z\",\n \"timeFinalized\": \"2026-03-11T14:31:06.572Z\"\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "ETag" : "CPysg+SHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWw4WAMPvQ5Rrp5XOurVFp6PVI9SCcumn7jfEeroMj-PaPbEXw4uQ782st_apJ85h41uUTVmT1E",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:06 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:06 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "f4f9f982-0ef5-4393-9c07-e42e114082c6",
+ "persistent" : true,
+ "scenarioName" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-retention-compliance",
+ "requiredScenarioState" : "Started",
+ "newScenarioState" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-retention-compliance-2",
+ "insertionIndex" : 948
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-post-5.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-post-5.json
new file mode 100644
index 000000000..ad1ea61a3
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-post-5.json
@@ -0,0 +1,31 @@
+{
+ "id" : "74e8fd52-aaaa-4d3d-8eca-996437c3946c",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionCompliance-POST-5",
+ "request" : {
+ "url" : "/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/objectlock/retention-compliance&uploadType=resumable",
+ "method" : "POST",
+ "bodyPatterns" : [ {
+ "equalToJson" : "{\"bucket\":\"substrate-sdk-gcp-poc1-test-bucket-versioned\",\"metadata\":{},\"name\":\"conformance-tests/objectlock/retention-compliance\",\"retention\":{\"mode\":\"Locked\",\"retainUntilTime\":\"2026-03-11T15:47:25.512Z\"},\"temporaryHold\":false}",
+ "ignoreArrayOrder" : true,
+ "ignoreExtraElements" : false
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "X-GUploader-UploadID" : "AGQBYWwAjZLULyOwV-0g_cf-_CuMqR2r41aLGOPXumHkNXj6IY7L5Wi3hAMTJeEVh42nWU9DlWzVGJuaOLlsgGc-LKkEzswgD0fi_Z_jzFK1LA",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:06 GMT",
+ "Location" : "https://storage.googleapis.com/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/objectlock/retention-compliance&uploadType=resumable&upload_id=AGQBYWwAjZLULyOwV-0g_cf-_CuMqR2r41aLGOPXumHkNXj6IY7L5Wi3hAMTJeEVh42nWU9DlWzVGJuaOLlsgGc-LKkEzswgD0fi_Z_jzFK1LA",
+ "Content-Type" : "text/plain; charset=utf-8"
+ }
+ },
+ "uuid" : "74e8fd52-aaaa-4d3d-8eca-996437c3946c",
+ "persistent" : true,
+ "insertionIndex" : 950
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-put-4.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-put-4.json
new file mode 100644
index 000000000..ff767bbef
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentioncompliance-put-4.json
@@ -0,0 +1,31 @@
+{
+ "id" : "4f654544-94e5-432f-a4ac-2c539c5ad997",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionCompliance-PUT-4",
+ "request" : {
+ "url" : "/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/objectlock/retention-compliance&uploadType=resumable&upload_id=AGQBYWwAjZLULyOwV-0g_cf-_CuMqR2r41aLGOPXumHkNXj6IY7L5Wi3hAMTJeEVh42nWU9DlWzVGJuaOLlsgGc-LKkEzswgD0fi_Z_jzFK1LA",
+ "method" : "PUT",
+ "bodyPatterns" : [ {
+ "equalTo" : "Object lock retention compliance test",
+ "caseInsensitive" : false
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/retention-compliance/1773239466514044\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-compliance\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-compliance?generation=1773239466514044&alt=media\",\n \"name\": \"conformance-tests/objectlock/retention-compliance\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239466514044\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"37\",\n \"md5Hash\": \"oNJGr8D4uvHn3WAsgO/ZZw==\",\n \"crc32c\": \"4z8aNg==\",\n \"etag\": \"CPysg+SHmJMDEAE=\",\n \"temporaryHold\": false,\n \"retentionExpirationTime\": \"2026-03-11T15:47:25.512Z\",\n \"retention\": {\n \"retainUntilTime\": \"2026-03-11T15:47:25.512Z\",\n \"mode\": \"Locked\"\n },\n \"timeCreated\": \"2026-03-11T14:31:06.572Z\",\n \"updated\": \"2026-03-11T14:31:06.572Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:06.572Z\",\n \"timeFinalized\": \"2026-03-11T14:31:06.572Z\"\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "ETag" : "CPysg+SHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWwAjZLULyOwV-0g_cf-_CuMqR2r41aLGOPXumHkNXj6IY7L5Wi3hAMTJeEVh42nWU9DlWzVGJuaOLlsgGc-LKkEzswgD0fi_Z_jzFK1LA",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:06 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "4f654544-94e5-432f-a4ac-2c539c5ad997",
+ "persistent" : true,
+ "insertionIndex" : 949
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-delete-0.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-delete-0.json
new file mode 100644
index 000000000..8d07511be
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-delete-0.json
@@ -0,0 +1,25 @@
+{
+ "id" : "61003eb9-d91c-441c-91df-2ded91ae6d49",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionGovernance-DELETE-0",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-governance",
+ "method" : "DELETE"
+ },
+ "response" : {
+ "status" : 204,
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "X-GUploader-UploadID" : "AGQBYWxkNlb7V7zGXbJopz2ediP3El2WzuIJv3u8BF8HF5s9QqNeM_yVKWhAIDqsLuP8AR2CJzRcf1k",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:08 GMT",
+ "Content-Type" : "application/json"
+ }
+ },
+ "uuid" : "61003eb9-d91c-441c-91df-2ded91ae6d49",
+ "persistent" : true,
+ "insertionIndex" : 952
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-1.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-1.json
new file mode 100644
index 000000000..17a3f1a4a
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-1.json
@@ -0,0 +1,25 @@
+{
+ "id" : "211a9575-30e1-4567-b038-6dce1b7e9e37",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionGovernance-GET-1",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?maxResults=1&projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#objects\",\n \"nextPageToken\": \"Cidjb25mb3JtYW5jZS10ZXN0cy9vYmplY3Rsb2NrL2xlZ2FsLWhvbGQ=\",\n \"items\": [\n {\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/legal-hold/1770354569251017\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Flegal-hold\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Flegal-hold?generation=1770354569251017&alt=media\",\n \"name\": \"conformance-tests/objectlock/legal-hold\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1770354569251017\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"27\",\n \"md5Hash\": \"TRQZ8WSU+pMmjJZKRHoHBw==\",\n \"crc32c\": \"8r/jMg==\",\n \"etag\": \"CMmR6NmMxJIDEAE=\",\n \"temporaryHold\": true,\n \"timeCreated\": \"2026-02-06T05:09:29.301Z\",\n \"updated\": \"2026-02-06T05:09:29.301Z\",\n \"timeStorageClassUpdated\": \"2026-02-06T05:09:29.301Z\",\n \"timeFinalized\": \"2026-02-06T05:09:29.301Z\"\n }\n ]\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "X-GUploader-UploadID" : "AGQBYWzLXc3tAj2BhjeMkaMNqA1Xiwd3du8G_Rc2f0hDnzEtFGgvWuxPfP059If7TEjJJBB_HH4HW4Q",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:08 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:08 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "211a9575-30e1-4567-b038-6dce1b7e9e37",
+ "persistent" : true,
+ "insertionIndex" : 953
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-2.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-2.json
new file mode 100644
index 000000000..0e53f8876
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-2.json
@@ -0,0 +1,28 @@
+{
+ "id" : "432f044d-8453-4227-8c76-64788543de8f",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionGovernance-GET-2",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-governance?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/retention-governance/1773239467736800\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-governance\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-governance?generation=1773239467736800&alt=media\",\n \"name\": \"conformance-tests/objectlock/retention-governance\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239467736800\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"37\",\n \"md5Hash\": \"fnzudKkVoyLvbHXDqwNNTw==\",\n \"crc32c\": \"s67YvA==\",\n \"etag\": \"COD9zeSHmJMDEAE=\",\n \"temporaryHold\": false,\n \"retentionExpirationTime\": \"2026-03-11T15:47:28.252Z\",\n \"retention\": {\n \"retainUntilTime\": \"2026-03-11T15:47:28.252Z\",\n \"mode\": \"Unlocked\"\n },\n \"timeCreated\": \"2026-03-11T14:31:07.797Z\",\n \"updated\": \"2026-03-11T14:31:07.797Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:07.797Z\",\n \"timeFinalized\": \"2026-03-11T14:31:07.797Z\"\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "ETag" : "COD9zeSHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWxm2OeQHbShR94DUfOQxI95d56kOs8kHD8BX8esXc4MOqZ28_3UHGpW6XtABJMWOO_j9RMRhp8",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:08 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:08 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "432f044d-8453-4227-8c76-64788543de8f",
+ "persistent" : true,
+ "scenarioName" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-retention-governance",
+ "requiredScenarioState" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-retention-governance-2",
+ "insertionIndex" : 954
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-3.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-3.json
new file mode 100644
index 000000000..8a64572b4
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-get-3.json
@@ -0,0 +1,29 @@
+{
+ "id" : "0e502160-f7ea-422a-9b57-8d95b530ad52",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionGovernance-GET-3",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-governance?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/retention-governance/1773239467736800\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-governance\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-governance?generation=1773239467736800&alt=media\",\n \"name\": \"conformance-tests/objectlock/retention-governance\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239467736800\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"37\",\n \"md5Hash\": \"fnzudKkVoyLvbHXDqwNNTw==\",\n \"crc32c\": \"s67YvA==\",\n \"etag\": \"COD9zeSHmJMDEAE=\",\n \"temporaryHold\": false,\n \"retentionExpirationTime\": \"2026-03-11T15:47:28.252Z\",\n \"retention\": {\n \"retainUntilTime\": \"2026-03-11T15:47:28.252Z\",\n \"mode\": \"Unlocked\"\n },\n \"timeCreated\": \"2026-03-11T14:31:07.797Z\",\n \"updated\": \"2026-03-11T14:31:07.797Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:07.797Z\",\n \"timeFinalized\": \"2026-03-11T14:31:07.797Z\"\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "ETag" : "COD9zeSHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWxNMOC31iy0PwQdbbLr0x24GU3RUOOnu6wcBOfle83zxeyFMrj_LyNQrSUBexwupYZOU5ENSrE",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:07 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:07 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "0e502160-f7ea-422a-9b57-8d95b530ad52",
+ "persistent" : true,
+ "scenarioName" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-retention-governance",
+ "requiredScenarioState" : "Started",
+ "newScenarioState" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-retention-governance-2",
+ "insertionIndex" : 955
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-post-5.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-post-5.json
new file mode 100644
index 000000000..f60c2dd26
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-post-5.json
@@ -0,0 +1,31 @@
+{
+ "id" : "26be7339-affc-4120-b52b-f2b03e6201a7",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionGovernance-POST-5",
+ "request" : {
+ "url" : "/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/objectlock/retention-governance&uploadType=resumable",
+ "method" : "POST",
+ "bodyPatterns" : [ {
+ "equalToJson" : "{\"bucket\":\"substrate-sdk-gcp-poc1-test-bucket-versioned\",\"metadata\":{},\"name\":\"conformance-tests/objectlock/retention-governance\",\"retention\":{\"mode\":\"Unlocked\",\"retainUntilTime\":\"2026-03-11T15:47:28.252Z\"},\"temporaryHold\":false}",
+ "ignoreArrayOrder" : true,
+ "ignoreExtraElements" : false
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "X-GUploader-UploadID" : "AGQBYWz8hWvSMQ5LcXi_hGGV2pxjsdg8PmC5qpQzgyBZN3kT0XxCOuKuK9z4z_3-dW6T_btB-cNTMMw5IWjVJd3kA1MI4wWHYbUbNPU8vK6Etw",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:07 GMT",
+ "Location" : "https://storage.googleapis.com/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/objectlock/retention-governance&uploadType=resumable&upload_id=AGQBYWz8hWvSMQ5LcXi_hGGV2pxjsdg8PmC5qpQzgyBZN3kT0XxCOuKuK9z4z_3-dW6T_btB-cNTMMw5IWjVJd3kA1MI4wWHYbUbNPU8vK6Etw",
+ "Content-Type" : "text/plain; charset=utf-8"
+ }
+ },
+ "uuid" : "26be7339-affc-4120-b52b-f2b03e6201a7",
+ "persistent" : true,
+ "insertionIndex" : 957
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-put-4.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-put-4.json
new file mode 100644
index 000000000..9c93da13c
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_afteruploadwithretentiongovernance-put-4.json
@@ -0,0 +1,31 @@
+{
+ "id" : "fff4ed6e-6cf8-416d-a012-00408cc9e735",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_afterUploadWithRetentionGovernance-PUT-4",
+ "request" : {
+ "url" : "/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/objectlock/retention-governance&uploadType=resumable&upload_id=AGQBYWz8hWvSMQ5LcXi_hGGV2pxjsdg8PmC5qpQzgyBZN3kT0XxCOuKuK9z4z_3-dW6T_btB-cNTMMw5IWjVJd3kA1MI4wWHYbUbNPU8vK6Etw",
+ "method" : "PUT",
+ "bodyPatterns" : [ {
+ "equalTo" : "Object lock retention governance test",
+ "caseInsensitive" : false
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/retention-governance/1773239467736800\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-governance\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fretention-governance?generation=1773239467736800&alt=media\",\n \"name\": \"conformance-tests/objectlock/retention-governance\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239467736800\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"37\",\n \"md5Hash\": \"fnzudKkVoyLvbHXDqwNNTw==\",\n \"crc32c\": \"s67YvA==\",\n \"etag\": \"COD9zeSHmJMDEAE=\",\n \"temporaryHold\": false,\n \"retentionExpirationTime\": \"2026-03-11T15:47:28.252Z\",\n \"retention\": {\n \"retainUntilTime\": \"2026-03-11T15:47:28.252Z\",\n \"mode\": \"Unlocked\"\n },\n \"timeCreated\": \"2026-03-11T14:31:07.797Z\",\n \"updated\": \"2026-03-11T14:31:07.797Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:07.797Z\",\n \"timeFinalized\": \"2026-03-11T14:31:07.797Z\"\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "ETag" : "COD9zeSHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWz8hWvSMQ5LcXi_hGGV2pxjsdg8PmC5qpQzgyBZN3kT0XxCOuKuK9z4z_3-dW6T_btB-cNTMMw5IWjVJd3kA1MI4wWHYbUbNPU8vK6Etw",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:07 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "fff4ed6e-6cf8-416d-a012-00408cc9e735",
+ "persistent" : true,
+ "insertionIndex" : 956
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_nonexistentkey_throws-get-0.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_nonexistentkey_throws-get-0.json
new file mode 100644
index 000000000..99b047c23
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_nonexistentkey_throws-get-0.json
@@ -0,0 +1,26 @@
+{
+ "id" : "2726eddd-0023-446f-b2a9-84205a1e3ffc",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_nonexistentKey_throws-GET-0",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fnonexistent?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 404,
+ "body" : "{\n \"error\": {\n \"code\": 404,\n \"message\": \"No such object: substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/nonexistent\",\n \"errors\": [\n {\n \"message\": \"No such object: substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/nonexistent\",\n \"domain\": \"global\",\n \"reason\": \"notFound\"\n }\n ]\n }\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "X-GUploader-UploadID" : "AGQBYWzWa7XPpYEZZGBB6o8h9MswPeFH4VAK1ddxXDGFNJwffo-9OEu6RbsQ2gkNCVmK6xedBxf3i24",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:05 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "2726eddd-0023-446f-b2a9-84205a1e3ffc",
+ "persistent" : true,
+ "insertionIndex" : 943
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-delete-0.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-delete-0.json
new file mode 100644
index 000000000..a1d697db8
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-delete-0.json
@@ -0,0 +1,25 @@
+{
+ "id" : "d8d8d686-b5d1-406d-a0ed-9e144b2acda3",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_objectWithoutLock_returnsNullOrNoRetention-DELETE-0",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fno-lock",
+ "method" : "DELETE"
+ },
+ "response" : {
+ "status" : 204,
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "X-GUploader-UploadID" : "AGQBYWyUytG_bmME1CZ9Csm2_TwNtUnnn6ywrs5g1HXMVK1t9oIRsEy3_TpyKvAF5DwTyQyRMix7IV0",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:05 GMT",
+ "Content-Type" : "application/json"
+ }
+ },
+ "uuid" : "d8d8d686-b5d1-406d-a0ed-9e144b2acda3",
+ "persistent" : true,
+ "insertionIndex" : 936
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-1.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-1.json
new file mode 100644
index 000000000..e405e4399
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-1.json
@@ -0,0 +1,25 @@
+{
+ "id" : "301cda49-79e6-4dce-800e-413e6d042045",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_objectWithoutLock_returnsNullOrNoRetention-GET-1",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?maxResults=1&projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#objects\",\n \"nextPageToken\": \"Cidjb25mb3JtYW5jZS10ZXN0cy9vYmplY3Rsb2NrL2xlZ2FsLWhvbGQ=\",\n \"items\": [\n {\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/legal-hold/1770354569251017\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Flegal-hold\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Flegal-hold?generation=1770354569251017&alt=media\",\n \"name\": \"conformance-tests/objectlock/legal-hold\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1770354569251017\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"27\",\n \"md5Hash\": \"TRQZ8WSU+pMmjJZKRHoHBw==\",\n \"crc32c\": \"8r/jMg==\",\n \"etag\": \"CMmR6NmMxJIDEAE=\",\n \"temporaryHold\": true,\n \"timeCreated\": \"2026-02-06T05:09:29.301Z\",\n \"updated\": \"2026-02-06T05:09:29.301Z\",\n \"timeStorageClassUpdated\": \"2026-02-06T05:09:29.301Z\",\n \"timeFinalized\": \"2026-02-06T05:09:29.301Z\"\n }\n ]\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "X-GUploader-UploadID" : "AGQBYWz97a2GzSfJ4FX1WPxINs-FWMlGFG90RSV4-di4KoXWn61q1n10VSXEeL8wy0UlZuB15lwvMCw",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:05 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:05 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "301cda49-79e6-4dce-800e-413e6d042045",
+ "persistent" : true,
+ "insertionIndex" : 937
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-2.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-2.json
new file mode 100644
index 000000000..fb3c83b01
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-2.json
@@ -0,0 +1,28 @@
+{
+ "id" : "5f23e662-c128-4480-8784-3d238c4a9134",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_objectWithoutLock_returnsNullOrNoRetention-GET-2",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fno-lock?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/no-lock/1773239464845229\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fno-lock\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fno-lock?generation=1773239464845229&alt=media\",\n \"name\": \"conformance-tests/objectlock/no-lock\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239464845229\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"24\",\n \"md5Hash\": \"/dLDmP1tAJxHTx+aAtOOxQ==\",\n \"crc32c\": \"sPg8aA==\",\n \"etag\": \"CK2/neOHmJMDEAE=\",\n \"timeCreated\": \"2026-03-11T14:31:04.906Z\",\n \"updated\": \"2026-03-11T14:31:04.906Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:04.906Z\",\n \"timeFinalized\": \"2026-03-11T14:31:04.906Z\"\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "ETag" : "CK2/neOHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWymow9TdzCpaJS2V2AP4xqOSS2k_vpXd0JQ7fSvCdSJn9w_OhbVT7r3hJD5wOjh2gTCEPXEcXU",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:05 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:05 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "5f23e662-c128-4480-8784-3d238c4a9134",
+ "persistent" : true,
+ "scenarioName" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-no-lock",
+ "requiredScenarioState" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-no-lock-2",
+ "insertionIndex" : 938
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-3.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-3.json
new file mode 100644
index 000000000..e3b7d69a5
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-get-3.json
@@ -0,0 +1,29 @@
+{
+ "id" : "28e01eb3-1093-44a1-ae6c-741e4bae3cbe",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_objectWithoutLock_returnsNullOrNoRetention-GET-3",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fno-lock?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/no-lock/1773239464845229\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fno-lock\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fno-lock?generation=1773239464845229&alt=media\",\n \"name\": \"conformance-tests/objectlock/no-lock\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239464845229\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"24\",\n \"md5Hash\": \"/dLDmP1tAJxHTx+aAtOOxQ==\",\n \"crc32c\": \"sPg8aA==\",\n \"etag\": \"CK2/neOHmJMDEAE=\",\n \"timeCreated\": \"2026-03-11T14:31:04.906Z\",\n \"updated\": \"2026-03-11T14:31:04.906Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:04.906Z\",\n \"timeFinalized\": \"2026-03-11T14:31:04.906Z\"\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "ETag" : "CK2/neOHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWxtJh25_GeNrUBzv4Jbz4N-fqEDo9Dijl2vwSeMS1YkDsI7NEdUtJrd_o3hQnp-57nh-7VHRts",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:05 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:05 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "28e01eb3-1093-44a1-ae6c-741e4bae3cbe",
+ "persistent" : true,
+ "scenarioName" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-no-lock",
+ "requiredScenarioState" : "Started",
+ "newScenarioState" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-objectlock-no-lock-2",
+ "insertionIndex" : 939
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-post-5.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-post-5.json
new file mode 100644
index 000000000..768ca61e9
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-post-5.json
@@ -0,0 +1,31 @@
+{
+ "id" : "7f45a062-de72-4f13-873c-c0319c9a4747",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_objectWithoutLock_returnsNullOrNoRetention-POST-5",
+ "request" : {
+ "url" : "/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/objectlock/no-lock&uploadType=resumable",
+ "method" : "POST",
+ "bodyPatterns" : [ {
+ "equalToJson" : "{\"bucket\":\"substrate-sdk-gcp-poc1-test-bucket-versioned\",\"metadata\":{},\"name\":\"conformance-tests/objectlock/no-lock\"}",
+ "ignoreArrayOrder" : true,
+ "ignoreExtraElements" : false
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "X-GUploader-UploadID" : "AGQBYWyU0Ktta7MjjrnEfqB3L1-DSBxcPxOCVJToxYjLcD_4ivrIPq5C0it_7S2IvqNGzltAWSYbvr0HfZ1MMx4fhvdQ0WsXab5VWW_MAhjqy8w",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:04 GMT",
+ "Location" : "https://storage.googleapis.com/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/objectlock/no-lock&uploadType=resumable&upload_id=AGQBYWyU0Ktta7MjjrnEfqB3L1-DSBxcPxOCVJToxYjLcD_4ivrIPq5C0it_7S2IvqNGzltAWSYbvr0HfZ1MMx4fhvdQ0WsXab5VWW_MAhjqy8w",
+ "Content-Type" : "text/plain; charset=utf-8"
+ }
+ },
+ "uuid" : "7f45a062-de72-4f13-873c-c0319c9a4747",
+ "persistent" : true,
+ "insertionIndex" : 941
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-put-4.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-put-4.json
new file mode 100644
index 000000000..412f742c8
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testgetobjectlock_objectwithoutlock_returnsnullornoretention-put-4.json
@@ -0,0 +1,31 @@
+{
+ "id" : "7691cd39-5a85-4a55-b2ad-62827dcc4488",
+ "name" : "GcpBlobStoreIT_testGetObjectLock_objectWithoutLock_returnsNullOrNoRetention-PUT-4",
+ "request" : {
+ "url" : "/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/objectlock/no-lock&uploadType=resumable&upload_id=AGQBYWyU0Ktta7MjjrnEfqB3L1-DSBxcPxOCVJToxYjLcD_4ivrIPq5C0it_7S2IvqNGzltAWSYbvr0HfZ1MMx4fhvdQ0WsXab5VWW_MAhjqy8w",
+ "method" : "PUT",
+ "bodyPatterns" : [ {
+ "equalTo" : "Object without lock test",
+ "caseInsensitive" : false
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/no-lock/1773239464845229\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fno-lock\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Fno-lock?generation=1773239464845229&alt=media\",\n \"name\": \"conformance-tests/objectlock/no-lock\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239464845229\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"24\",\n \"md5Hash\": \"/dLDmP1tAJxHTx+aAtOOxQ==\",\n \"crc32c\": \"sPg8aA==\",\n \"etag\": \"CK2/neOHmJMDEAE=\",\n \"timeCreated\": \"2026-03-11T14:31:04.906Z\",\n \"updated\": \"2026-03-11T14:31:04.906Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:04.906Z\",\n \"timeFinalized\": \"2026-03-11T14:31:04.906Z\"\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "ETag" : "CK2/neOHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWyU0Ktta7MjjrnEfqB3L1-DSBxcPxOCVJToxYjLcD_4ivrIPq5C0it_7S2IvqNGzltAWSYbvr0HfZ1MMx4fhvdQ0WsXab5VWW_MAhjqy8w",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:04 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "7691cd39-5a85-4a55-b2ad-62827dcc4488",
+ "persistent" : true,
+ "insertionIndex" : 940
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-delete-0.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-delete-0.json
new file mode 100644
index 000000000..21bba296a
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-delete-0.json
@@ -0,0 +1,26 @@
+{
+ "id" : "655d37ed-6ecd-4a63-8201-83de07aed494",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-DELETE-0",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock-fake",
+ "method" : "DELETE"
+ },
+ "response" : {
+ "status" : 404,
+ "body" : "{\n \"error\": {\n \"code\": 404,\n \"message\": \"No such object: substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/blob-for-tagging-objectlock-fake\",\n \"errors\": [\n {\n \"message\": \"No such object: substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/blob-for-tagging-objectlock-fake\",\n \"domain\": \"global\",\n \"reason\": \"notFound\"\n }\n ]\n }\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "X-GUploader-UploadID" : "AGQBYWyfQsXXutf1tSEvoGCZERcX0wnn02RlTUhnCHbnjDa-c122nV0DThamytGEVrccAFDFpZde6MA",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:04 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "655d37ed-6ecd-4a63-8201-83de07aed494",
+ "persistent" : true,
+ "insertionIndex" : 923
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-delete-2.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-delete-2.json
new file mode 100644
index 000000000..45238a219
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-delete-2.json
@@ -0,0 +1,25 @@
+{
+ "id" : "81608e55-f791-45b5-bd65-773183225077",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-DELETE-2",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock",
+ "method" : "DELETE"
+ },
+ "response" : {
+ "status" : 204,
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "X-GUploader-UploadID" : "AGQBYWxMRnSea3zjsE4AegAKcklBBJ2yIJ-G5ZUgz6NTXpoWN5CktjfYA_FHJ7glU5x8MYeoQkRu4Ks",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:03 GMT",
+ "Content-Type" : "application/json"
+ }
+ },
+ "uuid" : "81608e55-f791-45b5-bd65-773183225077",
+ "persistent" : true,
+ "insertionIndex" : 925
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-1.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-1.json
new file mode 100644
index 000000000..30580a32e
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-1.json
@@ -0,0 +1,27 @@
+{
+ "id" : "be81b8d7-6b2e-4420-b2a0-b2cc62a5fc3a",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-GET-1",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?maxResults=1&projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#objects\",\n \"items\": [\n {\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/objectlock/legal-hold/1770354569251017\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Flegal-hold\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fobjectlock%2Flegal-hold?generation=1770354569251017&alt=media\",\n \"name\": \"conformance-tests/objectlock/legal-hold\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1770354569251017\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"27\",\n \"md5Hash\": \"TRQZ8WSU+pMmjJZKRHoHBw==\",\n \"crc32c\": \"8r/jMg==\",\n \"etag\": \"CMmR6NmMxJIDEAE=\",\n \"temporaryHold\": true,\n \"timeCreated\": \"2026-02-06T05:09:29.301Z\",\n \"updated\": \"2026-02-06T05:09:29.301Z\",\n \"timeStorageClassUpdated\": \"2026-02-06T05:09:29.301Z\",\n \"timeFinalized\": \"2026-02-06T05:09:29.301Z\"\n }\n ]\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "X-GUploader-UploadID" : "AGQBYWwh5Kpj6aB2YGPnBq91ha3FCjq7TmZkD84gv1S5X24N-IWlcZleeuq6iSpYcTnjfWhzD5d3kxo",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:04 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:04 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "be81b8d7-6b2e-4420-b2a0-b2cc62a5fc3a",
+ "persistent" : true,
+ "scenarioName" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o",
+ "requiredScenarioState" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-2",
+ "insertionIndex" : 924
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-3.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-3.json
new file mode 100644
index 000000000..894f7ff51
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-3.json
@@ -0,0 +1,28 @@
+{
+ "id" : "967882ce-1526-4751-a68e-6b2bf4c4b488",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-GET-3",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?maxResults=1&projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#objects\",\n \"nextPageToken\": \"Ci1jb25mb3JtYW5jZS10ZXN0cy9ibG9iLWZvci10YWdnaW5nLW9iamVjdGxvY2s=\",\n \"items\": [\n {\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/blob-for-tagging-objectlock/1773239462550974\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?generation=1773239462550974&alt=media\",\n \"name\": \"conformance-tests/blob-for-tagging-objectlock\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239462550974\",\n \"metageneration\": \"2\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"34\",\n \"md5Hash\": \"fhoYDt3ji+s3dJJLcNy/xw==\",\n \"crc32c\": \"Np37Cg==\",\n \"etag\": \"CL67keKHmJMDEAI=\",\n \"timeCreated\": \"2026-03-11T14:31:02.615Z\",\n \"updated\": \"2026-03-11T14:31:03.240Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:02.615Z\",\n \"timeFinalized\": \"2026-03-11T14:31:02.615Z\",\n \"metadata\": {\n \"gcp-tag-tag3\": \"value3\"\n }\n }\n ]\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "X-GUploader-UploadID" : "AGQBYWzXDnX4IVr_h6kMTBBmdBN26VOapFuD8XpnSx5AExMq8zZJ3qSb4K62kEyis042gylU8z2ZN64",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:03 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:03 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "967882ce-1526-4751-a68e-6b2bf4c4b488",
+ "persistent" : true,
+ "scenarioName" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o",
+ "requiredScenarioState" : "Started",
+ "newScenarioState" : "scenario-1-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-2",
+ "insertionIndex" : 926
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-4.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-4.json
new file mode 100644
index 000000000..90a3b20be
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-4.json
@@ -0,0 +1,26 @@
+{
+ "id" : "933ea7bf-8b6a-41f5-905e-d5d8ebcde60d",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-GET-4",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock-fake?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 404,
+ "body" : "{\n \"error\": {\n \"code\": 404,\n \"message\": \"No such object: substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/blob-for-tagging-objectlock-fake\",\n \"errors\": [\n {\n \"message\": \"No such object: substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/blob-for-tagging-objectlock-fake\",\n \"domain\": \"global\",\n \"reason\": \"notFound\"\n }\n ]\n }\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "X-GUploader-UploadID" : "AGQBYWyq6NWbvK3yUQmWAmlhBnUe7mvcmGS1QUzPw_csjztMaYcdN4hywZ5y8sMdixpOpkP96jGENr8",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:03 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "933ea7bf-8b6a-41f5-905e-d5d8ebcde60d",
+ "persistent" : true,
+ "insertionIndex" : 927
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-5.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-5.json
new file mode 100644
index 000000000..1f4bf4659
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-5.json
@@ -0,0 +1,28 @@
+{
+ "id" : "9fe3ec3e-3233-40e8-a488-9efd79979d4e",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-GET-5",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/blob-for-tagging-objectlock/1773239462550974\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?generation=1773239462550974&alt=media\",\n \"name\": \"conformance-tests/blob-for-tagging-objectlock\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239462550974\",\n \"metageneration\": \"2\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"34\",\n \"md5Hash\": \"fhoYDt3ji+s3dJJLcNy/xw==\",\n \"crc32c\": \"Np37Cg==\",\n \"etag\": \"CL67keKHmJMDEAI=\",\n \"timeCreated\": \"2026-03-11T14:31:02.615Z\",\n \"updated\": \"2026-03-11T14:31:03.240Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:02.615Z\",\n \"timeFinalized\": \"2026-03-11T14:31:02.615Z\",\n \"metadata\": {\n \"gcp-tag-tag3\": \"value3\"\n }\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "ETag" : "CL67keKHmJMDEAI=",
+ "X-GUploader-UploadID" : "AGQBYWwiDEpXy5niMm7v_Th-aFqSNvh1WwteFOJXGV1kaVE2bQy-3-VphKs1qpBtZTvy0yjT-ii0A7c",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:03 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:03 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "9fe3ec3e-3233-40e8-a488-9efd79979d4e",
+ "persistent" : true,
+ "scenarioName" : "scenario-2-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-blob-for-tagging-objectlock",
+ "requiredScenarioState" : "scenario-2-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-blob-for-tagging-objectlock-4",
+ "insertionIndex" : 928
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-7.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-7.json
new file mode 100644
index 000000000..482f446a4
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-7.json
@@ -0,0 +1,29 @@
+{
+ "id" : "3adcd5a7-4d5a-46d6-9064-35db2c55e216",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-GET-7",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/blob-for-tagging-objectlock/1773239462550974\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?generation=1773239462550974&alt=media\",\n \"name\": \"conformance-tests/blob-for-tagging-objectlock\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239462550974\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"34\",\n \"md5Hash\": \"fhoYDt3ji+s3dJJLcNy/xw==\",\n \"crc32c\": \"Np37Cg==\",\n \"etag\": \"CL67keKHmJMDEAE=\",\n \"timeCreated\": \"2026-03-11T14:31:02.615Z\",\n \"updated\": \"2026-03-11T14:31:02.615Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:02.615Z\",\n \"timeFinalized\": \"2026-03-11T14:31:02.615Z\",\n \"metadata\": {\n \"gcp-tag-tag1\": \"value1\"\n }\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "ETag" : "CL67keKHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWw0_M4JXZpQZ9IsKd2QhQtWYRMJuj1Emy4s15SQ9dsEPoTqNpAvWlw7MTiSUaw3iDx5mvxQwTc",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:02 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:02 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "3adcd5a7-4d5a-46d6-9064-35db2c55e216",
+ "persistent" : true,
+ "scenarioName" : "scenario-2-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-blob-for-tagging-objectlock",
+ "requiredScenarioState" : "scenario-2-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-blob-for-tagging-objectlock-3",
+ "newScenarioState" : "scenario-2-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-blob-for-tagging-objectlock-4",
+ "insertionIndex" : 930
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-8.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-8.json
new file mode 100644
index 000000000..834655032
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-8.json
@@ -0,0 +1,29 @@
+{
+ "id" : "eb0250d8-d41a-4d6a-9651-61c71d687d89",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-GET-8",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/blob-for-tagging-objectlock/1773239462550974\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?generation=1773239462550974&alt=media\",\n \"name\": \"conformance-tests/blob-for-tagging-objectlock\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239462550974\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"34\",\n \"md5Hash\": \"fhoYDt3ji+s3dJJLcNy/xw==\",\n \"crc32c\": \"Np37Cg==\",\n \"etag\": \"CL67keKHmJMDEAE=\",\n \"timeCreated\": \"2026-03-11T14:31:02.615Z\",\n \"updated\": \"2026-03-11T14:31:02.615Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:02.615Z\",\n \"timeFinalized\": \"2026-03-11T14:31:02.615Z\",\n \"metadata\": {\n \"gcp-tag-tag1\": \"value1\"\n }\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "ETag" : "CL67keKHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWz2x4YYhX5jXJQlhSZwe3d7EQz7r16O3pb9W8fL0Ji3NzfjZqhKirbCrzH5dQyM6pyDwuV71Rc",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:02 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:02 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "eb0250d8-d41a-4d6a-9651-61c71d687d89",
+ "persistent" : true,
+ "scenarioName" : "scenario-2-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-blob-for-tagging-objectlock",
+ "requiredScenarioState" : "scenario-2-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-blob-for-tagging-objectlock-2",
+ "newScenarioState" : "scenario-2-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-blob-for-tagging-objectlock-3",
+ "insertionIndex" : 931
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-9.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-9.json
new file mode 100644
index 000000000..a10655088
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-get-9.json
@@ -0,0 +1,29 @@
+{
+ "id" : "3077557d-d942-45ee-87c9-2e89e38c9e89",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-GET-9",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?projection=full",
+ "method" : "GET"
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/blob-for-tagging-objectlock/1773239462550974\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?generation=1773239462550974&alt=media\",\n \"name\": \"conformance-tests/blob-for-tagging-objectlock\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239462550974\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"34\",\n \"md5Hash\": \"fhoYDt3ji+s3dJJLcNy/xw==\",\n \"crc32c\": \"Np37Cg==\",\n \"etag\": \"CL67keKHmJMDEAE=\",\n \"timeCreated\": \"2026-03-11T14:31:02.615Z\",\n \"updated\": \"2026-03-11T14:31:02.615Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:02.615Z\",\n \"timeFinalized\": \"2026-03-11T14:31:02.615Z\",\n \"metadata\": {\n \"gcp-tag-tag1\": \"value1\"\n }\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "private, max-age=0, must-revalidate, no-transform",
+ "ETag" : "CL67keKHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWx_oOSVk-ZGuju5boWkZxjS2647Au-8dnMZO-FLRRvSxtSN4ZWaWNuAihD14W5aEnPH4lOgvIk",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Expires" : "Wed, 11 Mar 2026 14:31:02 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:02 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "3077557d-d942-45ee-87c9-2e89e38c9e89",
+ "persistent" : true,
+ "scenarioName" : "scenario-2-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-blob-for-tagging-objectlock",
+ "requiredScenarioState" : "Started",
+ "newScenarioState" : "scenario-2-storage-v1-b-substrate-sdk-gcp-poc1-test-bucket-versioned-o-conformance-tests-blob-for-tagging-objectlock-2",
+ "insertionIndex" : 932
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-post-11.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-post-11.json
new file mode 100644
index 000000000..cf79bec17
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-post-11.json
@@ -0,0 +1,31 @@
+{
+ "id" : "4ca2a251-4d9d-4175-b8e1-a54e4033ce00",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-POST-11",
+ "request" : {
+ "url" : "/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/blob-for-tagging-objectlock&uploadType=resumable",
+ "method" : "POST",
+ "bodyPatterns" : [ {
+ "equalToJson" : "{\"bucket\":\"substrate-sdk-gcp-poc1-test-bucket-versioned\",\"metadata\":{\"gcp-tag-tag1\":\"value1\"},\"name\":\"conformance-tests/blob-for-tagging-objectlock\"}",
+ "ignoreArrayOrder" : true,
+ "ignoreExtraElements" : false
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "X-GUploader-UploadID" : "AGQBYWw1lAXF9ni6HjgoEgDykp3mBpA34dGwENuo7Mq5m8r1r-qk8ZZNfpi8d8CkqRAH5EoClTPndO6UF61GgQ3VQkaff1Y1J7RbhLKcL3tDg_4",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:02 GMT",
+ "Location" : "https://storage.googleapis.com/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/blob-for-tagging-objectlock&uploadType=resumable&upload_id=AGQBYWw1lAXF9ni6HjgoEgDykp3mBpA34dGwENuo7Mq5m8r1r-qk8ZZNfpi8d8CkqRAH5EoClTPndO6UF61GgQ3VQkaff1Y1J7RbhLKcL3tDg_4",
+ "Content-Type" : "text/plain; charset=utf-8"
+ }
+ },
+ "uuid" : "4ca2a251-4d9d-4175-b8e1-a54e4033ce00",
+ "persistent" : true,
+ "insertionIndex" : 934
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-post-6.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-post-6.json
new file mode 100644
index 000000000..331f0e173
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-post-6.json
@@ -0,0 +1,32 @@
+{
+ "id" : "f25fae26-6fa3-472f-8d98-bdf00a956686",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-POST-6",
+ "request" : {
+ "url" : "/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?projection=full",
+ "method" : "POST",
+ "bodyPatterns" : [ {
+ "equalToJson" : "{\"bucket\":\"substrate-sdk-gcp-poc1-test-bucket-versioned\",\"generation\":\"1773239462550974\",\"metadata\":{\"gcp-tag-tag1\":null,\"gcp-tag-tag3\":\"value3\"},\"name\":\"conformance-tests/blob-for-tagging-objectlock\"}",
+ "ignoreArrayOrder" : true,
+ "ignoreExtraElements" : false
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/blob-for-tagging-objectlock/1773239462550974\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?generation=1773239462550974&alt=media\",\n \"name\": \"conformance-tests/blob-for-tagging-objectlock\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239462550974\",\n \"metageneration\": \"2\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"34\",\n \"md5Hash\": \"fhoYDt3ji+s3dJJLcNy/xw==\",\n \"crc32c\": \"Np37Cg==\",\n \"etag\": \"CL67keKHmJMDEAI=\",\n \"timeCreated\": \"2026-03-11T14:31:02.615Z\",\n \"updated\": \"2026-03-11T14:31:03.240Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:02.615Z\",\n \"timeFinalized\": \"2026-03-11T14:31:02.615Z\",\n \"metadata\": {\n \"gcp-tag-tag3\": \"value3\"\n }\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "ETag" : "CL67keKHmJMDEAI=",
+ "X-GUploader-UploadID" : "AGQBYWyjvZkTcoCexKLoKVCE9nTgpFul3ygLre2F52Im1enYXluMtyttMoiRxbz0qGbhrjnTTmZ6lQs",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:03 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "f25fae26-6fa3-472f-8d98-bdf00a956686",
+ "persistent" : true,
+ "insertionIndex" : 929
+}
\ No newline at end of file
diff --git a/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-put-10.json b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-put-10.json
new file mode 100644
index 000000000..748c3e0f5
--- /dev/null
+++ b/blob/blob-gcp/src/test/resources/mappings/gcpblobstoreit_testtagging_withobjectlock-put-10.json
@@ -0,0 +1,31 @@
+{
+ "id" : "840e4735-6094-46bb-9f3c-4eb199d73d5e",
+ "name" : "GcpBlobStoreIT_testTagging_withObjectLock-PUT-10",
+ "request" : {
+ "url" : "/upload/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o?name=conformance-tests/blob-for-tagging-objectlock&uploadType=resumable&upload_id=AGQBYWw1lAXF9ni6HjgoEgDykp3mBpA34dGwENuo7Mq5m8r1r-qk8ZZNfpi8d8CkqRAH5EoClTPndO6UF61GgQ3VQkaff1Y1J7RbhLKcL3tDg_4",
+ "method" : "PUT",
+ "bodyPatterns" : [ {
+ "equalTo" : "Tagging with object lock test data",
+ "caseInsensitive" : false
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "body" : "{\n \"kind\": \"storage#object\",\n \"id\": \"substrate-sdk-gcp-poc1-test-bucket-versioned/conformance-tests/blob-for-tagging-objectlock/1773239462550974\",\n \"selfLink\": \"https://www.googleapis.com/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock\",\n \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/substrate-sdk-gcp-poc1-test-bucket-versioned/o/conformance-tests%2Fblob-for-tagging-objectlock?generation=1773239462550974&alt=media\",\n \"name\": \"conformance-tests/blob-for-tagging-objectlock\",\n \"bucket\": \"substrate-sdk-gcp-poc1-test-bucket-versioned\",\n \"generation\": \"1773239462550974\",\n \"metageneration\": \"1\",\n \"contentType\": \"application/octet-stream\",\n \"storageClass\": \"STANDARD\",\n \"size\": \"34\",\n \"md5Hash\": \"fhoYDt3ji+s3dJJLcNy/xw==\",\n \"crc32c\": \"Np37Cg==\",\n \"etag\": \"CL67keKHmJMDEAE=\",\n \"timeCreated\": \"2026-03-11T14:31:02.615Z\",\n \"updated\": \"2026-03-11T14:31:02.615Z\",\n \"timeStorageClassUpdated\": \"2026-03-11T14:31:02.615Z\",\n \"timeFinalized\": \"2026-03-11T14:31:02.615Z\",\n \"metadata\": {\n \"gcp-tag-tag1\": \"value1\"\n }\n}\n",
+ "headers" : {
+ "Alt-Svc" : "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
+ "Server" : "UploadServer",
+ "Cache-Control" : "no-cache, no-store, max-age=0, must-revalidate",
+ "ETag" : "CL67keKHmJMDEAE=",
+ "X-GUploader-UploadID" : "AGQBYWw1lAXF9ni6HjgoEgDykp3mBpA34dGwENuo7Mq5m8r1r-qk8ZZNfpi8d8CkqRAH5EoClTPndO6UF61GgQ3VQkaff1Y1J7RbhLKcL3tDg_4",
+ "Vary" : [ "Origin", "X-Origin" ],
+ "Pragma" : "no-cache",
+ "Expires" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ "Date" : "Wed, 11 Mar 2026 14:31:02 GMT",
+ "Content-Type" : "application/json; charset=UTF-8"
+ }
+ },
+ "uuid" : "840e4735-6094-46bb-9f3c-4eb199d73d5e",
+ "persistent" : true,
+ "insertionIndex" : 933
+}
\ No newline at end of file