diff --git a/tests/drivers/file.sh b/tests/drivers/file.sh
index a28c501d..83aed0ab 100644
--- a/tests/drivers/file.sh
+++ b/tests/drivers/file.sh
@@ -350,6 +350,26 @@ create_test_files_with_prefix() {
return 0
}
+create_test_files_with_random_names() {
+ if ! check_param_count_v2 "number of files" 1 $#; then
+ return 1
+ fi
+ local file_name error file_names=()
+ for ((i=0;i<$1;i++)); do
+ if ! file_name=$(get_file_name 2>&1); then
+ log 2 "error getting file name: $file_name"
+ return 1
+ fi
+ if ! error=$(create_test_file "$file_name" 2>&1); then
+ log 2 "error creating test file: $error"
+ return 1
+ fi
+ file_names+=("$file_name")
+ done
+ echo "${file_names[*]}"
+ return 0
+}
+
# Combined function to setup environment and create test files
# Params: filename1 [filename2 ...]
# Note: Uses $FILE_SIZE if set, otherwise defaults to 10 bytes. Requires $TEST_FILE_FOLDER.
diff --git a/tests/drivers/get_object_tagging/get_object_tagging_rest.sh b/tests/drivers/get_object_tagging/get_object_tagging_rest.sh
index a4245569..2d9a71b4 100644
--- a/tests/drivers/get_object_tagging/get_object_tagging_rest.sh
+++ b/tests/drivers/get_object_tagging/get_object_tagging_rest.sh
@@ -68,7 +68,13 @@ check_for_empty_tagset() {
if ! check_param_count_v2 "data file" 1 $#; then
return 1
fi
- if ! check_for_empty_element "$1" "Tagging" "TagSet"; then
+
+ if ! get_element "$1" "Tagging"; then
+ log 2 "error getting Tagging element"
+ return 1
+ fi
+
+ if ! check_for_empty_or_nonexistent_element "$1" "Tagging" "TagSet"; then
log 2 "error checking for empty XML element"
return 1
fi
diff --git a/tests/drivers/list_object_versions/list_object_versions_rest.sh b/tests/drivers/list_object_versions/list_object_versions_rest.sh
index 3ed613dc..9fc5b0e1 100644
--- a/tests/drivers/list_object_versions/list_object_versions_rest.sh
+++ b/tests/drivers/list_object_versions/list_object_versions_rest.sh
@@ -115,7 +115,7 @@ check_object_versions_after_deletion() {
return 1
fi
- local response
+ local response xml_data
if ! response=$(check_validity_and_or_parse_xml_data "$1" 2>&1); then
log 2 "error getting XML data: $response"
return 1
@@ -184,3 +184,92 @@ parse_latest_version_id() {
echo "$version_id"
return 0
}
+
+check_page_with_two_different_keys() {
+ if ! check_param_count_ge_le "data file, version ID marker, version ID, next version ID marker (optional)" 3 4 $#; then
+ return 1
+ fi
+ if ! check_version_page_order "$1" "KeyMarker" "Key" "NextKeyMarker" "$2" "$3" "$4"; then
+ log 2 "error checking pages for different keys"
+ return 1
+ fi
+ return 0
+}
+
+parse_version_ids_with_same_key() {
+ if ! check_param_count_v2 "data file" 1 $#; then
+ return 1
+ fi
+ local response versions version_id
+
+ if ! response=$(get_element "$1" "ListVersionsResult" "Version" 2>&1); then
+ log 2 "error getting version: $response"
+ return 1
+ fi
+ log 5 "versions: $response"
+ mapfile -t versions <<< "$response"
+
+ for version in "${versions[@]}"; do
+ if ! response=$(get_element_text_inside_string "$version" "VersionId" 2>&1); then
+ log 2 "error getting VersionId element: $response"
+ return 1
+ fi
+ version_id="$response"
+ echo "$version_id"
+ done
+ return 0
+}
+
+check_page_order_of_version_ids_with_same_key() {
+ if ! check_param_count_ge_le "data file, version ID marker, version ID, next version ID marker (optional)" 3 4 $#; then
+ return 1
+ fi
+ if ! check_version_page_order "$1" "VersionIdMarker" "VersionId" "NextVersionIdMarker" "$2" "$3" "$4"; then
+ log 2 "error checking pages for same key, different version IDs"
+ return 1
+ fi
+ return 0
+}
+
+check_version_page_order() {
+ if ! check_param_count_ge_le "data file, previous marker name, value name, next marker name, prev value, value, next value" 6 7 $#; then
+ return 1
+ fi
+ if ! response=$(check_validity_and_or_parse_xml_data "$1" 2>&1); then
+ log 2 "error getting XML data: $response"
+ return 1
+ fi
+ xml_data="$response"
+
+ if ! check_xml_element "$xml_data" "$5" "ListVersionsResult" "$2"; then
+ log 2 "error checking KeyMarker element"
+ return 1
+ fi
+ if ! check_xml_element "$xml_data" "$6" "ListVersionsResult" "Version" "$3"; then
+ log 2 "error checking Key element"
+ return 1
+ fi
+ if [ $# -lt 7 ]; then
+ if ! check_for_empty_element "$xml_data" "ListVersionsResult" "$4"; then
+ log 2 "error checking for empty NextKeyMarker"
+ return 1
+ fi
+ else
+ if ! check_xml_element "$xml_data" "$7" "ListVersionsResult" "$4"; then
+ log 2 "error checking NextKeyMarker element"
+ return 1
+ fi
+ fi
+ return 0
+}
+
+list_object_versions_with_prefix_and_delimiter_check_results() {
+ if ! check_param_count_gt "bucket name, prefix, delimiter, expected common prefixes, --, expected keys" 6 $#; then
+ return 1
+ fi
+ if ! send_rest_go_command_callback "200" "check_prefixes_delimiters_and_keys" "-bucketName" "$1" "-query" "versions&delimiter=$3&prefix=$2" "--" "ListVersionsResult" "Version" "${@:2}"; then
+ log 2 "error sending command to list objects or receiving response"
+ return 1
+ fi
+ return 0
+}
\ No newline at end of file
diff --git a/tests/drivers/list_objects/list_objects_rest.sh b/tests/drivers/list_objects/list_objects_rest.sh
index c1449dc3..69796fde 100644
--- a/tests/drivers/list_objects/list_objects_rest.sh
+++ b/tests/drivers/list_objects/list_objects_rest.sh
@@ -99,7 +99,7 @@ list_objects_with_prefix_and_delimiter_check_results() {
}
list_objects_check_key() {
- if ! check_param_count_v2 "bucket name, key, encoding type" 3 $#; then
+ if ! check_param_count_v2 "bucket name, key, encoding type and additional query if desired" 3 $#; then
return 1
fi
query=()
diff --git a/tests/drivers/objects_and_versions.sh b/tests/drivers/objects_and_versions.sh
new file mode 100644
index 00000000..ec2770ff
--- /dev/null
+++ b/tests/drivers/objects_and_versions.sh
@@ -0,0 +1,144 @@
+#!/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.
+
+objects_versions_invalid_encoding() {
+ if ! check_param_count_v2 "base query" 1 $#; then
+ return 1
+ fi
+ local response bucket_name file_name query=""
+
+ if [ "$1" != "" ]; then
+ query="$1&"
+ fi
+
+ if ! response=$(setup_bucket_and_file_v3 "$BUCKET_ONE_NAME" 2>&1); then
+ log 2 "error setting up bucket and file: $response"
+ return 1
+ fi
+ read -r bucket_name file_name <<< "$response"
+
+ if ! response=$(send_rest_go_command "200" "-method" PUT "-bucketName" "$bucket_name" "-payloadFile" "$TEST_FILE_FOLDER/$file_name" "-objectKey" "$file_name" 2>&1); then
+ log 2 "error sending put object command: $response"
+ return 1
+ fi
+
+ local bad_encoding="jdfkllaj"
+ if ! response=$(send_rest_go_command_expect_error_with_arg_name_value "400" "InvalidArgument" "Invalid Encoding Method specified in Request" \
+ "encoding-type" "$bad_encoding" "-bucketName" "$bucket_name" "-query" "${query}encoding-type=$bad_encoding" 2>&1); then
+ log 2 "error checking for invalid encoding"
+ return 1
+ fi
+ return 0
+}
+
+objects_versions_encoding_success() {
+ if ! check_param_count_v2 "base query, base element, object element" 3 $#; then
+ return 1
+ fi
+ local response bucket_name file_name expected_encoding payload_file
+
+ if ! response=$(setup_bucket_v3 "$BUCKET_ONE_NAME" 2>&1); then
+ log 2 "error setting up bucket: $response"
+ return 1
+ fi
+ bucket_name="$response"
+
+ file_name="a+ b.txt"
+ expected_encoding="a%2B+b.txt"
+ if ! create_test_file "$file_name"; then
+ log 2 "error creating test file"
+ return 1
+ fi
+
+ payload_file="$TEST_FILE_FOLDER/$file_name"
+ if ! send_rest_go_command "200" "-method" "PUT" "-payloadFile" "$payload_file" "-bucketName" "$bucket_name" "-objectKey" "$file_name"; then
+ log 2 "error sending PutObject command"
+ return 1
+ fi
+
+ if ! list_objects_check_key "$bucket_name" "$expected_encoding" "url" "$1" "$2" "$3"; then
+ log 2 "error checking object matches expected encoding"
+ return 1
+ fi
+
+ if ! list_objects_check_key "$bucket_name" "$file_name" "" "$1" "$2" "$3"; then
+ log 2 "error checking that object isn't encoded without url param"
+ return 1
+ fi
+ return 0
+}
+
+list_objects_check_key() {
+ if ! check_param_count_v2 "bucket name, key, encoding type, additional query, main element, object element" 6 $#; then
+ return 1
+ fi
+ local query_params=() query
+ if [ "$3" != "" ]; then
+ query="encoding-type=$3"
+ if [ "$4" != "" ]; then
+ query+="&$4"
+ fi
+ elif [ "$4" != "" ]; then
+ query="$4"
+ fi
+ if [ "$query" != "" ]; then
+ query_params=("-query" "$query")
+ fi
+ if ! send_rest_go_command_callback "200" "check_if_key_exists" "-bucketName" "$1" "${query_params[@]}" "--" "$2" "$5" "$6"; then
+ log 2 "error sending rest command"
+ return 1
+ fi
+ return 0
+}
+
+check_if_key_exists() {
+ if ! check_param_count_v2 "data file, key, main element, object element" 4 $#; then
+ return 1
+ fi
+ if ! check_if_element_exists "$1" "$2" "$3" "$4" "Key"; then
+ log 2 "error checking if Key '$2' exists"
+ return 1
+ fi
+ return 0
+}
+
+setup_delimiter_test() {
+ local response bucket_name file_names=() prefix
+
+ if ! response=$(setup_bucket_v3 "$BUCKET_ONE_NAME" 2>&1); then
+ log 2 "error setting up bucket: $response"
+ return 1
+ fi
+ bucket_name="$response"
+
+ file_names=("a-b-1.txt" "a-b-2.txt" "a-b/c-1.txt" "a-b/c-2.txt" "a-b/d.txt" "a/c.txt")
+ prefix="a-"
+
+ if ! create_test_files_and_folders "${file_names[@]}"; then
+ log 2 "error creating test files and folders"
+ return 1
+ fi
+
+ for file_name in "${file_names[@]}"; do
+ if ! put_object "rest" "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"; then
+ log 2 "error putting object '$file_name'"
+ return 1
+ fi
+ done
+ echo "$bucket_name"
+ echo "$prefix"
+ return 0
+}
diff --git a/tests/drivers/put_object/put_object_rest.sh b/tests/drivers/put_object/put_object_rest.sh
index 309b8883..e52588e3 100644
--- a/tests/drivers/put_object/put_object_rest.sh
+++ b/tests/drivers/put_object/put_object_rest.sh
@@ -100,6 +100,35 @@ setup_bucket_and_add_file_v3() {
return 0
}
+setup_bucket_and_add_files_v3() {
+ if ! check_param_count_v2 "bucket prefix, number of files" 2 $#; then
+ return 1
+ fi
+ local response bucket_name files
+
+ if ! response=$(setup_bucket_v3 "$1" 2>&1); then
+ log 2 "error setting up bucket: $response"
+ return 1
+ fi
+ bucket_name="$response"
+
+ if ! response=$(create_test_files_with_random_names "$2" 2>&1); then
+ log 2 "error creating test files"
+ return 1
+ fi
+ read -r -a files <<< "$response"
+
+ for file in "${files[@]}"; do
+ if ! put_object_rest "$TEST_FILE_FOLDER/$file" "$bucket_name" "$file"; then
+ log 2 "error putting object '$file'"
+ return 1
+ fi
+ done
+
+ echo "$bucket_name ${files[*]}"
+ return 0
+}
+
send_openssl_go_command_chunked_no_content_length() {
if ! check_param_count_gt "bucket name, key" 2 $#; then
return 1
diff --git a/tests/drivers/xml.sh b/tests/drivers/xml.sh
index e7b2380b..3d42c076 100644
--- a/tests/drivers/xml.sh
+++ b/tests/drivers/xml.sh
@@ -55,7 +55,6 @@ build_xpath_string_for_element() {
xpath+='/'
fi
done
- log 5 "xpath: $xpath"
echo "$xpath"
return 0
}
@@ -79,24 +78,28 @@ get_inner_xpath_string_for_element() {
return 0
}
-check_for_empty_element() {
+check_for_empty_or_nonexistent_element() {
if ! check_param_count_gt "data file, XML tree" 2 $#; then
return 1
fi
+ local response
- # shellcheck disable=SC2068
- if ! xpath=$(build_xpath_string_for_element ${@:2} 2>&1); then
+ if ! xpath=$(build_xpath_string_for_element "${@:2}" 2>&1); then
log 2 "error building XPath search string: $xpath"
- return 1
+ return 2
fi
if ! get_xml_data "$1" "$1.xml"; then
log 2 "error getting XML data"
- return 1
+ return 2
fi
- if grep -q '<[^/ ?>].*>' "$1.xml"; then
- if xmllint --xpath "${xpath}[not(normalize-space())]" "$1.xml" 1>/dev/null 2>&1; then
+ if ! response=$(get_element "$1.xml" "${@:2}" 2>&1); then
+ if [[ "$response" == *"XPath set is empty"* ]]; then
return 0
fi
+ log 2 "error checking for empty or nonexistent param: $response"
+ return 2
+ elif xmllint --xpath "${xpath}[not(normalize-space())]" "$1.xml" 1>/dev/null 2>&1; then
+ return 0
fi
return 1
}
@@ -115,6 +118,7 @@ get_element() {
return 1
fi
echo "$xml_val"
+ return 0
}
get_element_text() {
@@ -144,15 +148,15 @@ get_element_text() {
return 0
fi
echo "$xml_val"
+ return 0
}
check_xml_element() {
- if [ $# -lt 3 ]; then
- log 2 "'check_xml_element' requires data source, expected value, XML tree"
+ if ! check_param_count_gt "data source, expected value, XML tree" 3 $#; then
return 1
fi
- if ! xml_val=$(get_element_text "$1" "${@:3}"); then
- log 2 "error getting element text"
+ if ! xml_val=$(get_element_text "$1" "${@:3}" 2>&1); then
+ log 2 "error getting element text: $xml_val"
return 1
fi
log 5 "expect: '$2', actual: '$xml_val'"
@@ -179,13 +183,43 @@ check_xml_element_inside_string() {
return 0
}
+get_element_text_inside_string() {
+ if ! check_param_count_gt "string, XML tree" 2 $#; then
+ return 1
+ fi
+ local response xpath result
+
+ if ! response=$(build_xpath_string_for_element "${@:2}" 2>&1); then
+ log 2 "error building XPath search string: $response"
+ return 1
+ fi
+ xpath="$response"
+
+ result=$(echo "$1" | xmllint --xpath "boolean($xpath)" - 2>&1)
+ if [ "$result" == "false" ]; then
+ log 2 "element matching '$xpath' doesn't exist"
+ return 1
+ fi
+
+ if ! response=$(echo "$1" | xmllint --xpath "${xpath}/text()" - 2>&1); then
+ if [[ "$response" == *"XPath set is empty"* ]]; then
+ echo ""
+ return 0
+ fi
+ log 2 "error getting element text: $response"
+ return 1
+ fi
+ echo "$response"
+ return 0
+}
+
check_xml_element_contains() {
if [ $# -lt 3 ]; then
log 2 "'check_xml_element_contains' requires data source, expected value, XML tree"
return 1
fi
if [ "$2" == "" ]; then
- if ! check_for_empty_element "$1" "${@:3}"; then
+ if ! check_xml_element "$1" "" "${@:3}"; then
log 2 "Message value not empty"
return 1
fi
diff --git a/tests/setup.sh b/tests/setup.sh
index 8ec67f16..e8a98c2f 100644
--- a/tests/setup.sh
+++ b/tests/setup.sh
@@ -83,10 +83,6 @@ setup() {
return 1
fi
- if [ -n "$TEST_LOG_FILE" ]; then
- printf "\n%s\n\n" "**** $TEST_ID ****" >> "$TEST_LOG_FILE.$TEST_ID"
- fi
-
if [ "$RUN_USERS" == "true" ] && [ "$DIRECT" != "true" ] && [ "$CREATE_STATIC_USERS_IF_NONEXISTENT" == "true" ]; then
if ! static_user_versitygw_setup; then
log 2 "error setting up static versitygw users"
diff --git a/tests/test_rest_delete_objects.sh b/tests/test_rest_delete_objects.sh
index 0e3afd54..03272b71 100755
--- a/tests/test_rest_delete_objects.sh
+++ b/tests/test_rest_delete_objects.sh
@@ -171,7 +171,7 @@ source ./tests/setup.sh
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" \
+ run send_rest_go_command_callback "200" "check_for_empty_or_nonexistent_element" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
"-contentMD5" "-objectsToDelete" "key=${file_name}" "-deleteObjectsQuietMode" "--" "DeleteResult"
assert_success
diff --git a/tests/test_rest_list_object_versions.sh b/tests/test_rest_list_object_versions.sh
index 0e09f34f..c3ec8617 100755
--- a/tests/test_rest_list_object_versions.sh
+++ b/tests/test_rest_list_object_versions.sh
@@ -20,6 +20,7 @@ load ./bats-assert/load
source ./tests/setup.sh
source ./tests/drivers/create_bucket/create_bucket_rest.sh
source ./tests/drivers/list_object_versions/list_object_versions_rest.sh
+source ./tests/drivers/objects_and_versions.sh
source ./tests/util/util_time.sh
# tags: curl,ListObjectVersions,versions,invalid-query
@@ -67,3 +68,106 @@ source ./tests/util/util_time.sh
run list_object_versions_before_and_after_retention_deletion "$bucket_name" "$test_file"
assert_success
}
+
+@test "ListObjectVersions - invalid encoding" {
+ if [ "$DIRECT" != "true" ]; then
+ skip "https://github.com/versity/versitygw/issues/2169"
+ fi
+ run objects_versions_invalid_encoding "versions"
+ assert_success
+}
+
+@test "ListObjectVersions - encoding success" {
+ if [ "$DIRECT" != "true" ]; then
+ skip "https://github.com/versity/versitygw/issues/2169"
+ fi
+ run objects_versions_encoding_success "versions" "ListVersionsResult" "Version"
+ assert_success
+}
+
+@test "ListObjectVersions - version ID marker w/o key marker" {
+ if [ "$DIRECT" != "true" ]; then
+ skip "https://github.com/versity/versitygw/issues/2174"
+ fi
+ run setup_bucket_and_add_files_v3 "$BUCKET_ONE_NAME" "2"
+ assert_success
+ read -r bucket_name file_one file_two <<< "$output"
+
+ run send_rest_go_command_expect_error_with_arg_name_value "400" "InvalidArgument" "A version-id marker cannot be specified without a key marker" \
+ "version-id-marker" "null" "-bucketName" "$bucket_name" "-query" "versions&max-keys=1&version-id-marker=null"
+ assert_success
+}
+
+@test "ListObjectVersions - key-marker set to first key returns proper values" {
+ if [ "$DIRECT" != "true" ]; then
+ skip "https://github.com/versity/versitygw/issues/2178"
+ fi
+ run setup_bucket_and_add_files_v3 "$BUCKET_ONE_NAME" "2"
+ assert_success
+ read -r bucket_name file_one file_two <<< "$output"
+
+ local first_file second_file
+ if [[ "$file_one" < "$file_two" ]]; then
+ first_file="$file_one"
+ second_file="$file_two"
+ else
+ first_file="$file_two"
+ second_file="$file_one"
+ fi
+
+ run send_rest_go_command_callback "200" "check_page_with_two_different_keys" \
+ "-bucketName" "$bucket_name" "-query" "versions&max-keys=1" "--" "" "$first_file" "$first_file"
+ assert_success
+
+ run send_rest_go_command_callback "200" "check_page_with_two_different_keys" \
+ "-bucketName" "$bucket_name" "-query" "versions&max-keys=1&key-marker=$first_file" "--" "$first_file" "$second_file"
+ assert_success
+}
+
+@test "ListObjectVersions - same key, different versions" {
+ if [ "$DIRECT" != "true" ]; then
+ skip "https://github.com/versity/versitygw/issues/2178"
+ fi
+ run setup_bucket_and_add_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 put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
+ assert_success
+
+ run send_rest_go_command_callback "200" "parse_version_ids_with_same_key" \
+ "-bucketName" "$bucket_name" "-query" "versions"
+ assert_success
+ mapfile -t version_ids <<< "$output"
+
+ run send_rest_go_command_callback "200" "check_page_order_of_version_ids_with_same_key" \
+ "-bucketName" "$bucket_name" "-query" "versions&max-keys=1" "--" "" "${version_ids[0]}" "${version_ids[0]}"
+ assert_success
+
+ run send_rest_go_command_callback "200" "check_page_order_of_version_ids_with_same_key" \
+ "-bucketName" "$bucket_name" "-query" "versions&max-keys=1&key-marker=$file_name&version-id-marker=${version_ids[0]}" \
+ "--" "${version_ids[0]}" "${version_ids[1]}" "${version_ids[1]}"
+ assert_success
+
+ run send_rest_go_command_callback "200" "check_page_order_of_version_ids_with_same_key" \
+ "-bucketName" "$bucket_name" "-query" "versions&max-keys=1&key-marker=$file_name&version-id-marker=${version_ids[1]}" \
+ "--" "${version_ids[1]}" "${version_ids[2]}"
+ assert_success
+}
+
+@test "REST - ListObjectVersions - prefix/delimiter" {
+ run setup_delimiter_test
+ assert_success
+ mapfile -t test_info <<< "$output"
+ bucket_name="${test_info[0]}"
+ prefix="${test_info[1]}"
+
+ run list_object_versions_with_prefix_and_delimiter_check_results "$bucket_name" "$prefix" "/" "a-b/" "--" "a-b-1.txt" "a-b-2.txt"
+ assert_success
+}
diff --git a/tests/test_rest_list_objects.sh b/tests/test_rest_list_objects.sh
index f891df25..28c0ae4f 100755
--- a/tests/test_rest_list_objects.sh
+++ b/tests/test_rest_list_objects.sh
@@ -22,6 +22,7 @@ source ./tests/drivers/create_bucket/create_bucket_rest.sh
source ./tests/drivers/list_objects/list_objects.sh
source ./tests/drivers/list_objects/list_objects_rest.sh
source ./tests/drivers/list_objects/list_objects_s3api.sh
+source ./tests/drivers/objects_and_versions.sh
# tags: curl,ListObjects,minimal-request
@test "test_rest_list_objects" {
@@ -169,18 +170,9 @@ source ./tests/drivers/list_objects/list_objects_s3api.sh
# tags: curl,ListObjects,encoding-type,invalid-query
@test "REST - ListObjects - invalid encoding" {
if [ "$DIRECT" != "true" ]; then
- skip "https://github.com/versity/versitygw/issues/1984"
+ skip "https://github.com/versity/versitygw/issues/1985"
fi
- run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
- assert_success
- read -r bucket_name file_name <<< "$output"
-
- run send_rest_go_command "200" "-method" PUT "-bucketName" "$bucket_name" "-payloadFile" "$TEST_FILE_FOLDER/$file_name" "-objectKey" "$file_name"
- assert_success
-
- local bad_encoding="jdfkllaj"
- run send_rest_go_command_expect_error_with_arg_name_value "400" "InvalidArgument" "Invalid Encoding Method specified in Request" \
- "encoding-type" "$bad_encoding" "-bucketName" "$bucket_name" "-query" "encoding-type=$bad_encoding"
+ run objects_versions_invalid_encoding ""
assert_success
}
@@ -189,23 +181,8 @@ source ./tests/drivers/list_objects/list_objects_s3api.sh
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1985"
fi
- run setup_bucket_v3 "$BUCKET_ONE_NAME"
- assert_success
- bucket_name=$output
- file_name="a+ b.txt"
- expected_encoding="a%2B+b.txt"
- run create_test_file "$file_name"
- assert_success
-
- payload_file="$TEST_FILE_FOLDER/$file_name"
- run send_rest_go_command "200" "-method" "PUT" "-payloadFile" "$payload_file" "-bucketName" "$bucket_name" "-objectKey" "$file_name"
- assert_success
-
- run list_objects_check_key "$bucket_name" "$expected_encoding" "url"
- assert_success
-
- run list_objects_check_key "$bucket_name" "$file_name" ""
+ run objects_versions_encoding_success "" "ListBucketResult" "Contents"
assert_success
}
@@ -361,27 +338,12 @@ source ./tests/drivers/list_objects/list_objects_s3api.sh
}
list_objects_delimiter() {
- run assert_param_count "ListObjects version" 1 $#
+ run setup_delimiter_test
assert_success
+ mapfile -t test_info <<< "$output"
+ bucket_name="${test_info[0]}"
+ prefix="${test_info[1]}"
- run get_bucket_name "$BUCKET_ONE_NAME"
- assert_success
- # shellcheck disable=SC2031
- local bucket_name="$output"
-
- file_names=("a-b-1.txt" "a-b-2.txt" "a-b/c-1.txt" "a-b/c-2.txt" "a-b/d.txt" "a/c.txt")
- local prefix="a-"
- run create_test_files_and_folders "${file_names[@]}"
- assert_success
-
- run setup_bucket_v2 "$bucket_name"
- assert_success
-
- for file_name in "${file_names[@]}"; do
- run put_object "rest" "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
- assert_success
- done
-
- run list_objects_with_prefix_and_delimiter_check_results "$bucket_name" "2" "$prefix" "/" "a-b/" "--" "a-b-1.txt" "a-b-2.txt"
+ run list_objects_with_prefix_and_delimiter_check_results "$bucket_name" "$1" "$prefix" "/" "a-b/" "--" "a-b-1.txt" "a-b-2.txt"
assert_success
}
diff --git a/tests/test_xml.sh b/tests/test_xml.sh
index 83fe2378..06500194 100755
--- a/tests/test_xml.sh
+++ b/tests/test_xml.sh
@@ -92,3 +92,85 @@ source ./tests/setup_unit.sh
run compare_data_with_xml_file "$TEST_FILE_FOLDER/$input" "\nAgainOK"
assert_success
}
+
+@test "check_for_empty_or_nonexistent_element" {
+ run get_file_names 6
+ assert_success
+ read -r file_one file_two file_three file_four file_five <<< "$output"
+
+ printf '' > "$TEST_FILE_FOLDER/$file_one"
+ printf '' > "$TEST_FILE_FOLDER/$file_two"
+ printf 'a' > "$TEST_FILE_FOLDER/$file_three"
+ printf '' > "$TEST_FILE_FOLDER/$file_four"
+ printf '' > "$TEST_FILE_FOLDER/$file_five"
+
+ run check_for_empty_or_nonexistent_element "$TEST_FILE_FOLDER/$file_one" "Outer" "Inner"
+ assert_success
+
+ run check_for_empty_or_nonexistent_element "$TEST_FILE_FOLDER/$file_two" "Outer" "Inner"
+ assert_success
+
+ run check_for_empty_or_nonexistent_element "$TEST_FILE_FOLDER/$file_three" "Outer" "Inner"
+ assert_failure 1
+
+ run check_for_empty_or_nonexistent_element "$TEST_FILE_FOLDER/$file_four" "Outer" "Inner"
+ assert_success
+
+ run check_for_empty_or_nonexistent_element "$TEST_FILE_FOLDER/$file_five" "Invalid XML" "Inner"
+ assert_failure 2
+}
+
+@test "get_element_text_inside_string" {
+ local string_one='text'
+ local string_two=''
+ local string_three=''
+ local string_four=''
+
+ run get_element_text_inside_string "$string_one" "Inner"
+ assert_success
+ assert_output "text"
+
+ run get_element_text_inside_string "$string_two" "Inner"
+ assert_success
+ assert_output ""
+
+ run get_element_text_inside_string "$string_three" "Inner"
+ assert_success
+ assert_output ""
+
+ run get_element_text_inside_string "$string_four" "Inner"
+ assert_failure
+ assert_output -p "element matching"
+}
+
+@test "check_xml_element" {
+ run get_file_names 4
+ assert_success
+ read -r file_one file_two file_three file_four <<< "$output"
+
+ printf 'text' > "$TEST_FILE_FOLDER/$file_one"
+ printf '' > "$TEST_FILE_FOLDER/$file_two"
+ printf '' > "$TEST_FILE_FOLDER/$file_three"
+ printf '' > "$TEST_FILE_FOLDER/$file_four"
+
+ run check_xml_element "$TEST_FILE_FOLDER/$file_one" "tex" "Outer" "Inner"
+ assert_failure
+ assert_output -p "expected 'tex', actual 'text'"
+
+ run check_xml_element "$TEST_FILE_FOLDER/$file_one" "text" "Outer" "Inner"
+ assert_success
+
+ run check_xml_element "$TEST_FILE_FOLDER/$file_two" "a" "Outer" "Inner"
+ assert_failure
+ assert_output -p "expected 'a', actual ''"
+
+ run check_xml_element "$TEST_FILE_FOLDER/$file_two" "" "Outer" "Inner"
+ assert_success
+
+ run check_xml_element "$TEST_FILE_FOLDER/$file_three" "" "Outer" "Inner"
+ assert_success
+
+ run check_xml_element "$TEST_FILE_FOLDER/$file_four" "" "Outer" "Inner"
+ assert_failure
+ assert_output -p "element matching"
+}