You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by mg...@apache.org on 2023/05/29 18:09:39 UTC
[avro] 01/01: Print friendlier error messages in the tests
This is an automated email from the ASF dual-hosted git repository.
mgrigorov pushed a commit to branch better-error-messages-in-tests
in repository https://gitbox.apache.org/repos/asf/avro.git
commit a269b4da6b37087d9d7ba43b144a39a82a20d2da
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
AuthorDate: Mon May 29 21:09:07 2023 +0300
Print friendlier error messages in the tests
Signed-off-by: Martin Tzvetanov Grigorov <mg...@apache.org>
---
lang/rust/Cargo.lock | 1 +
lang/rust/avro/examples/benchmark.rs | 5 +-
lang/rust/avro/examples/generate_interop_data.rs | 5 +-
lang/rust/avro/examples/test_interop_data.rs | 3 +-
lang/rust/avro/src/codec.rs | 35 +-
lang/rust/avro/src/de.rs | 77 ++--
lang/rust/avro/src/decimal.rs | 13 +-
lang/rust/avro/src/decode.rs | 75 ++--
lang/rust/avro/src/reader.rs | 93 ++--
lang/rust/avro/src/schema.rs | 531 ++++++++++++++---------
lang/rust/avro/src/schema_compatibility.rs | 58 +--
lang/rust/avro/src/ser.rs | 55 ++-
lang/rust/avro/src/types.rs | 223 ++++++----
lang/rust/avro/src/util.rs | 7 +-
lang/rust/avro/src/writer.rs | 204 +++++----
lang/rust/avro/tests/append_to_existing.rs | 5 +-
lang/rust/avro/tests/io.rs | 95 ++--
lang/rust/avro_test_helper/Cargo.toml | 1 +
lang/rust/avro_test_helper/src/lib.rs | 16 +
19 files changed, 907 insertions(+), 595 deletions(-)
diff --git a/lang/rust/Cargo.lock b/lang/rust/Cargo.lock
index 19731f011..9b138c241 100644
--- a/lang/rust/Cargo.lock
+++ b/lang/rust/Cargo.lock
@@ -98,6 +98,7 @@ dependencies = [
name = "apache-avro-test-helper"
version = "0.15.0"
dependencies = [
+ "anyhow",
"color-backtrace",
"ctor 0.2.0",
"env_logger",
diff --git a/lang/rust/avro/examples/benchmark.rs b/lang/rust/avro/examples/benchmark.rs
index 4cf0f1365..c3eac4313 100644
--- a/lang/rust/avro/examples/benchmark.rs
+++ b/lang/rust/avro/examples/benchmark.rs
@@ -20,6 +20,7 @@ use apache_avro::{
types::{Record, Value},
Reader, Writer,
};
+use apache_avro_test_helper::TestResult;
use std::{
io::{BufReader, BufWriter},
time::{Duration, Instant},
@@ -45,7 +46,7 @@ fn benchmark(
big_or_small: &str,
count: usize,
runs: usize,
-) -> anyhow::Result<()> {
+) -> TestResult {
let mut records = Vec::new();
for __ in 0..count {
records.push(record.clone());
@@ -100,7 +101,7 @@ fn benchmark(
Ok(())
}
-fn main() -> anyhow::Result<()> {
+fn main() -> TestResult {
let raw_small_schema = r#"
{"namespace": "test", "type": "record", "name": "Test", "fields": [{"type": {"type": "string"}, "name": "field"}]}
"#;
diff --git a/lang/rust/avro/examples/generate_interop_data.rs b/lang/rust/avro/examples/generate_interop_data.rs
index 72b4d10b2..35a6dc7c0 100644
--- a/lang/rust/avro/examples/generate_interop_data.rs
+++ b/lang/rust/avro/examples/generate_interop_data.rs
@@ -20,6 +20,7 @@ use apache_avro::{
types::{Record, Value},
Codec, Writer,
};
+use apache_avro_test_helper::TestResult;
use std::{
collections::HashMap,
io::{BufWriter, Write},
@@ -74,7 +75,7 @@ fn create_datum(schema: &Schema) -> Record {
datum
}
-fn main() -> anyhow::Result<()> {
+fn main() -> TestResult {
let schema_str = std::fs::read_to_string("../../share/test/schemas/interop.avsc")
.expect("Unable to read the interop Avro schema");
let schema = Schema::parse_str(schema_str.as_str())?;
@@ -104,7 +105,7 @@ fn main() -> anyhow::Result<()> {
Ok(())
}
-fn write_user_metadata<W: Write>(writer: &mut Writer<BufWriter<W>>) -> anyhow::Result<()> {
+fn write_user_metadata<W: Write>(writer: &mut Writer<BufWriter<W>>) -> TestResult {
writer.add_user_metadata("user_metadata".to_string(), b"someByteArray")?;
Ok(())
diff --git a/lang/rust/avro/examples/test_interop_data.rs b/lang/rust/avro/examples/test_interop_data.rs
index 611c0e192..736b1fd7d 100644
--- a/lang/rust/avro/examples/test_interop_data.rs
+++ b/lang/rust/avro/examples/test_interop_data.rs
@@ -16,13 +16,14 @@
// under the License.
use apache_avro::Reader;
+use apache_avro_test_helper::TestResult;
use std::{
collections::HashMap,
ffi::OsStr,
io::{BufReader, Read},
};
-fn main() -> anyhow::Result<()> {
+fn main() -> TestResult {
let mut expected_user_metadata: HashMap<String, Vec<u8>> = HashMap::new();
expected_user_metadata.insert("user_metadata".to_string(), b"someByteArray".to_vec());
diff --git a/lang/rust/avro/src/codec.rs b/lang/rust/avro/src/codec.rs
index 0866ff62d..c34da0bfc 100644
--- a/lang/rust/avro/src/codec.rs
+++ b/lang/rust/avro/src/codec.rs
@@ -186,55 +186,58 @@ impl Codec {
mod tests {
use super::*;
use pretty_assertions::{assert_eq, assert_ne};
+ use apache_avro_test_helper::TestResult;
const INPUT: &[u8] = b"theanswertolifetheuniverseandeverythingis42theanswertolifetheuniverseandeverythingis4theanswertolifetheuniverseandeverythingis2";
#[test]
- fn null_compress_and_decompress() {
+ fn null_compress_and_decompress() -> TestResult {
let codec = Codec::Null;
let mut stream = INPUT.to_vec();
- codec.compress(&mut stream).unwrap();
+ codec.compress(&mut stream)?;
assert_eq!(INPUT, stream.as_slice());
- codec.decompress(&mut stream).unwrap();
+ codec.decompress(&mut stream)?;
assert_eq!(INPUT, stream.as_slice());
+ Ok(())
}
#[test]
- fn deflate_compress_and_decompress() {
- compress_and_decompress(Codec::Deflate);
+ fn deflate_compress_and_decompress()-> TestResult {
+ compress_and_decompress(Codec::Deflate)
}
#[cfg(feature = "snappy")]
#[test]
- fn snappy_compress_and_decompress() {
- compress_and_decompress(Codec::Snappy);
+ fn snappy_compress_and_decompress()-> TestResult {
+ compress_and_decompress(Codec::Snappy)
}
#[cfg(feature = "zstandard")]
#[test]
- fn zstd_compress_and_decompress() {
- compress_and_decompress(Codec::Zstandard);
+ fn zstd_compress_and_decompress()-> TestResult {
+ compress_and_decompress(Codec::Zstandard)
}
#[cfg(feature = "bzip")]
#[test]
- fn bzip_compress_and_decompress() {
- compress_and_decompress(Codec::Bzip2);
+ fn bzip_compress_and_decompress()-> TestResult {
+ compress_and_decompress(Codec::Bzip2)
}
#[cfg(feature = "xz")]
#[test]
- fn xz_compress_and_decompress() {
- compress_and_decompress(Codec::Xz);
+ fn xz_compress_and_decompress()-> TestResult {
+ compress_and_decompress(Codec::Xz)
}
- fn compress_and_decompress(codec: Codec) {
+ fn compress_and_decompress(codec: Codec) -> TestResult {
let mut stream = INPUT.to_vec();
- codec.compress(&mut stream).unwrap();
+ codec.compress(&mut stream)?;
assert_ne!(INPUT, stream.as_slice());
assert!(INPUT.len() > stream.len());
- codec.decompress(&mut stream).unwrap();
+ codec.decompress(&mut stream)?;
assert_eq!(INPUT, stream.as_slice());
+ Ok(())
}
#[test]
diff --git a/lang/rust/avro/src/de.rs b/lang/rust/avro/src/de.rs
index a1b52e6c5..a2e7a0e52 100644
--- a/lang/rust/avro/src/de.rs
+++ b/lang/rust/avro/src/de.rs
@@ -654,6 +654,8 @@ mod tests {
use std::sync::atomic::Ordering;
use uuid::Uuid;
+ use apache_avro_test_helper::TestResult;
+
use super::*;
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
@@ -749,7 +751,7 @@ mod tests {
}
#[test]
- fn test_from_value() {
+ fn test_from_value() -> TestResult {
let test = Value::Record(vec![
("a".to_owned(), Value::Long(27)),
("b".to_owned(), Value::String("foo".to_owned())),
@@ -758,7 +760,7 @@ mod tests {
a: 27,
b: "foo".to_owned(),
};
- let final_value: Test = from_value(&test).unwrap();
+ let final_value: Test = from_value(&test)?;
assert_eq!(final_value, expected);
let test_inner = Value::Record(vec![
@@ -773,18 +775,20 @@ mod tests {
]);
let expected_inner = TestInner { a: expected, b: 35 };
- let final_value: TestInner = from_value(&test_inner).unwrap();
- assert_eq!(final_value, expected_inner)
+ let final_value: TestInner = from_value(&test_inner)?;
+ assert_eq!(final_value, expected_inner);
+
+ Ok(())
}
#[test]
- fn test_from_value_unit_enum() {
+ fn test_from_value_unit_enum() -> TestResult {
let expected = TestUnitExternalEnum {
a: UnitExternalEnum::Val1,
};
let test = Value::Record(vec![("a".to_owned(), Value::Enum(0, "Val1".to_owned()))]);
- let final_value: TestUnitExternalEnum = from_value(&test).unwrap();
+ let final_value: TestUnitExternalEnum = from_value(&test)?;
assert_eq!(
final_value, expected,
"Error deserializing unit external enum"
@@ -798,7 +802,7 @@ mod tests {
"a".to_owned(),
Value::Record(vec![("t".to_owned(), Value::String("Val1".to_owned()))]),
)]);
- let final_value: TestUnitInternalEnum = from_value(&test).unwrap();
+ let final_value: TestUnitInternalEnum = from_value(&test)?;
assert_eq!(
final_value, expected,
"Error deserializing unit internal enum"
@@ -811,7 +815,7 @@ mod tests {
"a".to_owned(),
Value::Record(vec![("t".to_owned(), Value::String("Val1".to_owned()))]),
)]);
- let final_value: TestUnitAdjacentEnum = from_value(&test).unwrap();
+ let final_value: TestUnitAdjacentEnum = from_value(&test)?;
assert_eq!(
final_value, expected,
"Error deserializing unit adjacent enum"
@@ -821,15 +825,16 @@ mod tests {
};
let test = Value::Record(vec![("a".to_owned(), Value::Null)]);
- let final_value: TestUnitUntaggedEnum = from_value(&test).unwrap();
+ let final_value: TestUnitUntaggedEnum = from_value(&test)?;
assert_eq!(
final_value, expected,
"Error deserializing unit untagged enum"
);
+ Ok(())
}
#[test]
- fn avro_3645_3646_test_from_value_enum() {
+ fn avro_3645_3646_test_from_value_enum() -> TestResult {
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
struct TestNullExternalEnum {
a: NullExternalEnum,
@@ -901,13 +906,15 @@ mod tests {
];
for (expected, test) in data.iter() {
- let actual: TestNullExternalEnum = from_value(test).unwrap();
+ let actual: TestNullExternalEnum = from_value(test)?;
assert_eq!(actual, *expected);
}
+
+ Ok(())
}
#[test]
- fn test_from_value_single_value_enum() {
+ fn test_from_value_single_value_enum() -> TestResult {
let expected = TestSingleValueExternalEnum {
a: SingleValueExternalEnum::Double(64.0),
};
@@ -922,15 +929,17 @@ mod tests {
),
]),
)]);
- let final_value: TestSingleValueExternalEnum = from_value(&test).unwrap();
+ let final_value: TestSingleValueExternalEnum = from_value(&test)?;
assert_eq!(
final_value, expected,
"Error deserializing single value external enum(union)"
);
+
+ Ok(())
}
#[test]
- fn test_from_value_struct_enum() {
+ fn test_from_value_struct_enum() -> TestResult {
let expected = TestStructExternalEnum {
a: StructExternalEnum::Val1 { x: 1.0, y: 2.0 },
};
@@ -951,15 +960,17 @@ mod tests {
),
]),
)]);
- let final_value: TestStructExternalEnum = from_value(&test).unwrap();
+ let final_value: TestStructExternalEnum = from_value(&test)?;
assert_eq!(
final_value, expected,
"error deserializing struct external enum(union)"
);
+
+ Ok(())
}
#[test]
- fn test_avro_3692_from_value_struct_flatten() {
+ fn test_avro_3692_from_value_struct_flatten() -> TestResult {
#[derive(Deserialize, PartialEq, Debug)]
struct S1 {
f1: String,
@@ -981,12 +992,14 @@ mod tests {
("f1".to_owned(), "Hello".into()),
("f2".to_owned(), "World".into()),
]);
- let final_value: S1 = from_value(&test).unwrap();
+ let final_value: S1 = from_value(&test)?;
assert_eq!(final_value, expected);
+
+ Ok(())
}
#[test]
- fn test_from_value_tuple_enum() {
+ fn test_from_value_tuple_enum() -> TestResult {
let expected = TestTupleExternalEnum {
a: TupleExternalEnum::Val1(1.0, 2.0),
};
@@ -1004,17 +1017,17 @@ mod tests {
),
]),
)]);
- let final_value: TestTupleExternalEnum = from_value(&test).unwrap();
+ let final_value: TestTupleExternalEnum = from_value(&test)?;
assert_eq!(
final_value, expected,
"error serializing tuple external enum(union)"
);
- }
- type TestResult<T> = anyhow::Result<T, Box<dyn std::error::Error>>;
+ Ok(())
+ }
#[test]
- fn test_date() -> TestResult<()> {
+ fn test_date() -> TestResult {
let raw_value = 1;
let value = Value::Date(raw_value);
let result = crate::from_value::<i32>(&value)?;
@@ -1023,7 +1036,7 @@ mod tests {
}
#[test]
- fn test_time_millis() -> TestResult<()> {
+ fn test_time_millis() -> TestResult {
let raw_value = 1;
let value = Value::TimeMillis(raw_value);
let result = crate::from_value::<i32>(&value)?;
@@ -1032,7 +1045,7 @@ mod tests {
}
#[test]
- fn test_time_micros() -> TestResult<()> {
+ fn test_time_micros() -> TestResult {
let raw_value = 1;
let value = Value::TimeMicros(raw_value);
let result = crate::from_value::<i64>(&value)?;
@@ -1041,7 +1054,7 @@ mod tests {
}
#[test]
- fn test_timestamp_millis() -> TestResult<()> {
+ fn test_timestamp_millis() -> TestResult {
let raw_value = 1;
let value = Value::TimestampMillis(raw_value);
let result = crate::from_value::<i64>(&value)?;
@@ -1050,7 +1063,7 @@ mod tests {
}
#[test]
- fn test_timestamp_micros() -> TestResult<()> {
+ fn test_timestamp_micros() -> TestResult {
let raw_value = 1;
let value = Value::TimestampMicros(raw_value);
let result = crate::from_value::<i64>(&value)?;
@@ -1059,16 +1072,16 @@ mod tests {
}
#[test]
- fn test_from_value_uuid_str() -> TestResult<()> {
+ fn test_from_value_uuid_str() -> TestResult {
let raw_value = "9ec535ff-3e2a-45bd-91d3-0a01321b5a49";
- let value = Value::Uuid(Uuid::parse_str(raw_value).unwrap());
+ let value = Value::Uuid(Uuid::parse_str(raw_value)?);
let result = crate::from_value::<Uuid>(&value)?;
assert_eq!(result.to_string(), raw_value);
Ok(())
}
#[test]
- fn test_from_value_uuid_slice() -> TestResult<()> {
+ fn test_from_value_uuid_slice() -> TestResult {
let raw_value = &[4, 54, 67, 12, 43, 2, 2, 76, 32, 50, 87, 5, 1, 33, 43, 87];
let value = Value::Uuid(Uuid::from_slice(raw_value)?);
let result = crate::from_value::<Uuid>(&value)?;
@@ -1077,7 +1090,7 @@ mod tests {
}
#[test]
- fn test_from_value_with_union() -> TestResult<()> {
+ fn test_from_value_with_union() -> TestResult {
// AVRO-3232 test for deserialize_any on missing fields on the destination struct:
// Error: DeserializeValue("Unsupported union")
// Error: DeserializeValue("incorrect value of type: String")
@@ -1227,7 +1240,7 @@ mod tests {
}
#[test]
- fn avro_3747_human_readable_false() -> TestResult<()> {
+ fn avro_3747_human_readable_false() -> TestResult {
use serde::de::Deserializer as SerdeDeserializer;
let is_human_readable = false;
@@ -1241,7 +1254,7 @@ mod tests {
}
#[test]
- fn avro_3747_human_readable_true() -> TestResult<()> {
+ fn avro_3747_human_readable_true() -> TestResult {
use serde::de::Deserializer as SerdeDeserializer;
crate::util::SERDE_HUMAN_READABLE.store(true, Ordering::Release);
diff --git a/lang/rust/avro/src/decimal.rs b/lang/rust/avro/src/decimal.rs
index e67430384..4373205df 100644
--- a/lang/rust/avro/src/decimal.rs
+++ b/lang/rust/avro/src/decimal.rs
@@ -104,22 +104,27 @@ mod tests {
use super::*;
use pretty_assertions::assert_eq;
use std::convert::TryFrom;
+ use apache_avro_test_helper::TestResult;
#[test]
- fn test_decimal_from_bytes_from_ref_decimal() {
+ fn test_decimal_from_bytes_from_ref_decimal() -> TestResult {
let input = vec![1, 24];
let d = Decimal::from(&input);
- let output = <Vec<u8>>::try_from(&d).unwrap();
+ let output = <Vec<u8>>::try_from(&d)?;
assert_eq!(output, input);
+
+ Ok(())
}
#[test]
- fn test_decimal_from_bytes_from_owned_decimal() {
+ fn test_decimal_from_bytes_from_owned_decimal() -> TestResult {
let input = vec![1, 24];
let d = Decimal::from(&input);
- let output = <Vec<u8>>::try_from(d).unwrap();
+ let output = <Vec<u8>>::try_from(d)?;
assert_eq!(output, input);
+
+ Ok(())
}
}
diff --git a/lang/rust/avro/src/decode.rs b/lang/rust/avro/src/decode.rs
index 31b76243a..39efefced 100644
--- a/lang/rust/avro/src/decode.rs
+++ b/lang/rust/avro/src/decode.rs
@@ -305,47 +305,56 @@ mod tests {
};
use pretty_assertions::assert_eq;
use std::collections::HashMap;
+ use apache_avro_test_helper::TestResult;
#[test]
- fn test_decode_array_without_size() {
+ fn test_decode_array_without_size() -> TestResult {
let mut input: &[u8] = &[6, 2, 4, 6, 0];
let result = decode(&Schema::Array(Box::new(Schema::Int)), &mut input);
- assert_eq!(Array(vec!(Int(1), Int(2), Int(3))), result.unwrap());
+ assert_eq!(Array(vec!(Int(1), Int(2), Int(3))), result?);
+
+ Ok(())
}
#[test]
- fn test_decode_array_with_size() {
+ fn test_decode_array_with_size() -> TestResult {
let mut input: &[u8] = &[5, 6, 2, 4, 6, 0];
let result = decode(&Schema::Array(Box::new(Schema::Int)), &mut input);
- assert_eq!(Array(vec!(Int(1), Int(2), Int(3))), result.unwrap());
+ assert_eq!(Array(vec!(Int(1), Int(2), Int(3))), result?);
+
+ Ok(())
}
#[test]
- fn test_decode_map_without_size() {
+ fn test_decode_map_without_size() -> TestResult {
let mut input: &[u8] = &[0x02, 0x08, 0x74, 0x65, 0x73, 0x74, 0x02, 0x00];
let result = decode(&Schema::Map(Box::new(Schema::Int)), &mut input);
let mut expected = HashMap::new();
expected.insert(String::from("test"), Int(1));
- assert_eq!(Map(expected), result.unwrap());
+ assert_eq!(Map(expected), result?);
+
+ Ok(())
}
#[test]
- fn test_decode_map_with_size() {
+ fn test_decode_map_with_size() -> TestResult {
let mut input: &[u8] = &[0x01, 0x0C, 0x08, 0x74, 0x65, 0x73, 0x74, 0x02, 0x00];
let result = decode(&Schema::Map(Box::new(Schema::Int)), &mut input);
let mut expected = HashMap::new();
expected.insert(String::from("test"), Int(1));
- assert_eq!(Map(expected), result.unwrap());
+ assert_eq!(Map(expected), result?);
+
+ Ok(())
}
#[test]
- fn test_negative_decimal_value() {
+ fn test_negative_decimal_value() -> TestResult {
use crate::{encode::encode, schema::Name};
use num_bigint::ToBigInt;
let inner = Box::new(Schema::Fixed(FixedSchema {
size: 2,
doc: None,
- name: Name::new("decimal").unwrap(),
+ name: Name::new("decimal")?,
aliases: None,
attributes: Default::default(),
}));
@@ -361,17 +370,19 @@ mod tests {
encode(&value, &schema, &mut buffer).expect(&success(&value, &schema));
let mut bytes = &buffer[..];
- let result = decode(&schema, &mut bytes).unwrap();
+ let result = decode(&schema, &mut bytes)?;
assert_eq!(result, value);
+
+ Ok(())
}
#[test]
- fn test_decode_decimal_with_bigger_than_necessary_size() {
+ fn test_decode_decimal_with_bigger_than_necessary_size() -> TestResult {
use crate::{encode::encode, schema::Name};
use num_bigint::ToBigInt;
let inner = Box::new(Schema::Fixed(FixedSchema {
size: 13,
- name: Name::new("decimal").unwrap(),
+ name: Name::new("decimal")?,
aliases: None,
doc: None,
attributes: Default::default(),
@@ -388,12 +399,14 @@ mod tests {
encode(&value, &schema, &mut buffer).expect(&success(&value, &schema));
let mut bytes: &[u8] = &buffer[..];
- let result = decode(&schema, &mut bytes).unwrap();
+ let result = decode(&schema, &mut bytes)?;
assert_eq!(result, value);
+
+ Ok(())
}
#[test]
- fn test_avro_3448_recursive_definition_decode_union() {
+ fn test_avro_3448_recursive_definition_decode_union() -> TestResult {
// if encoding fails in this test check the corresponding test in encode
let schema = Schema::parse_str(
r#"
@@ -419,7 +432,7 @@ mod tests {
]
}"#,
)
- .unwrap();
+ ?;
let inner_value1 = Value::Record(vec![("z".into(), Value::Int(3))]);
let inner_value2 = Value::Record(vec![("z".into(), Value::Int(6))]);
@@ -453,10 +466,12 @@ mod tests {
&schema
))
);
+
+ Ok(())
}
#[test]
- fn test_avro_3448_recursive_definition_decode_array() {
+ fn test_avro_3448_recursive_definition_decode_array() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -484,7 +499,7 @@ mod tests {
]
}"#,
)
- .unwrap();
+ ?;
let inner_value1 = Value::Record(vec![("z".into(), Value::Int(3))]);
let inner_value2 = Value::Record(vec![("z".into(), Value::Int(6))]);
@@ -501,11 +516,13 @@ mod tests {
"Failed to decode using recursive definitions with schema:\n {:?}\n",
&schema
))
- )
+ );
+
+ Ok(())
}
#[test]
- fn test_avro_3448_recursive_definition_decode_map() {
+ fn test_avro_3448_recursive_definition_decode_map() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -533,7 +550,7 @@ mod tests {
]
}"#,
)
- .unwrap();
+ ?;
let inner_value1 = Value::Record(vec![("z".into(), Value::Int(3))]);
let inner_value2 = Value::Record(vec![("z".into(), Value::Int(6))]);
@@ -553,11 +570,13 @@ mod tests {
"Failed to decode using recursive definitions with schema:\n {:?}\n",
&schema
))
- )
+ );
+
+ Ok(())
}
#[test]
- fn test_avro_3448_proper_multi_level_decoding_middle_namespace() {
+ fn test_avro_3448_proper_multi_level_decoding_middle_namespace() -> TestResult {
// if encoding fails in this test check the corresponding test in encode
let schema = r#"
{
@@ -601,7 +620,7 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let inner_record = Value::Record(vec![("inner_field_1".into(), Value::Double(5.4))]);
let middle_record_variation_1 = Value::Record(vec![(
"middle_field_1".into(),
@@ -668,10 +687,12 @@ mod tests {
&schema
))
);
+
+ Ok(())
}
#[test]
- fn test_avro_3448_proper_multi_level_decoding_inner_namespace() {
+ fn test_avro_3448_proper_multi_level_decoding_inner_namespace() -> TestResult {
// if encoding fails in this test check the corresponding test in encode
let schema = r#"
{
@@ -716,7 +737,7 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let inner_record = Value::Record(vec![("inner_field_1".into(), Value::Double(5.4))]);
let middle_record_variation_1 = Value::Record(vec![(
"middle_field_1".into(),
@@ -783,5 +804,7 @@ mod tests {
&schema
))
);
+
+ Ok(())
}
}
diff --git a/lang/rust/avro/src/reader.rs b/lang/rust/avro/src/reader.rs
index bdd318861..f83c30f3f 100644
--- a/lang/rust/avro/src/reader.rs
+++ b/lang/rust/avro/src/reader.rs
@@ -532,6 +532,7 @@ mod tests {
use pretty_assertions::assert_eq;
use serde::Deserialize;
use std::io::Cursor;
+ use apache_avro_test_helper::TestResult;
const SCHEMA: &str = r#"
{
@@ -569,8 +570,8 @@ mod tests {
];
#[test]
- fn test_from_avro_datum() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_from_avro_datum() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let mut encoded: &'static [u8] = &[54, 6, 102, 111, 111];
let mut record = Record::new(&schema).unwrap();
@@ -579,13 +580,15 @@ mod tests {
let expected = record.into();
assert_eq!(
- from_avro_datum(&schema, &mut encoded, None).unwrap(),
+ from_avro_datum(&schema, &mut encoded, None)?,
expected
);
+
+ Ok(())
}
#[test]
- fn test_from_avro_datum_with_union_to_struct() {
+ fn test_from_avro_datum_with_union_to_struct() -> TestResult {
const TEST_RECORD_SCHEMA_3240: &str = r#"
{
"type": "record",
@@ -628,7 +631,7 @@ mod tests {
a_nullable_string: Option<String>,
}
- let schema = Schema::parse_str(TEST_RECORD_SCHEMA_3240).unwrap();
+ let schema = Schema::parse_str(TEST_RECORD_SCHEMA_3240)?;
let mut encoded: &'static [u8] = &[54, 6, 102, 111, 111];
let expected_record: TestRecord3240 = TestRecord3240 {
@@ -638,32 +641,36 @@ mod tests {
a_nullable_string: None,
};
- let avro_datum = from_avro_datum(&schema, &mut encoded, None).unwrap();
+ let avro_datum = from_avro_datum(&schema, &mut encoded, None)?;
let parsed_record: TestRecord3240 = match &avro_datum {
- Value::Record(_) => from_value::<TestRecord3240>(&avro_datum).unwrap(),
+ Value::Record(_) => from_value::<TestRecord3240>(&avro_datum)?,
unexpected => {
panic!("could not map avro data to struct, found unexpected: {unexpected:?}")
}
};
assert_eq!(parsed_record, expected_record);
+
+ Ok(())
}
#[test]
- fn test_null_union() {
- let schema = Schema::parse_str(UNION_SCHEMA).unwrap();
+ fn test_null_union() -> TestResult {
+ let schema = Schema::parse_str(UNION_SCHEMA)?;
let mut encoded: &'static [u8] = &[2, 0];
assert_eq!(
- from_avro_datum(&schema, &mut encoded, None).unwrap(),
+ from_avro_datum(&schema, &mut encoded, None)?,
Value::Union(1, Box::new(Value::Long(0)))
);
+
+ Ok(())
}
#[test]
- fn test_reader_iterator() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
- let reader = Reader::with_schema(&schema, ENCODED).unwrap();
+ fn test_reader_iterator() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
+ let reader = Reader::with_schema(&schema, ENCODED)?;
let mut record1 = Record::new(&schema).unwrap();
record1.put("a", 27i64);
@@ -676,20 +683,24 @@ mod tests {
let expected = vec![record1.into(), record2.into()];
for (i, value) in reader.enumerate() {
- assert_eq!(value.unwrap(), expected[i]);
+ assert_eq!(value?, expected[i]);
}
+
+ Ok(())
}
#[test]
- fn test_reader_invalid_header() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_reader_invalid_header() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let invalid = ENCODED.iter().copied().skip(1).collect::<Vec<u8>>();
assert!(Reader::with_schema(&schema, &invalid[..]).is_err());
+
+ Ok(())
}
#[test]
- fn test_reader_invalid_block() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_reader_invalid_block() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let invalid = ENCODED
.iter()
.copied()
@@ -699,32 +710,38 @@ mod tests {
.into_iter()
.rev()
.collect::<Vec<u8>>();
- let reader = Reader::with_schema(&schema, &invalid[..]).unwrap();
+ let reader = Reader::with_schema(&schema, &invalid[..])?;
for value in reader {
assert!(value.is_err());
}
+
+ Ok(())
}
#[test]
- fn test_reader_empty_buffer() {
+ fn test_reader_empty_buffer() -> TestResult {
let empty = Cursor::new(Vec::new());
assert!(Reader::new(empty).is_err());
+
+ Ok(())
}
#[test]
- fn test_reader_only_header() {
+ fn test_reader_only_header() -> TestResult {
let invalid = ENCODED.iter().copied().take(165).collect::<Vec<u8>>();
- let reader = Reader::new(&invalid[..]).unwrap();
+ let reader = Reader::new(&invalid[..])?;
for value in reader {
assert!(value.is_err());
}
+
+ Ok(())
}
#[test]
- fn test_avro_3405_read_user_metadata_success() {
+ fn test_avro_3405_read_user_metadata_success() -> TestResult {
use crate::writer::Writer;
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ let schema = Schema::parse_str(SCHEMA)?;
let mut writer = Writer::new(&schema, Vec::new());
let mut user_meta_data: HashMap<String, Vec<u8>> = HashMap::new();
@@ -736,20 +753,22 @@ mod tests {
user_meta_data.insert("vecKey".to_string(), vec![1, 2, 3]);
for (k, v) in user_meta_data.iter() {
- writer.add_user_metadata(k.to_string(), v).unwrap();
+ writer.add_user_metadata(k.to_string(), v)?;
}
let mut record = Record::new(&schema).unwrap();
record.put("a", 27i64);
record.put("b", "foo");
- writer.append(record.clone()).unwrap();
- writer.append(record.clone()).unwrap();
- writer.flush().unwrap();
- let result = writer.into_inner().unwrap();
+ writer.append(record.clone())?;
+ writer.append(record.clone())?;
+ writer.flush()?;
+ let result = writer.into_inner()?;
- let reader = Reader::new(&result[..]).unwrap();
+ let reader = Reader::new(&result[..])?;
assert_eq!(reader.user_metadata(), &user_meta_data);
+
+ Ok(())
}
#[derive(Deserialize, Clone, PartialEq, Debug)]
@@ -833,7 +852,7 @@ mod tests {
}
#[test]
- fn test_avro_3507_single_object_reader() {
+ fn test_avro_3507_single_object_reader() -> TestResult {
let obj = TestSingleObjectReader {
a: 42,
b: 3.33,
@@ -860,10 +879,12 @@ mod tests {
.expect("Should read");
let expected_value: Value = obj.into();
assert_eq!(expected_value, val);
+
+ Ok(())
}
#[test]
- fn avro_3642_test_single_object_reader_incomplete_reads() {
+ fn avro_3642_test_single_object_reader_incomplete_reads() -> TestResult {
let obj = TestSingleObjectReader {
a: 42,
b: 3.33,
@@ -892,10 +913,12 @@ mod tests {
.expect("Should read");
let expected_value: Value = obj.into();
assert_eq!(expected_value, val);
+
+ Ok(())
}
#[test]
- fn test_avro_3507_reader_parity() {
+ fn test_avro_3507_reader_parity() -> TestResult {
let obj = TestSingleObjectReader {
a: 42,
b: 3.33,
@@ -935,7 +958,9 @@ mod tests {
let expected_value: Value = obj.clone().into();
assert_eq!(obj, read_obj1);
assert_eq!(obj, read_obj2);
- assert_eq!(val, expected_value)
+ assert_eq!(val, expected_value);
+
+ Ok(())
}
#[cfg(not(feature = "snappy"))]
diff --git a/lang/rust/avro/src/schema.rs b/lang/rust/avro/src/schema.rs
index 629647abc..277459df7 100644
--- a/lang/rust/avro/src/schema.rs
+++ b/lang/rust/avro/src/schema.rs
@@ -276,12 +276,12 @@ impl Name {
/// use apache_avro::schema::Name;
///
/// assert_eq!(
- /// Name::new("some_name").unwrap().fully_qualified_name(&Some("some_namespace".into())),
- /// Name::new("some_namespace.some_name").unwrap()
+ /// Name::new("some_name")?.fully_qualified_name(&Some("some_namespace".into())),
+ /// Name::new("some_namespace.some_name")?
/// );
/// assert_eq!(
- /// Name::new("some_namespace.some_name").unwrap().fully_qualified_name(&Some("other_namespace".into())),
- /// Name::new("some_namespace.some_name").unwrap()
+ /// Name::new("some_namespace.some_name")?.fully_qualified_name(&Some("other_namespace".into())),
+ /// Name::new("some_namespace.some_name")?
/// );
/// ```
pub fn fully_qualified_name(&self, enclosing_namespace: &Namespace) -> Name {
@@ -2073,6 +2073,7 @@ mod tests {
use super::*;
use pretty_assertions::assert_eq;
use serde_json::json;
+ use apache_avro_test_helper::TestResult;
#[test]
fn test_invalid_schema() {
@@ -2080,31 +2081,35 @@ mod tests {
}
#[test]
- fn test_primitive_schema() {
- assert_eq!(Schema::Null, Schema::parse_str("\"null\"").unwrap());
- assert_eq!(Schema::Int, Schema::parse_str("\"int\"").unwrap());
- assert_eq!(Schema::Double, Schema::parse_str("\"double\"").unwrap());
+ fn test_primitive_schema() -> TestResult {
+ assert_eq!(Schema::Null, Schema::parse_str("\"null\"")?);
+ assert_eq!(Schema::Int, Schema::parse_str("\"int\"")?);
+ assert_eq!(Schema::Double, Schema::parse_str("\"double\"")?);
+ Ok(())
}
#[test]
- fn test_array_schema() {
- let schema = Schema::parse_str(r#"{"type": "array", "items": "string"}"#).unwrap();
+ fn test_array_schema() -> TestResult {
+ let schema = Schema::parse_str(r#"{"type": "array", "items": "string"}"#)?;
assert_eq!(Schema::Array(Box::new(Schema::String)), schema);
+ Ok(())
}
#[test]
- fn test_map_schema() {
- let schema = Schema::parse_str(r#"{"type": "map", "values": "double"}"#).unwrap();
+ fn test_map_schema() -> TestResult {
+ let schema = Schema::parse_str(r#"{"type": "map", "values": "double"}"#)?;
assert_eq!(Schema::Map(Box::new(Schema::Double)), schema);
+ Ok(())
}
#[test]
- fn test_union_schema() {
- let schema = Schema::parse_str(r#"["null", "int"]"#).unwrap();
+ fn test_union_schema() -> TestResult {
+ let schema = Schema::parse_str(r#"["null", "int"]"#)?;
assert_eq!(
- Schema::Union(UnionSchema::new(vec![Schema::Null, Schema::Int]).unwrap()),
+ Schema::Union(UnionSchema::new(vec![Schema::Null, Schema::Int])?),
schema
);
+ Ok(())
}
#[test]
@@ -2114,10 +2119,10 @@ mod tests {
}
#[test]
- fn test_multi_union_schema() {
+ fn test_multi_union_schema() -> TestResult {
let schema = Schema::parse_str(r#"["null", "int", "float", "string", "bytes"]"#);
assert!(schema.is_ok());
- let schema = schema.unwrap();
+ let schema = schema?;
assert_eq!(SchemaKind::from(&schema), SchemaKind::Union);
let union_schema = match schema {
Schema::Union(u) => u,
@@ -2140,11 +2145,12 @@ mod tests {
SchemaKind::Bytes
);
assert_eq!(variants.next(), None);
+
+ Ok(())
}
- // AVRO-3621
#[test]
- fn test_avro_3621_nullable_record_field() {
+ fn test_avro_3621_nullable_record_field() -> TestResult {
let nullable_record_field = RecordField {
name: "next".to_string(),
doc: None,
@@ -2160,7 +2166,7 @@ mod tests {
},
},
])
- .unwrap(),
+ ?,
),
order: RecordFieldOrder::Ascending,
position: 1,
@@ -2181,11 +2187,12 @@ mod tests {
};
assert!(!non_nullable_record_field.is_nullable());
+ Ok(())
}
// AVRO-3248
#[test]
- fn test_union_of_records() {
+ fn test_union_of_records() -> TestResult {
use std::iter::FromIterator;
// A and B are the same except the name.
@@ -2214,14 +2221,13 @@ mod tests {
]
}"#;
- let schema_c = Schema::parse_list(&[schema_str_a, schema_str_b, schema_str_c])
- .unwrap()
+ let schema_c = Schema::parse_list(&[schema_str_a, schema_str_b, schema_str_c])?
.last()
.unwrap()
.clone();
let schema_c_expected = Schema::Record(RecordSchema {
- name: Name::new("C").unwrap(),
+ name: Name::new("C")?,
aliases: None,
doc: None,
fields: vec![RecordField {
@@ -2232,13 +2238,13 @@ mod tests {
schema: Schema::Union(
UnionSchema::new(vec![
Schema::Ref {
- name: Name::new("A").unwrap(),
+ name: Name::new("A")?,
},
Schema::Ref {
- name: Name::new("B").unwrap(),
+ name: Name::new("B")?,
},
])
- .unwrap(),
+ ?,
),
order: RecordFieldOrder::Ignore,
position: 0,
@@ -2249,11 +2255,11 @@ mod tests {
});
assert_eq!(schema_c, schema_c_expected);
+ Ok(())
}
- // AVRO-3584 : recursion in type definitions
#[test]
- fn avro_3584_test_recursion_records() {
+ fn avro_3584_test_recursion_records() -> TestResult {
// A and B are the same except the name.
let schema_str_a = r#"{
"name": "A",
@@ -2267,7 +2273,7 @@ mod tests {
"fields": [ {"name": "field_one", "type": "A"} ]
}"#;
- let list = Schema::parse_list(&[schema_str_a, schema_str_b]).unwrap();
+ let list = Schema::parse_list(&[schema_str_a, schema_str_b])?;
let schema_a = list.first().unwrap().clone();
@@ -2276,17 +2282,18 @@ mod tests {
let f1 = fields.get(0);
let ref_schema = Schema::Ref {
- name: Name::new("B").unwrap(),
+ name: Name::new("B")?,
};
assert_eq!(ref_schema, f1.unwrap().schema);
}
_ => panic!("Expected a record schema!"),
}
+
+ Ok(())
}
- // AVRO-3248
#[test]
- fn test_nullable_record() {
+ fn test_avro_3248_nullable_record() -> TestResult {
use std::iter::FromIterator;
let schema_str_a = r#"{
@@ -2306,14 +2313,13 @@ mod tests {
]
}"#;
- let schema_option_a = Schema::parse_list(&[schema_str_a, schema_str_option_a])
- .unwrap()
+ let schema_option_a = Schema::parse_list(&[schema_str_a, schema_str_option_a])?
.last()
.unwrap()
.clone();
let schema_option_a_expected = Schema::Record(RecordSchema {
- name: Name::new("OptionA").unwrap(),
+ name: Name::new("OptionA")?,
aliases: None,
doc: None,
fields: vec![RecordField {
@@ -2325,10 +2331,10 @@ mod tests {
UnionSchema::new(vec![
Schema::Null,
Schema::Ref {
- name: Name::new("A").unwrap(),
+ name: Name::new("A")?,
},
])
- .unwrap(),
+ ?,
),
order: RecordFieldOrder::Ignore,
position: 0,
@@ -2339,10 +2345,12 @@ mod tests {
});
assert_eq!(schema_option_a, schema_option_a_expected);
+
+ Ok(())
}
#[test]
- fn test_record_schema() {
+ fn test_record_schema() -> TestResult {
let parsed = Schema::parse_str(
r#"
{
@@ -2355,14 +2363,14 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
let mut lookup = BTreeMap::new();
lookup.insert("a".to_owned(), 0);
lookup.insert("b".to_owned(), 1);
let expected = Schema::Record(RecordSchema {
- name: Name::new("test").unwrap(),
+ name: Name::new("test")?,
aliases: None,
doc: None,
fields: vec![
@@ -2392,11 +2400,12 @@ mod tests {
});
assert_eq!(parsed, expected);
+
+ Ok(())
}
- // AVRO-3302
#[test]
- fn test_record_schema_with_currently_parsing_schema() {
+ fn test_avro_3302_record_schema_with_currently_parsing_schema() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -2416,7 +2425,7 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
let mut lookup = BTreeMap::new();
lookup.insert("recordField".to_owned(), 0);
@@ -2426,7 +2435,7 @@ mod tests {
node_lookup.insert("label".to_owned(), 0);
let expected = Schema::Record(RecordSchema {
- name: Name::new("test").unwrap(),
+ name: Name::new("test")?,
aliases: None,
doc: None,
fields: vec![RecordField {
@@ -2435,7 +2444,7 @@ mod tests {
default: None,
aliases: None,
schema: Schema::Record(RecordSchema {
- name: Name::new("Node").unwrap(),
+ name: Name::new("Node")?,
aliases: None,
doc: None,
fields: vec![
@@ -2455,7 +2464,7 @@ mod tests {
default: None,
aliases: None,
schema: Schema::Array(Box::new(Schema::Ref {
- name: Name::new("Node").unwrap(),
+ name: Name::new("Node")?,
})),
order: RecordFieldOrder::Ascending,
position: 1,
@@ -2477,11 +2486,13 @@ mod tests {
let canonical_form = &schema.canonical_form();
let expected = r#"{"name":"test","type":"record","fields":[{"name":"recordField","type":{"name":"Node","type":"record","fields":[{"name":"label","type":"string"},{"name":"children","type":{"type":"array","items":"Node"}}]}}]}"#;
assert_eq!(canonical_form, &expected);
+
+ Ok(())
}
// https://github.com/flavray/avro-rs/pull/99#issuecomment-1016948451
#[test]
- fn test_parsing_of_recursive_type_enum() {
+ fn test_parsing_of_recursive_type_enum() -> TestResult {
let schema = r#"
{
"type": "record",
@@ -2525,14 +2536,16 @@ mod tests {
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let schema_str = schema.canonical_form();
let expected = r#"{"name":"office.User","type":"record","fields":[{"name":"details","type":[{"name":"Employee","type":"record","fields":[{"name":"gender","type":{"name":"Gender","type":"enum","symbols":["male","female"]}}]},{"name":"Manager","type":"record","fields":[{"name":"gender","type":"Gender"}]}]}]}"#;
assert_eq!(schema_str, expected);
+
+ Ok(())
}
#[test]
- fn test_parsing_of_recursive_type_fixed() {
+ fn test_parsing_of_recursive_type_fixed() -> TestResult {
let schema = r#"
{
"type": "record",
@@ -2573,15 +2586,16 @@ mod tests {
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let schema_str = schema.canonical_form();
let expected = r#"{"name":"office.User","type":"record","fields":[{"name":"details","type":[{"name":"Employee","type":"record","fields":[{"name":"id","type":{"name":"EmployeeId","type":"fixed","size":16}}]},{"name":"Manager","type":"record","fields":[{"name":"id","type":"EmployeeId"}]}]}]}"#;
assert_eq!(schema_str, expected);
+
+ Ok(())
}
- // AVRO-3302
#[test]
- fn test_record_schema_with_currently_parsing_schema_aliases() {
+ fn test_avro_3302_record_schema_with_currently_parsing_schema_aliases() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -2595,7 +2609,7 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
let mut lookup = BTreeMap::new();
lookup.insert("value".to_owned(), 0);
@@ -2634,7 +2648,7 @@ mod tests {
},
},
])
- .unwrap(),
+ ?,
),
order: RecordFieldOrder::Ascending,
position: 1,
@@ -2649,11 +2663,12 @@ mod tests {
let canonical_form = &schema.canonical_form();
let expected = r#"{"name":"LongList","type":"record","fields":[{"name":"value","type":"long"},{"name":"next","type":["null","LongList"]}]}"#;
assert_eq!(canonical_form, &expected);
+
+ Ok(())
}
- // AVRO-3370
#[test]
- fn test_record_schema_with_currently_parsing_schema_named_record() {
+ fn test_avro_3370_record_schema_with_currently_parsing_schema_named_record() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -2666,7 +2681,7 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
let mut lookup = BTreeMap::new();
lookup.insert("value".to_owned(), 0);
@@ -2714,11 +2729,12 @@ mod tests {
let canonical_form = &schema.canonical_form();
let expected = r#"{"name":"record","type":"record","fields":[{"name":"value","type":"long"},{"name":"next","type":"record"}]}"#;
assert_eq!(canonical_form, &expected);
+
+ Ok(())
}
- // AVRO-3370
#[test]
- fn test_record_schema_with_currently_parsing_schema_named_enum() {
+ fn test_avro_3370_record_schema_with_currently_parsing_schema_named_enum() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -2735,7 +2751,7 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
let mut lookup = BTreeMap::new();
lookup.insert("enum".to_owned(), 0);
@@ -2796,11 +2812,12 @@ mod tests {
let canonical_form = &schema.canonical_form();
let expected = r#"{"name":"record","type":"record","fields":[{"name":"enum","type":{"name":"enum","type":"enum","symbols":["one","two","three"]}},{"name":"next","type":{"name":"enum","type":"enum","symbols":["one","two","three"]}}]}"#;
assert_eq!(canonical_form, &expected);
+
+ Ok(())
}
- // AVRO-3370
#[test]
- fn test_record_schema_with_currently_parsing_schema_named_fixed() {
+ fn test_avro_3370_record_schema_with_currently_parsing_schema_named_fixed() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -2817,7 +2834,7 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
let mut lookup = BTreeMap::new();
lookup.insert("fixed".to_owned(), 0);
@@ -2878,16 +2895,18 @@ mod tests {
let canonical_form = &schema.canonical_form();
let expected = r#"{"name":"record","type":"record","fields":[{"name":"fixed","type":{"name":"fixed","type":"fixed","size":456}},{"name":"next","type":{"name":"fixed","type":"fixed","size":456}}]}"#;
assert_eq!(canonical_form, &expected);
+
+ Ok(())
}
#[test]
- fn test_enum_schema() {
+ fn test_enum_schema() -> TestResult {
let schema = Schema::parse_str(
r#"{"type": "enum", "name": "Suit", "symbols": ["diamonds", "spades", "clubs", "hearts"]}"#,
- ).unwrap();
+ )?;
let expected = Schema::Enum(EnumSchema {
- name: Name::new("Suit").unwrap(),
+ name: Name::new("Suit")?,
aliases: None,
doc: None,
symbols: vec![
@@ -2900,32 +2919,38 @@ mod tests {
});
assert_eq!(expected, schema);
+
+ Ok(())
}
#[test]
- fn test_enum_schema_duplicate() {
+ fn test_enum_schema_duplicate() -> TestResult {
// Duplicate "diamonds"
let schema = Schema::parse_str(
r#"{"type": "enum", "name": "Suit", "symbols": ["diamonds", "spades", "clubs", "diamonds"]}"#,
);
assert!(schema.is_err());
+
+ Ok(())
}
#[test]
- fn test_enum_schema_name() {
+ fn test_enum_schema_name() -> TestResult {
// Invalid name "0000" does not match [A-Za-z_][A-Za-z0-9_]*
let schema = Schema::parse_str(
r#"{"type": "enum", "name": "Enum", "symbols": ["0000", "variant"]}"#,
);
assert!(schema.is_err());
+
+ Ok(())
}
#[test]
- fn test_fixed_schema() {
- let schema = Schema::parse_str(r#"{"type": "fixed", "name": "test", "size": 16}"#).unwrap();
+ fn test_fixed_schema() -> TestResult {
+ let schema = Schema::parse_str(r#"{"type": "fixed", "name": "test", "size": 16}"#)?;
let expected = Schema::Fixed(FixedSchema {
- name: Name::new("test").unwrap(),
+ name: Name::new("test")?,
aliases: None,
doc: None,
size: 16usize,
@@ -2933,17 +2958,19 @@ mod tests {
});
assert_eq!(expected, schema);
+
+ Ok(())
}
#[test]
- fn test_fixed_schema_with_documentation() {
+ fn test_fixed_schema_with_documentation() -> TestResult {
let schema = Schema::parse_str(
r#"{"type": "fixed", "name": "test", "size": 16, "doc": "FixedSchema documentation"}"#,
)
- .unwrap();
+ ?;
let expected = Schema::Fixed(FixedSchema {
- name: Name::new("test").unwrap(),
+ name: Name::new("test")?,
aliases: None,
doc: Some(String::from("FixedSchema documentation")),
size: 16usize,
@@ -2951,27 +2978,31 @@ mod tests {
});
assert_eq!(expected, schema);
+
+ Ok(())
}
#[test]
- fn test_no_documentation() {
+ fn test_no_documentation() -> TestResult {
let schema =
Schema::parse_str(r#"{"type": "enum", "name": "Coin", "symbols": ["heads", "tails"]}"#)
- .unwrap();
+ ?;
let doc = match schema {
Schema::Enum(EnumSchema { doc, .. }) => doc,
- _ => return,
+ _ => unreachable!(),
};
assert!(doc.is_none());
+
+ Ok(())
}
#[test]
- fn test_documentation() {
+ fn test_documentation() -> TestResult {
let schema = Schema::parse_str(
r#"{"type": "enum", "name": "Coin", "doc": "Some documentation", "symbols": ["heads", "tails"]}"#
- ).unwrap();
+ )?;
let doc = match schema {
Schema::Enum(EnumSchema { doc, .. }) => doc,
@@ -2979,6 +3010,8 @@ mod tests {
};
assert_eq!("Some documentation".to_owned(), doc.unwrap());
+
+ Ok(())
}
// Tests to ensure Schema is Send + Sync. These tests don't need to _do_ anything, if they can
@@ -3001,8 +3034,7 @@ mod tests {
}
#[test]
- #[cfg_attr(miri, ignore)] // Sha256 uses an inline assembly instructions which is not supported by miri
- fn test_schema_fingerprint() {
+ fn test_schema_fingerprint() -> TestResult {
use crate::rabin::Rabin;
use md5::Md5;
use sha2::Sha256;
@@ -3019,7 +3051,7 @@ mod tests {
}
"#;
- let schema = Schema::parse_str(raw_schema).unwrap();
+ let schema = Schema::parse_str(raw_schema)?;
assert_eq!(
"abf662f831715ff78f88545a05a9262af75d6406b54e1a8a174ff1d2b75affc4",
format!("{}", schema.fingerprint::<Sha256>())
@@ -3032,33 +3064,39 @@ mod tests {
assert_eq!(
"28cf0a67d9937bb3",
format!("{}", schema.fingerprint::<Rabin>())
- )
+ );
+
+ Ok(())
}
#[test]
- fn test_logical_types() {
- let schema = Schema::parse_str(r#"{"type": "int", "logicalType": "date"}"#).unwrap();
+ fn test_logical_types() -> TestResult {
+ let schema = Schema::parse_str(r#"{"type": "int", "logicalType": "date"}"#)?;
assert_eq!(schema, Schema::Date);
let schema =
- Schema::parse_str(r#"{"type": "long", "logicalType": "timestamp-micros"}"#).unwrap();
+ Schema::parse_str(r#"{"type": "long", "logicalType": "timestamp-micros"}"#)?;
assert_eq!(schema, Schema::TimestampMicros);
+
+ Ok(())
}
#[test]
- fn test_nullable_logical_type() {
+ fn test_nullable_logical_type() -> TestResult {
let schema = Schema::parse_str(
r#"{"type": ["null", {"type": "long", "logicalType": "timestamp-micros"}]}"#,
)
- .unwrap();
+ ?;
assert_eq!(
schema,
- Schema::Union(UnionSchema::new(vec![Schema::Null, Schema::TimestampMicros]).unwrap())
+ Schema::Union(UnionSchema::new(vec![Schema::Null, Schema::TimestampMicros])?)
);
+
+ Ok(())
}
#[test]
- fn record_field_order_from_str() {
+ fn record_field_order_from_str() -> TestResult {
use std::str::FromStr;
assert_eq!(
@@ -3074,11 +3112,12 @@ mod tests {
RecordFieldOrder::Ignore
);
assert!(RecordFieldOrder::from_str("not an ordering").is_err());
+
+ Ok(())
}
- /// AVRO-3374
#[test]
- fn test_avro_3374_preserve_namespace_for_primitive() {
+ fn test_avro_3374_preserve_namespace_for_primitive() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -3091,17 +3130,19 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
let json = schema.canonical_form();
assert_eq!(
json,
r#"{"name":"ns.int","type":"record","fields":[{"name":"value","type":"int"},{"name":"next","type":["null","ns.int"]}]}"#
);
+
+ Ok(())
}
#[test]
- fn test_avro_3433_preserve_schema_refs_in_json() {
+ fn test_avro_3433_preserve_schema_refs_in_json() -> TestResult {
let schema = r#"
{
"name": "test.test",
@@ -3116,14 +3157,16 @@ mod tests {
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let expected = r#"{"name":"test.test","type":"record","fields":[{"name":"bar","type":{"name":"test.foo","type":"record","fields":[{"name":"id","type":"long"}]}},{"name":"baz","type":"test.foo"}]}"#;
assert_eq!(schema.canonical_form(), expected);
+
+ Ok(())
}
#[test]
- fn test_read_namespace_from_name() {
+ fn test_read_namespace_from_name() -> TestResult {
let schema = r#"
{
"name": "space.name",
@@ -3137,17 +3180,19 @@ mod tests {
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
if let Schema::Record(RecordSchema { name, .. }) = schema {
assert_eq!(name.name, "name");
assert_eq!(name.namespace, Some("space".to_string()));
} else {
panic!("Expected a record schema!");
}
+
+ Ok(())
}
#[test]
- fn test_namespace_from_name_has_priority_over_from_field() {
+ fn test_namespace_from_name_has_priority_over_from_field() -> TestResult {
let schema = r#"
{
"name": "space1.name",
@@ -3162,16 +3207,18 @@ mod tests {
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
if let Schema::Record(RecordSchema { name, .. }) = schema {
assert_eq!(name.namespace, Some("space1".to_string()));
} else {
panic!("Expected a record schema!");
}
+
+ Ok(())
}
#[test]
- fn test_namespace_from_field() {
+ fn test_namespace_from_field() -> TestResult {
let schema = r#"
{
"name": "name",
@@ -3186,20 +3233,24 @@ mod tests {
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
if let Schema::Record(RecordSchema { name, .. }) = schema {
assert_eq!(name.namespace, Some("space2".to_string()));
} else {
panic!("Expected a record schema!");
}
+
+ Ok(())
}
#[test]
/// Zero-length namespace is considered as no-namespace.
- fn test_namespace_from_name_with_empty_value() {
- let name = Name::new(".name").unwrap();
+ fn test_namespace_from_name_with_empty_value() -> TestResult {
+ let name = Name::new(".name")?;
assert_eq!(name.name, "name");
assert_eq!(name.namespace, None);
+
+ Ok(())
}
#[test]
@@ -3221,7 +3272,7 @@ mod tests {
}
#[test]
- fn avro_3448_test_proper_resolution_inner_record_inherited_namespace() {
+ fn avro_3448_test_proper_resolution_inner_record_inherited_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3251,16 +3302,18 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "space.inner_record_name"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_resolution_inner_record_qualified_namespace() {
+ fn avro_3448_test_proper_resolution_inner_record_qualified_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3290,16 +3343,18 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "space.inner_record_name"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_resolution_inner_enum_inherited_namespace() {
+ fn avro_3448_test_proper_resolution_inner_enum_inherited_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3324,16 +3379,18 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "space.inner_enum_name"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_resolution_inner_enum_qualified_namespace() {
+ fn avro_3448_test_proper_resolution_inner_enum_qualified_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3358,16 +3415,18 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "space.inner_enum_name"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_resolution_inner_fixed_inherited_namespace() {
+ fn avro_3448_test_proper_resolution_inner_fixed_inherited_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3392,16 +3451,18 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "space.inner_fixed_name"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_resolution_inner_fixed_qualified_namespace() {
+ fn avro_3448_test_proper_resolution_inner_fixed_qualified_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3426,16 +3487,18 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "space.inner_fixed_name"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_resolution_inner_record_inner_namespace() {
+ fn avro_3448_test_proper_resolution_inner_record_inner_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3466,16 +3529,18 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "inner_space.inner_record_name"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_resolution_inner_enum_inner_namespace() {
+ fn avro_3448_test_proper_resolution_inner_enum_inner_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3501,16 +3566,18 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "inner_space.inner_enum_name"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_resolution_inner_fixed_inner_namespace() {
+ fn avro_3448_test_proper_resolution_inner_fixed_inner_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3536,16 +3603,18 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "inner_space.inner_fixed_name"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_multi_level_resolution_inner_record_outer_namespace() {
+ fn avro_3448_test_proper_multi_level_resolution_inner_record_outer_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3587,7 +3656,7 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 3);
for s in &[
@@ -3595,12 +3664,14 @@ mod tests {
"space.middle_record_name",
"space.inner_record_name",
] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_multi_level_resolution_inner_record_middle_namespace() {
+ fn avro_3448_test_proper_multi_level_resolution_inner_record_middle_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3643,7 +3714,7 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 3);
for s in &[
@@ -3651,12 +3722,14 @@ mod tests {
"middle_namespace.middle_record_name",
"middle_namespace.inner_record_name",
] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_multi_level_resolution_inner_record_inner_namespace() {
+ fn avro_3448_test_proper_multi_level_resolution_inner_record_inner_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3700,7 +3773,7 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 3);
for s in &[
@@ -3708,12 +3781,14 @@ mod tests {
"middle_namespace.middle_record_name",
"inner_namespace.inner_record_name",
] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_in_array_resolution_inherited_namespace() {
+ fn avro_3448_test_proper_in_array_resolution_inherited_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3743,16 +3818,18 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "space.in_array_record"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3448_test_proper_in_map_resolution_inherited_namespace() {
+ fn avro_3448_test_proper_in_map_resolution_inherited_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3782,16 +3859,18 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "space.in_map_record"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
+
+ Ok(())
}
#[test]
- fn avro_3466_test_to_json_inner_enum_inner_namespace() {
+ fn avro_3466_test_to_json_inner_enum_inner_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3817,23 +3896,25 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
// confirm we have expected 2 full-names
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "inner_space.inner_enum_name"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
// convert Schema back to JSON string
let schema_str = serde_json::to_string(&schema).expect("test failed");
let _schema = Schema::parse_str(&schema_str).expect("test failed");
assert_eq!(schema, _schema);
+
+ Ok(())
}
#[test]
- fn avro_3466_test_to_json_inner_fixed_inner_namespace() {
+ fn avro_3466_test_to_json_inner_fixed_inner_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -3859,19 +3940,21 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let rs = ResolvedSchema::try_from(&schema).expect("Schema didn't successfully parse");
// confirm we have expected 2 full-names
assert_eq!(rs.get_names().len(), 2);
for s in &["space.record_name", "inner_space.inner_fixed_name"] {
- assert!(rs.get_names().contains_key(&Name::new(s).unwrap()));
+ assert!(rs.get_names().contains_key(&Name::new(s)?));
}
// convert Schema back to JSON string
let schema_str = serde_json::to_string(&schema).expect("test failed");
let _schema = Schema::parse_str(&schema_str).expect("test failed");
assert_eq!(schema, _schema);
+
+ Ok(())
}
fn assert_avro_3512_aliases(aliases: &Aliases) {
@@ -3889,7 +3972,7 @@ mod tests {
}
#[test]
- fn avro_3512_alias_with_null_namespace_record() {
+ fn avro_3512_alias_with_null_namespace_record() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -3903,17 +3986,19 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
if let Schema::Record(RecordSchema { ref aliases, .. }) = schema {
assert_avro_3512_aliases(aliases);
} else {
panic!("The Schema should be a record: {schema:?}");
}
+
+ Ok(())
}
#[test]
- fn avro_3512_alias_with_null_namespace_enum() {
+ fn avro_3512_alias_with_null_namespace_enum() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -3927,17 +4012,19 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
if let Schema::Enum(EnumSchema { ref aliases, .. }) = schema {
assert_avro_3512_aliases(aliases);
} else {
panic!("The Schema should be an enum: {schema:?}");
}
+
+ Ok(())
}
#[test]
- fn avro_3512_alias_with_null_namespace_fixed() {
+ fn avro_3512_alias_with_null_namespace_fixed() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -3949,17 +4036,19 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
if let Schema::Fixed(FixedSchema { ref aliases, .. }) = schema {
assert_avro_3512_aliases(aliases);
} else {
panic!("The Schema should be a fixed: {schema:?}");
}
+
+ Ok(())
}
#[test]
- fn avro_3518_serialize_aliases_record() {
+ fn avro_3518_serialize_aliases_record() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -3979,19 +4068,21 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
- let value = serde_json::to_value(&schema).unwrap();
- let serialized = serde_json::to_string(&value).unwrap();
+ let value = serde_json::to_value(&schema)?;
+ let serialized = serde_json::to_string(&value)?;
assert_eq!(
r#"{"aliases":["space.b","x.y","c"],"fields":[{"aliases":["time1","ns.time2"],"default":123,"name":"time","type":"long"}],"name":"a","namespace":"space","type":"record"}"#,
&serialized
);
- assert_eq!(schema, Schema::parse_str(&serialized).unwrap());
+ assert_eq!(schema, Schema::parse_str(&serialized)?);
+
+ Ok(())
}
#[test]
- fn avro_3518_serialize_aliases_enum() {
+ fn avro_3518_serialize_aliases_enum() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -4005,19 +4096,21 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
- let value = serde_json::to_value(&schema).unwrap();
- let serialized = serde_json::to_string(&value).unwrap();
+ let value = serde_json::to_value(&schema)?;
+ let serialized = serde_json::to_string(&value)?;
assert_eq!(
r#"{"aliases":["space.b","x.y","c"],"name":"a","namespace":"space","symbols":["symbol1","symbol2"],"type":"enum"}"#,
&serialized
);
- assert_eq!(schema, Schema::parse_str(&serialized).unwrap());
+ assert_eq!(schema, Schema::parse_str(&serialized)?);
+
+ Ok(())
}
#[test]
- fn avro_3518_serialize_aliases_fixed() {
+ fn avro_3518_serialize_aliases_fixed() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -4029,19 +4122,21 @@ mod tests {
}
"#,
)
- .unwrap();
+ ?;
- let value = serde_json::to_value(&schema).unwrap();
- let serialized = serde_json::to_string(&value).unwrap();
+ let value = serde_json::to_value(&schema)?;
+ let serialized = serde_json::to_string(&value)?;
assert_eq!(
r#"{"aliases":["space.b","x.y","c"],"name":"a","namespace":"space","size":12,"type":"fixed"}"#,
&serialized
);
- assert_eq!(schema, Schema::parse_str(&serialized).unwrap());
+ assert_eq!(schema, Schema::parse_str(&serialized)?);
+
+ Ok(())
}
#[test]
- fn avro_3130_parse_anonymous_union_type() {
+ fn avro_3130_parse_anonymous_union_type() -> TestResult {
let schema_str = r#"
{
"type": "record",
@@ -4061,10 +4156,10 @@ mod tests {
]
}
"#;
- let schema = Schema::parse_str(schema_str).unwrap();
+ let schema = Schema::parse_str(schema_str)?;
if let Schema::Record(RecordSchema { name, fields, .. }) = schema {
- assert_eq!(name, Name::new("AccountEvent").unwrap());
+ assert_eq!(name, Name::new("AccountEvent")?);
let field = &fields[0];
assert_eq!(&field.name, "NullableLongArray");
@@ -4087,10 +4182,12 @@ mod tests {
} else {
panic!("Expected Schema::Record");
}
+
+ Ok(())
}
#[test]
- fn avro_custom_attributes_schema_without_attributes() {
+ fn avro_custom_attributes_schema_without_attributes() -> TestResult {
let schemata_str = [
r#"
{
@@ -4118,9 +4215,11 @@ mod tests {
"#,
];
for schema_str in schemata_str.iter() {
- let schema = Schema::parse_str(schema_str).unwrap();
+ let schema = Schema::parse_str(schema_str)?;
assert_eq!(schema.custom_attributes(), Some(&Default::default()));
}
+
+ Ok(())
}
const CUSTOM_ATTRS_SUFFIX: &str = r#"
@@ -4134,7 +4233,7 @@ mod tests {
"#;
#[test]
- fn avro_3609_custom_attributes_schema_with_attributes() {
+ fn avro_3609_custom_attributes_schema_with_attributes() -> TestResult {
let schemata_str = [
r#"
{
@@ -4175,13 +4274,15 @@ mod tests {
.replace("{{{}}}", CUSTOM_ATTRS_SUFFIX)
.as_str(),
)
- .unwrap();
+ ?;
assert_eq!(
schema.custom_attributes(),
Some(&expected_custom_attibutes())
);
}
+
+ Ok(())
}
fn expected_custom_attibutes() -> BTreeMap<String, Value> {
@@ -4200,7 +4301,7 @@ mod tests {
}
#[test]
- fn avro_3609_custom_attributes_record_field_without_attributes() {
+ fn avro_3609_custom_attributes_record_field_without_attributes() -> TestResult {
let schema_str = String::from(
r#"
{
@@ -4219,11 +4320,11 @@ mod tests {
);
let schema =
- Schema::parse_str(schema_str.replace("{{{}}}", CUSTOM_ATTRS_SUFFIX).as_str()).unwrap();
+ Schema::parse_str(schema_str.replace("{{{}}}", CUSTOM_ATTRS_SUFFIX).as_str())?;
match schema {
Schema::Record(RecordSchema { name, fields, .. }) => {
- assert_eq!(name, Name::new("Rec").unwrap());
+ assert_eq!(name, Name::new("Rec")?);
assert_eq!(fields.len(), 1);
let field = &fields[0];
assert_eq!(&field.name, "field_one");
@@ -4231,10 +4332,12 @@ mod tests {
}
_ => panic!("Expected Schema::Record"),
}
+
+ Ok(())
}
#[test]
- fn avro_3625_null_is_first() {
+ fn avro_3625_null_is_first() -> TestResult {
let schema_str = String::from(
r#"
{
@@ -4247,11 +4350,11 @@ mod tests {
"#,
);
- let schema = Schema::parse_str(&schema_str).unwrap();
+ let schema = Schema::parse_str(&schema_str)?;
match schema {
Schema::Record(RecordSchema { name, fields, .. }) => {
- assert_eq!(name, Name::new("union_schema_test").unwrap());
+ assert_eq!(name, Name::new("union_schema_test")?);
assert_eq!(fields.len(), 1);
let field = &fields[0];
assert_eq!(&field.name, "a");
@@ -4268,10 +4371,12 @@ mod tests {
}
_ => panic!("Expected Schema::Record"),
}
+
+ Ok(())
}
#[test]
- fn avro_3625_null_is_last() {
+ fn avro_3625_null_is_last() -> TestResult {
let schema_str = String::from(
r#"
{
@@ -4284,11 +4389,11 @@ mod tests {
"#,
);
- let schema = Schema::parse_str(&schema_str).unwrap();
+ let schema = Schema::parse_str(&schema_str)?;
match schema {
Schema::Record(RecordSchema { name, fields, .. }) => {
- assert_eq!(name, Name::new("union_schema_test").unwrap());
+ assert_eq!(name, Name::new("union_schema_test")?);
assert_eq!(fields.len(), 1);
let field = &fields[0];
assert_eq!(&field.name, "a");
@@ -4304,10 +4409,12 @@ mod tests {
}
_ => panic!("Expected Schema::Record"),
}
+
+ Ok(())
}
#[test]
- fn avro_3625_null_is_the_middle() {
+ fn avro_3625_null_is_the_middle() -> TestResult {
let schema_str = String::from(
r#"
{
@@ -4320,11 +4427,11 @@ mod tests {
"#,
);
- let schema = Schema::parse_str(&schema_str).unwrap();
+ let schema = Schema::parse_str(&schema_str)?;
match schema {
Schema::Record(RecordSchema { name, fields, .. }) => {
- assert_eq!(name, Name::new("union_schema_test").unwrap());
+ assert_eq!(name, Name::new("union_schema_test")?);
assert_eq!(fields.len(), 1);
let field = &fields[0];
assert_eq!(&field.name, "a");
@@ -4341,10 +4448,12 @@ mod tests {
}
_ => panic!("Expected Schema::Record"),
}
+
+ Ok(())
}
#[test]
- fn avro_3649_default_notintfirst() {
+ fn avro_3649_default_notintfirst() -> TestResult {
let schema_str = String::from(
r#"
{
@@ -4357,11 +4466,11 @@ mod tests {
"#,
);
- let schema = Schema::parse_str(&schema_str).unwrap();
+ let schema = Schema::parse_str(&schema_str)?;
match schema {
Schema::Record(RecordSchema { name, fields, .. }) => {
- assert_eq!(name, Name::new("union_schema_test").unwrap());
+ assert_eq!(name, Name::new("union_schema_test")?);
assert_eq!(fields.len(), 1);
let field = &fields[0];
assert_eq!(&field.name, "a");
@@ -4377,10 +4486,12 @@ mod tests {
}
_ => panic!("Expected Schema::Record"),
}
+
+ Ok(())
}
#[test]
- fn avro_3709_parsing_of_record_field_aliases() {
+ fn avro_3709_parsing_of_record_field_aliases() -> TestResult {
let schema = r#"
{
"name": "rec",
@@ -4395,7 +4506,7 @@ mod tests {
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
if let Schema::Record(RecordSchema { fields, .. }) = schema {
let num_field = &fields[0];
assert_eq!(num_field.name, "num");
@@ -4403,10 +4514,12 @@ mod tests {
} else {
panic!("Expected a record schema!");
}
+
+ Ok(())
}
#[test]
- fn avro_3735_parse_enum_namespace() {
+ fn avro_3735_parse_enum_namespace() -> TestResult {
let schema = r#"
{
"type": "record",
@@ -4453,24 +4566,26 @@ mod tests {
pub bar_use: Bar,
}
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let foo = Foo {
bar_init: Bar::Bar0,
bar_use: Bar::Bar1,
};
- let avro_value = crate::to_value(foo).unwrap();
+ let avro_value = crate::to_value(foo)?;
assert!(avro_value.validate(&schema));
let mut writer = crate::Writer::new(&schema, Vec::new());
// schema validation happens here
- writer.append(avro_value).unwrap();
+ writer.append(avro_value)?;
+
+ Ok(())
}
#[test]
- fn avro_3755_deserialize() {
+ fn avro_3755_deserialize() -> TestResult {
#[derive(
Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Clone, serde::Deserialize, serde::Serialize,
)]
@@ -4543,21 +4658,21 @@ mod tests {
]
}"#;
- let writer_schema = Schema::parse_str(writer_schema).unwrap();
+ let writer_schema = Schema::parse_str(writer_schema)?;
let foo = Foo {
bar_init: Bar::Bar0,
bar_use: Bar::Bar1,
};
- let avro_value = crate::to_value(foo).unwrap();
+ let avro_value = crate::to_value(foo)?;
assert!(
avro_value.validate(&writer_schema),
"value is valid for schema",
);
- let datum = crate::to_avro_datum(&writer_schema, avro_value).unwrap();
+ let datum = crate::to_avro_datum(&writer_schema, avro_value)?;
let mut x = &datum[..];
- let reader_schema = Schema::parse_str(reader_schema).unwrap();
+ let reader_schema = Schema::parse_str(reader_schema)?;
let deser_value =
- crate::from_avro_datum(&writer_schema, &mut x, Some(&reader_schema)).unwrap();
+ crate::from_avro_datum(&writer_schema, &mut x, Some(&reader_schema))?;
match deser_value {
types::Value::Record(fields) => {
assert_eq!(fields.len(), 2);
@@ -4568,5 +4683,7 @@ mod tests {
}
_ => panic!("Expected Value::Record"),
}
+
+ Ok(())
}
}
diff --git a/lang/rust/avro/src/schema_compatibility.rs b/lang/rust/avro/src/schema_compatibility.rs
index aad8fde36..dcd70f2b1 100644
--- a/lang/rust/avro/src/schema_compatibility.rs
+++ b/lang/rust/avro/src/schema_compatibility.rs
@@ -326,6 +326,7 @@ impl SchemaCompatibility {
#[cfg(test)]
mod tests {
+ use apache_avro_test_helper::TestResult;
use super::*;
fn int_array_schema() -> Schema {
@@ -589,15 +590,14 @@ mod tests {
}
#[test]
- fn test_missing_field() {
+ fn test_missing_field() -> TestResult {
let reader_schema = Schema::parse_str(
r#"
{"type":"record", "name":"Record", "fields":[
{"name":"oldfield1", "type":"int"}
]}
"#,
- )
- .unwrap();
+ )?;
assert!(SchemaCompatibility::can_read(
&writer_schema(),
&reader_schema,
@@ -606,18 +606,19 @@ mod tests {
&reader_schema,
&writer_schema()
));
+
+ Ok(())
}
#[test]
- fn test_missing_second_field() {
+ fn test_missing_second_field() -> TestResult {
let reader_schema = Schema::parse_str(
r#"
{"type":"record", "name":"Record", "fields":[
{"name":"oldfield2", "type":"string"}
]}
"#,
- )
- .unwrap();
+ )?;
assert!(SchemaCompatibility::can_read(
&writer_schema(),
&reader_schema
@@ -626,10 +627,12 @@ mod tests {
&reader_schema,
&writer_schema()
));
+
+ Ok(())
}
#[test]
- fn test_all_fields() {
+ fn test_all_fields() -> TestResult {
let reader_schema = Schema::parse_str(
r#"
{"type":"record", "name":"Record", "fields":[
@@ -637,8 +640,7 @@ mod tests {
{"name":"oldfield2", "type":"string"}
]}
"#,
- )
- .unwrap();
+ )?;
assert!(SchemaCompatibility::can_read(
&writer_schema(),
&reader_schema
@@ -647,10 +649,12 @@ mod tests {
&reader_schema,
&writer_schema()
));
+
+ Ok(())
}
#[test]
- fn test_new_field_with_default() {
+ fn test_new_field_with_default() -> TestResult {
let reader_schema = Schema::parse_str(
r#"
{"type":"record", "name":"Record", "fields":[
@@ -658,8 +662,7 @@ mod tests {
{"name":"newfield1", "type":"int", "default":42}
]}
"#,
- )
- .unwrap();
+ )?;
assert!(SchemaCompatibility::can_read(
&writer_schema(),
&reader_schema
@@ -668,10 +671,12 @@ mod tests {
&reader_schema,
&writer_schema()
));
+
+ Ok(())
}
#[test]
- fn test_new_field() {
+ fn test_new_field() -> TestResult {
let reader_schema = Schema::parse_str(
r#"
{"type":"record", "name":"Record", "fields":[
@@ -679,8 +684,7 @@ mod tests {
{"name":"newfield1", "type":"int"}
]}
"#,
- )
- .unwrap();
+ )?;
assert!(!SchemaCompatibility::can_read(
&writer_schema(),
&reader_schema
@@ -689,6 +693,8 @@ mod tests {
&reader_schema,
&writer_schema()
));
+
+ Ok(())
}
#[test]
@@ -720,7 +726,7 @@ mod tests {
}
#[test]
- fn test_union_reader_writer_subset_incompatiblity() {
+ fn test_union_reader_writer_subset_incompatibility() {
// reader union schema must contain all writer union branches
let union_writer = union_schema(vec![Schema::Int, Schema::String]);
let union_reader = union_schema(vec![Schema::String]);
@@ -730,15 +736,14 @@ mod tests {
}
#[test]
- fn test_incompatible_record_field() {
+ fn test_incompatible_record_field() -> TestResult {
let string_schema = Schema::parse_str(
r#"
{"type":"record", "name":"MyRecord", "namespace":"ns", "fields": [
{"name":"field1", "type":"string"}
]}
"#,
- )
- .unwrap();
+ )?;
let int_schema = Schema::parse_str(
r#"
@@ -746,25 +751,26 @@ mod tests {
{"name":"field1", "type":"int"}
]}
"#,
- )
- .unwrap();
+ )?;
assert!(!SchemaCompatibility::can_read(&string_schema, &int_schema));
+
+ Ok(())
}
#[test]
- fn test_enum_symbols() {
+ fn test_enum_symbols() -> TestResult {
let enum_schema1 = Schema::parse_str(
r#"
{"type":"enum", "name":"MyEnum", "symbols":["A","B"]}
"#,
- )
- .unwrap();
+ )?;
let enum_schema2 =
- Schema::parse_str(r#"{"type":"enum", "name":"MyEnum", "symbols":["A","B","C"]}"#)
- .unwrap();
+ Schema::parse_str(r#"{"type":"enum", "name":"MyEnum", "symbols":["A","B","C"]}"#)?;
assert!(!SchemaCompatibility::can_read(&enum_schema2, &enum_schema1));
assert!(SchemaCompatibility::can_read(&enum_schema1, &enum_schema2));
+
+ Ok(())
}
fn point_2d_schema() -> Schema {
diff --git a/lang/rust/avro/src/ser.rs b/lang/rust/avro/src/ser.rs
index 2237c1d99..a2567f64f 100644
--- a/lang/rust/avro/src/ser.rs
+++ b/lang/rust/avro/src/ser.rs
@@ -492,6 +492,7 @@ mod tests {
use pretty_assertions::assert_eq;
use serde::{Deserialize, Serialize};
use std::sync::atomic::Ordering;
+ use apache_avro_test_helper::TestResult;
#[derive(Debug, Deserialize, Serialize, Clone)]
struct Test {
@@ -683,7 +684,7 @@ mod tests {
}
#[test]
- fn test_to_value() {
+ fn test_to_value() -> TestResult {
let test = Test {
a: 27,
b: "foo".to_owned(),
@@ -693,7 +694,7 @@ mod tests {
("b".to_owned(), Value::String("foo".to_owned())),
]);
- assert_eq!(to_value(test.clone()).unwrap(), expected);
+ assert_eq!(to_value(test.clone())?, expected);
let test_inner = TestInner { a: test, b: 35 };
@@ -708,11 +709,13 @@ mod tests {
("b".to_owned(), Value::Int(35)),
]);
- assert_eq!(to_value(test_inner).unwrap(), expected_inner);
+ assert_eq!(to_value(test_inner)?, expected_inner);
+
+ Ok(())
}
#[test]
- fn test_to_value_unit_enum() {
+ fn test_to_value_unit_enum() -> TestResult {
let test = TestUnitExternalEnum {
a: UnitExternalEnum::Val1,
};
@@ -720,7 +723,7 @@ mod tests {
let expected = Value::Record(vec![("a".to_owned(), Value::Enum(0, "Val1".to_owned()))]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"Error serializing unit external enum"
);
@@ -735,7 +738,7 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"Error serializing unit internal enum"
);
@@ -750,7 +753,7 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"Error serializing unit adjacent enum"
);
@@ -762,14 +765,16 @@ mod tests {
let expected = Value::Record(vec![("a".to_owned(), Value::Null)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"Error serializing unit untagged enum"
);
+
+ Ok(())
}
#[test]
- fn test_to_value_single_value_enum() {
+ fn test_to_value_single_value_enum() -> TestResult {
let test = TestSingleValueExternalEnum {
a: SingleValueExternalEnum::Double(64.0),
};
@@ -786,7 +791,7 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"Error serializing single value external enum"
);
@@ -811,7 +816,7 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"Error serializing single value adjacent enum"
);
@@ -823,14 +828,16 @@ mod tests {
let expected = Value::Record(vec![("a".to_owned(), Value::Double(64.0))]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"Error serializing single value untagged enum"
);
+
+ Ok(())
}
#[test]
- fn test_to_value_struct_enum() {
+ fn test_to_value_struct_enum() -> TestResult {
let test = TestStructExternalEnum {
a: StructExternalEnum::Val1 { x: 1.0, y: 2.0 },
};
@@ -852,7 +859,7 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"error serializing struct external enum"
);
@@ -872,7 +879,7 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"error serializing struct internal enum"
);
@@ -895,7 +902,7 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"error serializing struct adjacent enum"
);
@@ -912,7 +919,7 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"error serializing struct untagged enum"
);
@@ -934,14 +941,16 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"error serializing struct untagged enum variant"
);
+
+ Ok(())
}
#[test]
- fn test_to_value_tuple_enum() {
+ fn test_to_value_tuple_enum() -> TestResult {
let test = TestTupleExternalEnum {
a: TupleExternalEnum::Val2(1.0, 2.0, 3.0),
};
@@ -962,7 +971,7 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"error serializing tuple external enum"
);
@@ -983,7 +992,7 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"error serializing tuple adjacent enum"
);
@@ -998,10 +1007,12 @@ mod tests {
)]);
assert_eq!(
- to_value(test).unwrap(),
+ to_value(test)?,
expected,
"error serializing tuple untagged enum"
);
+
+ Ok(())
}
#[test]
diff --git a/lang/rust/avro/src/types.rs b/lang/rust/avro/src/types.rs
index d44826be1..26349fcd9 100644
--- a/lang/rust/avro/src/types.rs
+++ b/lang/rust/avro/src/types.rs
@@ -1019,9 +1019,10 @@ mod tests {
use apache_avro_test_helper::logger::{assert_logged, assert_not_logged};
use pretty_assertions::assert_eq;
use uuid::Uuid;
+ use apache_avro_test_helper::TestResult;
#[test]
- fn validate() {
+ fn validate() -> TestResult {
let value_schema_valid = vec![
(Value::Int(42), Schema::Int, true, ""),
(Value::Int(43), Schema::Long, true, ""),
@@ -1035,19 +1036,19 @@ mod tests {
),
(
Value::Union(0, Box::new(Value::Null)),
- Schema::Union(UnionSchema::new(vec![Schema::Null, Schema::Int]).unwrap()),
+ Schema::Union(UnionSchema::new(vec![Schema::Null, Schema::Int])?),
true,
"",
),
(
Value::Union(1, Box::new(Value::Int(42))),
- Schema::Union(UnionSchema::new(vec![Schema::Null, Schema::Int]).unwrap()),
+ Schema::Union(UnionSchema::new(vec![Schema::Null, Schema::Int])?),
true,
"",
),
(
Value::Union(0, Box::new(Value::Null)),
- Schema::Union(UnionSchema::new(vec![Schema::Double, Schema::Int]).unwrap()),
+ Schema::Union(UnionSchema::new(vec![Schema::Double, Schema::Int])?),
false,
"Invalid value: Union(0, Null) for schema: Union(UnionSchema { schemas: [Double, Int], variant_index: {Int: 1, Double: 0} }). Reason: Unsupported value-schema combination",
),
@@ -1060,7 +1061,7 @@ mod tests {
Schema::String,
Schema::Int,
])
- .unwrap(),
+ ?,
),
true,
"",
@@ -1068,14 +1069,14 @@ mod tests {
(
Value::Union(1, Box::new(Value::Long(42i64))),
Schema::Union(
- UnionSchema::new(vec![Schema::Null, Schema::TimestampMillis]).unwrap(),
+ UnionSchema::new(vec![Schema::Null, Schema::TimestampMillis])?,
),
true,
"",
),
(
Value::Union(2, Box::new(Value::Long(1_i64))),
- Schema::Union(UnionSchema::new(vec![Schema::Null, Schema::Int]).unwrap()),
+ Schema::Union(UnionSchema::new(vec![Schema::Null, Schema::Int])?),
false,
"Invalid value: Union(2, Long(1)) for schema: Union(UnionSchema { schemas: [Null, Int], variant_index: {Null: 0, Int: 1} }). Reason: No schema in the union at position '2'",
),
@@ -1166,10 +1167,12 @@ mod tests {
assert_eq!(expected_err_message, full_err_message);
}
}
+
+ Ok(())
}
#[test]
- fn validate_fixed() {
+ fn validate_fixed() -> TestResult {
let schema = Schema::Fixed(FixedSchema {
size: 4,
name: Name::new("some_fixed").unwrap(),
@@ -1199,10 +1202,12 @@ mod tests {
)
.as_str(),
);
+
+ Ok(())
}
#[test]
- fn validate_enum() {
+ fn validate_enum() -> TestResult {
let schema = Schema::Enum(EnumSchema {
name: Name::new("some_enum").unwrap(),
aliases: None,
@@ -1271,10 +1276,12 @@ mod tests {
)
.as_str(),
);
+
+ Ok(())
}
#[test]
- fn validate_record() {
+ fn validate_record() -> TestResult {
// {
// "type": "record",
// "fields": [
@@ -1318,7 +1325,7 @@ mod tests {
default: Some(JsonValue::Null),
aliases: None,
schema: Schema::Union(
- UnionSchema::new(vec![Schema::Null, Schema::Int]).unwrap(),
+ UnionSchema::new(vec![Schema::Null, Schema::Int])?,
),
order: RecordFieldOrder::Ascending,
position: 2,
@@ -1410,7 +1417,7 @@ mod tests {
Field with name '"b"' is not a member of the map items"#,
);
- let union_schema = Schema::Union(UnionSchema::new(vec![Schema::Null, schema]).unwrap());
+ let union_schema = Schema::Union(UnionSchema::new(vec![Schema::Null, schema])?);
assert!(Value::Union(
1,
@@ -1433,33 +1440,41 @@ Field with name '"b"' is not a member of the map items"#,
))
)
.validate(&union_schema));
+
+ Ok(())
}
#[test]
- fn resolve_bytes_ok() {
+ fn resolve_bytes_ok() -> TestResult {
let value = Value::Array(vec![Value::Int(0), Value::Int(42)]);
assert_eq!(
- value.resolve(&Schema::Bytes).unwrap(),
+ value.resolve(&Schema::Bytes)?,
Value::Bytes(vec![0u8, 42u8])
);
+
+ Ok(())
}
#[test]
- fn resolve_string_from_bytes() {
+ fn resolve_string_from_bytes() -> TestResult {
let value = Value::Bytes(vec![97, 98, 99]);
assert_eq!(
- value.resolve(&Schema::String).unwrap(),
+ value.resolve(&Schema::String)?,
Value::String("abc".to_string())
);
+
+ Ok(())
}
#[test]
- fn resolve_string_from_fixed() {
+ fn resolve_string_from_fixed() -> TestResult {
let value = Value::Fixed(3, vec![97, 98, 99]);
assert_eq!(
- value.resolve(&Schema::String).unwrap(),
+ value.resolve(&Schema::String)?,
Value::String("abc".to_string())
);
+
+ Ok(())
}
#[test]
@@ -1469,7 +1484,7 @@ Field with name '"b"' is not a member of the map items"#,
}
#[test]
- fn resolve_decimal_bytes() {
+ fn resolve_decimal_bytes() -> TestResult {
let value = Value::Decimal(Decimal::from(vec![1, 2]));
value
.clone()
@@ -1478,8 +1493,10 @@ Field with name '"b"' is not a member of the map items"#,
scale: 4,
inner: Box::new(Schema::Bytes),
}))
- .unwrap();
+ ?;
assert!(value.resolve(&Schema::String).is_err());
+
+ Ok(())
}
#[test]
@@ -1580,10 +1597,12 @@ Field with name '"b"' is not a member of the map items"#,
}
#[test]
- fn resolve_uuid() {
- let value = Value::Uuid(Uuid::parse_str("1481531d-ccc9-46d9-a56f-5b67459c0537").unwrap());
+ fn resolve_uuid() -> TestResult {
+ let value = Value::Uuid(Uuid::parse_str("1481531d-ccc9-46d9-a56f-5b67459c0537")?);
assert!(value.clone().resolve(&Schema::Uuid).is_ok());
assert!(value.resolve(&Schema::TimestampMicros).is_err());
+
+ Ok(())
}
#[test]
@@ -1593,7 +1612,7 @@ Field with name '"b"' is not a member of the map items"#,
}
#[test]
- fn test_avro_3621_resolve_to_nullable_union() {
+ fn test_avro_3621_resolve_to_nullable_union() -> TestResult {
let schema = Schema::parse_str(
r#"{
"type": "record",
@@ -1627,7 +1646,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}"#,
)
- .unwrap();
+ ?;
let value = Value::Record(vec![(
"event".to_string(),
@@ -1640,33 +1659,35 @@ Field with name '"b"' is not a member of the map items"#,
Value::Record(vec![("size".to_string(), Value::Int(1))]),
)]);
assert!(value.resolve(&schema).is_err());
+
+ Ok(())
}
#[test]
- fn json_from_avro() {
- assert_eq!(JsonValue::try_from(Value::Null).unwrap(), JsonValue::Null);
+ fn json_from_avro() -> TestResult {
+ assert_eq!(JsonValue::try_from(Value::Null)?, JsonValue::Null);
assert_eq!(
- JsonValue::try_from(Value::Boolean(true)).unwrap(),
+ JsonValue::try_from(Value::Boolean(true))?,
JsonValue::Bool(true)
);
assert_eq!(
- JsonValue::try_from(Value::Int(1)).unwrap(),
+ JsonValue::try_from(Value::Int(1))?,
JsonValue::Number(1.into())
);
assert_eq!(
- JsonValue::try_from(Value::Long(1)).unwrap(),
+ JsonValue::try_from(Value::Long(1))?,
JsonValue::Number(1.into())
);
assert_eq!(
- JsonValue::try_from(Value::Float(1.0)).unwrap(),
+ JsonValue::try_from(Value::Float(1.0))?,
JsonValue::Number(Number::from_f64(1.0).unwrap())
);
assert_eq!(
- JsonValue::try_from(Value::Double(1.0)).unwrap(),
+ JsonValue::try_from(Value::Double(1.0))?,
JsonValue::Number(Number::from_f64(1.0).unwrap())
);
assert_eq!(
- JsonValue::try_from(Value::Bytes(vec![1, 2, 3])).unwrap(),
+ JsonValue::try_from(Value::Bytes(vec![1, 2, 3]))?,
JsonValue::Array(vec![
JsonValue::Number(1.into()),
JsonValue::Number(2.into()),
@@ -1674,11 +1695,11 @@ Field with name '"b"' is not a member of the map items"#,
])
);
assert_eq!(
- JsonValue::try_from(Value::String("test".into())).unwrap(),
+ JsonValue::try_from(Value::String("test".into()))?,
JsonValue::String("test".into())
);
assert_eq!(
- JsonValue::try_from(Value::Fixed(3, vec![1, 2, 3])).unwrap(),
+ JsonValue::try_from(Value::Fixed(3, vec![1, 2, 3]))?,
JsonValue::Array(vec![
JsonValue::Number(1.into()),
JsonValue::Number(2.into()),
@@ -1686,12 +1707,12 @@ Field with name '"b"' is not a member of the map items"#,
])
);
assert_eq!(
- JsonValue::try_from(Value::Enum(1, "test_enum".into())).unwrap(),
+ JsonValue::try_from(Value::Enum(1, "test_enum".into()))?,
JsonValue::String("test_enum".into())
);
assert_eq!(
JsonValue::try_from(Value::Union(1, Box::new(Value::String("test_enum".into()))))
- .unwrap(),
+ ?,
JsonValue::String("test_enum".into())
);
assert_eq!(
@@ -1700,7 +1721,7 @@ Field with name '"b"' is not a member of the map items"#,
Value::Int(2),
Value::Int(3)
]))
- .unwrap(),
+ ?,
JsonValue::Array(vec![
JsonValue::Number(1.into()),
JsonValue::Number(2.into()),
@@ -1717,7 +1738,7 @@ Field with name '"b"' is not a member of the map items"#,
.into_iter()
.collect()
))
- .unwrap(),
+ ?,
JsonValue::Object(
vec![
("v1".to_string(), JsonValue::Number(1.into())),
@@ -1734,7 +1755,7 @@ Field with name '"b"' is not a member of the map items"#,
("v2".to_string(), Value::Int(2)),
("v3".to_string(), Value::Int(3))
]))
- .unwrap(),
+ ?,
JsonValue::Object(
vec![
("v1".to_string(), JsonValue::Number(1.into())),
@@ -1746,11 +1767,11 @@ Field with name '"b"' is not a member of the map items"#,
)
);
assert_eq!(
- JsonValue::try_from(Value::Date(1)).unwrap(),
+ JsonValue::try_from(Value::Date(1))?,
JsonValue::Number(1.into())
);
assert_eq!(
- JsonValue::try_from(Value::Decimal(vec![1, 2, 3].into())).unwrap(),
+ JsonValue::try_from(Value::Decimal(vec![1, 2, 3].into()))?,
JsonValue::Array(vec![
JsonValue::Number(1.into()),
JsonValue::Number(2.into()),
@@ -1758,26 +1779,26 @@ Field with name '"b"' is not a member of the map items"#,
])
);
assert_eq!(
- JsonValue::try_from(Value::TimeMillis(1)).unwrap(),
+ JsonValue::try_from(Value::TimeMillis(1))?,
JsonValue::Number(1.into())
);
assert_eq!(
- JsonValue::try_from(Value::TimeMicros(1)).unwrap(),
+ JsonValue::try_from(Value::TimeMicros(1))?,
JsonValue::Number(1.into())
);
assert_eq!(
- JsonValue::try_from(Value::TimestampMillis(1)).unwrap(),
+ JsonValue::try_from(Value::TimestampMillis(1))?,
JsonValue::Number(1.into())
);
assert_eq!(
- JsonValue::try_from(Value::TimestampMicros(1)).unwrap(),
+ JsonValue::try_from(Value::TimestampMicros(1))?,
JsonValue::Number(1.into())
);
assert_eq!(
JsonValue::try_from(Value::Duration(
[1u8, 2u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8].into()
))
- .unwrap(),
+ ?,
JsonValue::Array(vec![
JsonValue::Number(1.into()),
JsonValue::Number(2.into()),
@@ -1795,15 +1816,17 @@ Field with name '"b"' is not a member of the map items"#,
);
assert_eq!(
JsonValue::try_from(Value::Uuid(
- Uuid::parse_str("936DA01F-9ABD-4D9D-80C7-02AF85C822A8").unwrap()
+ Uuid::parse_str("936DA01F-9ABD-4D9D-80C7-02AF85C822A8")?
))
- .unwrap(),
+ ?,
JsonValue::String("936da01f-9abd-4d9d-80c7-02af85c822a8".into())
);
+
+ Ok(())
}
#[test]
- fn test_avro_3433_recursive_resolves_record() {
+ fn test_avro_3433_recursive_resolves_record() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -1828,7 +1851,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}"#,
)
- .unwrap();
+ ?;
let inner_value1 = Value::Record(vec![("z".into(), Value::Int(3))]);
let inner_value2 = Value::Record(vec![("z".into(), Value::Int(6))]);
@@ -1836,10 +1859,12 @@ Field with name '"b"' is not a member of the map items"#,
outer
.resolve(&schema)
.expect("Record definition defined in one field must be available in other field");
+
+ Ok(())
}
#[test]
- fn test_avro_3433_recursive_resolves_array() {
+ fn test_avro_3433_recursive_resolves_array() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -1870,7 +1895,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}"#,
)
- .unwrap();
+ ?;
let inner_value1 = Value::Record(vec![("z".into(), Value::Int(3))]);
let inner_value2 = Value::Record(vec![("z".into(), Value::Int(6))]);
@@ -1884,10 +1909,12 @@ Field with name '"b"' is not a member of the map items"#,
outer_value
.resolve(&schema)
.expect("Record defined in array definition must be resolvable from map");
+
+ Ok(())
}
#[test]
- fn test_avro_3433_recursive_resolves_map() {
+ fn test_avro_3433_recursive_resolves_map() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -1915,7 +1942,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}"#,
)
- .unwrap();
+ ?;
let inner_value1 = Value::Record(vec![("z".into(), Value::Int(3))]);
let inner_value2 = Value::Record(vec![("z".into(), Value::Int(6))]);
@@ -1929,10 +1956,12 @@ Field with name '"b"' is not a member of the map items"#,
outer_value
.resolve(&schema)
.expect("Record defined in record field must be resolvable from map field");
+
+ Ok(())
}
#[test]
- fn test_avro_3433_recursive_resolves_record_wrapper() {
+ fn test_avro_3433_recursive_resolves_record_wrapper() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -1964,7 +1993,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}"#,
)
- .unwrap();
+ ?;
let inner_value1 = Value::Record(vec![("z".into(), Value::Int(3))]);
let inner_value2 = Value::Record(vec![(
@@ -1974,10 +2003,12 @@ Field with name '"b"' is not a member of the map items"#,
let outer_value =
Value::Record(vec![("a".into(), inner_value1), ("b".into(), inner_value2)]);
outer_value.resolve(&schema).expect("Record schema defined in field must be resolvable in Record schema defined in other field");
+
+ Ok(())
}
#[test]
- fn test_avro_3433_recursive_resolves_map_and_array() {
+ fn test_avro_3433_recursive_resolves_map_and_array() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -2008,7 +2039,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}"#,
)
- .unwrap();
+ ?;
let inner_value1 = Value::Record(vec![("z".into(), Value::Int(3))]);
let inner_value2 = Value::Record(vec![("z".into(), Value::Int(6))]);
@@ -2022,10 +2053,12 @@ Field with name '"b"' is not a member of the map items"#,
outer_value
.resolve(&schema)
.expect("Record defined in map definition must be resolvable from array");
+
+ Ok(())
}
#[test]
- fn test_avro_3433_recursive_resolves_union() {
+ fn test_avro_3433_recursive_resolves_union() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -2050,7 +2083,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}"#,
)
- .unwrap();
+ ?;
let inner_value1 = Value::Record(vec![("z".into(), Value::Int(3))]);
let inner_value2 = Value::Record(vec![("z".into(), Value::Int(6))]);
@@ -2065,10 +2098,12 @@ Field with name '"b"' is not a member of the map items"#,
outer2
.resolve(&schema)
.expect("Record definition defined in union must be resolved in other field");
+
+ Ok(())
}
#[test]
- fn test_avro_3461_test_multi_level_resolve_outer_namespace() {
+ fn test_avro_3461_test_multi_level_resolve_outer_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -2110,7 +2145,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let inner_record = Value::Record(vec![("inner_field_1".into(), Value::Double(5.4))]);
let middle_record_variation_1 = Value::Record(vec![(
"middle_field_1".into(),
@@ -2151,10 +2186,12 @@ Field with name '"b"' is not a member of the map items"#,
outer_record_variation_3
.resolve(&schema)
.expect("Should be able to resolve value to the schema that is it's definition");
+
+ Ok(())
}
#[test]
- fn test_avro_3461_test_multi_level_resolve_middle_namespace() {
+ fn test_avro_3461_test_multi_level_resolve_middle_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -2197,7 +2234,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let inner_record = Value::Record(vec![("inner_field_1".into(), Value::Double(5.4))]);
let middle_record_variation_1 = Value::Record(vec![(
"middle_field_1".into(),
@@ -2238,10 +2275,12 @@ Field with name '"b"' is not a member of the map items"#,
outer_record_variation_3
.resolve(&schema)
.expect("Should be able to resolve value to the schema that is it's definition");
+
+ Ok(())
}
#[test]
- fn test_avro_3461_test_multi_level_resolve_inner_namespace() {
+ fn test_avro_3461_test_multi_level_resolve_inner_namespace() -> TestResult {
let schema = r#"
{
"name": "record_name",
@@ -2285,7 +2324,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}
"#;
- let schema = Schema::parse_str(schema).unwrap();
+ let schema = Schema::parse_str(schema)?;
let inner_record = Value::Record(vec![("inner_field_1".into(), Value::Double(5.4))]);
let middle_record_variation_1 = Value::Record(vec![(
@@ -2327,10 +2366,12 @@ Field with name '"b"' is not a member of the map items"#,
outer_record_variation_3
.resolve(&schema)
.expect("Should be able to resolve value to the schema that is it's definition");
+
+ Ok(())
}
#[test]
- fn test_avro_3460_validation_with_refs() {
+ fn test_avro_3460_validation_with_refs() -> TestResult {
let schema = Schema::parse_str(
r#"
{
@@ -2355,7 +2396,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}"#,
)
- .unwrap();
+ ?;
let inner_value_right = Value::Record(vec![("z".into(), Value::Int(3))]);
let inner_value_wrong1 = Value::Record(vec![("z".into(), Value::Null)]);
@@ -2378,10 +2419,12 @@ Field with name '"b"' is not a member of the map items"#,
!outer2.validate(&schema),
"field b record is invalid against the schema"
); // this should pass, but doesn't
+
+ Ok(())
}
#[test]
- fn test_avro_3460_validation_with_refs_real_struct() {
+ fn test_avro_3460_validation_with_refs_real_struct() -> TestResult {
use crate::ser::Serializer;
use serde::Serialize;
@@ -2432,7 +2475,7 @@ Field with name '"b"' is not a member of the map items"#,
]
}"#,
)
- .unwrap();
+ ?;
let test_inner = TestInner { z: 3 };
let test_outer1 = TestRefSchemaStruct1 {
@@ -2449,11 +2492,11 @@ Field with name '"b"' is not a member of the map items"#,
};
let mut ser = Serializer::default();
- let test_outer1: Value = test_outer1.serialize(&mut ser).unwrap();
+ let test_outer1: Value = test_outer1.serialize(&mut ser)?;
let mut ser = Serializer::default();
- let test_outer2: Value = test_outer2.serialize(&mut ser).unwrap();
+ let test_outer2: Value = test_outer2.serialize(&mut ser)?;
let mut ser = Serializer::default();
- let test_outer3: Value = test_outer3.serialize(&mut ser).unwrap();
+ let test_outer3: Value = test_outer3.serialize(&mut ser)?;
assert!(
!test_outer1.validate(&schema),
@@ -2467,9 +2510,11 @@ Field with name '"b"' is not a member of the map items"#,
!test_outer3.validate(&schema),
"field b record is invalid against the schema"
);
+
+ Ok(())
}
- fn avro_3674_with_or_without_namespace(with_namespace: bool) {
+ fn avro_3674_with_or_without_namespace(with_namespace: bool) -> TestResult {
use crate::ser::Serializer;
use serde::Serialize;
@@ -2511,7 +2556,7 @@ Field with name '"b"' is not a member of the map items"#,
},
);
- let schema = Schema::parse_str(&schema_str).unwrap();
+ let schema = Schema::parse_str(&schema_str)?;
#[derive(Serialize)]
enum EnumType {
@@ -2540,25 +2585,27 @@ Field with name '"b"' is not a member of the map items"#,
};
let mut ser = Serializer::default();
- let test_value: Value = msg.serialize(&mut ser).unwrap();
+ let test_value: Value = msg.serialize(&mut ser)?;
assert!(test_value.validate(&schema), "test_value should validate");
assert!(
test_value.resolve(&schema).is_ok(),
"test_value should resolve"
);
+
+ Ok(())
}
#[test]
- fn test_avro_3674_validate_no_namespace_resolution() {
- avro_3674_with_or_without_namespace(false);
+ fn test_avro_3674_validate_no_namespace_resolution() -> TestResult {
+ avro_3674_with_or_without_namespace(false)
}
#[test]
- fn test_avro_3674_validate_with_namespace_resolution() {
- avro_3674_with_or_without_namespace(true);
+ fn test_avro_3674_validate_with_namespace_resolution() -> TestResult {
+ avro_3674_with_or_without_namespace(true)
}
- fn avro_3688_schema_resolution_panic(set_field_b: bool) {
+ fn avro_3688_schema_resolution_panic(set_field_b: bool) -> TestResult {
use crate::ser::Serializer;
use serde::{Deserialize, Serialize};
@@ -2605,7 +2652,7 @@ Field with name '"b"' is not a member of the map items"#,
field_b: Option<Inner>,
}
- let schema = Schema::parse_str(schema_str).unwrap();
+ let schema = Schema::parse_str(schema_str)?;
let msg = Message {
field_a: Some(Inner {
@@ -2621,21 +2668,23 @@ Field with name '"b"' is not a member of the map items"#,
};
let mut ser = Serializer::default();
- let test_value: Value = msg.serialize(&mut ser).unwrap();
+ let test_value: Value = msg.serialize(&mut ser)?;
assert!(test_value.validate(&schema), "test_value should validate");
assert!(
test_value.resolve(&schema).is_ok(),
"test_value should resolve"
);
+
+ Ok(())
}
#[test]
- fn test_avro_3688_field_b_not_set() {
- avro_3688_schema_resolution_panic(false);
+ fn test_avro_3688_field_b_not_set()-> TestResult {
+ avro_3688_schema_resolution_panic(false)
}
#[test]
- fn test_avro_3688_field_b_set() {
- avro_3688_schema_resolution_panic(true);
+ fn test_avro_3688_field_b_set()-> TestResult {
+ avro_3688_schema_resolution_panic(true)
}
}
diff --git a/lang/rust/avro/src/util.rs b/lang/rust/avro/src/util.rs
index d94acce7a..5ce901ed4 100644
--- a/lang/rust/avro/src/util.rs
+++ b/lang/rust/avro/src/util.rs
@@ -188,6 +188,7 @@ pub(crate) fn is_human_readable() -> bool {
mod tests {
use super::*;
use pretty_assertions::assert_eq;
+ use apache_avro_test_helper::TestResult;
#[test]
fn test_zigzag() {
@@ -280,8 +281,10 @@ mod tests {
}
#[test]
- fn test_safe_len() {
- assert_eq!(42usize, safe_len(42usize).unwrap());
+ fn test_safe_len() -> TestResult {
+ assert_eq!(42usize, safe_len(42usize)?);
assert!(safe_len(1024 * 1024 * 1024).is_err());
+
+ Ok(())
}
}
diff --git a/lang/rust/avro/src/writer.rs b/lang/rust/avro/src/writer.rs
index 58d13d40f..83e863455 100644
--- a/lang/rust/avro/src/writer.rs
+++ b/lang/rust/avro/src/writer.rs
@@ -639,6 +639,8 @@ mod tests {
use pretty_assertions::assert_eq;
use serde::{Deserialize, Serialize};
+ use apache_avro_test_helper::TestResult;
+
const AVRO_OBJECT_HEADER_LEN: usize = AVRO_OBJECT_HEADER.len();
const SCHEMA: &str = r#"
@@ -661,8 +663,8 @@ mod tests {
const UNION_SCHEMA: &str = r#"["null", "long"]"#;
#[test]
- fn test_to_avro_datum() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_to_avro_datum() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let mut record = Record::new(&schema).unwrap();
record.put("a", 27i64);
record.put("b", "foo");
@@ -672,33 +674,37 @@ mod tests {
zig_i64(3, &mut expected);
expected.extend(vec![b'f', b'o', b'o'].into_iter());
- assert_eq!(to_avro_datum(&schema, record).unwrap(), expected);
+ assert_eq!(to_avro_datum(&schema, record)?, expected);
+
+ Ok(())
}
#[test]
- fn test_union_not_null() {
- let schema = Schema::parse_str(UNION_SCHEMA).unwrap();
+ fn test_union_not_null() -> TestResult {
+ let schema = Schema::parse_str(UNION_SCHEMA)?;
let union = Value::Union(1, Box::new(Value::Long(3)));
let mut expected = Vec::new();
zig_i64(1, &mut expected);
zig_i64(3, &mut expected);
- assert_eq!(to_avro_datum(&schema, union).unwrap(), expected);
+ assert_eq!(to_avro_datum(&schema, union)?, expected);
+
+ Ok(())
}
#[test]
- fn test_union_null() {
- let schema = Schema::parse_str(UNION_SCHEMA).unwrap();
+ fn test_union_null() -> TestResult {
+ let schema = Schema::parse_str(UNION_SCHEMA)?;
let union = Value::Union(0, Box::new(Value::Null));
let mut expected = Vec::new();
zig_i64(0, &mut expected);
- assert_eq!(to_avro_datum(&schema, union).unwrap(), expected);
- }
+ assert_eq!(to_avro_datum(&schema, union)?, expected);
- type TestResult<T> = anyhow::Result<T, Box<dyn std::error::Error>>;
+ Ok(())
+ }
fn logical_type_test<T: Into<Value> + Clone>(
schema_str: &'static str,
@@ -708,7 +714,7 @@ mod tests {
raw_schema: &Schema,
raw_value: T,
- ) -> TestResult<()> {
+ ) -> TestResult {
let schema = Schema::parse_str(schema_str)?;
assert_eq!(&schema, expected_schema);
// The serialized format should be the same as the schema.
@@ -718,13 +724,13 @@ mod tests {
// Should deserialize from the schema into the logical type.
let mut r = ser.as_slice();
- let de = crate::from_avro_datum(&schema, &mut r, None).unwrap();
+ let de = crate::from_avro_datum(&schema, &mut r, None)?;
assert_eq!(de, value);
Ok(())
}
#[test]
- fn date() -> TestResult<()> {
+ fn date() -> TestResult {
logical_type_test(
r#"{"type": "int", "logicalType": "date"}"#,
&Schema::Date,
@@ -735,7 +741,7 @@ mod tests {
}
#[test]
- fn time_millis() -> TestResult<()> {
+ fn time_millis() -> TestResult {
logical_type_test(
r#"{"type": "int", "logicalType": "time-millis"}"#,
&Schema::TimeMillis,
@@ -746,7 +752,7 @@ mod tests {
}
#[test]
- fn time_micros() -> TestResult<()> {
+ fn time_micros() -> TestResult {
logical_type_test(
r#"{"type": "long", "logicalType": "time-micros"}"#,
&Schema::TimeMicros,
@@ -757,7 +763,7 @@ mod tests {
}
#[test]
- fn timestamp_millis() -> TestResult<()> {
+ fn timestamp_millis() -> TestResult {
logical_type_test(
r#"{"type": "long", "logicalType": "timestamp-millis"}"#,
&Schema::TimestampMillis,
@@ -768,7 +774,7 @@ mod tests {
}
#[test]
- fn timestamp_micros() -> TestResult<()> {
+ fn timestamp_micros() -> TestResult {
logical_type_test(
r#"{"type": "long", "logicalType": "timestamp-micros"}"#,
&Schema::TimestampMicros,
@@ -779,10 +785,10 @@ mod tests {
}
#[test]
- fn decimal_fixed() -> TestResult<()> {
+ fn decimal_fixed() -> TestResult {
let size = 30;
let inner = Schema::Fixed(FixedSchema {
- name: Name::new("decimal").unwrap(),
+ name: Name::new("decimal")?,
aliases: None,
doc: None,
size,
@@ -803,7 +809,7 @@ mod tests {
}
#[test]
- fn decimal_bytes() -> TestResult<()> {
+ fn decimal_bytes() -> TestResult {
let inner = Schema::Bytes;
let value = vec![0u8; 10];
logical_type_test(
@@ -820,9 +826,9 @@ mod tests {
}
#[test]
- fn duration() -> TestResult<()> {
+ fn duration() -> TestResult {
let inner = Schema::Fixed(FixedSchema {
- name: Name::new("duration").unwrap(),
+ name: Name::new("duration")?,
aliases: None,
doc: None,
size: 12,
@@ -843,18 +849,18 @@ mod tests {
}
#[test]
- fn test_writer_append() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_writer_append() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let mut writer = Writer::new(&schema, Vec::new());
let mut record = Record::new(&schema).unwrap();
record.put("a", 27i64);
record.put("b", "foo");
- let n1 = writer.append(record.clone()).unwrap();
- let n2 = writer.append(record.clone()).unwrap();
- let n3 = writer.flush().unwrap();
- let result = writer.into_inner().unwrap();
+ let n1 = writer.append(record.clone())?;
+ let n2 = writer.append(record.clone())?;
+ let n3 = writer.flush()?;
+ let result = writer.into_inner()?;
assert_eq!(n1 + n2 + n3, result.len());
@@ -872,11 +878,13 @@ mod tests {
&result[last_data_byte - data.len()..last_data_byte],
data.as_slice()
);
+
+ Ok(())
}
#[test]
- fn test_writer_extend() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_writer_extend() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let mut writer = Writer::new(&schema, Vec::new());
let mut record = Record::new(&schema).unwrap();
@@ -885,9 +893,9 @@ mod tests {
let record_copy = record.clone();
let records = vec![record, record_copy];
- let n1 = writer.extend(records.into_iter()).unwrap();
- let n2 = writer.flush().unwrap();
- let result = writer.into_inner().unwrap();
+ let n1 = writer.extend(records.into_iter())?;
+ let n2 = writer.flush()?;
+ let result = writer.into_inner()?;
assert_eq!(n1 + n2, result.len());
@@ -905,6 +913,8 @@ mod tests {
&result[last_data_byte - data.len()..last_data_byte],
data.as_slice()
);
+
+ Ok(())
}
#[derive(Debug, Clone, Deserialize, Serialize)]
@@ -914,8 +924,8 @@ mod tests {
}
#[test]
- fn test_writer_append_ser() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_writer_append_ser() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let mut writer = Writer::new(&schema, Vec::new());
let record = TestSerdeSerialize {
@@ -923,9 +933,9 @@ mod tests {
b: "foo".to_owned(),
};
- let n1 = writer.append_ser(record).unwrap();
- let n2 = writer.flush().unwrap();
- let result = writer.into_inner().unwrap();
+ let n1 = writer.append_ser(record)?;
+ let n2 = writer.flush()?;
+ let result = writer.into_inner()?;
assert_eq!(n1 + n2, result.len());
@@ -942,11 +952,13 @@ mod tests {
&result[last_data_byte - data.len()..last_data_byte],
data.as_slice()
);
+
+ Ok(())
}
#[test]
- fn test_writer_extend_ser() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_writer_extend_ser() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let mut writer = Writer::new(&schema, Vec::new());
let record = TestSerdeSerialize {
@@ -956,9 +968,9 @@ mod tests {
let record_copy = record.clone();
let records = vec![record, record_copy];
- let n1 = writer.extend_ser(records.into_iter()).unwrap();
- let n2 = writer.flush().unwrap();
- let result = writer.into_inner().unwrap();
+ let n1 = writer.extend_ser(records.into_iter())?;
+ let n2 = writer.flush()?;
+ let result = writer.into_inner()?;
assert_eq!(n1 + n2, result.len());
@@ -976,6 +988,8 @@ mod tests {
&result[last_data_byte - data.len()..last_data_byte],
data.as_slice()
);
+
+ Ok(())
}
fn make_writer_with_codec(schema: &Schema) -> Writer<'_, Vec<u8>> {
@@ -991,15 +1005,15 @@ mod tests {
.build()
}
- fn check_writer(mut writer: Writer<'_, Vec<u8>>, schema: &Schema) {
+ fn check_writer(mut writer: Writer<'_, Vec<u8>>, schema: &Schema) -> TestResult {
let mut record = Record::new(schema).unwrap();
record.put("a", 27i64);
record.put("b", "foo");
- let n1 = writer.append(record.clone()).unwrap();
- let n2 = writer.append(record.clone()).unwrap();
- let n3 = writer.flush().unwrap();
- let result = writer.into_inner().unwrap();
+ let n1 = writer.append(record.clone())?;
+ let n2 = writer.append(record.clone())?;
+ let n3 = writer.flush()?;
+ let result = writer.into_inner()?;
assert_eq!(n1 + n2 + n3, result.len());
@@ -1008,7 +1022,7 @@ mod tests {
zig_i64(3, &mut data);
data.extend(b"foo");
data.extend(data.clone());
- Codec::Deflate.compress(&mut data).unwrap();
+ Codec::Deflate.compress(&mut data)?;
// starts with magic
assert_eq!(&result[..AVRO_OBJECT_HEADER_LEN], AVRO_OBJECT_HEADER);
@@ -1018,24 +1032,26 @@ mod tests {
&result[last_data_byte - data.len()..last_data_byte],
data.as_slice()
);
+
+ Ok(())
}
#[test]
- fn test_writer_with_codec() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_writer_with_codec() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let writer = make_writer_with_codec(&schema);
- check_writer(writer, &schema);
+ check_writer(writer, &schema)
}
#[test]
- fn test_writer_with_builder() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_writer_with_builder() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let writer = make_writer_with_builder(&schema);
- check_writer(writer, &schema);
+ check_writer(writer, &schema)
}
#[test]
- fn test_logical_writer() {
+ fn test_logical_writer() -> TestResult {
const LOGICAL_TYPE_SCHEMA: &str = r#"
{
"type": "record",
@@ -1055,7 +1071,7 @@ mod tests {
}
"#;
let codec = Codec::Deflate;
- let schema = Schema::parse_str(LOGICAL_TYPE_SCHEMA).unwrap();
+ let schema = Schema::parse_str(LOGICAL_TYPE_SCHEMA)?;
let mut writer = Writer::builder()
.schema(&schema)
.codec(codec)
@@ -1071,10 +1087,10 @@ mod tests {
let mut record2 = Record::new(&schema).unwrap();
record2.put("a", Value::Union(0, Box::new(Value::Null)));
- let n1 = writer.append(record1).unwrap();
- let n2 = writer.append(record2).unwrap();
- let n3 = writer.flush().unwrap();
- let result = writer.into_inner().unwrap();
+ let n1 = writer.append(record1)?;
+ let n2 = writer.append(record2)?;
+ let n3 = writer.flush()?;
+ let result = writer.into_inner()?;
assert_eq!(n1 + n2 + n3, result.len());
@@ -1085,7 +1101,7 @@ mod tests {
// byte indicating null
zig_i64(0, &mut data);
- codec.compress(&mut data).unwrap();
+ codec.compress(&mut data)?;
// starts with magic
assert_eq!(&result[..AVRO_OBJECT_HEADER_LEN], AVRO_OBJECT_HEADER);
@@ -1095,47 +1111,43 @@ mod tests {
&result[last_data_byte - data.len()..last_data_byte],
data.as_slice()
);
+
+ Ok(())
}
#[test]
- fn test_avro_3405_writer_add_metadata_success() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_avro_3405_writer_add_metadata_success() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let mut writer = Writer::new(&schema, Vec::new());
- writer
- .add_user_metadata("stringKey".to_string(), String::from("stringValue"))
- .unwrap();
- writer
- .add_user_metadata("strKey".to_string(), "strValue")
- .unwrap();
- writer
- .add_user_metadata("bytesKey".to_string(), b"bytesValue")
- .unwrap();
- writer
- .add_user_metadata("vecKey".to_string(), vec![1, 2, 3])
- .unwrap();
+ writer.add_user_metadata("stringKey".to_string(), String::from("stringValue"))?;
+ writer.add_user_metadata("strKey".to_string(), "strValue")?;
+ writer.add_user_metadata("bytesKey".to_string(), b"bytesValue")?;
+ writer.add_user_metadata("vecKey".to_string(), vec![1, 2, 3])?;
let mut record = Record::new(&schema).unwrap();
record.put("a", 27i64);
record.put("b", "foo");
- writer.append(record.clone()).unwrap();
- writer.append(record.clone()).unwrap();
- writer.flush().unwrap();
- let result = writer.into_inner().unwrap();
+ writer.append(record.clone())?;
+ writer.append(record.clone())?;
+ writer.flush()?;
+ let result = writer.into_inner()?;
assert_eq!(result.len(), 260);
+
+ Ok(())
}
#[test]
- fn test_avro_3405_writer_add_metadata_failure() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_avro_3405_writer_add_metadata_failure() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let mut writer = Writer::new(&schema, Vec::new());
let mut record = Record::new(&schema).unwrap();
record.put("a", 27i64);
record.put("b", "foo");
- writer.append(record.clone()).unwrap();
+ writer.append(record.clone())?;
match writer.add_user_metadata("stringKey".to_string(), String::from("value2")) {
Err(e @ Error::FileHeaderAlreadyWritten) => {
@@ -1144,11 +1156,13 @@ mod tests {
Err(e) => panic!("Unexpected error occurred while writing user metadata: {e:?}"),
Ok(_) => panic!("Expected an error that metadata cannot be added after adding data"),
}
+
+ Ok(())
}
#[test]
- fn test_avro_3405_writer_add_metadata_reserved_prefix_failure() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_avro_3405_writer_add_metadata_reserved_prefix_failure() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let mut writer = Writer::new(&schema, Vec::new());
let key = "avro.stringKey".to_string();
@@ -1161,11 +1175,13 @@ mod tests {
),
Ok(_) => panic!("Expected an error that the metadata key cannot be prefixed with 'avro.'"),
}
+
+ Ok(())
}
#[test]
- fn test_avro_3405_writer_add_metadata_with_builder_api_success() {
- let schema = Schema::parse_str(SCHEMA).unwrap();
+ fn test_avro_3405_writer_add_metadata_with_builder_api_success() -> TestResult {
+ let schema = Schema::parse_str(SCHEMA)?;
let mut user_meta_data: HashMap<String, Value> = HashMap::new();
user_meta_data.insert(
@@ -1182,6 +1198,8 @@ mod tests {
.build();
assert_eq!(writer.user_metadata, user_meta_data);
+
+ Ok(())
}
#[derive(Serialize, Clone)]
@@ -1234,7 +1252,7 @@ mod tests {
}
#[test]
- fn test_single_object_writer() {
+ fn test_single_object_writer() -> TestResult {
let mut buf: Vec<u8> = Vec::new();
let obj = TestSingleObjectWriter {
a: 300,
@@ -1268,11 +1286,13 @@ mod tests {
&mut msg_binary,
)
.expect("encode should have failed by here as a dependency of any writing");
- assert_eq!(&buf[10..], &msg_binary[..])
+ assert_eq!(&buf[10..], &msg_binary[..]);
+
+ Ok(())
}
#[test]
- fn test_writer_parity() {
+ fn test_writer_parity() -> TestResult {
let obj1 = TestSingleObjectWriter {
a: 300,
b: 34.555,
@@ -1302,5 +1322,7 @@ mod tests {
.expect("Serialization expected");
assert_eq!(buf1, buf2);
assert_eq!(buf1, buf3);
+
+ Ok(())
}
}
diff --git a/lang/rust/avro/tests/append_to_existing.rs b/lang/rust/avro/tests/append_to_existing.rs
index 7b3874746..2ea59d95c 100644
--- a/lang/rust/avro/tests/append_to_existing.rs
+++ b/lang/rust/avro/tests/append_to_existing.rs
@@ -20,9 +20,10 @@ use apache_avro::{
types::{Record, Value},
AvroResult, Reader, Schema, Writer,
};
+use apache_avro_test_helper::TestResult;
#[test]
-fn avro_3630_append_to_an_existing_file() {
+fn avro_3630_append_to_an_existing_file() -> TestResult {
let schema_str = r#"
{
"type": "record",
@@ -53,6 +54,8 @@ fn avro_3630_append_to_an_existing_file() {
check(value, i);
i += 1
}
+
+ Ok(())
}
/// Simulates reading from a pre-existing .avro file and returns its bytes
diff --git a/lang/rust/avro/tests/io.rs b/lang/rust/avro/tests/io.rs
index 9d3dc7b79..7c3d5e961 100644
--- a/lang/rust/avro/tests/io.rs
+++ b/lang/rust/avro/tests/io.rs
@@ -20,6 +20,7 @@ use apache_avro::{from_avro_datum, to_avro_datum, types::Value, Error, Schema};
use lazy_static::lazy_static;
use pretty_assertions::assert_eq;
use std::io::Cursor;
+use apache_avro_test_helper::TestResult;
lazy_static! {
static ref SCHEMAS_TO_VALIDATE: Vec<(&'static str, Value)> = vec![
@@ -99,44 +100,52 @@ lazy_static! {
}
#[test]
-fn test_validate() {
+fn test_validate() -> TestResult {
for (raw_schema, value) in SCHEMAS_TO_VALIDATE.iter() {
- let schema = Schema::parse_str(raw_schema).unwrap();
+ let schema = Schema::parse_str(raw_schema)?;
assert!(
value.validate(&schema),
"value {value:?} does not validate schema: {raw_schema}"
);
}
+
+ Ok(())
}
#[test]
-fn test_round_trip() {
+fn test_round_trip() -> TestResult {
for (raw_schema, value) in SCHEMAS_TO_VALIDATE.iter() {
- let schema = Schema::parse_str(raw_schema).unwrap();
+ let schema = Schema::parse_str(raw_schema)?;
let encoded = to_avro_datum(&schema, value.clone()).unwrap();
let decoded = from_avro_datum(&schema, &mut Cursor::new(encoded), None).unwrap();
assert_eq!(value, &decoded);
}
+
+ Ok(())
}
#[test]
-fn test_binary_int_encoding() {
+fn test_binary_int_encoding() -> TestResult {
for (number, hex_encoding) in BINARY_ENCODINGS.iter() {
- let encoded = to_avro_datum(&Schema::Int, Value::Int(*number as i32)).unwrap();
+ let encoded = to_avro_datum(&Schema::Int, Value::Int(*number as i32))?;
assert_eq!(&encoded, hex_encoding);
}
+
+ Ok(())
}
#[test]
-fn test_binary_long_encoding() {
+fn test_binary_long_encoding() -> TestResult {
for (number, hex_encoding) in BINARY_ENCODINGS.iter() {
- let encoded = to_avro_datum(&Schema::Long, Value::Long(*number)).unwrap();
+ let encoded = to_avro_datum(&Schema::Long, Value::Long(*number))?;
assert_eq!(&encoded, hex_encoding);
}
+
+ Ok(())
}
#[test]
-fn test_schema_promotion() {
+fn test_schema_promotion() -> TestResult {
// Each schema is present in order of promotion (int -> long, long -> float, float -> double)
// Each value represents the expected decoded value when promoting a value previously encoded with a promotable schema
let promotable_schemas = vec![r#""int""#, r#""long""#, r#""float""#, r#""double""#];
@@ -147,11 +156,11 @@ fn test_schema_promotion() {
Value::Double(219.0),
];
for (i, writer_raw_schema) in promotable_schemas.iter().enumerate() {
- let writer_schema = Schema::parse_str(writer_raw_schema).unwrap();
+ let writer_schema = Schema::parse_str(writer_raw_schema)?;
let original_value = &promotable_values[i];
for (j, reader_raw_schema) in promotable_schemas.iter().enumerate().skip(i + 1) {
- let reader_schema = Schema::parse_str(reader_raw_schema).unwrap();
- let encoded = to_avro_datum(&writer_schema, original_value.clone()).unwrap();
+ let reader_schema = Schema::parse_str(reader_raw_schema)?;
+ let encoded = to_avro_datum(&writer_schema, original_value.clone())?;
let decoded = from_avro_datum(
&writer_schema,
&mut Cursor::new(encoded),
@@ -163,28 +172,30 @@ fn test_schema_promotion() {
assert_eq!(decoded, promotable_values[j]);
}
}
+
+ Ok(())
}
#[test]
-fn test_unknown_symbol() {
+fn test_unknown_symbol() -> TestResult {
let writer_schema =
- Schema::parse_str(r#"{"type": "enum", "name": "Test", "symbols": ["FOO", "BAR"]}"#)
- .unwrap();
+ Schema::parse_str(r#"{"type": "enum", "name": "Test", "symbols": ["FOO", "BAR"]}"#)?;
let reader_schema =
- Schema::parse_str(r#"{"type": "enum", "name": "Test", "symbols": ["BAR", "BAZ"]}"#)
- .unwrap();
+ Schema::parse_str(r#"{"type": "enum", "name": "Test", "symbols": ["BAR", "BAZ"]}"#)?;
let original_value = Value::Enum(0, "FOO".to_string());
- let encoded = to_avro_datum(&writer_schema, original_value).unwrap();
+ let encoded = to_avro_datum(&writer_schema, original_value)?;
let decoded = from_avro_datum(
&writer_schema,
&mut Cursor::new(encoded),
Some(&reader_schema),
);
assert!(decoded.is_err());
+
+ Ok(())
}
#[test]
-fn test_default_value() {
+fn test_default_value() -> TestResult {
for (field_type, default_json, default_datum) in DEFAULT_VALUE_EXAMPLES.iter() {
let reader_schema = Schema::parse_str(&format!(
r#"{{
@@ -194,26 +205,26 @@ fn test_default_value() {
{{"name": "H", "type": {field_type}, "default": {default_json}}}
]
}}"#
- ))
- .unwrap();
+ ))?;
let datum_to_read = Value::Record(vec![("H".to_string(), default_datum.clone())]);
- let encoded = to_avro_datum(&LONG_RECORD_SCHEMA, LONG_RECORD_DATUM.clone()).unwrap();
+ let encoded = to_avro_datum(&LONG_RECORD_SCHEMA, LONG_RECORD_DATUM.clone())?;
let datum_read = from_avro_datum(
&LONG_RECORD_SCHEMA,
&mut Cursor::new(encoded),
Some(&reader_schema),
- )
- .unwrap();
+ )?;
assert_eq!(
datum_read, datum_to_read,
"{} -> {}",
*field_type, *default_json
);
}
+
+ Ok(())
}
#[test]
-fn test_no_default_value() {
+fn test_no_default_value() -> TestResult {
let reader_schema = Schema::parse_str(
r#"{
"type": "record",
@@ -222,19 +233,20 @@ fn test_no_default_value() {
{"name": "H", "type": "int"}
]
}"#,
- )
- .unwrap();
- let encoded = to_avro_datum(&LONG_RECORD_SCHEMA, LONG_RECORD_DATUM.clone()).unwrap();
+ )?;
+ let encoded = to_avro_datum(&LONG_RECORD_SCHEMA, LONG_RECORD_DATUM.clone())?;
let result = from_avro_datum(
&LONG_RECORD_SCHEMA,
&mut Cursor::new(encoded),
Some(&reader_schema),
);
assert!(result.is_err());
+
+ Ok(())
}
#[test]
-fn test_projection() {
+fn test_projection() -> TestResult {
let reader_schema = Schema::parse_str(
r#"
{
@@ -246,24 +258,24 @@ fn test_projection() {
]
}
"#,
- )
- .unwrap();
+ )?;
let datum_to_read = Value::Record(vec![
("E".to_string(), Value::Int(5)),
("F".to_string(), Value::Int(6)),
]);
- let encoded = to_avro_datum(&LONG_RECORD_SCHEMA, LONG_RECORD_DATUM.clone()).unwrap();
+ let encoded = to_avro_datum(&LONG_RECORD_SCHEMA, LONG_RECORD_DATUM.clone())?;
let datum_read = from_avro_datum(
&LONG_RECORD_SCHEMA,
&mut Cursor::new(encoded),
Some(&reader_schema),
- )
- .unwrap();
+ )?;
assert_eq!(datum_to_read, datum_read);
+
+ Ok(())
}
#[test]
-fn test_field_order() {
+fn test_field_order() -> TestResult {
let reader_schema = Schema::parse_str(
r#"
{
@@ -275,20 +287,20 @@ fn test_field_order() {
]
}
"#,
- )
- .unwrap();
+ )?;
let datum_to_read = Value::Record(vec![
("F".to_string(), Value::Int(6)),
("E".to_string(), Value::Int(5)),
]);
- let encoded = to_avro_datum(&LONG_RECORD_SCHEMA, LONG_RECORD_DATUM.clone()).unwrap();
+ let encoded = to_avro_datum(&LONG_RECORD_SCHEMA, LONG_RECORD_DATUM.clone())?;
let datum_read = from_avro_datum(
&LONG_RECORD_SCHEMA,
&mut Cursor::new(encoded),
Some(&reader_schema),
- )
- .unwrap();
+ )?;
assert_eq!(datum_to_read, datum_read);
+
+ Ok(())
}
#[test]
@@ -304,8 +316,7 @@ fn test_type_exception() -> Result<(), String> {
]
}
"#,
- )
- .unwrap();
+ ).unwrap();
let datum_to_write = Value::Record(vec![
("E".to_string(), Value::Int(5)),
("F".to_string(), Value::String(String::from("Bad"))),
diff --git a/lang/rust/avro_test_helper/Cargo.toml b/lang/rust/avro_test_helper/Cargo.toml
index d1597dae4..fc6b09c69 100644
--- a/lang/rust/avro_test_helper/Cargo.toml
+++ b/lang/rust/avro_test_helper/Cargo.toml
@@ -31,6 +31,7 @@ documentation = "https://docs.rs/apache-avro-test-helper"
[dependencies]
+anyhow = { default-features = false, version = "1.0.71", features = ["std"] }
color-backtrace = { default-features = false, version = "0.5.1" }
ctor = { default-features = false, version = "0.2.0" }
env_logger = { default-features = false, version = "0.10.0" }
diff --git a/lang/rust/avro_test_helper/src/lib.rs b/lang/rust/avro_test_helper/src/lib.rs
index 235b4c518..545bccc89 100644
--- a/lang/rust/avro_test_helper/src/lib.rs
+++ b/lang/rust/avro_test_helper/src/lib.rs
@@ -45,6 +45,22 @@ fn after_all() {
logger::clear_log_messages();
}
+/// A custom error type for tests.
+#[derive(Debug)]
+pub enum TestError {}
+
+/// A converter of any error into [TestError].
+/// It is used to print better error messages in the tests.
+/// Borrowed from https://bluxte.net/musings/2023/01/08/improving_failure_messages_rust_tests/
+impl<Err: std::fmt::Display> From<Err> for TestError {
+ #[track_caller]
+ fn from(err: Err) -> Self {
+ panic!("{}: {}", std::any::type_name::<Err>(), err);
+ }
+}
+
+pub type TestResult = anyhow::Result<(), TestError>;
+
/// Does nothing. Just loads the crate.
/// Should be used in the integration tests, because they do not use [dev-dependencies]
/// and do not auto-load this crate.