def test_encode_no_35(self): """Test encoding without MessageType(35) field""" if VERSION == 26: return msg = FixMessage() msg.append_pair(8, "FIX.4.2") with self.assertRaises(ValueError): msg.encode() return
def test_encode_no_8(self): """Test encoding without BeginString(8) field""" if VERSION == 26: return msg = FixMessage() msg.append_pair(35, "D") with self.assertRaises(ValueError): msg.encode() return
def test_set_session_version(self): """Test minimal message""" pkt = FixMessage() pkt.append_pair(8, "FIX.4.4") pkt.append_pair(35, "0") self.assertEqual(fix_str("8=FIX.4.4\x01" "9=5\x01" "35=0\x01" "10=163\x01"), pkt.encode())
def goodbye(self, sender, target, seq_no): msg = Message() msg.append_pair(8, self.header) msg.append_pair(34, seq_no) # sequence no msg.append_pair(35, '5') # msgType = logout msg.append_pair(49, sender) msg.append_time(52) # timestamp msg.append_pair(56, target) return msg.encode()
def test_remove_simple(self): """Test removal of single, existent field.""" msg = FixMessage() msg.append_pair(8, b'FIX.4.2') self.assertEqual(1, msg.count()) result = msg.remove(8) self.assertEqual(b'FIX.4.2', result) self.assertEqual(0, msg.count()) return
def test_remove_not_found(self): """Test removal of non-existent field.""" msg = FixMessage() msg.append_pair(8, b'FIX.4.2') msg.append_pair(35, b'D') msg.append_utc_timestamp(52) self.assertEqual(3, msg.count()) result = msg.remove(9) self.assertIsNone(result) self.assertEqual(3, msg.count())
def test_compare_not_equal_extra_field_in_b(self): """Test comparison of other message with extra field""" a = FixMessage() a.append_pair(8, "FIX.4.2") a.append_pair(35, "0") b = FixMessage() b.append_pair(8, "FIX.4.2") b.append_pair(35, "0") b.append_pair(42000, "something") self.assertFalse(a == b)
def test_get_repeating(self): pkt = FixMessage() pkt.append_pair(42, "a") pkt.append_pair(42, "b") pkt.append_pair(42, "c") self.assertEqual("a", pkt.get(42)) self.assertEqual("b", pkt.get(42, 2)) self.assertEqual("c", pkt.get(42, 3)) self.assertEqual("a", pkt.get(42, 1)) self.assertIsNone(pkt.get(42, 4)) return
def test_compare_not_equal_extra_field_in_b(self): a = FixMessage() a.append_pair(8, "FIX.4.2") a.append_pair(35, "0") b = FixMessage() b.append_pair(8, "FIX.4.2") b.append_pair(35, "0") b.append_pair(42000, "something") self.assertFalse(a == b) return
def test_get_repeating(self): """Test retrieval of repeating field's value""" pkt = FixMessage() pkt.append_pair(42, "a") pkt.append_pair(42, "b") pkt.append_pair(42, "c") self.assertEqual(fix_str("a"), pkt.get(42)) self.assertEqual(fix_str("b"), pkt.get(42, 2)) self.assertEqual(fix_str("c"), pkt.get(42, 3)) self.assertEqual(fix_str("a"), pkt.get(42, 1)) self.assertIsNone(pkt.get(42, 4)) return
def goodbye_back(self, message): parser = Parser() parser.append_buffer(message) message_recv = parser.get_message() msg = Message() msg.append_pair(8, self.header) msg.append_pair(34, int(message_recv.get(34)) + 1) # sequence no msg.append_pair(35, '5') # msgType = logout msg.append_pair(49, message_recv.get(56)) msg.append_time(52) # timestamp msg.append_pair(56, message_recv.get(49)) return msg.encode()
def send(self, values: dict) -> None: with self._send_lock: msg = FixMessage() msg.append_pair(simplefix.TAG_BEGINSTRING, 'FIX.4.2') msg.append_pair(simplefix.TAG_SENDER_COMPID, self._sender_id) msg.append_pair(simplefix.TAG_TARGET_COMPID, self._target_id) msg.append_pair(simplefix.TAG_MSGSEQNUM, self._next_send_seq_num) for key, value in values.items(): if isinstance(value, datetime): msg.append_utc_timestamp(key, value) else: msg.append_pair(key, value) if not msg.get(simplefix.TAG_SENDING_TIME): msg.append_utc_timestamp(simplefix.TAG_SENDING_TIME) encoded = msg.encode() self._last_send_time = time.time() self._next_send_seq_num += 1 try: print('send', encoded.replace(b'\x01', b'|')) self._sock.sendall(encoded) except OSError: self.close(clean=False) return if msg.message_type == simplefix.MSGTYPE_LOGON: self._has_session = True
def test_basic_fix_message(self): """Test parsing basic FIX message.""" pkt = FixMessage() pkt.append_pair(8, "FIX.4.2") pkt.append_pair(35, "D") pkt.append_pair(29, "A") buf = pkt.encode() p = FixParser() p.append_buffer(buf) m = p.get_message() self.assertIsNotNone(m) self.assertEqual(b"FIX.4.2", m.get(8)) self.assertEqual(b"D", m.get(35)) self.assertEqual(b"A", m.get(29))
def test_compare_equal(self): a = FixMessage() a.append_pair(8, "FIX.4.2") a.append_pair(35, "0") b = FixMessage() b.append_pair(8, "FIX.4.2") b.append_pair(35, "0") self.assertTrue(a == b) return
def test_count(self): """Test count of message fields""" msg = FixMessage() msg.append_pair(8, "FIX.4.2") msg.append_pair(35, "A") msg.append_pair(108, 30) self.assertEqual(3, msg.count()) msg.append_pair(141, "N") msg.append_pair(383, 16384) self.assertEqual(5, msg.count())
def test_count(self): msg = FixMessage() msg.append_pair(8, "FIX.4.2") msg.append_pair(35, "A") msg.append_pair(108, 30) self.assertEqual(3, msg.count()) msg.append_pair(141, "N") msg.append_pair(383, 16384) self.assertEqual(5, msg.count()) return
def test_compare_equal(self): """Test comparison of equal messages""" a = FixMessage() a.append_pair(8, "FIX.4.2") a.append_pair(35, "0") b = FixMessage() b.append_pair(8, "FIX.4.2") b.append_pair(35, "0") self.assertTrue(a == b)
def test_str(self): """Test conversion to string.""" msg = FixMessage() msg.append_pair(1, 1) msg.append_pair(2, "foo") msg.append_pair(3, b"bar") msg.append_pair(4, 3.1415679) buffer = str(msg) self.assertIsNotNone(buffer) self.assertEqual("1=1|2=foo|3=bar|4=3.1415679", buffer)
def test_compare_not_equal_different_values(self): a = FixMessage() a.append_pair(8, "FIX.4.2") a.append_pair(35, "0") b = FixMessage() b.append_pair(8, "FIX.4.2") b.append_pair(35, "1") self.assertFalse(a == b) self.assertFalse(b == a) return
def test_compare_not_equal_different_values(self): """Test comparison of unequal message field values""" a = FixMessage() a.append_pair(8, "FIX.4.2") a.append_pair(35, "0") b = FixMessage() b.append_pair(8, "FIX.4.2") b.append_pair(35, "1") self.assertFalse(a == b) self.assertFalse(b == a)
def test_raw_data(self): """Test parsing of raw data fields.""" raw = b"raw\x01data" pkt = FixMessage() pkt.append_pair(8, "FIX.4.2") pkt.append_pair(35, "D") pkt.append_data(95, 96, raw) buf = pkt.encode() parser = FixParser() parser.append_buffer(buf) msg = parser.get_message() self.assertIsNotNone(msg) self.assertEqual(b"FIX.4.2", msg.get(8)) self.assertEqual(b"D", msg.get(35)) self.assertEqual(len(raw), int(msg.get(95))) self.assertEqual(raw, msg.get(96)) return
def test_raw_data_tags(self): """Test functions to add and remove raw data tags.""" raw = b"raw\x015000=1" pkt = FixMessage() pkt.append_pair(8, "FIX.4.2") pkt.append_pair(35, "D") pkt.append_data(5001, 5002, raw) pkt.append_pair(20000, "private tag") buf = pkt.encode() parser = FixParser() parser.add_raw(5001, 5002) parser.append_buffer(buf) msg = parser.get_message() self.assertIsNotNone(msg) self.assertEqual(b"FIX.4.2", msg.get(8)) self.assertEqual(b"D", msg.get(35)) self.assertEqual(len(raw), int(msg.get(5001))) self.assertEqual(raw, msg.get(5002)) self.assertEqual(b"private tag", msg.get(20000)) parser.reset() parser.remove_raw(5001, 5002) parser.append_buffer(buf) msg = parser.get_message() self.assertIsNotNone(msg) self.assertEqual(b"FIX.4.2", msg.get(8)) self.assertEqual(b"D", msg.get(35)) self.assertEqual(len(raw), int(msg.get(5001))) self.assertEqual(b"raw", msg.get(5002)) self.assertEqual(b"1", msg.get(5000)) self.assertEqual(b"private tag", msg.get(20000))
def test_sequence_access(self): msg = FixMessage() msg.append_pair(8, "FIX.4.2") msg.append_pair(35, "A") msg.append_pair(108, 30) msg.append_pair(141, "N") msg.append_pair(383, 16384) self.assertEqual(35, msg[1][0]) self.assertEqual(141, msg[3][0]) l = [] for tag, _ in msg: l.append(int(tag)) self.assertEqual([8, 35, 108, 141, 383], l) return
def test_sequence_access(self): """Test sequence access to message fields""" msg = FixMessage() msg.append_pair(8, "FIX.4.2") msg.append_pair(35, "A") msg.append_pair(108, 30) msg.append_pair(141, "N") msg.append_pair(383, 16384) self.assertEqual(35, msg[1][0]) self.assertEqual(141, msg[3][0]) fields = [] for tag, _ in msg: fields.append(int(tag)) self.assertEqual([8, 35, 108, 141, 383], fields)
def test_header_field(self): """Test use of header flag""" msg = FixMessage() msg.append_pair(20000, "third") msg.append_pair(20001, "first", header=True) msg.append_pair(20002, "second", header=True) self.assertEqual(fix_str("20001=first\x01" "20002=second\x01" "20000=third\x01"), msg.encode(True))
def test_remove_nth(self): """Test removal of nth field.""" msg = FixMessage() msg.append_pair(99999, 1) msg.append_pair(99999, 99999) msg.append_pair(99999, 2) self.assertEqual(3, msg.count()) result = msg.remove(99999, 2) self.assertEqual(b'99999', result) self.assertEqual(2, msg.count()) self.assertEqual(b'1', msg.get(99999, 1)) self.assertEqual(b'2', msg.get(99999, 2))
def test_stop_tag(self): """Test termination using alternative tag number.""" pkt = FixMessage() pkt.append_pair(8, "FIX.4.2") pkt.append_pair(35, "D") pkt.append_pair(29, "A") pkt.append_pair(20000, "xxx") pkt.append_pair(10, "000") buf = pkt.encode() p = FixParser(stop_tag=20000) p.append_buffer(buf) m = p.get_message() self.assertIsNotNone(m) self.assertEqual(b"FIX.4.2", m.get(8)) self.assertEqual(b"D", m.get(35)) self.assertEqual(b"A", m.get(29)) self.assertEqual(b"xxx", m.get(20000)) self.assertEqual(False, 10 in m)
def test_stop_tag_deprecated(self): """Test deprecated setting of stop tag.""" pkt = FixMessage() pkt.append_pair(8, "FIX.4.2") pkt.append_pair(35, "D") pkt.append_pair(29, "A") pkt.append_pair(20000, "xxx") pkt.append_pair(10, "000") buf = pkt.encode() p = FixParser() p.set_message_terminator(tag=20000) p.append_buffer(buf) m = p.get_message() self.assertIsNotNone(m) self.assertEqual(b"FIX.4.2", m.get(8)) self.assertEqual(b"D", m.get(35)) self.assertEqual(b"A", m.get(29)) self.assertEqual(b"xxx", m.get(20000)) self.assertEqual(False, 10 in m)
def test_raw_begin_string(self): """Test raw encoding of BeginString(8)""" pkt = FixMessage() pkt.append_pair(8, "FIX.4.4") self.assertEqual(fix_str("8=FIX.4.4\x01"), pkt.encode(True)) return
def test_compare_not_equal_different_tags(self): """Test comparison of different tagged fields""" a = FixMessage() a.append_pair(8, "FIX.4.2") a.append_pair(35, "0") a.append_pair(42000, "something") b = FixMessage() b.append_pair(8, "FIX.4.2") b.append_pair(35, "1") b.append_pair(24000, "something") self.assertFalse(a == b) return