Skip to content

Commit e9f68ef

Browse files
committed
Refactor utility function to manually replace a tag's value in a raw message
1 parent 91641c5 commit e9f68ef

2 files changed

Lines changed: 22 additions & 18 deletions

File tree

crates/hotfix/tests/common/test_messages.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,23 @@ impl FixMessage for TestMessage {
147147
}
148148
}
149149
}
150+
151+
/// Replaces the value of a field in a raw FIX message.
152+
pub fn replace_field_value(raw_message: &mut Vec<u8>, tag: u32, new_value: &[u8]) {
153+
let tag_bytes = format!("{}=", tag).into_bytes();
154+
155+
if let Some(field_start) = raw_message
156+
.windows(tag_bytes.len())
157+
.position(|window| window == tag_bytes)
158+
{
159+
let value_start = field_start + tag_bytes.len();
160+
if let Some(field_end) = raw_message[value_start..]
161+
.iter()
162+
.position(|&b| b == b'\x01')
163+
{
164+
let value_end = value_start + field_end;
165+
166+
raw_message.splice(value_start..value_end, new_value.iter().cloned());
167+
}
168+
}
169+
}

crates/hotfix/tests/session_test_cases/invalid_message_tests.rs

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::common::actions::when;
22
use crate::common::assertions::then;
33
use crate::common::setup::given_an_active_session;
4-
use crate::common::test_messages::TestMessage;
4+
use crate::common::test_messages::{TestMessage, replace_field_value};
55
use hotfix::message::{FixMessage, generate_message};
66
use hotfix::session::Status;
77
use hotfix_message::dict::{FieldLocation, FixDatatype};
@@ -126,23 +126,7 @@ fn build_execution_report_with_incorrect_body_length(
126126
let mut raw_message =
127127
generate_message(sender_comp_id, target_comp_id, msg_seq_num, report).unwrap();
128128

129-
let message_str = String::from_utf8(raw_message.clone()).unwrap();
130-
131-
let body_length_start = message_str.find("9=").unwrap();
132-
let body_length_end =
133-
body_length_start + message_str[body_length_start..].find('\x01').unwrap();
134-
135-
let original_body_length = &message_str[body_length_start + 2..body_length_end];
136-
137-
// parse the original body length and make it incorrect (add 10 to it)
138-
if let Ok(original_length) = original_body_length.parse::<u32>() {
139-
let incorrect_length = original_length + 10;
140-
let corrupted_message = message_str.replace(
141-
&format!("9={}", original_length),
142-
&format!("9={}", incorrect_length),
143-
);
144-
raw_message = corrupted_message.into_bytes();
145-
}
129+
replace_field_value(&mut raw_message, 9, b"999");
146130

147131
raw_message
148132
}

0 commit comments

Comments
 (0)