test(e2e): tighten control character rejection oracle (#6561)

This commit is contained in:
Zhengchao An
2026-08-25 04:34:35 +08:00
committed by GitHub
parent 619f0fd9e8
commit 40f1356831
+22 -16
View File
@@ -28,6 +28,7 @@
mod tests { mod tests {
use crate::common::{RustFSTestEnvironment, init_logging, local_http_client}; use crate::common::{RustFSTestEnvironment, init_logging, local_http_client};
use aws_sdk_s3::Client; use aws_sdk_s3::Client;
use aws_sdk_s3::error::ProvideErrorMetadata;
use aws_sdk_s3::primitives::ByteStream; use aws_sdk_s3::primitives::ByteStream;
use http::StatusCode; use http::StatusCode;
use http::header::HOST; use http::header::HOST;
@@ -731,12 +732,7 @@ mod tests {
create_bucket(&client, bucket).await.expect("Failed to create bucket"); create_bucket(&client, bucket).await.expect("Failed to create bucket");
// Test that control characters are rejected // Test that control characters are rejected
let invalid_keys = vec![ let invalid_keys = ["file\0with\0null.txt", "file\nwith\nnewline.txt", "file\rwith\rcarriage.txt"];
"file\0with\0null.txt",
"file\nwith\nnewline.txt",
"file\rwith\rcarriage.txt",
"file\twith\ttab.txt", // Tab might be allowed, but let's test
];
for key in invalid_keys { for key in invalid_keys {
info!("Testing rejection of control character in key: {:?}", key); info!("Testing rejection of control character in key: {:?}", key);
@@ -747,18 +743,28 @@ mod tests {
.key(key) .key(key)
.body(ByteStream::from_static(b"test")) .body(ByteStream::from_static(b"test"))
.send() .send()
.await; .await
.expect_err("invalid control characters must be rejected by the server");
// Note: The validation happens on the server side, so we expect an error assert_eq!(
// For null byte, newline, and carriage return result.raw_response().map(|response| response.status().as_u16()),
if key.contains('\0') || key.contains('\n') || key.contains('\r') { Some(400),
assert!(result.is_err(), "Control character should be rejected for key: {key:?}"); "control character must return HTTP 400 for key {key:?}: {result:?}"
if let Err(e) = result { );
info!("✅ Control character correctly rejected: {:?}", e); assert_eq!(
} result.as_service_error().and_then(ProvideErrorMetadata::code),
} Some("InvalidArgument"),
"control character must return InvalidArgument for key {key:?}: {result:?}"
);
} }
let listed = client
.list_objects_v2()
.bucket(bucket)
.send()
.await
.expect("server must remain healthy after rejected requests");
assert!(listed.contents().is_empty(), "rejected requests must not create objects");
// Cleanup // Cleanup
env.stop_server(); env.stop_server();
info!("Test completed successfully"); info!("Test completed successfully");