|
1 |
| -use apache_avro::{AvroSchema, Writer}; |
| 1 | +use apache_avro::{AvroSchema, Schema, Writer, from_value}; |
2 | 2 | use apache_avro_test_helper::TestResult;
|
3 |
| -use serde::Serialize; |
| 3 | +use serde::{Deserialize, Serialize, de::DeserializeOwned}; |
| 4 | +use std::fmt::Debug; |
| 5 | + |
| 6 | +fn ser_deser<T>(schema: &Schema, record: T) -> TestResult |
| 7 | +where |
| 8 | + T: Serialize + DeserializeOwned + Debug + PartialEq + Clone, |
| 9 | +{ |
| 10 | + let record2 = record.clone(); |
| 11 | + let mut writer = Writer::new(schema, vec![]); |
| 12 | + writer.append_ser(record)?; |
| 13 | + let bytes_written = writer.into_inner()?; |
| 14 | + |
| 15 | + let reader = apache_avro::Reader::new(&bytes_written[..])?; |
| 16 | + for value in reader { |
| 17 | + let value = value?; |
| 18 | + let deserialized = from_value::<T>(&value)?; |
| 19 | + assert_eq!(deserialized, record2); |
| 20 | + } |
| 21 | + |
| 22 | + Ok(()) |
| 23 | +} |
4 | 24 |
|
5 | 25 | #[test]
|
6 |
| -fn avro_rs_225_index_out_of_bounds_with_serde_skip_serializing_skip_middle_field() -> TestResult { |
7 |
| - #[derive(Serialize, AvroSchema)] |
| 26 | +fn avro_rs_226_index_out_of_bounds_with_serde_skip_serializing_skip_middle_field() -> TestResult { |
| 27 | + #[derive(AvroSchema, Clone, Debug, Deserialize, PartialEq, Serialize)] |
8 | 28 | struct T {
|
9 | 29 | x: Option<i8>,
|
10 | 30 | #[serde(skip_serializing_if = "Option::is_none")]
|
11 | 31 | y: Option<String>,
|
12 | 32 | z: Option<i8>,
|
13 | 33 | }
|
14 | 34 |
|
15 |
| - let schema = T::get_schema(); |
16 |
| - let mut writer = Writer::new(&schema, vec![]); |
17 |
| - writer.append_ser(T { |
18 |
| - x: None, |
19 |
| - y: None, |
20 |
| - z: Some(1), |
21 |
| - })?; |
22 |
| - writer.into_inner()?; |
23 |
| - Ok(()) |
| 35 | + ser_deser::<T>( |
| 36 | + &T::get_schema(), |
| 37 | + T { |
| 38 | + x: None, |
| 39 | + y: None, |
| 40 | + z: Some(1), |
| 41 | + }, |
| 42 | + ) |
24 | 43 | }
|
25 | 44 |
|
26 | 45 | #[test]
|
27 |
| -fn avro_rs_225_index_out_of_bounds_with_serde_skip_serializing_skip_first_field() -> TestResult { |
28 |
| - #[derive(Serialize, AvroSchema)] |
| 46 | +fn avro_rs_226_index_out_of_bounds_with_serde_skip_serializing_skip_first_field() -> TestResult { |
| 47 | + #[derive(AvroSchema, Clone, Debug, Deserialize, PartialEq, Serialize)] |
29 | 48 | struct T {
|
30 | 49 | #[serde(skip_serializing_if = "Option::is_none")]
|
31 | 50 | x: Option<i8>,
|
32 | 51 | y: Option<String>,
|
33 | 52 | z: Option<i8>,
|
34 | 53 | }
|
35 | 54 |
|
36 |
| - let schema = T::get_schema(); |
37 |
| - let mut writer = Writer::new(&schema, vec![]); |
38 |
| - writer.append_ser(T { |
39 |
| - x: None, |
40 |
| - y: None, |
41 |
| - z: Some(1), |
42 |
| - })?; |
43 |
| - writer.into_inner()?; |
44 |
| - Ok(()) |
| 55 | + ser_deser::<T>( |
| 56 | + &T::get_schema(), |
| 57 | + T { |
| 58 | + x: None, |
| 59 | + y: None, |
| 60 | + z: Some(1), |
| 61 | + }, |
| 62 | + ) |
45 | 63 | }
|
46 | 64 |
|
47 | 65 | #[test]
|
48 |
| -fn avro_rs_225_index_out_of_bounds_with_serde_skip_serializing_skip_last_field() -> TestResult { |
49 |
| - #[derive(Serialize, AvroSchema)] |
| 66 | +fn avro_rs_226_index_out_of_bounds_with_serde_skip_serializing_skip_last_field() -> TestResult { |
| 67 | + #[derive(AvroSchema, Clone, Debug, Deserialize, PartialEq, Serialize)] |
50 | 68 | struct T {
|
51 | 69 | x: Option<i8>,
|
52 | 70 | y: Option<String>,
|
53 | 71 | #[serde(skip_serializing_if = "Option::is_none")]
|
54 | 72 | z: Option<i8>,
|
55 | 73 | }
|
56 | 74 |
|
57 |
| - let schema = T::get_schema(); |
58 |
| - let mut writer = Writer::new(&schema, vec![]); |
59 |
| - writer.append_ser(T { |
60 |
| - x: Some(0), |
61 |
| - y: None, |
62 |
| - z: None, |
63 |
| - })?; |
64 |
| - writer.into_inner()?; |
65 |
| - Ok(()) |
| 75 | + ser_deser::<T>( |
| 76 | + &T::get_schema(), |
| 77 | + T { |
| 78 | + x: Some(0), |
| 79 | + y: None, |
| 80 | + z: None, |
| 81 | + }, |
| 82 | + ) |
66 | 83 | }
|
67 | 84 |
|
68 | 85 | #[test]
|
69 |
| -fn avro_rs_225_index_out_of_bounds_with_serde_skip_serializing_skip_multiple_fields() -> TestResult |
| 86 | +fn avro_rs_226_index_out_of_bounds_with_serde_skip_serializing_skip_multiple_fields() -> TestResult |
70 | 87 | {
|
71 |
| - #[derive(Serialize, AvroSchema)] |
| 88 | + #[derive(AvroSchema, Clone, Debug, Deserialize, PartialEq, Serialize)] |
72 | 89 | struct T {
|
73 | 90 | x: Option<i8>,
|
74 |
| - #[serde(skip_serializing_if = "Option::is_none")] |
| 91 | + #[serde(skip_serializing_if = "Option::is_none", skip)] |
75 | 92 | y: Option<String>,
|
76 | 93 | #[serde(skip_serializing_if = "Option::is_none")]
|
77 | 94 | z: Option<i8>,
|
78 | 95 | }
|
79 | 96 |
|
80 |
| - let schema = T::get_schema(); |
81 |
| - let mut writer = Writer::new(&schema, vec![]); |
82 |
| - writer.append_ser(T { |
83 |
| - x: Some(0), |
84 |
| - y: None, |
85 |
| - z: None, |
86 |
| - })?; |
87 |
| - writer.into_inner()?; |
88 |
| - Ok(()) |
| 97 | + ser_deser::<T>( |
| 98 | + &T::get_schema(), |
| 99 | + T { |
| 100 | + x: Some(0), |
| 101 | + y: None, |
| 102 | + z: None, |
| 103 | + }, |
| 104 | + ) |
89 | 105 | }
|
0 commit comments