Merge pull request #2121 from versity/test/test_rest_delete_objects

This commit is contained in:
Ben McClelland
2026-05-09 09:14:52 -07:00
committed by GitHub
13 changed files with 375 additions and 52 deletions
+10 -3
View File
@@ -37,15 +37,22 @@ list_object_versions_rest() {
log 2 "'list_object_versions_rest' requires bucket name"
return 1
fi
if ! result=$(BUCKET_NAME="$1" OUTPUT_FILE="$TEST_FILE_FOLDER/object_versions.txt" ./tests/rest_scripts/list_object_versions.sh 2>&1); then
if ! response=$(get_file_name 2>&1); then
log 2 "error getting file name: $response"
return 1
fi
file_name="$response"
if ! result=$(BUCKET_NAME="$1" OUTPUT_FILE="$TEST_FILE_FOLDER/$file_name" ./tests/rest_scripts/list_object_versions.sh 2>&1); then
log 2 "error listing object versions: $result"
return 1
fi
if [ "$result" != "200" ]; then
log 2 "expected '200', was '$result' ($(cat "$TEST_FILE_FOLDER/object_versions.txt"))"
log 2 "expected '200', was '$result' ($(cat "$TEST_FILE_FOLDER/$file_name"))"
return 1
fi
versions=$(cat "$TEST_FILE_FOLDER/object_versions.txt")
versions=$(cat "$TEST_FILE_FOLDER/$file_name")
echo "$TEST_FILE_FOLDER/$file_name"
return 0
}
@@ -20,8 +20,8 @@ source ./tests/drivers/xml.sh
source ./tests/util/util_legal_hold.sh
list_and_delete_objects() {
log 6 "list_and_delete_objects"
if ! check_param_count "list_and_delete_objects" "bucket" 1 $#; then
log 6 "list_and_delete_objects: '$1'"
if ! check_param_count_v2 "bucket" 1 $#; then
return 1
fi
local response
@@ -30,6 +30,7 @@ list_and_delete_objects() {
return 1
fi
mapfile -t object_array <<< "$response"
log 5 "objects: ${object_array[*]}"
for object in "${object_array[@]}"; do
if [ "$object" == "" ]; then
break
@@ -107,3 +107,39 @@ delete_objects_verify_success() {
fi
return 0
}
check_delete_objects_precondition_error() {
if ! check_param_count_v2 "data file, key" 2 $#; then
return 1
fi
if ! response=$(get_element_with_matching_inner_value "$1" "$2" "DeleteResult" "Error" "--" "Key" 2>&1); then
log 2 "error finding element matching key '$2': $response"
return 1
fi
error_string="$response"
if ! error=$(check_xml_element_inside_string "$error_string" "PreconditionFailed" "Code" 2>&1); then
log 2 "error checking precondtion: $error"
return 1
fi
return 0
}
check_delete_objects_version_error() {
if ! check_param_count_v2 "data file, key, version ID" 3 $#; then
return 1
fi
if ! response=$(get_element_with_matching_inner_value "$1" "$2" "DeleteResult" "Error" "--" "Key" 2>&1); then
log 2 "error finding element matching key '$2': $response"
return 1
fi
error_string="$response"
if ! error=$(check_xml_element_inside_string "$error_string" "NoSuchVersion" "Code" 2>&1); then
log 2 "error checking error code: $error"
return 1
fi
if ! error=$(check_xml_element_inside_string "$error_string" "$3" "VersionId" 2>&1); then
log 2 "error checking version ID: $error"
return 1
fi
return 0
}
@@ -126,17 +126,22 @@ add_and_check_checksum() {
fi
}
get_etag_attribute_rest() {
if [ $# -ne 3 ]; then
log 2 "'get_etag_attribute_rest' requires bucket name, object key, expected etag"
check_etag_attribute_rest() {
if ! check_param_count_v2 "bucket name, object key, expected etag" 3 $#; then
return 1
fi
if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" ATTRIBUTES="ETag" OUTPUT_FILE="$TEST_FILE_FOLDER/attributes.txt" ./tests/rest_scripts/get_object_attributes.sh); then
if ! response=$(get_file_name 2>&1); then
log 2 "error getting file name: $response"
return 1
fi
file_name="$response"
if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" ATTRIBUTES="ETag" OUTPUT_FILE="$TEST_FILE_FOLDER/$file_name" ./tests/rest_scripts/get_object_attributes.sh); then
log 2 "error attempting to get object info: $result"
return 1
fi
log 5 "attributes: $(cat "$TEST_FILE_FOLDER/attributes.txt")"
if ! check_xml_element "$TEST_FILE_FOLDER/attributes.txt" "$3" "GetObjectAttributesResponse" "ETag"; then
log 5 "attributes: $(cat "$TEST_FILE_FOLDER/$file_name")"
if ! check_xml_element "$TEST_FILE_FOLDER/$file_name" "$3" "GetObjectAttributesResponse" "ETag"; then
log 2 "etag mismatch"
return 1
fi
+2 -1
View File
@@ -93,7 +93,7 @@ check_for_empty_element() {
log 2 "error getting XML data"
return 1
fi
if grep -q '<[^/][^ >]*>' "$1.xml"; then
if grep -q '<[^/ ?>].*>' "$1.xml"; then
if xmllint --xpath "${xpath}[not(normalize-space())]" "$1.xml" 1>/dev/null 2>&1; then
return 0
fi
@@ -155,6 +155,7 @@ check_xml_element() {
log 2 "error getting element text"
return 1
fi
log 5 "expect: '$2', actual: '$xml_val'"
if [ "$2" != "$xml_val" ]; then
log 2 "XML data mismatch, expected '$2', actual '$xml_val'"
return 1
@@ -0,0 +1,78 @@
package command
import (
"encoding/xml"
"errors"
"fmt"
"strings"
)
const (
ETag = "eTag"
Key = "key"
LastModifiedTime = "lastModifiedTime"
Size = "size"
VersionId = "versionId"
)
type Object struct {
XMLName xml.Name `xml:"Object"`
ETag string `xml:"ETag,omitempty"`
Key string `xml:"Key"`
LastModifiedTime string `xml:"LastModifiedTime,omitempty"`
Size string `xml:"Size,omitempty"`
VersionId string `xml:"VersionId,omitempty"`
}
type Delete struct {
XMLName xml.Name `xml:"Delete"`
XMLNamespace string `xml:"xmlns,attr"`
Objects []*Object
Quiet bool `xml:"Quiet,omitempty"`
}
func NewDeleteObjectsCommand(command *S3RequestBuilder, objectStrings []string, quietMode bool) (*S3RequestBuilder, error) {
command.Config.Method = "POST"
command.Config.Query = "delete"
deleteCommand := &Delete{
XMLNamespace: "https://s3.amazonaws.com/doc/2006-03-01/",
}
for _, objectString := range objectStrings {
var object *Object
var err error
if object, err = assembleObject(objectString); err != nil {
return nil, fmt.Errorf("error assembling object for DeleteObjects command: %w", err)
}
deleteCommand.Objects = append(deleteCommand.Objects, object)
}
deleteCommand.Quiet = quietMode
xmlData, err := xml.Marshal(deleteCommand)
if err != nil {
return nil, fmt.Errorf("error marshalling XML: %w", err)
}
command.Config.Payload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + string(xmlData)
return command, nil
}
func assembleObject(objectString string) (*Object, error) {
object := &Object{}
objectStrings := strings.SplitSeq(objectString, ";")
for singleObjectString := range objectStrings {
keyValuePair := strings.Split(singleObjectString, "=")
switch keyValuePair[0] {
case ETag:
object.ETag = keyValuePair[1]
case Key:
object.Key = keyValuePair[1]
case LastModifiedTime:
object.LastModifiedTime = keyValuePair[1]
case Size:
object.Size = keyValuePair[1]
case VersionId:
object.VersionId = keyValuePair[1]
default:
return nil, errors.New("invalid object key for DeleteObjects command: " + keyValuePair[0])
}
}
return object, nil
}
+9
View File
@@ -13,6 +13,7 @@ import (
const (
CreateBucket = "createBucket"
DeleteObjects = "deleteObjects"
PutBucketCors = "putBucketCORS"
PutBucketTagging = "putBucketTagging"
PutObject = "putObject"
@@ -72,6 +73,8 @@ var locationConstraint *string
var locationConstraintSet bool = false
var corsRules arrayFlags
var objectsToDelete arrayFlags
var deleteObjectsQuietMode *bool
type restParams map[string]string
@@ -175,6 +178,10 @@ func getS3CommandType(baseCommand *command.S3RequestBuilder) (command.S3CommandC
if s3Command, err = command.NewCreateBucketCommand(baseCommand, *locationConstraint, locationConstraintSet); err != nil {
return nil, fmt.Errorf("error setting up CreateBucket command: %w", err)
}
case DeleteObjects:
if s3Command, err = command.NewDeleteObjectsCommand(baseCommand, objectsToDelete, *deleteObjectsQuietMode); err != nil {
return nil, fmt.Errorf("error setting up DeleteObjects command: %w", err)
}
case PutBucketCors:
if s3Command, err = command.NewPutBucketCORSCommand(baseCommand, corsRules); err != nil {
return nil, fmt.Errorf("error setting up PutBucketCORS command: %w", err)
@@ -273,6 +280,8 @@ func checkFlags() error {
writeXMLPayloadToFile = flag.String("writeXMLPayloadToFile", "", "for curl commands, file to write XML payloads to")
outputFile = flag.String("outputFile", "", "for curl commands, location to save retrieved file data (to stdout if empty)")
headerFile = flag.String("headerFile", "", "for curl commands, location to save header file data (to stdout or outputFile if empty)")
flag.Var(&objectsToDelete, "objectsToDelete", "Objects to delete in DeleteObjects command (can add multiple)")
deleteObjectsQuietMode = flag.Bool("deleteObjectsQuietMode", false, "Quiet mode for DeleteObjects command")
// Parse the flags
flag.Parse()
+2
View File
@@ -84,6 +84,8 @@ tags:
desc: "DeleteBucketTagging command"
DeleteObject:
desc: "DeleteObject command"
DeleteObjects:
desc: "DeleteObjects command"
DeleteObjectTagging:
desc: "DeleteObjectTagging command"
GetBucketAcl:
+180
View File
@@ -0,0 +1,180 @@
#!/usr/bin/env bats
# Copyright 2026 Versity Software
# This file is licensed under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http:#www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
load ./bats-support/load
load ./bats-assert/load
source ./tests/drivers/create_bucket/create_bucket_rest.sh
source ./tests/drivers/delete_objects/delete_objects_rest.sh
source ./tests/setup.sh
# tags: curl, DeleteObjects, malformed-message
@test "REST - DeleteObjects - missing payload" {
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name file_name <<< "$output"
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
run send_rest_go_command_expect_error "400" "MissingRequestBodyError" "is empty" "-bucketName" "$bucket_name" "-method" "POST" "-query" "delete" "-contentMD5"
assert_success
}
# tags: curl, DeleteObjects, malformed-message
@test "REST - DeleteObjects - no objects added to payload" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/2109"
fi
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name file_name <<< "$output"
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
run send_rest_go_command_expect_error "400" "MalformedXML" "was not well-formed" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" "-contentMD5"
assert_success
run get_object_rest "$bucket_name" "$file_name" "$TEST_FILE_FOLDER/$file_name-copy"
assert_success
}
# tags: curl, DeleteObjects
@test "REST - DeleteObjects - nonexistent key" {
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name file_name <<< "$output"
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
local incorrect_file_name="${file_name}a"
run send_rest_go_command_callback "200" "check_xml_element_contains" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
"-contentMD5" "-objectsToDelete" "key=$incorrect_file_name" "--" "$incorrect_file_name" "DeleteResult" "Deleted" "Key"
assert_success
run download_and_compare_file "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name" "$TEST_FILE_FOLDER/${file_name}-copy"
assert_success
}
# tags: curl, DeleteObjects
@test "REST - DeleteObjects - ETag mismatch" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/2112"
fi
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name file_name <<< "$output"
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
run send_rest_go_command_callback "200" "check_delete_objects_precondition_error" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
"-contentMD5" "-objectsToDelete" "key=$file_name;eTag=abc" "--" "$file_name"
assert_success
run download_and_compare_file "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name" "$TEST_FILE_FOLDER/${file_name}-copy"
assert_success
}
# tags: curl, DeleteObjects
@test "REST - DeleteObject - ETag match" {
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name file_name <<< "$output"
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
run get_etag_rest "$bucket_name" "$file_name"
assert_success
etag="$output"
run send_rest_go_command_callback "200" "check_xml_element_contains" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
"-contentMD5" "-objectsToDelete" "key=$file_name;eTag=$etag" "--" "$file_name" "DeleteResult" "Deleted" "Key"
assert_success
run verify_object_not_found "$bucket_name" "$file_name"
assert_success
}
# tags: curl, DeleteObjects, versioning
@test "REST - DeleteObjects - version ID mismatch" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/2119"
fi
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name file_name <<< "$output"
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
incorrect_version="abc"
run send_rest_go_command_callback "200" "check_delete_objects_version_error" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
"-contentMD5" "-objectsToDelete" "key=$file_name;versionId=$incorrect_version" "--" "$file_name" "$incorrect_version"
assert_success
run download_and_compare_file "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name" "$TEST_FILE_FOLDER/${file_name}-copy"
assert_success
}
# tags: curl, DeleteObjects, versioning
@test "REST - DeleteObjects - version ID" {
if [ "$RECREATE_BUCKETS" == "false" ]; then
skip "cannot change versioning status for static buckets"
fi
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name file_name <<< "$output"
run put_bucket_versioning_rest "$bucket_name" "Enabled"
assert_success
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
run send_rest_go_command_callback "200" "parse_version_id" "-bucketName" "$bucket_name" "-query" "versions" "--" "true"
assert_success
version_id="$output"
run send_rest_go_command_callback "200" "check_xml_element_contains" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
"-contentMD5" "-objectsToDelete" "key=$file_name;versionId=$version_id" "--" "$file_name" "DeleteResult" "Deleted" "Key"
assert_success
run verify_object_not_found "$bucket_name" "$file_name"
assert_success
}
@test "REST - DeleteObjects - quiet mode" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/2124"
fi
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name file_name <<< "$output"
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
run send_rest_go_command_callback "200" "check_for_empty_element" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
"-contentMD5" "-objectsToDelete" "key=${file_name}" "-deleteObjectsQuietMode" "--" "DeleteResult"
assert_success
run verify_object_not_found "$bucket_name" "$file_name"
assert_success
}
+1 -1
View File
@@ -41,7 +41,7 @@ source ./tests/drivers/get_object_attributes/get_object_attributes_rest.sh
assert_success
expected_etag=$output
run get_etag_attribute_rest "$bucket_name" "$test_file" "$expected_etag"
run check_etag_attribute_rest "$bucket_name" "$test_file" "$expected_etag"
assert_success
}
+16 -22
View File
@@ -24,19 +24,14 @@ source ./tests/drivers/create_bucket/create_bucket_rest.sh
source ./tests/drivers/list_buckets/list_buckets_rest.sh
source ./tests/util/util_rest.sh
test_file="test_file"
# tags: curl, versioning, PutBucketVersioning
@test "REST - check, enable, suspend versioning" {
if [ "$RECREATE_BUCKETS" == "false" ]; then
skip "cannot change versioning status for static buckets"
fi
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket_v2 "$bucket_name"
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name test_file <<< "$output"
run check_versioning_status_rest "$bucket_name" ""
assert_success
@@ -59,12 +54,9 @@ test_file="test_file"
if [ "$RECREATE_BUCKETS" == "false" ]; then
skip "cannot change versioning status for static buckets"
fi
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket_and_file_v2 "$bucket_name" "$test_file"
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name test_file <<< "$output"
run put_object "rest" "$TEST_FILE_FOLDER/$test_file" "$bucket_name" "$test_file"
assert_success
@@ -90,12 +82,9 @@ test_file="test_file"
if [ "$RECREATE_BUCKETS" == "false" ]; then
skip "cannot change versioning status for static buckets"
fi
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket_and_file_v2 "$bucket_name" "$test_file"
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name test_file <<< "$output"
run put_object "rest" "$TEST_FILE_FOLDER/$test_file" "$bucket_name" "$test_file"
assert_success
@@ -112,12 +101,9 @@ test_file="test_file"
# tags: curl, versioning, PutBucketVersioning, PutObject, DeleteObject, GetObject
@test "versioning - retrieve after delete" {
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket_and_file_v2 "$bucket_name" "$test_file"
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name test_file <<< "$output"
run put_object "rest" "$TEST_FILE_FOLDER/$test_file" "$bucket_name" "$test_file"
assert_success
@@ -144,6 +130,10 @@ test_file="test_file"
run setup_bucket_object_lock_enabled_v2 "$bucket_name"
assert_success
run get_file_name
assert_success
test_file="$output"
run create_test_files "$test_file"
assert_success
@@ -169,6 +159,10 @@ test_file="test_file"
run setup_bucket_object_lock_enabled_v2 "$bucket_name"
assert_success
run get_file_name
assert_success
test_file="$output"
run create_test_files "$test_file"
assert_success
+10 -5
View File
@@ -347,24 +347,29 @@ get_delete_marker_and_verify_405() {
if ! check_param_count "get_delete_marker_and_verify_405" "bucket, file name" 2 $#; then
return 1
fi
if ! list_object_versions_rest "$1"; then
if ! response=$(list_object_versions_rest "$1" 2>&1); then
log 2 "error listing REST object versions"
return 1
fi
log 5 "versions: $(cat "$TEST_FILE_FOLDER/object_versions.txt")"
versions_file="$response"
log 5 "versions: $(cat "$versions_file")"
if ! version_id=$(xmllint --xpath "//*[local-name()=\"DeleteMarker\"]/*[local-name()=\"VersionId\"]/text()" "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
if ! version_id=$(xmllint --xpath "//*[local-name()=\"DeleteMarker\"]/*[local-name()=\"VersionId\"]/text()" "$versions_file" 2>&1); then
log 2 "error getting XML value: $version_id"
return 1
fi
log 5 "xml val: $version_id"
if ! result=$(OUTPUT_FILE="$TEST_FILE_FOLDER/result.txt" COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" VERSION_ID="$version_id" ./tests/rest_scripts/head_object.sh); then
if ! response=$(get_file_name 2>&1); then
log 2 "error getting file name: $response"
return 1
fi
if ! result=$(OUTPUT_FILE="$TEST_FILE_FOLDER/$response" COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" VERSION_ID="$version_id" ./tests/rest_scripts/head_object.sh); then
log 2 "error getting result: $result"
return 1
fi
if [ "$result" != "405" ]; then
log 2 "expected '405', was '$result' ($(cat "$TEST_FILE_FOLDER/result.txt"))"
log 2 "expected '405', was '$result' ($(cat "$TEST_FILE_FOLDER/$response"))"
return 1
fi
return 0
+17 -12
View File
@@ -191,12 +191,14 @@ get_and_check_versions_rest() {
if ! check_param_count_gt "bucket, key, count, expected islatest, expected id equal to null" 5 $#; then
return 1
fi
if ! list_object_versions_rest "$1"; then
log 2 "error listing object versions"
if ! response=$(list_object_versions_rest "$1" 2>&1); then
log 2 "error listing object versions: $response"
return 1
fi
log 5 "versions: $(cat "$TEST_FILE_FOLDER/object_versions.txt")"
if ! version_count=$(xmllint --xpath 'count(//*[local-name()="Version"])' "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
versions_file="$response"
log 5 "versions: $(cat "$versions_file")"
if ! version_count=$(xmllint --xpath 'count(//*[local-name()="Version"])' "$versions_file" 2>&1); then
log 2 "error getting version count: $version_count"
return 1
fi
@@ -213,7 +215,7 @@ get_and_check_versions_rest() {
fi
match_string="//*[local-name()=\"Version\"][*[local-name()=\"VersionId\" and text()$id_check\"null\"] and *[local-name()=\"IsLatest\" and text()=\"$4\"]]"
log 5 "match string: $match_string"
if ! xmllint --xpath "$match_string" "$TEST_FILE_FOLDER/object_versions.txt" 2>&1; then
if ! xmllint --xpath "$match_string" "$versions_file" 2>&1; then
return 1
fi
shift 2
@@ -225,12 +227,14 @@ check_versions_after_file_deletion() {
if ! check_param_count "check_versions_after_file_deletion" "bucket, key" 2 $#; then
return 1
fi
if ! list_object_versions_rest "$1"; then
log 2 "error listing object versions"
if ! response=$(list_object_versions_rest "$1" 2>&1); then
log 2 "error listing object versions: $response"
return 1
fi
log 5 "versions: $(cat "$TEST_FILE_FOLDER/object_versions.txt")"
if ! version_key=$(xmllint --xpath '//*[local-name()="Version"]/*[local-name()="Key"]/text()' "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
versions_file="$response"
log 5 "versions: $(cat "$versions_file")"
if ! version_key=$(xmllint --xpath '//*[local-name()="Version"]/*[local-name()="Key"]/text()' "$versions_file" 2>&1); then
log 2 "error getting Version 'Key' value: $version_key"
return 1
fi
@@ -238,7 +242,7 @@ check_versions_after_file_deletion() {
log 2 "version key mismatch (expected $2, actual $version_key)"
return 1
fi
if ! version_id=$(xmllint --xpath '//*[local-name()="Version"]/*[local-name()="VersionId"]/text()' "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
if ! version_id=$(xmllint --xpath '//*[local-name()="Version"]/*[local-name()="VersionId"]/text()' "$versions_file" 2>&1); then
log 2 "error getting Version 'VersionID' value: $version_id"
return 1
fi
@@ -246,7 +250,7 @@ check_versions_after_file_deletion() {
log 2 "version ID mismatch (expected 'null', actual '$version_id')"
return 1
fi
if ! marker_key=$(xmllint --xpath '//*[local-name()="DeleteMarker"]/*[local-name()="Key"]/text()' "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
if ! marker_key=$(xmllint --xpath '//*[local-name()="DeleteMarker"]/*[local-name()="Key"]/text()' "$versions_file" 2>&1); then
log 2 "error getting Version 'Key' value: $marker_key"
return 1
fi
@@ -254,7 +258,7 @@ check_versions_after_file_deletion() {
log 2 "delete marker key mismatch (expected $2, actual $marker_key)"
return 1
fi
if ! marker_id=$(xmllint --xpath '//*[local-name()="DeleteMarker"]/*[local-name()="VersionId"]/text()' "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
if ! marker_id=$(xmllint --xpath '//*[local-name()="DeleteMarker"]/*[local-name()="VersionId"]/text()' "$versions_file" 2>&1); then
log 2 "error getting Version 'VersionID' value: $versioning_info"
return 1
fi
@@ -262,4 +266,5 @@ check_versions_after_file_deletion() {
log 2 "delete marker ID expected to be non-null"
return 1
fi
return 0
}