]> git.apps.os.sepia.ceph.com Git - s3-tests.git/commitdiff
s3: test put_object() with IfMatch and IfNoneMatch
authorCasey Bodley <cbodley@redhat.com>
Fri, 27 Jun 2025 18:05:45 +0000 (14:05 -0400)
committerCasey Bodley <cbodley@redhat.com>
Mon, 28 Jul 2025 16:33:19 +0000 (12:33 -0400)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit 5f6d5b12450df7919d175435b5ab05e8fea77e56)

pytest.ini
s3tests_boto3/functional/test_s3.py

index da62a7d167b94d3187f99960f2ff955d0292dc96..511cb720c41bcd347cb7d209db7bf13a2972e0c4 100644 (file)
@@ -9,6 +9,7 @@ markers =
     bucket_encryption
     bucket_logging
     bucket_logging_cleanup
+    conditional_write
     fails_without_logging_rollover
     checksum
     cloud_transition
index 9b4c6b667e32c4044f8cc8ceb5855289f41c2340..09f2924405bc8a78e7084bd213123a14b070d513 100644 (file)
@@ -18022,3 +18022,53 @@ def test_delete_marker_expiration():
 
     # delete marker should have expired
     check_delete_marker(client, bucket, key, 'false')
+
+@pytest.mark.conditional_write
+def test_put_object_if_match():
+    client = get_client()
+    bucket = get_new_bucket(client)
+    key = 'obj'
+
+    etag = client.put_object(Bucket=bucket, Key=key, IfNoneMatch='*')['ETag']
+
+    e = assert_raises(ClientError, client.put_object, Bucket=bucket, Key=key, IfNoneMatch='*')
+    assert (412, 'PreconditionFailed') == _get_status_and_error_code(e.response)
+    e = assert_raises(ClientError, client.put_object, Bucket=bucket, Key=key, IfNoneMatch=etag)
+    assert (412, 'PreconditionFailed') == _get_status_and_error_code(e.response)
+
+    client.put_object(Bucket=bucket, Key=key, IfMatch=etag)
+
+    client.delete_object(Bucket=bucket, Key=key)
+
+    e = assert_raises(ClientError, client.put_object, Bucket=bucket, Key=key, IfMatch='*')
+    assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response)
+    e = assert_raises(ClientError, client.put_object, Bucket=bucket, Key=key, IfMatch='badetag')
+    assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response)
+
+    client.put_object(Bucket=bucket, Key=key, IfNoneMatch=etag)
+
+@pytest.mark.conditional_write
+def test_put_object_current_if_match():
+    client = get_client()
+    bucket = get_new_bucket(client)
+    check_configure_versioning_retry(bucket, "Enabled", "Enabled")
+    key = 'obj'
+
+    etag = client.put_object(Bucket=bucket, Key=key, IfNoneMatch='*')['ETag']
+
+    e = assert_raises(ClientError, client.put_object, Bucket=bucket, Key=key, IfNoneMatch='*')
+    assert (412, 'PreconditionFailed') == _get_status_and_error_code(e.response)
+    e = assert_raises(ClientError, client.put_object, Bucket=bucket, Key=key, IfNoneMatch=etag)
+    assert (412, 'PreconditionFailed') == _get_status_and_error_code(e.response)
+
+    client.put_object(Bucket=bucket, Key=key, IfMatch=etag)
+
+    response = client.delete_object(Bucket=bucket, Key=key)
+    assert response['DeleteMarker']
+
+    e = assert_raises(ClientError, client.put_object, Bucket=bucket, Key=key, IfMatch='*')
+    assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response)
+    e = assert_raises(ClientError, client.put_object, Bucket=bucket, Key=key, IfMatch='badetag')
+    assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response)
+
+    client.put_object(Bucket=bucket, Key=key, IfNoneMatch=etag)