diff --git a/build.gradle b/build.gradle index ebfc61a04d..ebc9013168 100644 --- a/build.gradle +++ b/build.gradle @@ -652,6 +652,7 @@ tasks.register('generateRustTestCodecs', JavaExec) { 'sbe-tool/src/test/resources/issue895.xml', 'sbe-tool/src/test/resources/issue972.xml', 'sbe-tool/src/test/resources/issue984.xml', + 'sbe-tool/src/test/resources/issue987.xml', 'sbe-tool/src/test/resources/example-bigendian-test-schema.xml', 'sbe-tool/src/test/resources/nested-composite-name.xml', ] diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 4be04c957b..6b265a3020 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -15,6 +15,7 @@ issue_435 = { path = "../generated/rust/issue435" } issue_895 = { path = "../generated/rust/issue895" } issue_972 = { path = "../generated/rust/issue972" } issue_984 = { path = "../generated/rust/issue984" } +issue_987 = { path = "../generated/rust/issue987" } baseline_bigendian = { path = "../generated/rust/baseline-bigendian" } nested_composite_name = { path = "../generated/rust/nested-composite-name" } @@ -27,4 +28,4 @@ harness = false [[bench]] name = "md_benchmark" -harness = false \ No newline at end of file +harness = false diff --git a/rust/benches/car_benchmark.rs b/rust/benches/car_benchmark.rs index 5f78fff1e4..44ed774c0e 100644 --- a/rust/benches/car_benchmark.rs +++ b/rust/benches/car_benchmark.rs @@ -131,7 +131,7 @@ fn decode(state: &State) -> SbeResult { let buf = ReadBuf::new(state.buffer.as_slice()); let header = MessageHeaderDecoder::default().wrap(buf, 0); - car = car.header(header); + car = car.header(header, 0); // Car... car.serial_number(); diff --git a/rust/benches/md_benchmark.rs b/rust/benches/md_benchmark.rs index 025df09f4f..27c3fa4939 100644 --- a/rust/benches/md_benchmark.rs +++ b/rust/benches/md_benchmark.rs @@ -90,7 +90,7 @@ fn decode_md(state: &State) -> SbeResult { let buf = ReadBuf::new(state.buffer.as_slice()); let header = MessageHeaderDecoder::default().wrap(buf, 0); - market_data = market_data.header(header); + market_data = market_data.header(header, 0); market_data.transact_time(); market_data.event_time_delta(); diff --git a/rust/car_example_baseline_data.sbe b/rust/car_example_baseline_data.sbe new file mode 100644 index 0000000000..0fd6c7e013 Binary files /dev/null and b/rust/car_example_baseline_data.sbe differ diff --git a/rust/car_example_extension_data.sbe b/rust/car_example_extension_data.sbe new file mode 100644 index 0000000000..cf8eededf6 Binary files /dev/null and b/rust/car_example_extension_data.sbe differ diff --git a/rust/tests/baseline_test.rs b/rust/tests/baseline_test.rs index 58a8503d20..ab9eecb1fd 100644 --- a/rust/tests/baseline_test.rs +++ b/rust/tests/baseline_test.rs @@ -44,7 +44,7 @@ fn decode_car_and_assert_expected_content(buffer: &[u8]) -> SbeResult<()> { let buf = ReadBuf::new(buffer); let header = MessageHeaderDecoder::default().wrap(buf, 0); assert_eq!(SBE_TEMPLATE_ID, header.template_id()); - car = car.header(header); + car = car.header(header, 0); // Car... assert_eq!(1234, car.serial_number()); diff --git a/rust/tests/big_endian_test.rs b/rust/tests/big_endian_test.rs index aabea63ce2..1bef7278dd 100644 --- a/rust/tests/big_endian_test.rs +++ b/rust/tests/big_endian_test.rs @@ -43,7 +43,7 @@ fn decode_car_and_assert_expected_content(buffer: &[u8]) -> SbeResult<()> { let buf = ReadBuf::new(buffer); let header = MessageHeaderDecoder::default().wrap(buf, 0); assert_eq!(SBE_TEMPLATE_ID, header.template_id()); - car = car.header(header); + car = car.header(header, 0); // Car... assert_eq!(1234, car.serial_number()); diff --git a/rust/tests/extension_test.rs b/rust/tests/extension_test.rs index 072b9b8baa..d7258bc39b 100644 --- a/rust/tests/extension_test.rs +++ b/rust/tests/extension_test.rs @@ -43,7 +43,7 @@ fn decode_car_and_assert_expected_content(buffer: &[u8]) -> SbeResult<()> { let buf = ReadBuf::new(buffer); let header = MessageHeaderDecoder::default().wrap(buf, 0); assert_eq!(SBE_TEMPLATE_ID, header.template_id()); - car = car.header(header); + car = car.header(header, 0); // Car... assert_eq!(1234, car.serial_number()); diff --git a/rust/tests/issue_435_test.rs b/rust/tests/issue_435_test.rs index 8664be42cd..7b1a9f8ffe 100644 --- a/rust/tests/issue_435_test.rs +++ b/rust/tests/issue_435_test.rs @@ -33,7 +33,7 @@ fn issue_435_ref_test() -> SbeResult<()> { assert_eq!(SBE_SCHEMA_ID, header.schema_id()); assert_eq!(*SetRef::default().set_one(true), header.s()); - let decoder = Issue435Decoder::default().header(header); + let decoder = Issue435Decoder::default().header(header, 0); assert_eq!(EnumRef::Two, decoder.example_decoder().e()); Ok(()) diff --git a/rust/tests/issue_895_test.rs b/rust/tests/issue_895_test.rs index 96968d2459..cb58e82d85 100644 --- a/rust/tests/issue_895_test.rs +++ b/rust/tests/issue_895_test.rs @@ -27,7 +27,7 @@ fn issue_895_both_some() -> SbeResult<()> { assert_eq!(SBE_TEMPLATE_ID, header.template_id()); assert_eq!(SBE_SCHEMA_ID, header.schema_id()); - let decoder = Issue895Decoder::default().header(header); + let decoder = Issue895Decoder::default().header(header, 0); assert_eq!(Some(2.07), decoder.optional_float()); assert_eq!(Some(4.12), decoder.optional_double()); @@ -46,7 +46,7 @@ fn issue_895_float_none() -> SbeResult<()> { let buf = ReadBuf::new(buf.as_slice()); let header = MessageHeaderDecoder::default().wrap(buf, 0); - let decoder = Issue895Decoder::default().header(header); + let decoder = Issue895Decoder::default().header(header, 0); assert_eq!(None, decoder.optional_float()); assert_eq!(Some(4.12), decoder.optional_double()); @@ -65,7 +65,7 @@ fn issue_895_double_none() -> SbeResult<()> { let buf = ReadBuf::new(buffer.as_slice()); let header = MessageHeaderDecoder::default().wrap(buf, 0); - let decoder = Issue895Decoder::default().header(header); + let decoder = Issue895Decoder::default().header(header, 0); assert_eq!(Some(2.07), decoder.optional_float()); assert_eq!(None, decoder.optional_double()); diff --git a/rust/tests/issue_972_test.rs b/rust/tests/issue_972_test.rs index 2cbab324d0..bcf4cd77e8 100644 --- a/rust/tests/issue_972_test.rs +++ b/rust/tests/issue_972_test.rs @@ -26,7 +26,7 @@ fn round_trip() -> SbeResult<()> { assert_eq!(SBE_TEMPLATE_ID, header.template_id()); assert_eq!(SBE_SCHEMA_ID, header.schema_id()); - let decoder = Issue972Decoder::default().header(header); + let decoder = Issue972Decoder::default().header(header, 0); if let Either::Right(composite) = decoder.new_field_decoder() { assert_eq!(2007, composite.f1().unwrap()); assert_eq!(2012, composite.f2().unwrap()); diff --git a/rust/tests/issue_984_test.rs b/rust/tests/issue_984_test.rs index 7ca0dcfc76..74cae2eb07 100644 --- a/rust/tests/issue_984_test.rs +++ b/rust/tests/issue_984_test.rs @@ -34,7 +34,7 @@ fn round_trip() -> SbeResult<()> { assert_eq!(SBE_TEMPLATE_ID, header.template_id()); assert_eq!(SBE_SCHEMA_ID, header.schema_id()); - let simple_msg_decoder = SimpleMessageDecoder::default().header(header); + let simple_msg_decoder = SimpleMessageDecoder::default().header(header, 0); assert_eq!(1985, simple_msg_decoder.id()); let mut grp_decoder = simple_msg_decoder.my_group_decoder(); assert_eq!(1, grp_decoder.count()); diff --git a/rust/tests/issue_987_test.rs b/rust/tests/issue_987_test.rs new file mode 100644 index 0000000000..4462f58b52 --- /dev/null +++ b/rust/tests/issue_987_test.rs @@ -0,0 +1,71 @@ +use issue_987::{ + issue_987_codec::{Issue987Decoder, Issue987Encoder, SBE_BLOCK_LENGTH, SBE_SCHEMA_ID, SBE_SCHEMA_VERSION, SBE_TEMPLATE_ID}, message_header_codec::MessageHeaderDecoder, * +}; + +fn create_encoder(buffer: &mut Vec, off: usize) -> Issue987Encoder { + let encoder = Issue987Encoder::default().wrap( + WriteBuf::new(buffer.as_mut_slice()), + off + message_header_codec::ENCODED_LENGTH, + ); + let mut header = encoder.header(off); + header.parent().unwrap() +} + +#[test] +fn encode_2_messages_and_then_decode() -> SbeResult<()> { + let mut buffer = vec![0u8; 256]; + + let mut off = 0; + + // encode message 1 + let mut encoder = create_encoder(&mut buffer, off); + encoder.old_field(10); + let mut other_encoder = encoder.new_field_encoder(); + other_encoder.f1(11); + other_encoder.f2(12); + let encoder = other_encoder.parent().unwrap(); + + // Update offset + off += message_header_codec::ENCODED_LENGTH + encoder.encoded_length(); + + // encode message 2 + let mut encoder = create_encoder(&mut buffer, off); + encoder.old_field(20); + let mut other_encoder = encoder.new_field_encoder(); + other_encoder.f1(21); + other_encoder.f2(22); + + // decoding ... + off = 0; + + // decode message 1 + let buf = ReadBuf::new(buffer.as_slice()); + let header = MessageHeaderDecoder::default().wrap(buf, off); + assert_eq!(SBE_BLOCK_LENGTH, header.block_length()); + assert_eq!(SBE_SCHEMA_VERSION, header.version()); + assert_eq!(SBE_TEMPLATE_ID, header.template_id()); + assert_eq!(SBE_SCHEMA_ID, header.schema_id()); + let decoder = Issue987Decoder::default().header(header, off); + assert_eq!(10, decoder.old_field()); + let other_decoder = decoder.new_field_decoder(); + assert_eq!(11, other_decoder.f1()); + assert_eq!(12, other_decoder.f2()); + + // Update offset + off += message_header_codec::ENCODED_LENGTH + decoder.encoded_length(); + + // decode message 2 + let buf = ReadBuf::new(buffer.as_slice()); + let header = MessageHeaderDecoder::default().wrap(buf, off); + assert_eq!(SBE_BLOCK_LENGTH, header.block_length()); + assert_eq!(SBE_SCHEMA_VERSION, header.version()); + assert_eq!(SBE_TEMPLATE_ID, header.template_id()); + assert_eq!(SBE_SCHEMA_ID, header.schema_id()); + let decoder = Issue987Decoder::default().header(header, off); + assert_eq!(20, decoder.old_field()); + let other_decoder = decoder.new_field_decoder(); + assert_eq!(21, other_decoder.f1()); + assert_eq!(22, other_decoder.f2()); + + Ok(()) +} diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/rust/MessageCoderDef.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/rust/MessageCoderDef.java index 67c37f22fd..8faaa9c451 100644 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/rust/MessageCoderDef.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/rust/MessageCoderDef.java @@ -141,13 +141,13 @@ void appendMessageHeaderEncoderFn(final Appendable out) throws IOException void appendMessageHeaderDecoderFn(final Appendable out) throws IOException { - indent(out, 2, "pub fn header(self, mut header: MessageHeaderDecoder>) -> Self {\n"); + indent(out, 2, "pub fn header(self, mut header: MessageHeaderDecoder>, offset: usize) -> Self {\n"); indent(out, 3, "debug_assert_eq!(SBE_TEMPLATE_ID, header.template_id());\n"); indent(out, 3, "let acting_block_length = header.block_length();\n"); indent(out, 3, "let acting_version = header.version();\n\n"); indent(out, 3, "self.wrap(\n"); indent(out, 4, "header.parent().unwrap(),\n"); - indent(out, 4, "message_header_codec::ENCODED_LENGTH,\n"); + indent(out, 4, "offset + message_header_codec::ENCODED_LENGTH,\n"); indent(out, 4, "acting_block_length,\n"); indent(out, 4, "acting_version,\n"); indent(out, 3, ")\n"); diff --git a/sbe-tool/src/test/resources/issue987.xml b/sbe-tool/src/test/resources/issue987.xml new file mode 100644 index 0000000000..4daebc019d --- /dev/null +++ b/sbe-tool/src/test/resources/issue987.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + +