in avro/src/schema.rs [5941:6048]
fn test_avro_3837_disallow_invalid_namespace() -> TestResult {
// Valid namespace #1 (Single name portion)
let schema_str = r#"
{
"name": "record1",
"namespace": "ns1",
"type": "record",
"fields": []
}
"#;
let expected = r#"{"name":"ns1.record1","type":"record","fields":[]}"#;
let schema = Schema::parse_str(schema_str)?;
let canonical_form = schema.canonical_form();
assert_eq!(canonical_form, expected);
// Valid namespace #2 (multiple name portions).
let schema_str = r#"
{
"name": "enum1",
"namespace": "ns1.foo.bar",
"type": "enum",
"symbols": ["a"]
}
"#;
let expected = r#"{"name":"ns1.foo.bar.enum1","type":"enum","symbols":["a"]}"#;
let schema = Schema::parse_str(schema_str)?;
let canonical_form = schema.canonical_form();
assert_eq!(canonical_form, expected);
// Invalid namespace #1 (a name portion starts with dot)
let schema_str = r#"
{
"name": "fixed1",
"namespace": ".ns1.a.b",
"type": "fixed",
"size": 1
}
"#;
match Schema::parse_str(schema_str) {
Err(Error::InvalidNamespace(_, _)) => (),
other => return Err(format!("Expected Error::InvalidNamespace, got {other:?}").into()),
};
// Invalid namespace #2 (invalid character in a name portion)
let schema_str = r#"
{
"name": "record1",
"namespace": "ns1.a*b.c",
"type": "record",
"fields": []
}
"#;
match Schema::parse_str(schema_str) {
Err(Error::InvalidNamespace(_, _)) => (),
other => return Err(format!("Expected Error::InvalidNamespace, got {other:?}").into()),
};
// Invalid namespace #3 (a name portion starts with a digit)
let schema_str = r#"
{
"name": "fixed1",
"namespace": "ns1.1a.b",
"type": "fixed",
"size": 1
}
"#;
match Schema::parse_str(schema_str) {
Err(Error::InvalidNamespace(_, _)) => (),
other => return Err(format!("Expected Error::InvalidNamespace, got {other:?}").into()),
};
// Invalid namespace #4 (a name portion is missing - two dots in a row)
let schema_str = r#"
{
"name": "fixed1",
"namespace": "ns1..a",
"type": "fixed",
"size": 1
}
"#;
match Schema::parse_str(schema_str) {
Err(Error::InvalidNamespace(_, _)) => (),
other => return Err(format!("Expected Error::InvalidNamespace, got {other:?}").into()),
};
// Invalid namespace #5 (a name portion is missing - ends with a dot)
let schema_str = r#"
{
"name": "fixed1",
"namespace": "ns1.a.",
"type": "fixed",
"size": 1
}
"#;
match Schema::parse_str(schema_str) {
Err(Error::InvalidNamespace(_, _)) => (),
other => return Err(format!("Expected Error::InvalidNamespace, got {other:?}").into()),
};
Ok(())
}