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" +}