mod common;
use bucketwarden_s3::S3HttpRequest;
use common::*;
#[test]
fn addressing_depth_supports_path_and_virtual_host_buckets() {
let mut runtime = runtime();
let path_bucket = runtime
.handle_s3_http(
S3HttpRequest::new("alice", "PUT", "/archive-path")
.with_header("host", "s3.bucketwarden.test"),
)
.expect("path bucket");
assert_eq!(path_bucket.status, 200);
let path_put = runtime
.handle_s3_http(
S3HttpRequest::new("alice", "PUT", "/archive-path/path.txt")
.with_header("host", "s3.bucketwarden.test")
.with_body(b"path".to_vec()),
)
.expect("path put");
assert_eq!(path_put.status, 200);
let virtual_bucket = runtime
.handle_s3_http(
S3HttpRequest::new("alice", "PUT", "/")
.with_header("host", "archive-vhost.s3.bucketwarden.test"),
)
.expect("virtual bucket");
assert_eq!(virtual_bucket.status, 200);
let virtual_put = runtime
.handle_s3_http(
S3HttpRequest::new("alice", "PUT", "/records/vhost.txt")
.with_header("host", "archive-vhost.s3.bucketwarden.test")
.with_body(b"virtual".to_vec()),
)
.expect("virtual put");
assert_eq!(virtual_put.status, 200);
let virtual_get = runtime
.handle_s3_http(
S3HttpRequest::new("alice", "GET", "/records/vhost.txt")
.with_header("host", "archive-vhost.s3.bucketwarden.test"),
)
.expect("virtual get");
assert_eq!(virtual_get.body, b"virtual");
}
#[test]
fn addressing_depth_enforces_dns_bucket_name_validation() {
let mut runtime = runtime();
for (host, expected_status) in [
("valid-bucket.s3.bucketwarden.test", 200),
("-bad.s3.bucketwarden.test", 400),
("bad-.s3.bucketwarden.test", 400),
("BadUpper.s3.bucketwarden.test", 400),
] {
let response = runtime
.handle_s3_http(S3HttpRequest::new("alice", "PUT", "/").with_header("host", host))
.expect("bucket create");
assert_eq!(response.status, expected_status, "{host}");
}
let invalid = runtime
.handle_s3_http(
S3HttpRequest::new("alice", "PUT", "/bad_bucket")
.with_header("host", "s3.bucketwarden.test"),
)
.expect("invalid path bucket");
assert_error_response(&invalid, 400, "InvalidBucketName", false);
}