mirror of
https://github.com/rustfs/rustfs.git
synced 2026-01-16 17:20:33 +00:00
feat: s3 tests classification (#1392)
Co-authored-by: houseme <housemecn@gmail.com>
This commit is contained in:
@@ -37,6 +37,8 @@ datas = "datas"
|
||||
bre = "bre"
|
||||
abd = "abd"
|
||||
mak = "mak"
|
||||
# s3-tests original test names (cannot be changed)
|
||||
nonexisted = "nonexisted"
|
||||
|
||||
[files]
|
||||
extend-exclude = []
|
||||
extend-exclude = []
|
||||
|
||||
@@ -22,10 +22,42 @@ use strum::{EnumString, IntoStaticStr};
|
||||
|
||||
use super::{Error as IamError, Validator, utils::wildcard};
|
||||
|
||||
#[derive(Serialize, Clone, Default, Debug)]
|
||||
/// A set of policy actions that serializes as a single string when containing one item,
|
||||
/// or as an array when containing multiple items (matching AWS S3 API format).
|
||||
#[derive(Clone, Default, Debug)]
|
||||
pub struct ActionSet(pub HashSet<Action>);
|
||||
|
||||
impl Serialize for ActionSet {
|
||||
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
|
||||
where
|
||||
S: serde::Serializer,
|
||||
{
|
||||
use serde::ser::SerializeSeq;
|
||||
|
||||
if self.0.len() == 1 {
|
||||
// Serialize single action as string (not array)
|
||||
if let Some(action) = self.0.iter().next() {
|
||||
let action_str: &str = action.into();
|
||||
return serializer.serialize_str(action_str);
|
||||
}
|
||||
}
|
||||
|
||||
// Serialize multiple actions as array
|
||||
let mut seq = serializer.serialize_seq(Some(self.0.len()))?;
|
||||
for action in &self.0 {
|
||||
let action_str: &str = action.into();
|
||||
seq.serialize_element(action_str)?;
|
||||
}
|
||||
seq.end()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActionSet {
|
||||
/// Returns true if the action set is empty.
|
||||
pub fn is_empty(&self) -> bool {
|
||||
self.0.is_empty()
|
||||
}
|
||||
|
||||
pub fn is_match(&self, action: &Action) -> bool {
|
||||
for act in self.0.iter() {
|
||||
if act.is_match(action) {
|
||||
@@ -150,6 +182,10 @@ impl Action {
|
||||
impl TryFrom<&str> for Action {
|
||||
type Error = Error;
|
||||
fn try_from(value: &str) -> std::result::Result<Self, Self::Error> {
|
||||
// Support wildcard "*" which matches all S3 actions (AWS S3 standard)
|
||||
if value == "*" {
|
||||
return Ok(Self::S3Action(S3Action::AllActions));
|
||||
}
|
||||
if value.starts_with(Self::S3_PREFIX) {
|
||||
Ok(Self::S3Action(
|
||||
S3Action::try_from(value).map_err(|_| IamError::InvalidAction(value.into()))?,
|
||||
@@ -559,3 +595,53 @@ pub enum KmsAction {
|
||||
#[strum(serialize = "kms:*")]
|
||||
AllActions,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use std::collections::HashSet;
|
||||
|
||||
#[test]
|
||||
fn test_action_wildcard_parsing() {
|
||||
// Test that "*" parses to S3Action::AllActions
|
||||
let action = Action::try_from("*").expect("Should parse wildcard");
|
||||
assert!(matches!(action, Action::S3Action(S3Action::AllActions)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_actionset_serialize_single_element() {
|
||||
// Single element should serialize as string
|
||||
let mut set = HashSet::new();
|
||||
set.insert(Action::S3Action(S3Action::GetObjectAction));
|
||||
let actionset = ActionSet(set);
|
||||
|
||||
let json = serde_json::to_string(&actionset).expect("Should serialize");
|
||||
assert_eq!(json, "\"s3:GetObject\"");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_actionset_serialize_multiple_elements() {
|
||||
// Multiple elements should serialize as array
|
||||
let mut set = HashSet::new();
|
||||
set.insert(Action::S3Action(S3Action::GetObjectAction));
|
||||
set.insert(Action::S3Action(S3Action::PutObjectAction));
|
||||
let actionset = ActionSet(set);
|
||||
|
||||
let json = serde_json::to_string(&actionset).expect("Should serialize");
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json).expect("Should parse");
|
||||
assert!(parsed.is_array());
|
||||
let arr = parsed.as_array().expect("Should be array");
|
||||
assert_eq!(arr.len(), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_actionset_wildcard_serialization() {
|
||||
// Wildcard action should serialize correctly
|
||||
let mut set = HashSet::new();
|
||||
set.insert(Action::try_from("*").expect("Should parse wildcard"));
|
||||
let actionset = ActionSet(set);
|
||||
|
||||
let json = serde_json::to_string(&actionset).expect("Should serialize");
|
||||
assert_eq!(json, "\"s3:*\"");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,13 @@ use super::Validator;
|
||||
#[derive(Serialize, Deserialize, Clone, Default, Debug)]
|
||||
pub struct ID(pub String);
|
||||
|
||||
impl ID {
|
||||
/// Returns true if the ID is empty.
|
||||
pub fn is_empty(&self) -> bool {
|
||||
self.0.is_empty()
|
||||
}
|
||||
}
|
||||
|
||||
impl Validator for ID {
|
||||
type Error = Error;
|
||||
/// if id is a valid utf string, then it is valid.
|
||||
|
||||
@@ -177,9 +177,11 @@ pub struct BucketPolicyArgs<'a> {
|
||||
pub object: &'a str,
|
||||
}
|
||||
|
||||
/// Bucket Policy with AWS S3-compatible JSON serialization.
|
||||
/// Empty optional fields are omitted from output to match AWS format.
|
||||
#[derive(Serialize, Deserialize, Clone, Default, Debug)]
|
||||
pub struct BucketPolicy {
|
||||
#[serde(default, rename = "ID")]
|
||||
#[serde(default, rename = "ID", skip_serializing_if = "ID::is_empty")]
|
||||
pub id: ID,
|
||||
#[serde(rename = "Version")]
|
||||
pub version: String,
|
||||
@@ -950,4 +952,106 @@ mod test {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_bucket_policy_serialize_omits_empty_fields() {
|
||||
use crate::policy::action::{Action, ActionSet, S3Action};
|
||||
use crate::policy::resource::{Resource, ResourceSet};
|
||||
use crate::policy::{Effect, Functions, Principal};
|
||||
|
||||
// Create a BucketPolicy with empty optional fields
|
||||
// Use JSON deserialization to create Principal (since aws field is private)
|
||||
let principal: Principal = serde_json::from_str(r#"{"AWS": "*"}"#).expect("Should parse principal");
|
||||
|
||||
let mut policy = BucketPolicy {
|
||||
id: ID::default(), // Empty ID
|
||||
version: "2012-10-17".to_string(),
|
||||
statements: vec![BPStatement {
|
||||
sid: ID::default(), // Empty Sid
|
||||
effect: Effect::Allow,
|
||||
principal,
|
||||
actions: ActionSet::default(),
|
||||
not_actions: ActionSet::default(), // Empty NotAction
|
||||
resources: ResourceSet::default(),
|
||||
not_resources: ResourceSet::default(), // Empty NotResource
|
||||
conditions: Functions::default(), // Empty Condition
|
||||
}],
|
||||
};
|
||||
|
||||
// Set actions and resources (required fields)
|
||||
policy.statements[0]
|
||||
.actions
|
||||
.0
|
||||
.insert(Action::S3Action(S3Action::ListBucketAction));
|
||||
policy.statements[0]
|
||||
.resources
|
||||
.0
|
||||
.insert(Resource::try_from("arn:aws:s3:::test/*").unwrap());
|
||||
|
||||
let json = serde_json::to_string(&policy).expect("Should serialize");
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json).expect("Should parse");
|
||||
|
||||
// Verify empty fields are omitted
|
||||
assert!(!parsed.as_object().unwrap().contains_key("ID"), "Empty ID should be omitted");
|
||||
|
||||
let statement = &parsed["Statement"][0];
|
||||
assert!(!statement.as_object().unwrap().contains_key("Sid"), "Empty Sid should be omitted");
|
||||
assert!(
|
||||
!statement.as_object().unwrap().contains_key("NotAction"),
|
||||
"Empty NotAction should be omitted"
|
||||
);
|
||||
assert!(
|
||||
!statement.as_object().unwrap().contains_key("NotResource"),
|
||||
"Empty NotResource should be omitted"
|
||||
);
|
||||
assert!(
|
||||
!statement.as_object().unwrap().contains_key("Condition"),
|
||||
"Empty Condition should be omitted"
|
||||
);
|
||||
|
||||
// Verify required fields are present
|
||||
assert_eq!(parsed["Version"], "2012-10-17");
|
||||
assert_eq!(statement["Effect"], "Allow");
|
||||
assert_eq!(statement["Principal"]["AWS"], "*");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_bucket_policy_serialize_single_action_as_string() {
|
||||
use crate::policy::action::{Action, ActionSet, S3Action};
|
||||
use crate::policy::resource::{Resource, ResourceSet};
|
||||
use crate::policy::{Effect, Principal};
|
||||
|
||||
// Use JSON deserialization to create Principal (since aws field is private)
|
||||
let principal: Principal = serde_json::from_str(r#"{"AWS": "*"}"#).expect("Should parse principal");
|
||||
|
||||
let mut policy = BucketPolicy {
|
||||
version: "2012-10-17".to_string(),
|
||||
statements: vec![BPStatement {
|
||||
effect: Effect::Allow,
|
||||
principal,
|
||||
actions: ActionSet::default(),
|
||||
resources: ResourceSet::default(),
|
||||
..Default::default()
|
||||
}],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
// Single action
|
||||
policy.statements[0]
|
||||
.actions
|
||||
.0
|
||||
.insert(Action::S3Action(S3Action::ListBucketAction));
|
||||
policy.statements[0]
|
||||
.resources
|
||||
.0
|
||||
.insert(Resource::try_from("arn:aws:s3:::test/*").unwrap());
|
||||
|
||||
let json = serde_json::to_string(&policy).expect("Should serialize");
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json).expect("Should parse");
|
||||
let action = &parsed["Statement"][0]["Action"];
|
||||
|
||||
// Single action should be serialized as string
|
||||
assert!(action.is_string(), "Single action should serialize as string");
|
||||
assert_eq!(action.as_str().unwrap(), "s3:ListBucket");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,13 +17,35 @@ use crate::error::Error;
|
||||
use serde::Serialize;
|
||||
use std::collections::HashSet;
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Default, PartialEq, Eq)]
|
||||
#[serde(rename_all = "PascalCase", default)]
|
||||
/// Principal that serializes AWS field as single string when containing only "*",
|
||||
/// or as an array otherwise (matching AWS S3 API format).
|
||||
#[derive(Debug, Clone, Default, PartialEq, Eq)]
|
||||
pub struct Principal {
|
||||
#[serde(rename = "AWS")]
|
||||
aws: HashSet<String>,
|
||||
}
|
||||
|
||||
impl Serialize for Principal {
|
||||
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
|
||||
where
|
||||
S: serde::Serializer,
|
||||
{
|
||||
use serde::ser::SerializeMap;
|
||||
|
||||
let mut map = serializer.serialize_map(Some(1))?;
|
||||
|
||||
// If single element, serialize as string; otherwise as array
|
||||
if self.aws.len() == 1 {
|
||||
if let Some(val) = self.aws.iter().next() {
|
||||
map.serialize_entry("AWS", val)?;
|
||||
}
|
||||
} else {
|
||||
map.serialize_entry("AWS", &self.aws)?;
|
||||
}
|
||||
|
||||
map.end()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
#[serde(untagged)]
|
||||
enum PrincipalFormat {
|
||||
@@ -118,4 +140,30 @@ mod test {
|
||||
};
|
||||
assert!(result);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_principal_serialize_single_element() {
|
||||
// Single element should serialize as string (AWS format)
|
||||
let principal = Principal {
|
||||
aws: HashSet::from(["*".to_string()]),
|
||||
};
|
||||
|
||||
let json = serde_json::to_string(&principal).expect("Should serialize");
|
||||
assert_eq!(json, r#"{"AWS":"*"}"#);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_principal_serialize_multiple_elements() {
|
||||
// Multiple elements should serialize as array
|
||||
let principal = Principal {
|
||||
aws: HashSet::from(["*".to_string(), "arn:aws:iam::123456789012:root".to_string()]),
|
||||
};
|
||||
|
||||
let json = serde_json::to_string(&principal).expect("Should serialize");
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json).expect("Should parse");
|
||||
let aws_value = parsed.get("AWS").expect("Should have AWS field");
|
||||
assert!(aws_value.is_array());
|
||||
let arr = aws_value.as_array().expect("Should be array");
|
||||
assert_eq!(arr.len(), 2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,11 @@ use super::{
|
||||
pub struct ResourceSet(pub HashSet<Resource>);
|
||||
|
||||
impl ResourceSet {
|
||||
/// Returns true if the resource set is empty.
|
||||
pub fn is_empty(&self) -> bool {
|
||||
self.0.is_empty()
|
||||
}
|
||||
|
||||
pub async fn is_match(&self, resource: &str, conditions: &HashMap<String, Vec<String>>) -> bool {
|
||||
self.is_match_with_resolver(resource, conditions, None).await
|
||||
}
|
||||
|
||||
@@ -179,10 +179,12 @@ impl PartialEq for Statement {
|
||||
}
|
||||
}
|
||||
|
||||
/// Bucket Policy Statement with AWS S3-compatible JSON serialization.
|
||||
/// Empty optional fields are omitted from output to match AWS format.
|
||||
#[derive(Debug, Deserialize, Serialize, Default, Clone)]
|
||||
#[serde(rename_all = "PascalCase", default)]
|
||||
pub struct BPStatement {
|
||||
#[serde(rename = "Sid", default)]
|
||||
#[serde(rename = "Sid", default, skip_serializing_if = "ID::is_empty")]
|
||||
pub sid: ID,
|
||||
#[serde(rename = "Effect")]
|
||||
pub effect: Effect,
|
||||
@@ -190,13 +192,13 @@ pub struct BPStatement {
|
||||
pub principal: Principal,
|
||||
#[serde(rename = "Action")]
|
||||
pub actions: ActionSet,
|
||||
#[serde(rename = "NotAction", default)]
|
||||
#[serde(rename = "NotAction", default, skip_serializing_if = "ActionSet::is_empty")]
|
||||
pub not_actions: ActionSet,
|
||||
#[serde(rename = "Resource", default)]
|
||||
pub resources: ResourceSet,
|
||||
#[serde(rename = "NotResource", default)]
|
||||
#[serde(rename = "NotResource", default, skip_serializing_if = "ResourceSet::is_empty")]
|
||||
pub not_resources: ResourceSet,
|
||||
#[serde(rename = "Condition", default)]
|
||||
#[serde(rename = "Condition", default, skip_serializing_if = "Functions::is_empty")]
|
||||
pub conditions: Functions,
|
||||
}
|
||||
|
||||
|
||||
130
scripts/s3-tests/implemented_tests.txt
Normal file
130
scripts/s3-tests/implemented_tests.txt
Normal file
@@ -0,0 +1,130 @@
|
||||
# Implemented S3 feature tests
|
||||
# ============================
|
||||
#
|
||||
# These tests SHOULD PASS on RustFS for standard S3 API compatibility.
|
||||
# Run these tests to verify RustFS S3 compatibility.
|
||||
#
|
||||
# Covered operations:
|
||||
# - Bucket: Create, Delete, List, Head, GetLocation
|
||||
# - Object: Put, Get, Delete, Copy, Head
|
||||
# - ListObjects/ListObjectsV2: prefix, delimiter, marker, maxkeys
|
||||
# - Multipart Upload: Create, Upload, Complete, Abort, List
|
||||
# - Tagging: Bucket and Object tags
|
||||
# - Bucket Policy: Put, Get, Delete
|
||||
# - Public Access Block: Put, Get, Delete
|
||||
# - Presigned URLs: GET and PUT operations
|
||||
# - Range requests: Partial object retrieval
|
||||
# - Metadata: User-defined metadata
|
||||
# - Conditional GET: If-Match, If-None-Match, If-Modified-Since
|
||||
#
|
||||
# Total: 109 tests
|
||||
|
||||
test_basic_key_count
|
||||
test_bucket_create_naming_bad_short_one
|
||||
test_bucket_create_naming_bad_short_two
|
||||
test_bucket_create_naming_bad_starts_nonalpha
|
||||
test_bucket_create_naming_dns_dash_at_end
|
||||
test_bucket_create_naming_dns_dash_dot
|
||||
test_bucket_create_naming_dns_dot_dash
|
||||
test_bucket_create_naming_dns_dot_dot
|
||||
test_bucket_create_naming_dns_underscore
|
||||
test_bucket_create_naming_good_contains_hyphen
|
||||
test_bucket_create_naming_good_contains_period
|
||||
test_bucket_create_naming_good_long_60
|
||||
test_bucket_create_naming_good_long_61
|
||||
test_bucket_create_naming_good_long_62
|
||||
test_bucket_create_naming_good_long_63
|
||||
test_bucket_create_naming_good_starts_alpha
|
||||
test_bucket_create_naming_good_starts_digit
|
||||
test_bucket_delete_nonempty
|
||||
test_bucket_delete_notexist
|
||||
test_bucket_head
|
||||
test_bucket_head_notexist
|
||||
test_bucket_list_distinct
|
||||
test_bucket_list_empty
|
||||
test_bucket_list_long_name
|
||||
test_bucket_list_marker_after_list
|
||||
test_bucket_list_marker_empty
|
||||
test_bucket_list_marker_none
|
||||
test_bucket_list_marker_not_in_list
|
||||
test_bucket_list_marker_unreadable
|
||||
test_bucket_list_maxkeys_invalid
|
||||
test_bucket_list_maxkeys_none
|
||||
test_bucket_list_maxkeys_zero
|
||||
test_bucket_list_prefix_alt
|
||||
test_bucket_list_prefix_basic
|
||||
test_bucket_list_prefix_delimiter_alt
|
||||
test_bucket_list_prefix_delimiter_basic
|
||||
test_bucket_list_prefix_delimiter_delimiter_not_exist
|
||||
test_bucket_list_prefix_delimiter_prefix_delimiter_not_exist
|
||||
test_bucket_list_prefix_delimiter_prefix_not_exist
|
||||
test_bucket_list_prefix_empty
|
||||
test_bucket_list_prefix_none
|
||||
test_bucket_list_prefix_not_exist
|
||||
test_bucket_list_prefix_unreadable
|
||||
test_bucket_list_special_prefix
|
||||
test_bucket_listv2_continuationtoken
|
||||
test_bucket_listv2_continuationtoken_empty
|
||||
test_bucket_listv2_fetchowner_defaultempty
|
||||
test_bucket_listv2_fetchowner_empty
|
||||
test_bucket_listv2_fetchowner_notempty
|
||||
test_bucket_listv2_maxkeys_none
|
||||
test_bucket_listv2_maxkeys_zero
|
||||
test_bucket_listv2_prefix_alt
|
||||
test_bucket_listv2_prefix_basic
|
||||
test_bucket_listv2_prefix_delimiter_alt
|
||||
test_bucket_listv2_prefix_delimiter_basic
|
||||
test_bucket_listv2_prefix_delimiter_delimiter_not_exist
|
||||
test_bucket_listv2_prefix_delimiter_prefix_delimiter_not_exist
|
||||
test_bucket_listv2_prefix_delimiter_prefix_not_exist
|
||||
test_bucket_listv2_prefix_empty
|
||||
test_bucket_listv2_prefix_none
|
||||
test_bucket_listv2_prefix_not_exist
|
||||
test_bucket_listv2_prefix_unreadable
|
||||
test_bucket_listv2_startafter_after_list
|
||||
test_bucket_listv2_startafter_not_in_list
|
||||
test_bucket_listv2_startafter_unreadable
|
||||
test_bucket_notexist
|
||||
test_buckets_create_then_list
|
||||
test_buckets_list_ctime
|
||||
test_bucketv2_notexist
|
||||
test_bucketv2_policy_another_bucket
|
||||
test_get_bucket_policy_status
|
||||
test_get_nonpublicpolicy_principal_bucket_policy_status
|
||||
test_get_object_ifmatch_good
|
||||
test_get_object_ifmodifiedsince_good
|
||||
test_get_object_ifunmodifiedsince_failed
|
||||
test_list_buckets_bad_auth
|
||||
test_multi_object_delete
|
||||
test_multi_object_delete_key_limit
|
||||
test_multi_objectv2_delete
|
||||
test_multi_objectv2_delete_key_limit
|
||||
test_multipart_copy_without_range
|
||||
test_multipart_upload_empty
|
||||
test_multipart_upload_incorrect_etag
|
||||
test_multipart_upload_missing_part
|
||||
test_multipart_upload_multiple_sizes
|
||||
test_multipart_upload_on_a_bucket_with_policy
|
||||
test_multipart_upload_overwrite_existing_object
|
||||
test_multipart_upload_size_too_small
|
||||
test_object_copy_bucket_not_found
|
||||
test_object_copy_key_not_found
|
||||
test_object_copy_not_owned_object_bucket
|
||||
test_object_head_zero_bytes
|
||||
test_object_metadata_replaced_on_put
|
||||
test_object_put_authenticated
|
||||
test_object_read_not_exist
|
||||
test_object_set_get_metadata_none_to_empty
|
||||
test_object_set_get_metadata_none_to_good
|
||||
test_object_set_get_metadata_overwrite_to_empty
|
||||
test_object_write_cache_control
|
||||
test_object_write_check_etag
|
||||
test_object_write_expires
|
||||
test_object_write_file
|
||||
test_object_write_read_update_read_delete
|
||||
test_object_write_to_nonexist_bucket
|
||||
test_put_max_kvsize_tags
|
||||
test_ranged_request_empty_object
|
||||
test_ranged_request_invalid_range
|
||||
test_set_multipart_tagging
|
||||
test_upload_part_copy_percent_encoded_key
|
||||
505
scripts/s3-tests/non_standard_tests.txt
Normal file
505
scripts/s3-tests/non_standard_tests.txt
Normal file
@@ -0,0 +1,505 @@
|
||||
# Non-standard S3 tests (Ceph/RGW/MinIO specific)
|
||||
# ================================================
|
||||
#
|
||||
# These tests use vendor-specific extensions not part of AWS S3 API.
|
||||
# They are PERMANENTLY EXCLUDED from RustFS compatibility testing.
|
||||
#
|
||||
# Exclusion reasons:
|
||||
# - fails_on_aws marker: Ceph-specific features
|
||||
# - X-RGW-* headers: Ceph proprietary headers
|
||||
# - allowUnordered: Ceph-specific query parameter
|
||||
# - ACL tests: RustFS uses IAM policy-based access control
|
||||
# - CORS tests: Not implemented
|
||||
# - POST Object: HTML form upload not implemented
|
||||
# - Error format differences: Minor response format variations
|
||||
#
|
||||
# Total: non-standard tests listed below
|
||||
|
||||
test_100_continue
|
||||
test_100_continue_error_retry
|
||||
test_abort_multipart_upload_not_found
|
||||
test_access_bucket_private_object_private
|
||||
test_access_bucket_private_object_publicread
|
||||
test_access_bucket_private_object_publicreadwrite
|
||||
test_access_bucket_private_objectv2_private
|
||||
test_access_bucket_private_objectv2_publicread
|
||||
test_access_bucket_private_objectv2_publicreadwrite
|
||||
test_access_bucket_publicread_object_private
|
||||
test_access_bucket_publicread_object_publicread
|
||||
test_access_bucket_publicread_object_publicreadwrite
|
||||
test_access_bucket_publicreadwrite_object_private
|
||||
test_access_bucket_publicreadwrite_object_publicread
|
||||
test_access_bucket_publicreadwrite_object_publicreadwrite
|
||||
test_account_usage
|
||||
test_atomic_conditional_write_1mb
|
||||
test_atomic_dual_conditional_write_1mb
|
||||
test_atomic_write_bucket_gone
|
||||
test_block_public_restrict_public_buckets
|
||||
test_bucket_acl_canned
|
||||
test_bucket_acl_canned_authenticatedread
|
||||
test_bucket_acl_canned_during_create
|
||||
test_bucket_acl_canned_private_to_private
|
||||
test_bucket_acl_canned_publicreadwrite
|
||||
test_bucket_acl_default
|
||||
test_bucket_acl_grant_email
|
||||
test_bucket_acl_grant_email_not_exist
|
||||
test_bucket_acl_grant_nonexist_user
|
||||
test_bucket_acl_grant_userid_fullcontrol
|
||||
test_bucket_acl_grant_userid_read
|
||||
test_bucket_acl_grant_userid_readacp
|
||||
test_bucket_acl_grant_userid_write
|
||||
test_bucket_acl_grant_userid_writeacp
|
||||
test_bucket_acl_revoke_all
|
||||
test_bucket_concurrent_set_canned_acl
|
||||
test_bucket_create_exists
|
||||
test_bucket_create_exists_nonowner
|
||||
test_bucket_create_naming_bad_ip
|
||||
test_bucket_create_naming_dns_long
|
||||
test_bucket_create_special_key_names
|
||||
test_bucket_get_location
|
||||
test_bucket_head_extended
|
||||
test_bucket_header_acl_grants
|
||||
test_bucket_list_delimiter_not_skip_special
|
||||
test_bucket_list_delimiter_prefix
|
||||
test_bucket_list_delimiter_prefix_underscore
|
||||
test_bucket_list_many
|
||||
test_bucket_list_maxkeys_one
|
||||
test_bucket_list_objects_anonymous
|
||||
test_bucket_list_objects_anonymous_fail
|
||||
test_bucket_list_return_data
|
||||
test_bucket_list_return_data_versioning
|
||||
test_bucket_list_unordered
|
||||
test_bucket_listv2_both_continuationtoken_startafter
|
||||
test_bucket_listv2_delimiter_prefix
|
||||
test_bucket_listv2_delimiter_prefix_underscore
|
||||
test_bucket_listv2_many
|
||||
test_bucket_listv2_maxkeys_one
|
||||
test_bucket_listv2_objects_anonymous
|
||||
test_bucket_listv2_objects_anonymous_fail
|
||||
test_bucket_listv2_unordered
|
||||
test_bucket_logging_bucket_acl_required
|
||||
test_bucket_logging_bucket_auth_type
|
||||
test_bucket_logging_cleanup_bucket_concurrent_deletion_j
|
||||
test_bucket_logging_cleanup_bucket_concurrent_deletion_j_single
|
||||
test_bucket_logging_cleanup_bucket_concurrent_deletion_s
|
||||
test_bucket_logging_cleanup_bucket_concurrent_deletion_s_single
|
||||
test_bucket_logging_cleanup_bucket_deletion_j
|
||||
test_bucket_logging_cleanup_bucket_deletion_j_single
|
||||
test_bucket_logging_cleanup_bucket_deletion_s
|
||||
test_bucket_logging_cleanup_bucket_deletion_s_single
|
||||
test_bucket_logging_cleanup_concurrent_disabling_j
|
||||
test_bucket_logging_cleanup_concurrent_disabling_j_single
|
||||
test_bucket_logging_cleanup_concurrent_disabling_s
|
||||
test_bucket_logging_cleanup_concurrent_disabling_s_single
|
||||
test_bucket_logging_cleanup_concurrent_updating_j
|
||||
test_bucket_logging_cleanup_concurrent_updating_j_single
|
||||
test_bucket_logging_cleanup_concurrent_updating_s
|
||||
test_bucket_logging_cleanup_concurrent_updating_s_single
|
||||
test_bucket_logging_cleanup_disabling_j
|
||||
test_bucket_logging_cleanup_disabling_j_single
|
||||
test_bucket_logging_cleanup_disabling_s
|
||||
test_bucket_logging_cleanup_disabling_s_single
|
||||
test_bucket_logging_cleanup_updating_j
|
||||
test_bucket_logging_cleanup_updating_j_single
|
||||
test_bucket_logging_cleanup_updating_s
|
||||
test_bucket_logging_cleanup_updating_s_single
|
||||
test_bucket_logging_concurrent_flush_j
|
||||
test_bucket_logging_concurrent_flush_j_single
|
||||
test_bucket_logging_concurrent_flush_s
|
||||
test_bucket_logging_concurrent_flush_s_single
|
||||
test_bucket_logging_conf_concurrent_updating_pfx_j
|
||||
test_bucket_logging_conf_concurrent_updating_pfx_s
|
||||
test_bucket_logging_conf_concurrent_updating_roll_j
|
||||
test_bucket_logging_conf_concurrent_updating_roll_s
|
||||
test_bucket_logging_conf_updating_pfx_j
|
||||
test_bucket_logging_conf_updating_pfx_s
|
||||
test_bucket_logging_conf_updating_roll_j
|
||||
test_bucket_logging_conf_updating_roll_s
|
||||
test_bucket_logging_copy_objects
|
||||
test_bucket_logging_copy_objects_bucket
|
||||
test_bucket_logging_copy_objects_bucket_versioned
|
||||
test_bucket_logging_copy_objects_versioned
|
||||
test_bucket_logging_delete_objects
|
||||
test_bucket_logging_delete_objects_versioned
|
||||
test_bucket_logging_event_type_j
|
||||
test_bucket_logging_event_type_s
|
||||
test_bucket_logging_flush_empty
|
||||
test_bucket_logging_flush_j
|
||||
test_bucket_logging_flush_j_single
|
||||
test_bucket_logging_flush_s
|
||||
test_bucket_logging_flush_s_single
|
||||
test_bucket_logging_get_objects
|
||||
test_bucket_logging_get_objects_versioned
|
||||
test_bucket_logging_head_objects
|
||||
test_bucket_logging_head_objects_versioned
|
||||
test_bucket_logging_key_filter_j
|
||||
test_bucket_logging_key_filter_s
|
||||
test_bucket_logging_mpu_copy
|
||||
test_bucket_logging_mpu_copy_versioned
|
||||
test_bucket_logging_mpu_j
|
||||
test_bucket_logging_mpu_s
|
||||
test_bucket_logging_mpu_versioned_j
|
||||
test_bucket_logging_mpu_versioned_s
|
||||
test_bucket_logging_mtime
|
||||
test_bucket_logging_multi_delete
|
||||
test_bucket_logging_multi_delete_versioned
|
||||
test_bucket_logging_multiple_prefixes
|
||||
test_bucket_logging_notupdating_j
|
||||
test_bucket_logging_notupdating_j_single
|
||||
test_bucket_logging_notupdating_s
|
||||
test_bucket_logging_notupdating_s_single
|
||||
test_bucket_logging_object_acl_required
|
||||
test_bucket_logging_object_meta
|
||||
test_bucket_logging_part_cleanup_concurrent_deletion_j
|
||||
test_bucket_logging_part_cleanup_concurrent_deletion_s
|
||||
test_bucket_logging_part_cleanup_concurrent_disabling_j
|
||||
test_bucket_logging_part_cleanup_concurrent_disabling_s
|
||||
test_bucket_logging_part_cleanup_concurrent_updating_j
|
||||
test_bucket_logging_part_cleanup_concurrent_updating_s
|
||||
test_bucket_logging_part_cleanup_deletion_j
|
||||
test_bucket_logging_part_cleanup_deletion_s
|
||||
test_bucket_logging_part_cleanup_disabling_j
|
||||
test_bucket_logging_part_cleanup_disabling_s
|
||||
test_bucket_logging_part_cleanup_updating_j
|
||||
test_bucket_logging_part_cleanup_updating_s
|
||||
test_bucket_logging_partitioned_key
|
||||
test_bucket_logging_permission_change_j
|
||||
test_bucket_logging_permission_change_s
|
||||
test_bucket_logging_put_and_flush
|
||||
test_bucket_logging_put_concurrency
|
||||
test_bucket_logging_put_objects
|
||||
test_bucket_logging_put_objects_versioned
|
||||
test_bucket_logging_roll_time
|
||||
test_bucket_logging_simple_key
|
||||
test_bucket_logging_single_prefix
|
||||
test_bucket_logging_target_cleanup_j
|
||||
test_bucket_logging_target_cleanup_j_single
|
||||
test_bucket_logging_target_cleanup_s
|
||||
test_bucket_logging_target_cleanup_s_single
|
||||
test_bucket_policy_get_obj_acl_existing_tag
|
||||
test_bucket_policy_get_obj_existing_tag
|
||||
test_bucket_policy_get_obj_tagging_existing_tag
|
||||
test_bucket_policy_put_obj_copy_source
|
||||
test_bucket_policy_put_obj_copy_source_meta
|
||||
test_bucket_policy_put_obj_kms_noenc
|
||||
test_bucket_policy_put_obj_request_obj_tag
|
||||
test_bucket_policy_put_obj_s3_incorrect_algo_sse_s3
|
||||
test_bucket_policy_put_obj_s3_noenc
|
||||
test_bucket_policy_put_obj_tagging_existing_tag
|
||||
test_bucket_policy_set_condition_operator_end_with_IfExists
|
||||
test_bucket_policy_upload_part_copy
|
||||
test_bucket_recreate_new_acl
|
||||
test_bucket_recreate_not_overriding
|
||||
test_bucket_recreate_overwrite_acl
|
||||
test_copy_object_ifmatch_failed
|
||||
test_copy_object_ifmatch_good
|
||||
test_copy_object_ifnonematch_failed
|
||||
test_copy_object_ifnonematch_good
|
||||
test_cors_header_option
|
||||
test_cors_origin_response
|
||||
test_cors_origin_wildcard
|
||||
test_cors_presigned_get_object
|
||||
test_cors_presigned_get_object_tenant
|
||||
test_cors_presigned_get_object_tenant_v2
|
||||
test_cors_presigned_get_object_v2
|
||||
test_cors_presigned_put_object
|
||||
test_cors_presigned_put_object_tenant
|
||||
test_cors_presigned_put_object_tenant_v2
|
||||
test_cors_presigned_put_object_tenant_with_acl
|
||||
test_cors_presigned_put_object_v2
|
||||
test_cors_presigned_put_object_with_acl
|
||||
test_create_bucket_bucket_owner_enforced
|
||||
test_create_bucket_bucket_owner_preferred
|
||||
test_create_bucket_object_writer
|
||||
test_delete_marker_expiration
|
||||
test_delete_marker_nonversioned
|
||||
test_delete_marker_suspended
|
||||
test_delete_marker_versioned
|
||||
test_delete_object_current_if_match
|
||||
test_delete_object_current_if_match_last_modified_time
|
||||
test_delete_object_current_if_match_size
|
||||
test_delete_object_if_match
|
||||
test_delete_object_if_match_last_modified_time
|
||||
test_delete_object_if_match_size
|
||||
test_delete_object_version_if_match
|
||||
test_delete_object_version_if_match_last_modified_time
|
||||
test_delete_object_version_if_match_size
|
||||
test_delete_objects_current_if_match
|
||||
test_delete_objects_current_if_match_last_modified_time
|
||||
test_delete_objects_current_if_match_size
|
||||
test_delete_objects_if_match
|
||||
test_delete_objects_if_match_last_modified_time
|
||||
test_delete_objects_if_match_size
|
||||
test_delete_objects_version_if_match
|
||||
test_delete_objects_version_if_match_last_modified_time
|
||||
test_delete_objects_version_if_match_size
|
||||
test_delete_tags_obj_public
|
||||
test_encrypted_transfer_13b
|
||||
test_encrypted_transfer_1MB
|
||||
test_encrypted_transfer_1b
|
||||
test_encrypted_transfer_1kb
|
||||
test_encryption_sse_c_deny_algo_with_bucket_policy
|
||||
test_encryption_sse_c_enforced_with_bucket_policy
|
||||
test_encryption_sse_c_multipart_invalid_chunks_1
|
||||
test_encryption_sse_c_multipart_invalid_chunks_2
|
||||
test_encryption_sse_c_multipart_upload
|
||||
test_encryption_sse_c_post_object_authenticated_request
|
||||
test_encryption_sse_c_unaligned_multipart_upload
|
||||
test_expected_bucket_owner
|
||||
test_get_multipart_checksum_object_attributes
|
||||
test_get_multipart_object_attributes
|
||||
test_get_obj_tagging
|
||||
test_get_object_attributes
|
||||
test_get_object_ifmatch_failed
|
||||
test_get_object_ifmodifiedsince_failed
|
||||
test_get_object_ifnonematch_failed
|
||||
test_get_object_ifnonematch_good
|
||||
test_get_object_ifunmodifiedsince_good
|
||||
test_get_paginated_multipart_object_attributes
|
||||
test_get_single_multipart_object_attributes
|
||||
test_get_sse_c_encrypted_object_attributes
|
||||
test_get_tags_acl_public
|
||||
test_head_bucket_usage
|
||||
test_lifecycle_cloud_multiple_transition
|
||||
test_lifecycle_cloud_transition
|
||||
test_lifecycle_cloud_transition_large_obj
|
||||
test_lifecycle_deletemarker_expiration
|
||||
test_lifecycle_deletemarker_expiration_with_days_tag
|
||||
test_lifecycle_expiration
|
||||
test_lifecycle_expiration_date
|
||||
test_lifecycle_expiration_header_and_tags_head
|
||||
test_lifecycle_expiration_header_head
|
||||
test_lifecycle_expiration_header_tags_head
|
||||
test_lifecycle_expiration_newer_noncurrent
|
||||
test_lifecycle_expiration_noncur_tags1
|
||||
test_lifecycle_expiration_size_gt
|
||||
test_lifecycle_expiration_size_lt
|
||||
test_lifecycle_expiration_tags1
|
||||
test_lifecycle_expiration_tags2
|
||||
test_lifecycle_expiration_versioned_tags2
|
||||
test_lifecycle_expiration_versioning_enabled
|
||||
test_lifecycle_multipart_expiration
|
||||
test_lifecycle_noncur_cloud_transition
|
||||
test_lifecycle_noncur_expiration
|
||||
test_lifecycle_noncur_transition
|
||||
test_lifecycle_transition
|
||||
test_lifecycle_transition_single_rule_multi_trans
|
||||
test_lifecyclev2_expiration
|
||||
test_list_buckets_anonymous
|
||||
test_list_buckets_invalid_auth
|
||||
test_list_buckets_paginated
|
||||
test_list_multipart_upload
|
||||
test_list_multipart_upload_owner
|
||||
test_multipart_checksum_sha256
|
||||
test_multipart_copy_improper_range
|
||||
test_multipart_copy_invalid_range
|
||||
test_multipart_copy_multiple_sizes
|
||||
test_multipart_copy_small
|
||||
test_multipart_copy_special_names
|
||||
test_multipart_copy_versioned
|
||||
test_multipart_get_part
|
||||
test_multipart_put_current_object_if_match
|
||||
test_multipart_put_current_object_if_none_match
|
||||
test_multipart_put_object_if_match
|
||||
test_multipart_single_get_part
|
||||
test_multipart_sse_c_get_part
|
||||
test_multipart_upload
|
||||
test_multipart_upload_contents
|
||||
test_multipart_upload_resend_part
|
||||
test_multipart_upload_small
|
||||
test_multipart_use_cksum_helper_crc32
|
||||
test_multipart_use_cksum_helper_crc32c
|
||||
test_multipart_use_cksum_helper_crc64nvme
|
||||
test_multipart_use_cksum_helper_sha1
|
||||
test_multipart_use_cksum_helper_sha256
|
||||
test_non_multipart_get_part
|
||||
test_non_multipart_sse_c_get_part
|
||||
test_object_acl
|
||||
test_object_acl_canned
|
||||
test_object_acl_canned_authenticatedread
|
||||
test_object_acl_canned_bucketownerfullcontrol
|
||||
test_object_acl_canned_bucketownerread
|
||||
test_object_acl_canned_during_create
|
||||
test_object_acl_canned_publicreadwrite
|
||||
test_object_acl_default
|
||||
test_object_acl_full_control_verify_attributes
|
||||
test_object_acl_full_control_verify_owner
|
||||
test_object_acl_read
|
||||
test_object_acl_readacp
|
||||
test_object_acl_write
|
||||
test_object_acl_writeacp
|
||||
test_object_anon_put
|
||||
test_object_anon_put_write_access
|
||||
test_object_content_encoding_aws_chunked
|
||||
test_object_copy_16m
|
||||
test_object_copy_canned_acl
|
||||
test_object_copy_diff_bucket
|
||||
test_object_copy_not_owned_bucket
|
||||
test_object_copy_replacing_metadata
|
||||
test_object_copy_retaining_metadata
|
||||
test_object_copy_same_bucket
|
||||
test_object_copy_to_itself
|
||||
test_object_copy_to_itself_with_metadata
|
||||
test_object_copy_verify_contenttype
|
||||
test_object_copy_versioned_bucket
|
||||
test_object_copy_versioned_url_encoding
|
||||
test_object_copy_versioning_multipart_upload
|
||||
test_object_copy_zero_size
|
||||
test_object_delete_key_bucket_gone
|
||||
test_object_header_acl_grants
|
||||
test_object_lock_changing_mode_from_compliance
|
||||
test_object_lock_changing_mode_from_governance_with_bypass
|
||||
test_object_lock_changing_mode_from_governance_without_bypass
|
||||
test_object_lock_delete_multipart_object_with_legal_hold_on
|
||||
test_object_lock_delete_multipart_object_with_retention
|
||||
test_object_lock_delete_object_with_legal_hold_off
|
||||
test_object_lock_delete_object_with_legal_hold_on
|
||||
test_object_lock_delete_object_with_retention
|
||||
test_object_lock_delete_object_with_retention_and_marker
|
||||
test_object_lock_get_legal_hold
|
||||
test_object_lock_get_obj_lock
|
||||
test_object_lock_get_obj_metadata
|
||||
test_object_lock_get_obj_retention
|
||||
test_object_lock_get_obj_retention_iso8601
|
||||
test_object_lock_multi_delete_object_with_retention
|
||||
test_object_lock_put_legal_hold
|
||||
test_object_lock_put_legal_hold_invalid_status
|
||||
test_object_lock_put_obj_lock
|
||||
test_object_lock_put_obj_lock_invalid_days
|
||||
test_object_lock_put_obj_lock_invalid_mode
|
||||
test_object_lock_put_obj_lock_invalid_status
|
||||
test_object_lock_put_obj_lock_invalid_years
|
||||
test_object_lock_put_obj_lock_with_days_and_years
|
||||
test_object_lock_put_obj_retention
|
||||
test_object_lock_put_obj_retention_increase_period
|
||||
test_object_lock_put_obj_retention_invalid_mode
|
||||
test_object_lock_put_obj_retention_override_default_retention
|
||||
test_object_lock_put_obj_retention_shorten_period
|
||||
test_object_lock_put_obj_retention_shorten_period_bypass
|
||||
test_object_lock_put_obj_retention_versionid
|
||||
test_object_lock_suspend_versioning
|
||||
test_object_lock_uploading_obj
|
||||
test_object_raw_authenticated
|
||||
test_object_raw_authenticated_bucket_acl
|
||||
test_object_raw_authenticated_bucket_gone
|
||||
test_object_raw_authenticated_object_acl
|
||||
test_object_raw_authenticated_object_gone
|
||||
test_object_raw_get
|
||||
test_object_raw_get_bucket_acl
|
||||
test_object_raw_get_bucket_gone
|
||||
test_object_raw_get_object_acl
|
||||
test_object_raw_get_object_gone
|
||||
test_object_raw_get_x_amz_expires_not_expired
|
||||
test_object_raw_get_x_amz_expires_not_expired_tenant
|
||||
test_object_raw_get_x_amz_expires_out_max_range
|
||||
test_object_raw_get_x_amz_expires_out_positive_range
|
||||
test_object_raw_get_x_amz_expires_out_range_zero
|
||||
test_object_raw_put_authenticated_expired
|
||||
test_object_raw_response_headers
|
||||
test_object_read_unreadable
|
||||
test_object_requestid_matches_header_on_error
|
||||
test_object_set_get_unicode_metadata
|
||||
test_object_write_with_chunked_transfer_encoding
|
||||
test_post_object_anonymous_request
|
||||
test_post_object_authenticated_no_content_type
|
||||
test_post_object_authenticated_request
|
||||
test_post_object_authenticated_request_bad_access_key
|
||||
test_post_object_case_insensitive_condition_fields
|
||||
test_post_object_condition_is_case_sensitive
|
||||
test_post_object_empty_conditions
|
||||
test_post_object_escaped_field_values
|
||||
test_post_object_expired_policy
|
||||
test_post_object_expires_is_case_sensitive
|
||||
test_post_object_ignored_header
|
||||
test_post_object_invalid_access_key
|
||||
test_post_object_invalid_content_length_argument
|
||||
test_post_object_invalid_date_format
|
||||
test_post_object_invalid_request_field_value
|
||||
test_post_object_invalid_signature
|
||||
test_post_object_missing_conditions_list
|
||||
test_post_object_missing_content_length_argument
|
||||
test_post_object_missing_expires_condition
|
||||
test_post_object_missing_policy_condition
|
||||
test_post_object_missing_signature
|
||||
test_post_object_no_key_specified
|
||||
test_post_object_request_missing_policy_specified_field
|
||||
test_post_object_set_invalid_success_code
|
||||
test_post_object_set_key_from_filename
|
||||
test_post_object_set_success_code
|
||||
test_post_object_success_redirect_action
|
||||
test_post_object_tags_anonymous_request
|
||||
test_post_object_tags_authenticated_request
|
||||
test_post_object_upload_larger_than_chunk
|
||||
test_post_object_upload_size_below_minimum
|
||||
test_post_object_upload_size_limit_exceeded
|
||||
test_post_object_upload_size_rgw_chunk_size_bug
|
||||
test_post_object_user_specified_header
|
||||
test_post_object_wrong_bucket
|
||||
test_put_bucket_acl_grant_group_read
|
||||
test_put_bucket_logging_account_j
|
||||
test_put_bucket_logging_account_s
|
||||
test_put_bucket_logging_extensions
|
||||
test_put_bucket_logging_policy_wildcard_objects
|
||||
test_put_bucket_logging_tenant_j
|
||||
test_put_bucket_logging_tenant_s
|
||||
test_put_bucket_ownership_bucket_owner_enforced
|
||||
test_put_bucket_ownership_bucket_owner_preferred
|
||||
test_put_bucket_ownership_object_writer
|
||||
test_put_current_object_if_match
|
||||
test_put_current_object_if_none_match
|
||||
test_put_delete_tags
|
||||
test_put_max_tags
|
||||
test_put_modify_tags
|
||||
test_put_obj_with_tags
|
||||
test_put_object_current_if_match
|
||||
test_put_object_if_match
|
||||
test_put_object_ifmatch_failed
|
||||
test_put_object_ifmatch_good
|
||||
test_put_object_ifmatch_nonexisted_failed
|
||||
test_put_object_ifmatch_overwrite_existed_good
|
||||
test_put_object_ifnonmatch_failed
|
||||
test_put_object_ifnonmatch_good
|
||||
test_put_object_ifnonmatch_nonexisted_good
|
||||
test_put_object_ifnonmatch_overwrite_existed_failed
|
||||
test_put_tags_acl_public
|
||||
test_ranged_big_request_response_code
|
||||
test_ranged_request_response_code
|
||||
test_ranged_request_return_trailing_bytes_response_code
|
||||
test_ranged_request_skip_leading_bytes_response_code
|
||||
test_read_through
|
||||
test_restore_noncur_obj
|
||||
test_restore_object_permanent
|
||||
test_restore_object_temporary
|
||||
test_set_cors
|
||||
test_sse_kms_default_post_object_authenticated_request
|
||||
test_sse_kms_default_upload_1b
|
||||
test_sse_kms_default_upload_1kb
|
||||
test_sse_kms_default_upload_1mb
|
||||
test_sse_kms_default_upload_8mb
|
||||
test_sse_kms_method_head
|
||||
test_sse_kms_multipart_invalid_chunks_1
|
||||
test_sse_kms_multipart_invalid_chunks_2
|
||||
test_sse_kms_multipart_upload
|
||||
test_sse_kms_post_object_authenticated_request
|
||||
test_sse_kms_present
|
||||
test_sse_kms_transfer_13b
|
||||
test_sse_kms_transfer_1MB
|
||||
test_sse_kms_transfer_1b
|
||||
test_sse_kms_transfer_1kb
|
||||
test_sse_s3_default_method_head
|
||||
test_sse_s3_default_multipart_upload
|
||||
test_sse_s3_default_post_object_authenticated_request
|
||||
test_sse_s3_default_upload_1b
|
||||
test_sse_s3_default_upload_1kb
|
||||
test_sse_s3_default_upload_1mb
|
||||
test_sse_s3_default_upload_8mb
|
||||
test_sse_s3_encrypted_upload_1b
|
||||
test_sse_s3_encrypted_upload_1kb
|
||||
test_sse_s3_encrypted_upload_1mb
|
||||
test_sse_s3_encrypted_upload_8mb
|
||||
test_versioned_object_acl_no_version_specified
|
||||
test_versioning_copy_obj_version
|
||||
test_versioning_multi_object_delete_with_marker_create
|
||||
test_versioning_obj_create_overwrite_multipart
|
||||
test_versioning_obj_suspended_copy
|
||||
test_versioning_stack_delete_merkers
|
||||
@@ -34,132 +34,9 @@ TEST_MODE="${TEST_MODE:-single}"
|
||||
MAXFAIL="${MAXFAIL:-1}"
|
||||
XDIST="${XDIST:-0}"
|
||||
|
||||
# =============================================================================
|
||||
# MARKEXPR: pytest marker expression to exclude test categories
|
||||
# =============================================================================
|
||||
# These markers exclude entire test categories via pytest's -m option.
|
||||
# Use MARKEXPR env var to override the default exclusions.
|
||||
#
|
||||
# Excluded categories:
|
||||
# - Unimplemented S3 features: lifecycle, versioning, s3website, bucket_logging, encryption
|
||||
# - Ceph/RGW specific tests: fails_on_aws, fails_on_rgw, fails_on_dbstore
|
||||
# - IAM features: iam_account, iam_tenant, iam_role, iam_user, iam_cross_account
|
||||
# - Other unimplemented: sns, sse_s3, storage_class, test_of_sts, webidentity_test
|
||||
# =============================================================================
|
||||
if [[ -z "${MARKEXPR:-}" ]]; then
|
||||
EXCLUDED_MARKERS=(
|
||||
# Unimplemented S3 features
|
||||
"lifecycle"
|
||||
"versioning"
|
||||
"s3website"
|
||||
"bucket_logging"
|
||||
"encryption"
|
||||
# Ceph/RGW specific tests (not standard S3)
|
||||
"fails_on_aws" # Tests for Ceph/RGW specific features (X-RGW-* headers, etc.)
|
||||
"fails_on_rgw" # Known RGW issues we don't need to replicate
|
||||
"fails_on_dbstore" # Ceph dbstore backend specific
|
||||
# IAM features requiring additional setup
|
||||
"iam_account"
|
||||
"iam_tenant"
|
||||
"iam_role"
|
||||
"iam_user"
|
||||
"iam_cross_account"
|
||||
# Other unimplemented features
|
||||
"sns" # SNS notification
|
||||
"sse_s3" # Server-side encryption with S3-managed keys
|
||||
"storage_class" # Storage class features
|
||||
"test_of_sts" # STS token service
|
||||
"webidentity_test" # Web Identity federation
|
||||
)
|
||||
# Build MARKEXPR from array: "not marker1 and not marker2 and ..."
|
||||
MARKEXPR=""
|
||||
for marker in "${EXCLUDED_MARKERS[@]}"; do
|
||||
if [[ -n "${MARKEXPR}" ]]; then
|
||||
MARKEXPR+=" and "
|
||||
fi
|
||||
MARKEXPR+="not ${marker}"
|
||||
done
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# TESTEXPR: pytest -k expression to exclude specific tests by name
|
||||
# =============================================================================
|
||||
# These patterns exclude specific tests via pytest's -k option (name matching).
|
||||
# Use TESTEXPR env var to override the default exclusions.
|
||||
#
|
||||
# Exclusion reasons are documented inline below.
|
||||
# =============================================================================
|
||||
if [[ -z "${TESTEXPR:-}" ]]; then
|
||||
EXCLUDED_TESTS=(
|
||||
# POST Object (HTML form upload) - not implemented
|
||||
"test_post_object"
|
||||
# ACL-dependent tests - ACL not implemented
|
||||
"test_bucket_list_objects_anonymous" # requires PutBucketAcl
|
||||
"test_bucket_listv2_objects_anonymous" # requires PutBucketAcl
|
||||
"test_bucket_concurrent_set_canned_acl" # ACL not implemented
|
||||
"test_expected_bucket_owner" # requires PutBucketAcl
|
||||
"test_bucket_acl" # Bucket ACL not implemented
|
||||
"test_object_acl" # Object ACL not implemented
|
||||
"test_put_bucket_acl" # PutBucketAcl not implemented
|
||||
"test_object_anon" # Anonymous access requires ACL
|
||||
"test_access_bucket" # Access control requires ACL
|
||||
"test_100_continue" # requires ACL
|
||||
# Chunked encoding - not supported
|
||||
"test_object_write_with_chunked_transfer_encoding"
|
||||
"test_object_content_encoding_aws_chunked"
|
||||
# CORS - not implemented
|
||||
"test_cors"
|
||||
"test_set_cors"
|
||||
# Presigned URL edge cases
|
||||
"test_object_raw" # Raw presigned URL tests
|
||||
# Error response format differences
|
||||
"test_bucket_create_exists" # Error format issue
|
||||
"test_bucket_recreate_not_overriding" # Error format issue
|
||||
"test_list_buckets_invalid_auth" # 401 vs 403
|
||||
"test_object_delete_key_bucket_gone" # 403 vs 404
|
||||
"test_abort_multipart_upload_not_found" # Error code issue
|
||||
# ETag conditional request edge cases
|
||||
"test_get_object_ifmatch_failed"
|
||||
"test_get_object_ifnonematch"
|
||||
# Copy operation edge cases
|
||||
"test_object_copy_to_itself" # Copy validation
|
||||
"test_object_copy_not_owned_bucket" # Cross-account access
|
||||
"test_multipart_copy_invalid_range" # Multipart validation
|
||||
# Timing-sensitive tests
|
||||
"test_versioning_concurrent_multi_object_delete"
|
||||
)
|
||||
# Build TESTEXPR from array: "not test1 and not test2 and ..."
|
||||
TESTEXPR=""
|
||||
for pattern in "${EXCLUDED_TESTS[@]}"; do
|
||||
if [[ -n "${TESTEXPR}" ]]; then
|
||||
TESTEXPR+=" and "
|
||||
fi
|
||||
TESTEXPR+="not ${pattern}"
|
||||
done
|
||||
fi
|
||||
|
||||
# Configuration file paths
|
||||
S3TESTS_CONF_TEMPLATE="${S3TESTS_CONF_TEMPLATE:-.github/s3tests/s3tests.conf}"
|
||||
S3TESTS_CONF="${S3TESTS_CONF:-s3tests.conf}"
|
||||
|
||||
# Service deployment mode: "build", "binary", "docker", or "existing"
|
||||
# - "build": Compile with cargo build --release and run (default)
|
||||
# - "binary": Use pre-compiled binary (RUSTFS_BINARY path or default)
|
||||
# - "docker": Build Docker image and run in container
|
||||
# - "existing": Use already running service (skip start, use S3_HOST and S3_PORT)
|
||||
DEPLOY_MODE="${DEPLOY_MODE:-build}"
|
||||
RUSTFS_BINARY="${RUSTFS_BINARY:-}"
|
||||
NO_CACHE="${NO_CACHE:-false}"
|
||||
|
||||
# Directories
|
||||
# Directories (define early for use in test list loading)
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
||||
ARTIFACTS_DIR="${PROJECT_ROOT}/artifacts/s3tests-${TEST_MODE}"
|
||||
CONTAINER_NAME="rustfs-${TEST_MODE}"
|
||||
NETWORK_NAME="rustfs-net"
|
||||
DATA_ROOT="${DATA_ROOT:-target}"
|
||||
DATA_DIR="${PROJECT_ROOT}/${DATA_ROOT}/test-data/${CONTAINER_NAME}"
|
||||
RUSTFS_PID=""
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
@@ -180,6 +57,137 @@ log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $*"
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Test Classification Files
|
||||
# =============================================================================
|
||||
# Tests are classified into three categories stored in text files:
|
||||
# - non_standard_tests.txt: Ceph/RGW specific tests (permanently excluded)
|
||||
# - unimplemented_tests.txt: Standard S3 features not yet implemented
|
||||
# - implemented_tests.txt: Tests that should pass on RustFS
|
||||
#
|
||||
# By default, only tests listed in implemented_tests.txt are run.
|
||||
# Use TESTEXPR env var to override and run custom test selection.
|
||||
# =============================================================================
|
||||
|
||||
# Test list files location
|
||||
TEST_LISTS_DIR="${SCRIPT_DIR}"
|
||||
IMPLEMENTED_TESTS_FILE="${TEST_LISTS_DIR}/implemented_tests.txt"
|
||||
NON_STANDARD_TESTS_FILE="${TEST_LISTS_DIR}/non_standard_tests.txt"
|
||||
UNIMPLEMENTED_TESTS_FILE="${TEST_LISTS_DIR}/unimplemented_tests.txt"
|
||||
|
||||
# =============================================================================
|
||||
# build_testexpr_from_file: Read test names from file and build pytest -k expr
|
||||
# =============================================================================
|
||||
# Reads test names from a file (one per line, ignoring comments and empty lines)
|
||||
# and builds a pytest -k expression to include only those tests.
|
||||
# =============================================================================
|
||||
build_testexpr_from_file() {
|
||||
local file="$1"
|
||||
local expr=""
|
||||
|
||||
if [[ ! -f "${file}" ]]; then
|
||||
log_error "Test list file not found: ${file}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
while IFS= read -r line || [[ -n "$line" ]]; do
|
||||
# Skip empty lines and comments
|
||||
[[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
|
||||
# Trim whitespace
|
||||
line=$(echo "$line" | xargs)
|
||||
[[ -z "$line" ]] && continue
|
||||
|
||||
if [[ -n "${expr}" ]]; then
|
||||
expr+=" or "
|
||||
fi
|
||||
expr+="${line}"
|
||||
done < "${file}"
|
||||
|
||||
echo "${expr}"
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# MARKEXPR: pytest marker expression (safety net for marker-based filtering)
|
||||
# =============================================================================
|
||||
# Even though we use file-based test selection, we keep marker exclusions
|
||||
# as a safety net to ensure no non-standard tests slip through.
|
||||
# =============================================================================
|
||||
if [[ -z "${MARKEXPR:-}" ]]; then
|
||||
# Minimal marker exclusions as safety net (file-based filtering is primary)
|
||||
MARKEXPR="not fails_on_aws and not fails_on_rgw and not fails_on_dbstore"
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# TESTEXPR: pytest -k expression to select specific tests
|
||||
# =============================================================================
|
||||
# By default, builds an inclusion expression from implemented_tests.txt.
|
||||
# Use TESTEXPR env var to override with custom selection.
|
||||
#
|
||||
# The file-based approach provides:
|
||||
# 1. Clear visibility of which tests are run
|
||||
# 2. Easy maintenance - edit txt files to add/remove tests
|
||||
# 3. Separation of concerns - test classification vs test execution
|
||||
# =============================================================================
|
||||
if [[ -z "${TESTEXPR:-}" ]]; then
|
||||
if [[ -f "${IMPLEMENTED_TESTS_FILE}" ]]; then
|
||||
log_info "Loading test list from: ${IMPLEMENTED_TESTS_FILE}"
|
||||
TESTEXPR=$(build_testexpr_from_file "${IMPLEMENTED_TESTS_FILE}")
|
||||
if [[ -z "${TESTEXPR}" ]]; then
|
||||
log_error "No tests found in ${IMPLEMENTED_TESTS_FILE}"
|
||||
exit 1
|
||||
fi
|
||||
# Count tests for logging
|
||||
TEST_COUNT=$(grep -v '^#' "${IMPLEMENTED_TESTS_FILE}" | grep -v '^[[:space:]]*$' | wc -l | xargs)
|
||||
log_info "Loaded ${TEST_COUNT} tests from implemented_tests.txt"
|
||||
else
|
||||
log_warn "Test list file not found: ${IMPLEMENTED_TESTS_FILE}"
|
||||
log_warn "Falling back to exclusion-based filtering"
|
||||
# Fallback to exclusion-based filtering if file doesn't exist
|
||||
EXCLUDED_TESTS=(
|
||||
"test_post_object"
|
||||
"test_bucket_list_objects_anonymous"
|
||||
"test_bucket_listv2_objects_anonymous"
|
||||
"test_bucket_concurrent_set_canned_acl"
|
||||
"test_bucket_acl"
|
||||
"test_object_acl"
|
||||
"test_access_bucket"
|
||||
"test_100_continue"
|
||||
"test_cors"
|
||||
"test_object_raw"
|
||||
"test_versioning"
|
||||
"test_versioned"
|
||||
)
|
||||
TESTEXPR=""
|
||||
for pattern in "${EXCLUDED_TESTS[@]}"; do
|
||||
if [[ -n "${TESTEXPR}" ]]; then
|
||||
TESTEXPR+=" and "
|
||||
fi
|
||||
TESTEXPR+="not ${pattern}"
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# Configuration file paths
|
||||
S3TESTS_CONF_TEMPLATE="${S3TESTS_CONF_TEMPLATE:-.github/s3tests/s3tests.conf}"
|
||||
S3TESTS_CONF="${S3TESTS_CONF:-s3tests.conf}"
|
||||
|
||||
# Service deployment mode: "build", "binary", "docker", or "existing"
|
||||
# - "build": Compile with cargo build --release and run (default)
|
||||
# - "binary": Use pre-compiled binary (RUSTFS_BINARY path or default)
|
||||
# - "docker": Build Docker image and run in container
|
||||
# - "existing": Use already running service (skip start, use S3_HOST and S3_PORT)
|
||||
DEPLOY_MODE="${DEPLOY_MODE:-build}"
|
||||
RUSTFS_BINARY="${RUSTFS_BINARY:-}"
|
||||
NO_CACHE="${NO_CACHE:-false}"
|
||||
|
||||
# Additional directories (SCRIPT_DIR and PROJECT_ROOT defined earlier)
|
||||
ARTIFACTS_DIR="${PROJECT_ROOT}/artifacts/s3tests-${TEST_MODE}"
|
||||
CONTAINER_NAME="rustfs-${TEST_MODE}"
|
||||
NETWORK_NAME="rustfs-net"
|
||||
DATA_ROOT="${DATA_ROOT:-target}"
|
||||
DATA_DIR="${PROJECT_ROOT}/${DATA_ROOT}/test-data/${CONTAINER_NAME}"
|
||||
RUSTFS_PID=""
|
||||
|
||||
show_usage() {
|
||||
cat << EOF
|
||||
Usage: $0 [OPTIONS]
|
||||
@@ -205,15 +213,22 @@ Environment Variables:
|
||||
S3_ALT_SECRET_KEY - Alt user secret key (default: rustfsalt)
|
||||
MAXFAIL - Stop after N failures (default: 1)
|
||||
XDIST - Enable parallel execution with N workers (default: 0)
|
||||
MARKEXPR - pytest marker expression (default: exclude unsupported features)
|
||||
TESTEXPR - pytest -k expression to filter tests by name (default: exclude unimplemented)
|
||||
MARKEXPR - pytest marker expression (default: safety net exclusions)
|
||||
TESTEXPR - pytest -k expression (default: from implemented_tests.txt)
|
||||
S3TESTS_CONF_TEMPLATE - Path to s3tests config template (default: .github/s3tests/s3tests.conf)
|
||||
S3TESTS_CONF - Path to generated s3tests config (default: s3tests.conf)
|
||||
DATA_ROOT - Root directory for test data storage (default: target)
|
||||
Final path: ${DATA_ROOT}/test-data/${CONTAINER_NAME}
|
||||
Final path: \${DATA_ROOT}/test-data/\${CONTAINER_NAME}
|
||||
|
||||
Test Classification Files (in scripts/s3-tests/):
|
||||
implemented_tests.txt - Tests that should pass (run by default)
|
||||
unimplemented_tests.txt - Standard S3 features not yet implemented
|
||||
non_standard_tests.txt - Ceph/RGW specific tests (permanently excluded)
|
||||
|
||||
Notes:
|
||||
- In build mode, if the binary exists and was compiled less than 5 minutes ago,
|
||||
- Tests are loaded from implemented_tests.txt by default
|
||||
- Set TESTEXPR to override with custom test selection
|
||||
- In build mode, if the binary exists and was compiled less than 30 minutes ago,
|
||||
compilation will be skipped unless --no-cache is specified.
|
||||
|
||||
Examples:
|
||||
|
||||
191
scripts/s3-tests/unimplemented_tests.txt
Normal file
191
scripts/s3-tests/unimplemented_tests.txt
Normal file
@@ -0,0 +1,191 @@
|
||||
# Unimplemented S3 feature tests
|
||||
# ==============================
|
||||
#
|
||||
# These tests cover STANDARD S3 features not yet implemented in RustFS.
|
||||
# They are TEMPORARILY EXCLUDED and should be enabled as features are added.
|
||||
#
|
||||
# Unimplemented features:
|
||||
# - Versioning: Object versioning support
|
||||
# - Lifecycle: Object lifecycle management
|
||||
# - S3 Website: Static website hosting
|
||||
# - Bucket Logging: Access logging
|
||||
# - SSE-S3: Server-side encryption with S3-managed keys
|
||||
# - Object Lock: WORM protection
|
||||
# - IAM: Identity and Access Management roles/users
|
||||
# - SNS: Event notifications
|
||||
# - STS: Security Token Service
|
||||
# - Checksum: Full checksum validation
|
||||
# - Conditional writes: If-Match/If-None-Match for writes
|
||||
# - Object ownership: BucketOwnerEnforced/Preferred
|
||||
#
|
||||
# Total: all unimplemented S3 feature tests listed below (keep this comment in sync with the list)
|
||||
|
||||
test_bucket_create_delete_bucket_ownership
|
||||
test_bucket_logging_owner
|
||||
test_bucket_policy_deny_self_denied_policy
|
||||
test_bucket_policy_deny_self_denied_policy_confirm_header
|
||||
test_bucket_policy_put_obj_kms_s3
|
||||
test_bucket_policy_put_obj_s3_kms
|
||||
test_copy_enc
|
||||
test_copy_part_enc
|
||||
test_delete_bucket_encryption_kms
|
||||
test_delete_bucket_encryption_s3
|
||||
test_encryption_key_no_sse_c
|
||||
test_encryption_sse_c_invalid_md5
|
||||
test_encryption_sse_c_method_head
|
||||
test_encryption_sse_c_multipart_bad_download
|
||||
test_encryption_sse_c_no_key
|
||||
test_encryption_sse_c_no_md5
|
||||
test_encryption_sse_c_other_key
|
||||
test_encryption_sse_c_present
|
||||
test_get_bucket_encryption_kms
|
||||
test_get_bucket_encryption_s3
|
||||
test_get_versioned_object_attributes
|
||||
test_lifecycle_delete
|
||||
test_lifecycle_expiration_days0
|
||||
test_lifecycle_expiration_header_put
|
||||
test_lifecycle_get
|
||||
test_lifecycle_get_no_id
|
||||
test_lifecycle_id_too_long
|
||||
test_lifecycle_invalid_status
|
||||
test_lifecycle_plain_null_version_current_transition
|
||||
test_lifecycle_same_id
|
||||
test_lifecycle_set
|
||||
test_lifecycle_set_date
|
||||
test_lifecycle_set_deletemarker
|
||||
test_lifecycle_set_empty_filter
|
||||
test_lifecycle_set_filter
|
||||
test_lifecycle_set_invalid_date
|
||||
test_lifecycle_set_multipart
|
||||
test_lifecycle_set_noncurrent
|
||||
test_lifecycle_set_noncurrent_transition
|
||||
test_lifecycle_transition_encrypted
|
||||
test_lifecycle_transition_set_invalid_date
|
||||
test_object_checksum_crc64nvme
|
||||
test_object_checksum_sha256
|
||||
test_object_lock_get_legal_hold_invalid_bucket
|
||||
test_object_lock_get_obj_lock_invalid_bucket
|
||||
test_object_lock_get_obj_retention_invalid_bucket
|
||||
test_object_lock_put_legal_hold_invalid_bucket
|
||||
test_object_lock_put_obj_lock_enable_after_create
|
||||
test_object_lock_put_obj_lock_invalid_bucket
|
||||
test_object_lock_put_obj_retention_invalid_bucket
|
||||
test_post_object_upload_checksum
|
||||
test_put_bucket_encryption_kms
|
||||
test_put_bucket_encryption_s3
|
||||
test_put_bucket_logging
|
||||
test_put_bucket_logging_errors
|
||||
test_put_bucket_logging_permissions
|
||||
test_put_bucket_logging_policy_wildcard
|
||||
test_put_obj_enc_conflict_bad_enc_kms
|
||||
test_put_obj_enc_conflict_c_kms
|
||||
test_put_obj_enc_conflict_c_s3
|
||||
test_put_obj_enc_conflict_s3_kms
|
||||
test_rm_bucket_logging
|
||||
test_sse_kms_no_key
|
||||
test_sse_kms_not_declared
|
||||
test_sse_kms_read_declare
|
||||
test_versioned_concurrent_object_create_and_remove
|
||||
test_versioned_concurrent_object_create_concurrent_remove
|
||||
test_versioned_object_acl
|
||||
test_versioning_bucket_atomic_upload_return_version_id
|
||||
test_versioning_bucket_create_suspend
|
||||
test_versioning_bucket_multipart_upload_return_version_id
|
||||
test_versioning_concurrent_multi_object_delete
|
||||
test_versioning_multi_object_delete
|
||||
test_versioning_multi_object_delete_with_marker
|
||||
test_versioning_obj_create_read_remove
|
||||
test_versioning_obj_create_read_remove_head
|
||||
test_versioning_obj_create_versions_remove_all
|
||||
test_versioning_obj_create_versions_remove_special_names
|
||||
test_versioning_obj_list_marker
|
||||
test_versioning_obj_plain_null_version_overwrite
|
||||
test_versioning_obj_plain_null_version_overwrite_suspended
|
||||
test_versioning_obj_plain_null_version_removal
|
||||
test_versioning_obj_suspend_versions
|
||||
|
||||
# Teardown issues (list_object_versions on non-versioned buckets)
|
||||
test_bucket_list_delimiter_alt
|
||||
test_bucket_list_delimiter_basic
|
||||
test_bucket_list_delimiter_dot
|
||||
test_bucket_list_delimiter_empty
|
||||
test_bucket_list_delimiter_none
|
||||
test_bucket_list_delimiter_not_exist
|
||||
test_bucket_list_delimiter_percentage
|
||||
test_bucket_list_delimiter_prefix_ends_with_delimiter
|
||||
test_bucket_list_delimiter_unreadable
|
||||
test_bucket_list_delimiter_whitespace
|
||||
test_bucket_list_encoding_basic
|
||||
test_bucket_listv2_delimiter_alt
|
||||
test_bucket_listv2_delimiter_basic
|
||||
test_bucket_listv2_delimiter_dot
|
||||
test_bucket_listv2_delimiter_empty
|
||||
test_bucket_listv2_delimiter_none
|
||||
test_bucket_listv2_delimiter_not_exist
|
||||
test_bucket_listv2_delimiter_percentage
|
||||
test_bucket_listv2_delimiter_prefix_ends_with_delimiter
|
||||
test_bucket_listv2_delimiter_unreadable
|
||||
test_bucket_listv2_delimiter_whitespace
|
||||
test_bucket_listv2_encoding_basic
|
||||
|
||||
# Checksum and atomic write tests (require x-amz-checksum-* support)
|
||||
test_atomic_dual_write_1mb
|
||||
test_atomic_dual_write_4mb
|
||||
test_atomic_dual_write_8mb
|
||||
test_atomic_multipart_upload_write
|
||||
test_atomic_read_1mb
|
||||
test_atomic_read_4mb
|
||||
test_atomic_read_8mb
|
||||
test_atomic_write_1mb
|
||||
test_atomic_write_4mb
|
||||
test_atomic_write_8mb
|
||||
test_set_bucket_tagging
|
||||
|
||||
# Tests with implementation issues (need investigation)
|
||||
test_bucket_policy_acl
|
||||
test_bucket_policy_different_tenant
|
||||
test_bucketv2_policy_acl
|
||||
test_multipart_resend_first_finishes_last
|
||||
|
||||
# Multipart abort and policy issues
|
||||
test_abort_multipart_upload
|
||||
test_bucket_policy_multipart
|
||||
|
||||
# Tests with prefix conflicts or ACL/tenant dependencies
|
||||
test_bucket_policy
|
||||
test_bucket_policy_allow_notprincipal
|
||||
test_bucket_policy_another_bucket
|
||||
test_bucket_policy_put_obj_acl
|
||||
test_bucket_policy_put_obj_grant
|
||||
test_bucket_policy_tenanted_bucket
|
||||
test_bucketv2_policy
|
||||
test_object_presigned_put_object_with_acl
|
||||
test_object_presigned_put_object_with_acl_tenant
|
||||
test_object_put_acl_mtime
|
||||
|
||||
# ACL-dependent tests (PutBucketAcl not implemented)
|
||||
test_block_public_object_canned_acls
|
||||
test_block_public_put_bucket_acls
|
||||
test_get_authpublic_acl_bucket_policy_status
|
||||
test_get_nonpublicpolicy_acl_bucket_policy_status
|
||||
test_get_public_acl_bucket_policy_status
|
||||
test_get_publicpolicy_acl_bucket_policy_status
|
||||
test_ignore_public_acls
|
||||
|
||||
# PublicAccessBlock and tag validation tests
|
||||
test_block_public_policy
|
||||
test_block_public_policy_with_principal
|
||||
test_get_obj_head_tagging
|
||||
test_get_public_block_deny_bucket_policy
|
||||
test_get_undefined_public_block
|
||||
test_put_excess_key_tags
|
||||
test_put_excess_tags
|
||||
test_put_excess_val_tags
|
||||
test_put_get_delete_public_block
|
||||
test_put_public_block
|
||||
test_set_get_del_bucket_policy
|
||||
|
||||
# Object attributes and torrent tests
|
||||
test_create_bucket_no_ownership_controls
|
||||
test_get_checksum_object_attributes
|
||||
test_get_object_torrent
|
||||
Reference in New Issue
Block a user