mirror of
https://github.com/versity/versitygw.git
synced 2026-07-20 15:02:23 +00:00
test: ListObjectVersions query tests
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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=()
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
+47
-13
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -92,3 +92,85 @@ source ./tests/setup_unit.sh
|
||||
run compare_data_with_xml_file "$TEST_FILE_FOLDER/$input" "<?xml version=\"1.0\"?>\n<Value>AgainOK</Value>"
|
||||
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 '<Outer><Inner></Inner></Outer>' > "$TEST_FILE_FOLDER/$file_one"
|
||||
printf '<Outer><Inner/></Outer>' > "$TEST_FILE_FOLDER/$file_two"
|
||||
printf '<Outer><Inner>a</Inner></Outer>' > "$TEST_FILE_FOLDER/$file_three"
|
||||
printf '<Outer></Outer>' > "$TEST_FILE_FOLDER/$file_four"
|
||||
printf '<Invalid XML><Inner></Inner></Invalid XML>' > "$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='<Outer><Inner>text</Inner></Outer>'
|
||||
local string_two='<Outer><Inner></Inner></Outer>'
|
||||
local string_three='<Outer><Inner/></Outer>'
|
||||
local string_four='<Outer></Outer>'
|
||||
|
||||
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 '<Outer><Inner>text</Inner></Outer>' > "$TEST_FILE_FOLDER/$file_one"
|
||||
printf '<Outer><Inner/></Outer>' > "$TEST_FILE_FOLDER/$file_two"
|
||||
printf '<Outer><Inner></Inner></Outer>' > "$TEST_FILE_FOLDER/$file_three"
|
||||
printf '<Outer></Outer>' > "$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"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user