diff --git a/rustfs/src/admin/handlers/bucket_meta.rs b/rustfs/src/admin/handlers/bucket_meta.rs index be7295801..8f48bde20 100644 --- a/rustfs/src/admin/handlers/bucket_meta.rs +++ b/rustfs/src/admin/handlers/bucket_meta.rs @@ -1013,6 +1013,66 @@ mod imported_config_apply_tests { } } + #[test] + fn g_d3_005_new_writer_backup_payloads_pass_old_import_validators() { + // Captured from the gateway persistence writers at a16e94426b36c6a454dc200a5639c711b590e1eb. + // Keep these bytes independent of RustFS's old serializer so rollback drift stays visible. + let new_writer_payloads: [(&str, &[u8]); 7] = [ + ( + BUCKET_NOTIFICATION_CONFIG, + b"", + ), + ( + BUCKET_LIFECYCLE_CONFIG, + b"30logs/expireEnabled", + ), + ( + BUCKET_SSECONFIG, + b"AES256", + ), + ( + BUCKET_TAGGING_CONFIG, + b"teamstorage", + ), + ( + OBJECT_LOCK_CONFIG, + b"Enabled", + ), + ( + BUCKET_VERSIONING_CONFIG, + b"Enabled", + ), + ( + BUCKET_REPLICATION_CONFIG, + b"arn:aws:iam::123456789012:role/replicationDisabledarn:aws:s3:::backup1Enabled", + ), + ]; + + let imported_xml_cases = import_cases() + .into_iter() + .filter(|case| case.conf_name != BUCKET_TARGETS_FILE) + .collect::>(); + assert_eq!(new_writer_payloads.len(), imported_xml_cases.len()); + assert!( + imported_xml_cases + .iter() + .all(|case| new_writer_payloads.iter().any(|(name, _)| *name == case.conf_name)) + ); + + let mut metadatas = imported_bucket(); + for (conf_name, payload) in new_writer_payloads { + assert!( + apply_imported_bucket_config(&mut metadatas, BUCKET, conf_name, payload.to_vec(), imported_at()) + .unwrap_or_else(|error| panic!("new-writer {conf_name} must pass the old import validator: {error}")) + ); + let case = imported_xml_cases + .iter() + .find(|case| case.conf_name == conf_name) + .unwrap_or_else(|| panic!("{conf_name} must have an import mapping")); + assert_eq!((case.payload)(&metadatas[BUCKET]), payload); + } + } + #[test] fn a_rejected_payload_leaves_the_field_untouched() { for case in import_cases() {