diff --git a/tests/commands/list_object_versions.sh b/tests/commands/list_object_versions.sh index 6f5d73ac..7207ab31 100644 --- a/tests/commands/list_object_versions.sh +++ b/tests/commands/list_object_versions.sh @@ -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 } diff --git a/tests/drivers/delete_object/delete_object_rest.sh b/tests/drivers/delete_object/delete_object_rest.sh index 16cc0204..c57eee84 100644 --- a/tests/drivers/delete_object/delete_object_rest.sh +++ b/tests/drivers/delete_object/delete_object_rest.sh @@ -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 diff --git a/tests/drivers/delete_objects/delete_objects_rest.sh b/tests/drivers/delete_objects/delete_objects_rest.sh index 2e55fc22..30ba9472 100644 --- a/tests/drivers/delete_objects/delete_objects_rest.sh +++ b/tests/drivers/delete_objects/delete_objects_rest.sh @@ -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 +} diff --git a/tests/drivers/get_object_attributes/get_object_attributes_rest.sh b/tests/drivers/get_object_attributes/get_object_attributes_rest.sh index 6b2f1d2c..c44eaf7d 100644 --- a/tests/drivers/get_object_attributes/get_object_attributes_rest.sh +++ b/tests/drivers/get_object_attributes/get_object_attributes_rest.sh @@ -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 diff --git a/tests/drivers/xml.sh b/tests/drivers/xml.sh index 5cc2ebca..dae02411 100644 --- a/tests/drivers/xml.sh +++ b/tests/drivers/xml.sh @@ -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 diff --git a/tests/rest_scripts/command/deleteObjectsCommand.go b/tests/rest_scripts/command/deleteObjectsCommand.go new file mode 100644 index 00000000..8a907142 --- /dev/null +++ b/tests/rest_scripts/command/deleteObjectsCommand.go @@ -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 = "\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 +} diff --git a/tests/rest_scripts/generateCommand.go b/tests/rest_scripts/generateCommand.go index 339107d5..b89e8538 100644 --- a/tests/rest_scripts/generateCommand.go +++ b/tests/rest_scripts/generateCommand.go @@ -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() diff --git a/tests/tags/tags.yaml b/tests/tags/tags.yaml index c1090aec..43c285d8 100644 --- a/tests/tags/tags.yaml +++ b/tests/tags/tags.yaml @@ -84,6 +84,8 @@ tags: desc: "DeleteBucketTagging command" DeleteObject: desc: "DeleteObject command" + DeleteObjects: + desc: "DeleteObjects command" DeleteObjectTagging: desc: "DeleteObjectTagging command" GetBucketAcl: diff --git a/tests/test_rest_delete_objects.sh b/tests/test_rest_delete_objects.sh new file mode 100755 index 00000000..0e3afd54 --- /dev/null +++ b/tests/test_rest_delete_objects.sh @@ -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 +} diff --git a/tests/test_rest_head_object.sh b/tests/test_rest_head_object.sh index 992a060d..e0360c41 100755 --- a/tests/test_rest_head_object.sh +++ b/tests/test_rest_head_object.sh @@ -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 } diff --git a/tests/test_rest_versioning.sh b/tests/test_rest_versioning.sh index 8fc1774e..3aebfdf1 100755 --- a/tests/test_rest_versioning.sh +++ b/tests/test_rest_versioning.sh @@ -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 diff --git a/tests/util/util_list_objects.sh b/tests/util/util_list_objects.sh index a7ef081f..f29417ae 100644 --- a/tests/util/util_list_objects.sh +++ b/tests/util/util_list_objects.sh @@ -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 diff --git a/tests/util/util_versioning.sh b/tests/util/util_versioning.sh index 7107d1d0..e4ae9c3a 100644 --- a/tests/util/util_versioning.sh +++ b/tests/util/util_versioning.sh @@ -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 }