test: CreateBucket ACLs tests, REST command testing update

This commit is contained in:
Luke McCrone
2025-07-08 16:28:17 -03:00
parent 9cc29af073
commit c6944650a3
6 changed files with 212 additions and 12 deletions

View File

@@ -89,3 +89,39 @@ create_bucket_object_lock_enabled() {
fi
return 0
}
create_bucket_rest_with_invalid_acl() {
if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$BUCKET_ONE_NAME" OUTPUT_FILE="$TEST_FILE_FOLDER/result.txt" ACL="public-reads" OBJECT_OWNERSHIP="BucketOwnerPreferred" ./tests/rest_scripts/create_bucket.sh 2>&1); then
log 2 "error creating bucket: $result"
return 1
fi
if ! check_rest_expected_error "$result" "$TEST_FILE_FOLDER/result.txt" "400" "InvalidArgument" ""; then
log 2 "error checking XML CreateBucket error"
return 1
fi
return 0
}
create_bucket_rest_expect_error() {
if ! check_param_count_v2 "bucket name, params, response code, error code, message" 5 $#; then
return 1
fi
env_vars="BUCKET_NAME=$1 $2"
if ! send_rest_command_expect_error "$env_vars" "./tests/rest_scripts/create_bucket.sh" "$3" "$4" "$5"; then
log 2 "error sending REST command and checking error"
return 1
fi
return 0
}
create_bucket_rest_expect_success() {
if ! check_param_count_v2 "bucket name, params" 2 $#; then
return 1
fi
env_vars="BUCKET_NAME=$1 $2"
if ! send_rest_command_expect_success "$env_vars" "./tests/rest_scripts/create_bucket.sh" "200"; then
log 2 "error sending REST command and checking error"
return 1
fi
return 0
}

View File

@@ -53,15 +53,12 @@ delete_bucket() {
}
delete_bucket_rest() {
if ! check_param_count "delete_bucket_rest" "bucket" 1 $#; then
if ! check_param_count_gt "bucket, env vars (optional)" 1 $#; then
return 1
fi
if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OUTPUT_FILE="$TEST_FILE_FOLDER/result.txt" ./tests/rest_scripts/delete_bucket.sh 2>&1); then
log 2 "error deleting bucket: $result"
return 1
fi
if [ "$result" != "204" ]; then
log 2 "expected '204', was '$result' ($(cat "$TEST_FILE_FOLDER/result.txt"))"
env_vars="BUCKET_NAME=$1 $2"
if ! send_rest_command_expect_success "$env_vars" "./tests/rest_scripts/delete_bucket.sh" "204"; then
log 2 "error sending REST command and checking error"
return 1
fi
return 0

View File

@@ -29,4 +29,52 @@ check_rest_expected_error() {
return 1
fi
return 0
}
}
send_rest_command() {
if ! check_param_count_v2 "env vars, script, output file" 3 $#; then
return 1
fi
local env_array=("env" "COMMAND_LOG=$COMMAND_LOG" "OUTPUT_FILE=$3")
if [ "$1" != "" ]; then
IFS=' ' read -r -a env_vars <<< "$1"
env_array+=("${env_vars[@]}")
fi
# shellcheck disable=SC2068
if ! result=$(${env_array[@]} "$2" 2>&1); then
log 2 "error sending command: $result"
return 1
fi
}
send_rest_command_expect_error() {
if ! check_param_count_v2 "env vars, script, response code, error, message" 5 $#; then
return 1
fi
output_file="$TEST_FILE_FOLDER/error.txt"
if ! send_rest_command "$1" "$2" "$output_file"; then
log 2 "error sending REST command"
return 1
fi
if ! check_rest_expected_error "$result" "$output_file" "$3" "$4" "$5"; then
log 2 "error checking REST error"
return 1
fi
return 0
}
send_rest_command_expect_success() {
if ! check_param_count_v2 "env vars, script, response code" 3 $#; then
return 1
fi
output_file="$TEST_FILE_FOLDER/error.txt"
if ! send_rest_command "$1" "$2" "$output_file"; then
log 2 "error sending REST command"
return 1
fi
if [ "$result" != "$3" ]; then
log 2 "expected '$3', was '$result' ($(cat "$TEST_FILE_FOLDER/error.txt"))"
return 1
fi
return 0
}

View File

@@ -20,11 +20,25 @@ source ./tests/rest_scripts/rest.sh
# shellcheck disable=SC2153
bucket_name="$BUCKET_NAME"
acl="$ACL"
# shellcheck disable=SC2153
object_ownership="$OBJECT_OWNERSHIP"
# shellcheck disable=SC2153
grant_full_control="$GRANT_FULL_CONTROL"
current_date_time=$(date -u +"%Y%m%dT%H%M%SZ")
cr_data=("PUT" "/$bucket_name" "" "host:$host")
if [ "$acl" != "" ]; then
cr_data+=("x-amz-acl:$acl")
fi
cr_data+=("x-amz-content-sha256:UNSIGNED-PAYLOAD" "x-amz-date:$current_date_time")
if [ "$grant_full_control" != "" ]; then
cr_data+=("x-amz-grant-full-control:$grant_full_control")
fi
if [ "$object_ownership" != "" ]; then
cr_data+=("x-amz-object-ownership:$object_ownership")
fi
build_canonical_request "${cr_data[@]}"
# shellcheck disable=SC2119

View File

@@ -26,6 +26,7 @@ source ./tests/util/util_bucket.sh
source ./tests/util/util_list_buckets.sh
source ./tests/util/util_lock_config.sh
source ./tests/util/util_ownership.sh
source ./tests/util/util_public_access_block.sh
source ./tests/util/util_rest.sh
source ./tests/util/util_tags.sh
@@ -174,7 +175,7 @@ export RUN_USERS=true
@test "REST - create bucket test" {
if [ "$RECREATE_BUCKETS" == "false" ]; then
skip "invalid test for static buckets"
skip "skip bucket create tests for static buckets"
fi
run bucket_cleanup_if_bucket_exists "$BUCKET_ONE_NAME"
assert_success
@@ -193,3 +194,90 @@ export RUN_USERS=true
run delete_object_empty_bucket_check_error
assert_success
}
@test "REST - CreateBucket w/invalid acl" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1379"
fi
if [ "$RECREATE_BUCKETS" == "false" ]; then
skip "skip bucket create tests for static buckets"
fi
run bucket_cleanup_if_bucket_exists "$BUCKET_ONE_NAME"
assert_success
envs="ACL=public-reads OBJECT_OWNERSHIP=BucketOwnerPreferred"
run create_bucket_rest_expect_error "$BUCKET_ONE_NAME" "$envs" "400" "InvalidArgument" ""
assert_success
}
@test "REST - CreateBucket - x-amz-grant-full-control - non-existent user" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1384"
fi
if [ "$RECREATE_BUCKETS" == "false" ]; then
skip "skip bucket create tests for static buckets"
fi
run bucket_cleanup_if_bucket_exists "$BUCKET_ONE_NAME"
assert_success
if [ "$DIRECT" == "true" ]; then
id="id=$ACL_AWS_CANONICAL_ID"0
else
id="$AWS_ACCESS_KEY_ID"a
fi
envs="GRANT_FULL_CONTROL=$id OBJECT_OWNERSHIP=BucketOwnerPreferred"
run create_bucket_rest_expect_error "$BUCKET_ONE_NAME" "$envs" "400" "InvalidArgument" "Invalid id"
assert_success
}
@test "REST - CreateBucket - x-amz-grant-full-control - no ownership control change" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1387"
fi
if [ "$RECREATE_BUCKETS" == "false" ]; then
skip "skip bucket create tests for static buckets"
fi
run bucket_cleanup_if_bucket_exists "$BUCKET_ONE_NAME"
assert_success
if [ "$DIRECT" == "true" ]; then
id="id=$ACL_AWS_CANONICAL_ID"
else
id="$AWS_ACCESS_KEY_ID"
fi
envs="GRANT_FULL_CONTROL=$id"
run create_bucket_rest_expect_error "$BUCKET_ONE_NAME" "$envs" "400" "InvalidBucketAclWithObjectOwnership" "Bucket cannot have ACLs set"
assert_success
}
@test "REST - CreateBucket - x-amz-grant-full-control - success" {
if [ "$RECREATE_BUCKETS" == "false" ]; then
skip "skip bucket create tests for static buckets"
fi
run bucket_cleanup_if_bucket_exists "$BUCKET_ONE_NAME"
assert_success
run create_versitygw_acl_user_or_get_direct_user "$USERNAME_ONE" "$PASSWORD_ONE"
assert_success
user_canonical_id=${lines[1]}
username=${lines[2]}
password=${lines[3]}
if [ "$DIRECT" == "true" ]; then
id="id=$user_canonical_id"
else
id="$user_canonical_id"
fi
envs="GRANT_FULL_CONTROL=$id OBJECT_OWNERSHIP=BucketOwnerPreferred"
run create_bucket_rest_expect_success "$BUCKET_ONE_NAME" "$envs"
assert_success
test_file="test_file"
run create_test_file "$test_file"
assert_success
run put_object_rest_with_user "$username" "$password" "$TEST_FILE_FOLDER/$test_file" "$BUCKET_ONE_NAME" "$test_file"
assert_success
run download_and_compare_file "$TEST_FILE_FOLDER/$test_file" "$BUCKET_ONE_NAME" "$test_file" "$TEST_FILE_FOLDER/${test_file}-copy"
assert_success
}

View File

@@ -1,13 +1,30 @@
#!/usr/bin/env bash
# Copyright 2024 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.
allow_public_access() {
if [ $# -ne 1 ]; then
log 2 "'allow_public_access' requires bucket name"
if ! check_param_count_v2 "bucket name" 1 $#; then
return 1
fi
if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" BLOCK_PUBLIC_ACLS="FALSE" IGNORE_PUBLIC_ACLS="FALSE" RESTRICT_PUBLIC_BUCKETS="FALSE" OUTPUT_FILE="$TEST_FILE_FOLDER/response.txt" ./tests/rest_scripts/put_public_access_block.sh); then
if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" BLOCK_PUBLIC_ACLS="FALSE" IGNORE_PUBLIC_ACLS="FALSE" RESTRICT_PUBLIC_BUCKETS="FALSE" OUTPUT_FILE="$TEST_FILE_FOLDER/response.txt" ./tests/rest_scripts/put_public_access_block.sh 2>&1); then
log 2 "error getting public access block: $result"
return 1
fi
if [ "$result" != "200" ]; then
log 2 "expected '200', was '$result' ($(cat "$TEST_FILE_FOLDER/response.txt"))"
return 1
fi
return 0
}