예제 #1
0
    def test_group_msg(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime(
            '%Y%m%d-%H:%M:%S.%f')
        order_msg.NoAllocs = 2
        ord_allocs1 = fix_messages_4_2_0_base.NoAllocsGroup()
        ord_allocs1.AllocAccount = 'Abc'
        ord_allocs1.AllocShares = 123
        ord_allocs2 = fix_messages_4_2_0_base.NoAllocsGroup()
        ord_allocs2.AllocAccount = 'Def'
        ord_allocs2.AllocShares = 456
        order_msg.NoAllocsGroup = [ord_allocs1, ord_allocs2]

        self.client_app.send_message(self._testMethodName, order_msg)

        msg = SERVER_QUEUE.get(timeout=3)
        self.assertIsInstance(msg, fix_messages_4_2_0_base.OrderSingle)
        self.assertEqual(msg.NoAllocs, 2)
        self.assertEqual(msg.NoAllocsGroup[0].AllocAccount, 'Abc')
        self.assertEqual(msg.NoAllocsGroup[0].AllocShares, 123)
        self.assertEqual(msg.NoAllocsGroup[1].AllocAccount, 'Def')
        self.assertEqual(msg.NoAllocsGroup[1].AllocShares, 456)

        self.do_logout(self.client_app)
예제 #2
0
    def test_bad_repeating_count(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime(
            '%Y%m%d-%H:%M:%S.%f')
        order_msg.NoAllocs = 3
        ord_allocs1 = fix_messages_4_2_0_base.NoAllocsGroup()
        ord_allocs1.AllocAccount = 'Abc'
        ord_allocs1.AllocShares = 123
        ord_allocs2 = fix_messages_4_2_0_base.NoAllocsGroup()
        ord_allocs2.AllocAccount = 'Def'
        ord_allocs2.AllocShares = 456
        order_msg.NoAllocsGroup = [ord_allocs1, ord_allocs2]

        self.client_app.send_message(self._testMethodName, order_msg)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXIncorrectNumInGroup)

        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Reject)

        self.do_logout(self.client_app)
예제 #3
0
    def test_send_time_accuracy(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')

        order_msg.Header.OrigSendingTime = (
            datetime.utcnow() + timedelta(hours=1)).strftime('%Y%m%d-%H:%M:%S.%f')
        order_msg.Header.PossDupFlag = 'Y'

        self.client_app.send_message(self._testMethodName, order_msg)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXSendTimeAccuracyError)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Reject)

        sent_logout = CLIENT_QUEUE.get(timeout=3)
        resp_logout = SERVER_QUEUE.get(timeout=3)

        self.assertIsInstance(resp_logout, fix_messages_4_2_0_base.Logout)
        self.assertIsInstance(sent_logout, fix_messages_4_2_0_base.Logout)
예제 #4
0
    def test_queue_msg(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')

        self.do_logout(self.client_app)

        self.client_app.send_message(self._testMethodName, order_msg)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=4),
                              fix_messages_4_2_0_base.Logon)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=4),
                              fix_messages_4_2_0_base.Logon)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.TestRequest)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Heartbeat)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.OrderSingle)

        self.do_logout(self.client_app)
예제 #5
0
    def test_bad_msg_type(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()

        fix_messages_4_2_0_base.OrderSingle._msgtype = 'BAD'

        class String_Type(str):
            def __bytes__(self):
                return str(self).encode()

        class MsgType(String_Type):
            _tag = '35'

        order_msg.Header.register_field(MsgType, True)

        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')

        self.client_app.send_message(self._testMethodName, order_msg)

        fix_messages_4_2_0_base.OrderSingle._msgtype = 'D'

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXInvalidMessageTypeError)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Reject)
        self.do_logout(self.client_app)
예제 #6
0
    def test_garbled_msg(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'+'\x01'+'BORKED'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')

        self.client_app.send_message(self._testMethodName, order_msg)
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXGarbledMessageError)

        # self.do_logout(self.client_app)
        self.client_app.engines[self._testMethodName].logout()

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXEngineResendRequest)
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.TestRequest)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.ResendRequest)
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.SequenceReset)

        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Heartbeat)
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.SequenceReset)
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Logout)

        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Logout)
예제 #7
0
    def test_begin_string_valid(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.Header.BeginString = 'FIX.4.2'
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')

        self.client_app.send_message(self._testMethodName, order_msg)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.OrderSingle)

        self.do_logout(self.client_app)
예제 #8
0
    def test_checksum_not_last(self):
        class CheckSum(str):
            _tag = '10'

            def __init__(self, *args, **kwargs):
                super().__init__()
                self._tag = '8'

        order_msg = fix_messages_4_2_0_base.OrderSingle()

        # hack the tag to not send checksum
        order_msg.Trailer.register_field(CheckSum, True)

        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime(
            '%Y%m%d-%H:%M:%S.%f')

        self.client_app.send_message(self._testMethodName, order_msg)
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXGarbledMessageError)

        self.client_app.engines[self._testMethodName].logout()

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXEngineResendRequest)
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.TestRequest)

        self.assertIsInstance(CLIENT_QUEUE.get(timeout=5),
                              fix_messages_4_2_0_base.ResendRequest)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Heartbeat)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.OrderSingle)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.SequenceReset)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=5),
                              fix_messages_4_2_0_base.Logout)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=5),
                              fix_messages_4_2_0_base.Logout)
예제 #9
0
    def test_send_time_missing(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')

        order_msg.Header.PossDupFlag = 'Y'

        self.client_app.send_message(self._testMethodName, order_msg)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.RequiredTagMissingError)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Reject)

        self.do_logout(self.client_app)
예제 #10
0
    def test_bad_target(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.Header.TargetCompID = 'BAD_TARGET'
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')

        self.client_app.send_message(self._testMethodName, order_msg)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXBadCompIDError)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Reject)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Logout)

        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Logout)
예제 #11
0
    def test_msg_seq_low(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')

        self.client_app.engines[self._testMethodName].store.new_day(
            datetime.utcnow())
        self.client_app.engines[self._testMethodName].store.set_current_in_seq(
            1)
        self.client_app.engines[self._testMethodName].msg_seq_num_out = 1

        self.client_app.send_message(self._testMethodName, order_msg)
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXSequenceTooLowError)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Logout)
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Logout)
예제 #12
0
    def test_msg_instead_of_hb(self):
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Heartbeat)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Heartbeat)

        time.sleep(.5)

        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')
        self.client_app.send_message(self._testMethodName, order_msg)

        # waiting for 2nd heartbeat
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.OrderSingle)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.Heartbeat)
        self.do_logout(self.client_app)
예제 #13
0
    def test_unsupported_msg(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')

        self.server_app.engines[self._testMethodName].callback_register = CallbackRegistrar(
            self.server_app.engines[self._testMethodName].loop)

        self.client_app.send_message(self._testMethodName, order_msg)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXUnsupportedMessageTypeError)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.BusinessMessageReject)

        self.server_app.register_callback(
            self._testMethodName, None,  self.server_app.on_queue_msg)

        self.do_logout(self.client_app)
예제 #14
0
    def test_msg_seq_high(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')

        self.client_app.engines[self._testMethodName].msg_seq_num_out = 10

        self.client_app.send_message(self._testMethodName, order_msg)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXEngineResendRequest)
        self.assertIsInstance(CLIENT_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.ResendRequest)
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.SequenceReset)
        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_messages_4_2_0_base.OrderSingle)

        self.do_logout(self.client_app)
예제 #15
0
    def test_poss_dupe_discard(self):
        order_msg = fix_messages_4_2_0_base.OrderSingle()
        order_msg.ClOrdID = "test_message"
        order_msg.HandlInst = '1'
        order_msg.Symbol = 'AAPL'
        order_msg.Side = '1'
        order_msg.OrdType = '1'
        order_msg.TransactTime = datetime.utcnow().strftime('%Y%m%d-%H:%M:%S.%f')

        order_msg.Header.OrigSendingTime = order_msg.TransactTime
        order_msg.Header.PossDupFlag = 'Y'

        self.client_app.engines[self._testMethodName].store.new_day(
            datetime.utcnow())
        self.client_app.engines[self._testMethodName].store.set_current_in_seq(
            1)
        self.client_app.engines[self._testMethodName].msg_seq_num_out = 1

        self.client_app.send_message(self._testMethodName, order_msg)

        self.assertIsInstance(SERVER_QUEUE.get(timeout=3),
                              fix_errors.FIXDupeMessageRecv)

        self.do_logout(self.client_app)