Exemple #1
0
    def test_proposed_trade_cache_timeout(self):
        """
        Test the timeout method of a proposed trade request in the cache
        """
        ask = Ask(
            OrderId(TraderId(self.market_community.mid), OrderNumber(24)),
            Price(63400, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600),
            Timestamp.now())
        order = Order(OrderId(TraderId("0"), OrderNumber(23)),
                      Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600.0),
                      Timestamp.now(), False)
        self.market_community.order_book.insert_ask(ask)
        self.assertEqual(len(self.market_community.order_book.asks), 1)
        self.market_community.order_manager.order_repository.add(order)
        order.reserve_quantity_for_tick(self.proposed_trade.recipient_order_id,
                                        Quantity(30, 'DUM2'))
        self.market_community.order_manager.order_repository.update(order)

        mocked_match_message = MockObject()
        mocked_match_message.payload = MockObject()
        mocked_match_message.payload.matchmaker_trader_id = 'a'
        self.market_community.incoming_match_messages[
            'a'] = mocked_match_message

        def mocked_send_decline(*_):
            mocked_send_decline.called = True

        mocked_send_decline.called = False
        self.market_community.send_decline_match_message = mocked_send_decline

        cache = ProposedTradeRequestCache(self.market_community,
                                          self.proposed_trade, 'a')
        cache.on_timeout()
        self.assertTrue(mocked_send_decline.called)
 def test_proposed_trade_cache_timeout(self):
     """
     Test the timeout method of a proposed trade request in the cache
     """
     ask = Ask(
         MessageId(TraderId('0'), MessageNumber('message_number')),
         OrderId(TraderId(self.market_community.mid), OrderNumber(24)),
         Price(63400, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600),
         Timestamp.now())
     order = Order(OrderId(TraderId("0"), OrderNumber(23)),
                   Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600.0),
                   Timestamp.now(), False)
     self.market_community.order_book.insert_ask(ask)
     self.assertEqual(len(self.market_community.order_book.asks), 1)
     self.market_community.order_manager.order_repository.add(order)
     order.reserve_quantity_for_tick(self.proposed_trade.recipient_order_id,
                                     Quantity(30, 'DUM2'))
     self.market_community.order_manager.order_repository.update(order)
     cache = ProposedTradeRequestCache(self.market_community,
                                       self.proposed_trade)
     cache.on_timeout()
     self.assertEqual(len(self.market_community.order_book.asks), 0)
class CommunityTestSuite(AbstractTestCommunity):
    """Community test cases."""
    @blocking_call_on_reactor_thread
    @inlineCallbacks
    def setUp(self, annotate=True):
        yield super(CommunityTestSuite, self).setUp(annotate=annotate)

        dummy1_wallet = DummyWallet1()
        dummy2_wallet = DummyWallet2()

        self.market_community = MarketCommunity(self.dispersy,
                                                self.master_member,
                                                self.member)
        self.market_community.initialize(wallets={
            dummy1_wallet.get_identifier():
            dummy1_wallet,
            dummy2_wallet.get_identifier():
            dummy2_wallet
        },
                                         use_database=False)
        self.market_community.use_local_address = True
        self.dispersy._lan_address = ("127.0.0.1", 1234)
        self.dispersy._endpoint.open(self.dispersy)

        self.dispersy.attach_community(self.market_community)

        eccrypto = ECCrypto()
        ec = eccrypto.generate_key(u"curve25519")
        member = Member(self.dispersy, ec, 1)

        trader_id = hashlib.sha1(member.public_key).digest().encode('hex')
        self.ask = Ask(
            MessageId(TraderId('0'), MessageNumber('message_number')),
            OrderId(TraderId(trader_id), OrderNumber(1234)),
            Price(63400, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600),
            Timestamp.now())
        self.ask.sign(member)

        self.bid = Bid(
            MessageId(TraderId('1'), MessageNumber('message_number')),
            OrderId(TraderId(trader_id), OrderNumber(1235)),
            Price(343, 'DUM1'), Quantity(22, 'DUM2'), Timeout(3600),
            Timestamp.now())
        self.bid.sign(member)
        self.order = Order(
            OrderId(TraderId(self.market_community.mid), OrderNumber(24)),
            Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600.0),
            Timestamp.now(), False)
        self.proposed_trade = Trade.propose(
            MessageId(TraderId('0'), MessageNumber('message_number')),
            OrderId(TraderId('0'), OrderNumber(23)),
            OrderId(TraderId(self.market_community.mid), OrderNumber(24)),
            Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timestamp.now())

    @blocking_call_on_reactor_thread
    def test_get_master_members(self):
        """
        Test retrieval of the master members of the Market community
        """
        self.assertTrue(MarketCommunity.get_master_members(self.dispersy))

    @blocking_call_on_reactor_thread
    def test_proposed_trade_cache_timeout(self):
        """
        Test the timeout method of a proposed trade request in the cache
        """
        ask = Ask(
            MessageId(TraderId('0'), MessageNumber('message_number')),
            OrderId(TraderId(self.market_community.mid), OrderNumber(24)),
            Price(63400, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600),
            Timestamp.now())
        order = Order(OrderId(TraderId("0"), OrderNumber(23)),
                      Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600.0),
                      Timestamp.now(), False)
        self.market_community.order_book.insert_ask(ask)
        self.assertEqual(len(self.market_community.order_book.asks), 1)
        self.market_community.order_manager.order_repository.add(order)
        order.reserve_quantity_for_tick(self.proposed_trade.recipient_order_id,
                                        Quantity(30, 'DUM2'))
        self.market_community.order_manager.order_repository.update(order)
        cache = ProposedTradeRequestCache(self.market_community,
                                          self.proposed_trade)
        cache.on_timeout()
        self.assertEqual(len(self.market_community.order_book.asks), 0)

    def get_tick_message(self, tick):
        meta = self.market_community.get_meta_message(
            u"ask" if isinstance(tick, Ask) else u"bid")
        return meta.impl(
            authentication=(self.market_community.my_member, ),
            distribution=(self.market_community.claim_global_time(), ),
            payload=tick.to_network() + (Ttl.default(), "127.0.0.1", 1234))

    def get_offer_sync(self, tick):
        meta = self.market_community.get_meta_message(u"offer-sync")
        candidate = Candidate(
            self.market_community.lookup_ip(TraderId(
                self.market_community.mid)), False)
        return meta.impl(
            authentication=(self.market_community.my_member, ),
            distribution=(self.market_community.claim_global_time(), ),
            destination=(candidate, ),
            payload=tick.to_network() + (Ttl(1), ) + ("127.0.0.1", 1234) +
            (isinstance(tick, Ask), ))

    @blocking_call_on_reactor_thread
    def test_verify_offer_creation(self):
        """
        Test creation of an offer in the community
        """
        self.assertRaises(RuntimeError,
                          self.market_community.verify_offer_creation,
                          Price(3, 'MC'), 'ABC', Quantity(4, 'BTC'), 'ABC')
        self.assertRaises(RuntimeError,
                          self.market_community.verify_offer_creation,
                          Price(3, 'MC'), 'ABC', Quantity(4, 'BTC'), 'MC')
        self.assertRaises(RuntimeError,
                          self.market_community.verify_offer_creation,
                          Price(1, 'DUM1'), 'DUM1', Quantity(1, 'BTC'), 'BTC')
        self.assertRaises(RuntimeError,
                          self.market_community.verify_offer_creation,
                          Price(0.1, 'DUM1'), 'DUM1', Quantity(1,
                                                               'DUM2'), 'DUM2')
        self.assertRaises(RuntimeError,
                          self.market_community.verify_offer_creation,
                          Price(1, 'DUM1'), 'DUM1', Quantity(0.1,
                                                             'DUM2'), 'DUM2')

    @blocking_call_on_reactor_thread
    def test_check_message(self):
        """
        Test the general check of the validity of a message in the market community
        """
        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        proposed_trade_msg = self.get_proposed_trade_msg()
        self.market_community.timeline.check = lambda _: (True, None)
        [
            self.assertIsInstance(msg, Message.Implementation) for msg in
            self.market_community.check_message([proposed_trade_msg])
        ]

        self.market_community.timeline.check = lambda _: (False, None)
        [
            self.assertIsInstance(msg, DelayMessageByProof) for msg in
            self.market_community.check_message([proposed_trade_msg])
        ]

    @blocking_call_on_reactor_thread
    def test_check_tick_message(self):
        """
        Test the general check of the validity of a tick message in the market community
        """
        self.ask._signature = EMPTY_SIG
        [
            self.assertIsInstance(msg, DropMessage)
            for msg in self.market_community.check_tick_message(
                [self.get_tick_message(self.ask)])
        ]

        self.market_community.timeline.check = lambda _: (False, None)
        [
            self.assertIsInstance(msg, DelayMessageByProof)
            for msg in self.market_community.check_tick_message(
                [self.get_tick_message(self.ask)])
        ]

        self.market_community.timeline.check = lambda _: (True, None)
        self.ask.order_id._trader_id = TraderId(self.market_community.mid)
        [
            self.assertIsInstance(msg, DropMessage)
            for msg in self.market_community.check_tick_message(
                [self.get_tick_message(self.ask)])
        ]

    @blocking_call_on_reactor_thread
    def test_check_trade_message(self):
        """
        Test the general check of the validity of a trade message in the market community
        """
        self.proposed_trade.recipient_order_id._trader_id = TraderId("abcdef")
        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        self.market_community.update_ip(TraderId("abcdef"), ('2.2.2.2', 2))
        self.market_community.timeline.check = lambda _: (False, None)
        [
            self.assertIsInstance(msg, DelayMessageByProof)
            for msg in self.market_community.check_trade_message(
                [self.get_proposed_trade_msg()])
        ]

        self.market_community.timeline.check = lambda _: (True, None)
        [
            self.assertIsInstance(msg, DropMessage)
            for msg in self.market_community.check_trade_message(
                [self.get_proposed_trade_msg()])
        ]

        self.proposed_trade.recipient_order_id._trader_id = TraderId(
            self.market_community.mid)
        self.market_community.timeline.check = lambda _: (True, None)
        [
            self.assertIsInstance(msg, DropMessage)
            for msg in self.market_community.check_trade_message(
                [self.get_proposed_trade_msg()])
        ]

        self.market_community.order_manager.order_repository.add(self.order)
        self.market_community.timeline.check = lambda _: (True, None)
        [
            self.assertIsInstance(msg, Message.Implementation)
            for msg in self.market_community.check_trade_message(
                [self.get_proposed_trade_msg()])
        ]

    @blocking_call_on_reactor_thread
    def test_send_offer_sync(self):
        """
        Test sending an offer sync
        """
        self.market_community.update_ip(TraderId('0'), ("127.0.0.1", 1234))
        self.market_community.update_ip(TraderId('1'), ("127.0.0.1", 1234))
        self.market_community.update_ip(self.ask.order_id.trader_id,
                                        ("127.0.0.1", 1234))
        candidate = WalkCandidate(("127.0.0.1", 1234), False,
                                  ("127.0.0.1", 1234), ("127.0.0.1", 1234),
                                  u"public")
        self.assertTrue(
            self.market_community.send_offer_sync(candidate, self.ask))

    @blocking_call_on_reactor_thread
    def test_send_proposed_trade(self):
        """
        Test sending a proposed trade
        """
        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('127.0.0.1', 1234))
        self.assertEqual(
            self.market_community.send_proposed_trade_messages(
                [self.proposed_trade]), [True])

    @blocking_call_on_reactor_thread
    def test_send_counter_trade(self):
        """
        Test sending a counter trade
        """
        self.market_community.update_ip(TraderId('b'), ('127.0.0.1', 1234))
        counter_trade = CounterTrade(
            MessageId(TraderId('a'), MessageNumber('2')), self.order.order_id,
            OrderId(TraderId('b'), OrderNumber(3)), 1235, Price(3, 'MC'),
            Quantity(4, 'BTC'), Timestamp.now())
        self.market_community.send_counter_trade(counter_trade)

    @blocking_call_on_reactor_thread
    def test_start_transaction(self):
        """
        Test the start transaction method
        """
        self.market_community.order_manager.order_repository.add(self.order)
        self.market_community.update_ip(TraderId('0'), ("127.0.0.1", 1234))
        self.market_community.start_transaction(self.proposed_trade)
        self.assertEqual(
            len(self.market_community.transaction_manager.find_all()), 1)

    @blocking_call_on_reactor_thread
    def test_create_intro_request(self):
        """
        Test the creation of an introduction request
        """
        self.market_community.order_book.insert_ask(self.ask)
        self.market_community.order_book.insert_bid(self.bid)
        candidate = WalkCandidate(("127.0.0.1", 1234), False,
                                  ("127.0.0.1", 1234), ("127.0.0.1", 1234),
                                  u"public")
        request = self.market_community.create_introduction_request(
            candidate, True)
        self.assertTrue(request)
        self.assertTrue(request.payload.orders_bloom_filter)

    @blocking_call_on_reactor_thread
    def test_on_introduction_request(self):
        """
        Test that when we receive an intro request with a orders bloom filter, we send an order sync back
        """
        def on_send_offer_sync(_, tick):
            self.assertIsInstance(tick, Tick)
            on_send_offer_sync.called = True

        on_send_offer_sync.called = False

        candidate = WalkCandidate(("127.0.0.1", 1234), False,
                                  ("127.0.0.1", 1234), ("127.0.0.1", 1234),
                                  u"public")
        candidate.associate(self.market_community.my_member)
        payload = self.market_community.create_introduction_request(
            candidate, True).payload

        self.market_community.order_book.insert_ask(self.ask)
        self.market_community.order_book.insert_bid(self.bid)
        self.market_community.update_ip(TraderId('0'), ("127.0.0.1", 1234))
        self.market_community.update_ip(TraderId('1'), ("127.0.0.1", 1234))
        self.market_community.send_offer_sync = on_send_offer_sync

        message = MockObject()
        message.payload = payload
        message.candidate = candidate
        self.market_community.on_introduction_request([message])
        self.assertTrue(on_send_offer_sync.called)

    @blocking_call_on_reactor_thread
    def test_lookup_ip(self):
        # Test for lookup ip
        self.market_community.update_ip(TraderId('0'), ("1.1.1.1", 0))
        self.assertEquals(("1.1.1.1", 0),
                          self.market_community.lookup_ip(TraderId('0')))

    @blocking_call_on_reactor_thread
    def test_get_wallet_address(self):
        """
        Test the retrieval of a wallet address
        """
        self.assertRaises(ValueError, self.market_community.get_wallet_address,
                          'ABCD')
        self.assertTrue(self.market_community.get_wallet_address('DUM1'))

    @blocking_call_on_reactor_thread
    def test_create_ask(self):
        # Test for create ask
        self.assertRaises(RuntimeError, self.market_community.create_ask, 20,
                          'DUM2', 100, 'DUM2', 0.0)
        self.assertRaises(RuntimeError, self.market_community.create_ask, 20,
                          'NOTEXIST', 100, 'DUM2', 0.0)
        self.assertRaises(RuntimeError, self.market_community.create_ask, 20,
                          'DUM2', 100, 'NOTEXIST', 0.0)
        self.assertTrue(
            self.market_community.create_ask(20, 'DUM1', 100, 'DUM2', 3600))
        self.assertEquals(1, len(self.market_community.order_book._asks))
        self.assertEquals(0, len(self.market_community.order_book._bids))

    @blocking_call_on_reactor_thread
    def test_on_tick(self):
        """
        Test whether a tick is inserted in the order book when we receive one
        """
        self.market_community.on_tick(
            [self.get_tick_message(self.ask),
             self.get_tick_message(self.bid)])
        self.assertEquals(1, len(self.market_community.order_book.asks))
        self.assertEquals(1, len(self.market_community.order_book.bids))

        # Update the timestamp of the ticks
        ask_timestamp = float(self.ask.timestamp)
        self.ask.update_timestamp()
        self.market_community.on_tick([self.get_tick_message(self.ask)])
        self.assertEquals(1, len(self.market_community.order_book.asks))
        new_timestamp = self.market_community.order_book.get_tick(
            self.ask.order_id).tick.timestamp
        self.assertGreater(new_timestamp, ask_timestamp)

    @blocking_call_on_reactor_thread
    def test_create_bid(self):
        # Test for create bid
        self.assertRaises(RuntimeError, self.market_community.create_bid, 20,
                          'DUM2', 100, 'DUM2', 0.0)
        self.assertRaises(RuntimeError, self.market_community.create_bid, 20,
                          'NOTEXIST', 100, 'DUM2', 0.0)
        self.assertRaises(RuntimeError, self.market_community.create_bid, 20,
                          'DUM2', 100, 'NOTEXIST', 0.0)
        self.assertTrue(
            self.market_community.create_bid(20, 'DUM1', 100, 'DUM2', 3600))
        self.assertEquals(0, len(self.market_community.order_book.asks))
        self.assertEquals(1, len(self.market_community.order_book.bids))

    def get_proposed_trade_msg(self):
        destination, payload = self.proposed_trade.to_network()
        payload += ("127.0.0.1", 1234)
        candidate = Candidate(self.market_community.lookup_ip(destination),
                              False)
        meta = self.market_community.get_meta_message(u"proposed-trade")
        message = meta.impl(
            authentication=(self.market_community.my_member, ),
            distribution=(self.market_community.claim_global_time(), ),
            destination=(candidate, ),
            payload=payload)
        return message

    @blocking_call_on_reactor_thread
    def test_on_proposed_trade_accept(self):
        """
        Test whether we accept a trade when we receive a correct proposed trade message
        """
        def mocked_start_transaction(*_):
            mocked_start_transaction.called = True

        mocked_start_transaction.called = False

        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        self.market_community.start_transaction = mocked_start_transaction
        self.market_community.order_manager.order_repository.add(self.order)

        self.market_community.on_proposed_trade(
            [self.get_proposed_trade_msg()])
        self.assertTrue(mocked_start_transaction.called)

    @blocking_call_on_reactor_thread
    def test_on_proposed_trade_decline(self):
        """
        Test whether we decline a trade when we receive an invalid proposed trade message
        """
        def mocked_send_decline_trade(*_):
            mocked_send_decline_trade.called = True

        mocked_send_decline_trade.called = False

        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        self.market_community.send_declined_trade = mocked_send_decline_trade
        self.market_community.order_manager.order_repository.add(self.order)

        self.proposed_trade._price = Price(900, 'DUM1')
        self.market_community.on_proposed_trade(
            [self.get_proposed_trade_msg()])
        self.assertTrue(mocked_send_decline_trade.called)

    @blocking_call_on_reactor_thread
    def test_on_proposed_trade_counter(self):
        """
        Test whether we send a counter trade when we receive a proposed trade message
        """
        def mocked_send_counter_trade(*_):
            mocked_send_counter_trade.called = True

        mocked_send_counter_trade.called = False

        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        self.market_community.send_counter_trade = mocked_send_counter_trade
        self.market_community.order_manager.order_repository.add(self.order)

        self.proposed_trade._quantity = Quantity(100000, 'DUM2')
        self.market_community.on_proposed_trade(
            [self.get_proposed_trade_msg()])
        self.assertTrue(mocked_send_counter_trade.called)

    @blocking_call_on_reactor_thread
    def test_on_offer_sync(self):
        """
        Test whether the right operations happen when we receive an offer sync
        """
        self.assertEqual(len(self.market_community.order_book.asks), 0)
        self.assertEqual(len(self.market_community.order_book.bids), 0)

        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        self.market_community.on_offer_sync([self.get_offer_sync(self.ask)])
        self.assertEqual(len(self.market_community.order_book.asks), 1)
        self.market_community.order_book.remove_tick(self.ask.order_id)
        self.market_community.on_offer_sync([self.get_offer_sync(self.bid)])
        self.assertEqual(len(self.market_community.order_book.bids), 1)

    @blocking_call_on_reactor_thread
    def test_compute_reputation(self):
        """
        Test the compute_reputation method
        """
        self.market_community.tradechain_community = MockObject()
        self.market_community.tradechain_community.persistence = MockObject()
        self.market_community.tradechain_community.persistence.get_all_blocks = lambda: [
        ]
        self.market_community.compute_reputation()
        self.assertFalse(self.market_community.reputation_dict)

    @blocking_call_on_reactor_thread
    def test_abort_transaction(self):
        """
        Test aborting a transaction
        """
        self.order.reserve_quantity_for_tick(
            OrderId(TraderId('0'), OrderNumber(23)), Quantity(30, 'DUM2'))
        self.market_community.order_manager.order_repository.add(self.order)
        self.market_community.update_ip(TraderId('0'), ("127.0.0.1", 1234))
        self.market_community.start_transaction(self.proposed_trade)
        transaction = self.market_community.transaction_manager.find_all()[0]
        self.assertTrue(transaction)
        self.assertEqual(self.order.reserved_quantity, Quantity(30, 'DUM2'))
        self.market_community.abort_transaction(transaction)

        order = self.market_community.order_manager.order_repository.find_by_id(
            transaction.order_id)
        self.assertEqual(order.reserved_quantity, Quantity(0, 'DUM2'))
Exemple #4
0
class OrderTestSuite(unittest.TestCase):
    """Order test cases."""

    def setUp(self):
        # Object creation
        self.transaction_id = TransactionId(TraderId("0"), TransactionNumber(1))
        self.transaction = Transaction(self.transaction_id, AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MC')),
                                       OrderId(TraderId('0'), OrderNumber(2)),
                                       OrderId(TraderId('1'), OrderNumber(1)), Timestamp(0.0))
        self.proposed_trade = Trade.propose(TraderId('0'),
                                            OrderId(TraderId('0'), OrderNumber(2)),
                                            OrderId(TraderId('1'), OrderNumber(3)),
                                            AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MC')), Timestamp(0.0))

        self.tick = Tick(OrderId(TraderId('0'), OrderNumber(1)),
                         AssetPair(AssetAmount(5, 'BTC'), AssetAmount(5, 'MC')),
                         Timeout(0), Timestamp(float("inf")), True)
        self.tick2 = Tick(OrderId(TraderId('0'), OrderNumber(2)),
                          AssetPair(AssetAmount(500, 'BTC'), AssetAmount(5, 'MC')),
                          Timeout(0), Timestamp(float("inf")), True)

        self.order_timestamp = Timestamp.now()
        self.order = Order(OrderId(TraderId("0"), OrderNumber(3)),
                           AssetPair(AssetAmount(50, 'BTC'), AssetAmount(5, 'MC')),
                           Timeout(5000), self.order_timestamp, False)
        self.order.set_verified()
        self.order2 = Order(OrderId(TraderId("0"), OrderNumber(4)),
                            AssetPair(AssetAmount(50, 'BTC'), AssetAmount(5, 'MC')),
                            Timeout(5), Timestamp(time.time() - 1000), True)
        self.order2.set_verified()

    def test_add_trade(self):
        """
        Test the add trade method of an order
        """
        self.order.reserve_quantity_for_tick(OrderId(TraderId('5'), OrderNumber(1)), 10)
        self.assertEquals(self.order.traded_quantity, 0)
        self.order.add_trade(OrderId(TraderId('5'), OrderNumber(1)), 10)
        self.assertEquals(self.order.traded_quantity, 10)

        self.order.reserve_quantity_for_tick(OrderId(TraderId('6'), OrderNumber(1)), 40)
        self.order.add_trade(OrderId(TraderId('6'), OrderNumber(1)), 40)
        self.assertTrue(self.order.is_complete())
        self.assertFalse(self.order.cancelled)

    def test_has_acceptable_price(self):
        """
        Test the acceptable price method
        """
        order = Order(OrderId(TraderId("0"), OrderNumber(3)),
                      AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB')),
                      Timeout(5000), self.order_timestamp, True)

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB'))
        self.assertTrue(order.has_acceptable_price(pair))

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(15, 'MB'))
        self.assertFalse(order.has_acceptable_price(pair))

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(60, 'MB'))
        self.assertTrue(order.has_acceptable_price(pair))

        order._is_ask = False

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB'))
        self.assertTrue(order.has_acceptable_price(pair))

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(15, 'MB'))
        self.assertTrue(order.has_acceptable_price(pair))

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(60, 'MB'))
        self.assertFalse(order.has_acceptable_price(pair))

    def test_is_ask(self):
        # Test for is ask
        self.assertTrue(self.order2.is_ask())
        self.assertFalse(self.order.is_ask())

    def test_reserve_quantity_insufficient(self):
        # Test for reserve insufficient quantity
        self.assertRaises(ValueError, self.order.reserve_quantity_for_tick, self.tick2.order_id,
                          self.tick2.assets.first)

    def test_reserve_quantity(self):
        # Test for reserve quantity
        self.assertEquals(0, self.order.reserved_quantity)
        self.order.reserve_quantity_for_tick(self.tick.order_id, 5)
        self.assertEquals(5, self.order.reserved_quantity)
        self.order.reserve_quantity_for_tick(self.tick.order_id, 5)
        self.assertEquals(10, self.order.reserved_quantity)

    def test_release_quantity(self):
        # Test for release quantity
        self.order.reserve_quantity_for_tick(self.tick.order_id, 5)
        self.assertEquals(5, self.order.reserved_quantity)
        self.order.release_quantity_for_tick(self.tick.order_id, 5)
        self.assertEquals(0, self.order.reserved_quantity)

        self.order.reserve_quantity_for_tick(self.tick.order_id, self.tick.assets.first.amount)
        quantity = self.tick.assets.first.amount + 1
        self.assertRaises(ValueError, self.order.release_quantity_for_tick, self.tick.order_id, quantity)

    def test_release_unreserved_quantity(self):
        # Test for release unreserved quantity
        with self.assertRaises(TickWasNotReserved):
            self.order.release_quantity_for_tick(self.tick.order_id, AssetAmount(5, 'BTC'))

    def test_is_valid(self):
        self.assertTrue(self.order.is_valid())
        self.assertFalse(self.order2.is_valid())

    def test_status(self):
        """
        Test the status of an order
        """
        self.order._verified = False
        self.assertEqual(self.order.status, "unverified")
        self.order.set_verified()
        self.assertEqual(self.order.status, "open")
        self.order._timeout = Timeout(0)
        self.assertEqual(self.order.status, "expired")
        self.order._traded_quantity = self.order.total_quantity
        self.assertEqual(self.order.status, "completed")
        self.order._cancelled = True
        self.assertEqual(self.order.status, "cancelled")

    def test_to_dict(self):
        """
        Test the conversion of an order to a dictionary
        """
        self.assertEqual(self.order.to_dictionary(), {
            "trader_id": "0",
            "cancelled": False,
            "completed_timestamp": None,
            "is_ask": False,
            "order_number": 3,
            "assets": {
                "first": {
                    "amount": 50,
                    "type": "BTC",
                },
                "second": {
                    "amount": 5,
                    "type": "MC"
                }
            },
            "reserved_quantity": 0,
            "traded": 0,
            "status": "open",
            "timeout": 5000,
            "timestamp": float(self.order_timestamp)
        })
Exemple #5
0
class TestDatabase(AbstractServer):

    @inlineCallbacks
    def setUp(self):
        yield super(TestDatabase, self).setUp()

        path = os.path.join(self.getStateDir(), 'sqlite')
        if not os.path.exists(path):
            os.makedirs(path)

        self.database = MarketDB(self.getStateDir(), 'market')

        self.order_id1 = OrderId(TraderId(b'3'), OrderNumber(4))
        self.order_id2 = OrderId(TraderId(b'4'), OrderNumber(5))
        self.order1 = Order(self.order_id1, AssetPair(AssetAmount(5, 'BTC'), AssetAmount(6, 'EUR')),
                            Timeout(3600), Timestamp.now(), True)
        self.order2 = Order(self.order_id2, AssetPair(AssetAmount(5, 'BTC'), AssetAmount(6, 'EUR')),
                            Timeout(3600), Timestamp.now(), False)
        self.order2.reserve_quantity_for_tick(OrderId(TraderId(b'3'), OrderNumber(4)), 3)

        self.transaction_id1 = TransactionId(TraderId(b"0"), TransactionNumber(4))
        self.transaction1 = Transaction(self.transaction_id1, AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MB')),
                                        OrderId(TraderId(b"0"), OrderNumber(1)),
                                        OrderId(TraderId(b"1"), OrderNumber(2)), Timestamp(20.0))

        self.payment1 = Payment(TraderId(b"0"), self.transaction_id1, AssetAmount(5, 'BTC'),
                                WalletAddress('abc'), WalletAddress('def'), PaymentId("abc"), Timestamp(20.0), False)

        self.transaction1.add_payment(self.payment1)

    def test_add_get_order(self):
        """
        Test the insertion and retrieval of an order in the database
        """
        self.database.add_order(self.order1)
        self.database.add_order(self.order2)
        orders = self.database.get_all_orders()
        self.assertEqual(len(orders), 2)

    def test_get_specific_order(self):
        """
        Test the retrieval of a specific order
        """
        order_id = OrderId(TraderId(b'3'), OrderNumber(4))
        self.assertIsNone(self.database.get_order(order_id))
        self.database.add_order(self.order1)
        self.assertIsNotNone(self.database.get_order(order_id))

    def test_delete_order(self):
        """
        Test the deletion of an order from the database
        """
        self.database.add_order(self.order1)
        self.assertEqual(len(self.database.get_all_orders()), 1)
        self.database.delete_order(self.order_id1)
        self.assertEqual(len(self.database.get_all_orders()), 0)

    def test_get_next_order_number(self):
        """
        Test the retrieval of the next order number from the database
        """
        self.assertEqual(self.database.get_next_order_number(), 1)
        self.database.add_order(self.order1)
        self.assertEqual(self.database.get_next_order_number(), 5)

    def test_add_delete_reserved_ticks(self):
        """
        Test the retrieval, addition and deletion of reserved ticks in the database
        """
        self.database.add_reserved_tick(self.order_id1, self.order_id2, self.order1.total_quantity)
        self.assertEqual(len(self.database.get_reserved_ticks(self.order_id1)), 1)
        self.database.delete_reserved_ticks(self.order_id1)
        self.assertEqual(len(self.database.get_reserved_ticks(self.order_id1)), 0)

    def test_add_get_transaction(self):
        """
        Test the insertion and retrieval of a transaction in the database
        """
        self.database.add_transaction(self.transaction1)
        transactions = self.database.get_all_transactions()
        self.assertEqual(len(transactions), 1)
        self.assertEqual(len(self.database.get_payments(self.transaction1.transaction_id)), 1)

    def test_insert_or_update_transaction(self):
        """
        Test the conditional insertion or update of a transaction in the database
        """
        # Test insertion
        self.database.insert_or_update_transaction(self.transaction1)
        transactions = self.database.get_all_transactions()
        self.assertEqual(len(transactions), 1)

        # Test try to update with older timestamp
        before_trans1 = Transaction(self.transaction1.transaction_id, self.transaction1.assets,
                                    self.transaction1.order_id, self.transaction1.partner_order_id,
                                    Timestamp(float(self.transaction1.timestamp) - 1.0))
        self.database.insert_or_update_transaction(before_trans1)
        transaction = self.database.get_transaction(self.transaction1.transaction_id)
        self.assertEqual(float(transaction.timestamp), float(self.transaction1.timestamp))

        # Test update with newer timestamp
        after_trans1 = Transaction(self.transaction1.transaction_id, self.transaction1.assets,
                                   self.transaction1.order_id, self.transaction1.partner_order_id,
                                   Timestamp(float(self.transaction1.timestamp) + 1.0))
        self.database.insert_or_update_transaction(after_trans1)
        transaction = self.database.get_transaction(self.transaction1.transaction_id)
        self.assertEqual(float(transaction.timestamp), float(after_trans1.timestamp))

    def test_get_specific_transaction(self):
        """
        Test the retrieval of a specific transaction
        """
        transaction_id = TransactionId(TraderId(b'0'), TransactionNumber(4))
        self.assertIsNone(self.database.get_transaction(transaction_id))
        self.database.add_transaction(self.transaction1)
        self.assertIsNotNone(self.database.get_transaction(transaction_id))

    def test_delete_transaction(self):
        """
        Test the deletion of a transaction from the database
        """
        self.database.add_transaction(self.transaction1)
        self.assertEqual(len(self.database.get_all_transactions()), 1)
        self.database.delete_transaction(self.transaction_id1)
        self.assertEqual(len(self.database.get_all_transactions()), 0)

    def test_get_next_transaction_number(self):
        """
        Test the retrieval of the next transaction number from the database
        """
        self.assertEqual(self.database.get_next_transaction_number(), 1)
        self.database.add_transaction(self.transaction1)
        self.assertEqual(self.database.get_next_transaction_number(), 5)

    def test_add_get_payment(self):
        """
        Test the insertion and retrieval of a payment in the database
        """
        self.database.add_payment(self.payment1)
        payments = self.database.get_payments(self.transaction_id1)
        self.assertEqual(len(payments), 1)

    def test_add_remove_tick(self):
        """
        Test addition, retrieval and deletion of ticks in the database
        """
        ask = Tick.from_order(self.order1)
        self.database.add_tick(ask)
        bid = Tick.from_order(self.order2)
        self.database.add_tick(bid)

        self.assertEqual(len(self.database.get_ticks()), 2)

        self.database.delete_all_ticks()
        self.assertEqual(len(self.database.get_ticks()), 0)

    def test_add_get_trader_identity(self):
        """
        Test the addition and retrieval of a trader identity in the database
        """
        self.database.add_trader_identity(TraderId(b"a"), "123", 1234)
        self.database.add_trader_identity(TraderId(b"b"), "124", 1235)
        traders = self.database.get_traders()
        self.assertEqual(len(traders), 2)

    def test_check_database(self):
        """
        Test the check of the database
        """
        self.assertEqual(self.database.check_database(six.text_type(LATEST_DB_VERSION)), LATEST_DB_VERSION)

    def test_get_upgrade_script(self):
        """
        Test fetching the upgrade script of the database
        """
        self.assertTrue(self.database.get_upgrade_script(1))

    def test_db_upgrade(self):
        self.database.execute(u"DROP TABLE orders;")
        self.database.execute(u"DROP TABLE ticks;")
        self.database.execute(u"CREATE TABLE orders(x INTEGER PRIMARY KEY ASC);")
        self.database.execute(u"CREATE TABLE ticks(x INTEGER PRIMARY KEY ASC);")
        self.assertEqual(self.database.check_database(u"1"), 3)
Exemple #6
0
class TestDatabase(AbstractServer):
    @blocking_call_on_reactor_thread
    @inlineCallbacks
    def setUp(self, annotate=True):
        yield super(TestDatabase, self).setUp(annotate=annotate)

        path = os.path.join(self.getStateDir(), 'sqlite')
        if not os.path.exists(path):
            os.makedirs(path)

        self.database = MarketDB(self.getStateDir(), 'market')

        self.order_id1 = OrderId(TraderId('3'), OrderNumber(4))
        self.order_id2 = OrderId(TraderId('4'), OrderNumber(5))
        self.order1 = Order(self.order_id1, Price(5,
                                                  'EUR'), Quantity(6, 'BTC'),
                            Timeout(3600), Timestamp.now(), True)
        self.order2 = Order(self.order_id2, Price(5,
                                                  'EUR'), Quantity(6, 'BTC'),
                            Timeout(3600), Timestamp.now(), False)
        self.order2.reserve_quantity_for_tick(
            OrderId(TraderId('3'), OrderNumber(4)), Quantity(3, 'BTC'))

        self.transaction_id1 = TransactionId(TraderId("0"),
                                             TransactionNumber(4))
        self.transaction1 = Transaction(self.transaction_id1,
                                        Price(100, 'BTC'), Quantity(30, 'MC'),
                                        OrderId(TraderId("0"), OrderNumber(1)),
                                        OrderId(TraderId("1"), OrderNumber(2)),
                                        Timestamp(20.0))

        self.payment1 = Payment(MessageId(TraderId("0"), MessageNumber(4)),
                                self.transaction_id1, Quantity(5, 'MC'),
                                Price(6, 'BTC'), WalletAddress('abc'),
                                WalletAddress('def'), PaymentId("abc"),
                                Timestamp(20.0), False)

        self.transaction1.add_payment(self.payment1)

    @blocking_call_on_reactor_thread
    def test_add_get_order(self):
        """
        Test the insertion and retrieval of an order in the database
        """
        self.database.add_order(self.order1)
        self.database.add_order(self.order2)
        orders = self.database.get_all_orders()
        self.assertEqual(len(orders), 2)

    @blocking_call_on_reactor_thread
    def test_get_specific_order(self):
        """
        Test the retrieval of a specific order
        """
        order_id = OrderId(TraderId('3'), OrderNumber(4))
        self.assertIsNone(self.database.get_order(order_id))
        self.database.add_order(self.order1)
        self.assertIsNotNone(self.database.get_order(order_id))

    @blocking_call_on_reactor_thread
    def test_delete_order(self):
        """
        Test the deletion of an order from the database
        """
        self.database.add_order(self.order1)
        self.assertEqual(len(self.database.get_all_orders()), 1)
        self.database.delete_order(self.order_id1)
        self.assertEqual(len(self.database.get_all_orders()), 0)

    @blocking_call_on_reactor_thread
    def test_get_next_order_number(self):
        """
        Test the retrieval of the next order number from the database
        """
        self.assertEqual(self.database.get_next_order_number(), 1)
        self.database.add_order(self.order1)
        self.assertEqual(self.database.get_next_order_number(), 5)

    @blocking_call_on_reactor_thread
    def test_add_delete_reserved_ticks(self):
        """
        Test the retrieval, addition and deletion of reserved ticks in the database
        """
        self.database.add_reserved_tick(self.order_id1, self.order_id2,
                                        self.order1.total_quantity)
        self.assertEqual(len(self.database.get_reserved_ticks(self.order_id1)),
                         1)
        self.database.delete_reserved_ticks(self.order_id1)
        self.assertEqual(len(self.database.get_reserved_ticks(self.order_id1)),
                         0)

    @blocking_call_on_reactor_thread
    def test_add_get_transaction(self):
        """
        Test the insertion and retrieval of a transaction in the database
        """
        self.database.add_transaction(self.transaction1)
        transactions = self.database.get_all_transactions()
        self.assertEqual(len(transactions), 1)
        self.assertEqual(
            len(self.database.get_payments(self.transaction1.transaction_id)),
            1)

    @blocking_call_on_reactor_thread
    def test_get_specific_transaction(self):
        """
        Test the retrieval of a specific transaction
        """
        transaction_id = TransactionId(TraderId('0'), TransactionNumber(4))
        self.assertIsNone(self.database.get_transaction(transaction_id))
        self.database.add_transaction(self.transaction1)
        self.assertIsNotNone(self.database.get_transaction(transaction_id))

    @blocking_call_on_reactor_thread
    def test_delete_transaction(self):
        """
        Test the deletion of a transaction from the database
        """
        self.database.add_transaction(self.transaction1)
        self.assertEqual(len(self.database.get_all_transactions()), 1)
        self.database.delete_transaction(self.transaction_id1)
        self.assertEqual(len(self.database.get_all_transactions()), 0)

    @blocking_call_on_reactor_thread
    def test_get_next_transaction_number(self):
        """
        Test the retrieval of the next transaction number from the database
        """
        self.assertEqual(self.database.get_next_transaction_number(), 1)
        self.database.add_transaction(self.transaction1)
        self.assertEqual(self.database.get_next_transaction_number(), 5)

    @blocking_call_on_reactor_thread
    def test_add_get_payment(self):
        """
        Test the insertion and retrieval of a payment in the database
        """
        self.database.add_payment(self.payment1)
        payments = self.database.get_payments(self.transaction_id1)
        self.assertEqual(len(payments), 1)

    @blocking_call_on_reactor_thread
    def test_add_remove_tick(self):
        """
        Test addition, retrieval and deletion of ticks in the database
        """
        ask = Tick.from_order(self.order1)
        self.database.add_tick(ask)
        bid = Tick.from_order(self.order2)
        self.database.add_tick(bid)

        self.assertEqual(len(self.database.get_ticks()), 2)

        self.database.delete_all_ticks()
        self.assertEqual(len(self.database.get_ticks()), 0)

    @blocking_call_on_reactor_thread
    def test_add_get_trader_identity(self):
        """
        Test the addition and retrieval of a trader identity in the database
        """
        self.database.add_trader_identity("a", "123", 1234)
        self.database.add_trader_identity("b", "124", 1235)
        traders = self.database.get_traders()
        self.assertEqual(len(traders), 2)
        self.assertEqual(traders, [("a", "123", 1234), ("b", "124", 1235)])

    @blocking_call_on_reactor_thread
    def test_check_database(self):
        """
        Test the check of the database
        """
        self.assertEqual(
            self.database.check_database(unicode(LATEST_DB_VERSION)),
            LATEST_DB_VERSION)

    @blocking_call_on_reactor_thread
    def test_get_upgrade_script(self):
        """
        Test fetching the upgrade script of the database
        """
        self.assertTrue(self.database.get_upgrade_script(1))

    @blocking_call_on_reactor_thread
    def test_db_upgrade(self):
        self.database.execute(u"DROP TABLE orders;")
        self.database.execute(u"DROP TABLE ticks;")
        self.database.execute(
            u"CREATE TABLE orders(x INTEGER PRIMARY KEY ASC);")
        self.database.execute(
            u"CREATE TABLE ticks(x INTEGER PRIMARY KEY ASC);")
        self.assertEqual(self.database.check_database(u"1"), 2)
Exemple #7
0
class OrderTestSuite(unittest.TestCase):
    """Order test cases."""
    def setUp(self):
        # Object creation
        self.transaction_id = TransactionId(TraderId("0"),
                                            TransactionNumber(1))
        self.transaction = Transaction(
            self.transaction_id,
            AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MC')),
            OrderId(TraderId('0'), OrderNumber(2)),
            OrderId(TraderId('1'), OrderNumber(1)), Timestamp(0.0))
        self.proposed_trade = Trade.propose(
            TraderId('0'), OrderId(TraderId('0'), OrderNumber(2)),
            OrderId(TraderId('1'), OrderNumber(3)),
            AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MC')),
            Timestamp(0.0))

        self.tick = Tick(
            OrderId(TraderId('0'), OrderNumber(1)),
            AssetPair(AssetAmount(5, 'BTC'), AssetAmount(5, 'MC')), Timeout(0),
            Timestamp(float("inf")), True)
        self.tick2 = Tick(
            OrderId(TraderId('0'), OrderNumber(2)),
            AssetPair(AssetAmount(500, 'BTC'), AssetAmount(5, 'MC')),
            Timeout(0), Timestamp(float("inf")), True)

        self.order_timestamp = Timestamp.now()
        self.order = Order(
            OrderId(TraderId("0"), OrderNumber(3)),
            AssetPair(AssetAmount(50, 'BTC'), AssetAmount(5, 'MC')),
            Timeout(5000), self.order_timestamp, False)
        self.order.set_verified()
        self.order2 = Order(
            OrderId(TraderId("0"), OrderNumber(4)),
            AssetPair(AssetAmount(50, 'BTC'), AssetAmount(5, 'MC')),
            Timeout(5), Timestamp(time.time() - 1000), True)
        self.order2.set_verified()

    def test_add_trade(self):
        """
        Test the add trade method of an order
        """
        self.order.reserve_quantity_for_tick(
            OrderId(TraderId('5'), OrderNumber(1)), 10)
        self.assertEquals(self.order.traded_quantity, 0)
        self.order.add_trade(OrderId(TraderId('5'), OrderNumber(1)), 10)
        self.assertEquals(self.order.traded_quantity, 10)

        self.order.reserve_quantity_for_tick(
            OrderId(TraderId('6'), OrderNumber(1)), 40)
        self.order.add_trade(OrderId(TraderId('6'), OrderNumber(1)), 40)
        self.assertTrue(self.order.is_complete())
        self.assertFalse(self.order.cancelled)

    def test_has_acceptable_price(self):
        """
        Test the acceptable price method
        """
        order = Order(OrderId(TraderId("0"), OrderNumber(3)),
                      AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB')),
                      Timeout(5000), self.order_timestamp, True)

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB'))
        self.assertTrue(order.has_acceptable_price(pair))

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(15, 'MB'))
        self.assertFalse(order.has_acceptable_price(pair))

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(60, 'MB'))
        self.assertTrue(order.has_acceptable_price(pair))

        order._is_ask = False

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB'))
        self.assertTrue(order.has_acceptable_price(pair))

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(15, 'MB'))
        self.assertTrue(order.has_acceptable_price(pair))

        pair = AssetPair(AssetAmount(60, 'BTC'), AssetAmount(60, 'MB'))
        self.assertFalse(order.has_acceptable_price(pair))

    def test_is_ask(self):
        # Test for is ask
        self.assertTrue(self.order2.is_ask())
        self.assertFalse(self.order.is_ask())

    def test_reserve_quantity_insufficient(self):
        # Test for reserve insufficient quantity
        self.assertRaises(ValueError, self.order.reserve_quantity_for_tick,
                          self.tick2.order_id, self.tick2.assets.first)

    def test_reserve_quantity(self):
        # Test for reserve quantity
        self.assertEquals(0, self.order.reserved_quantity)
        self.order.reserve_quantity_for_tick(self.tick.order_id, 5)
        self.assertEquals(5, self.order.reserved_quantity)
        self.order.reserve_quantity_for_tick(self.tick.order_id, 5)
        self.assertEquals(10, self.order.reserved_quantity)

    def test_release_quantity(self):
        # Test for release quantity
        self.order.reserve_quantity_for_tick(self.tick.order_id, 5)
        self.assertEquals(5, self.order.reserved_quantity)
        self.order.release_quantity_for_tick(self.tick.order_id, 5)
        self.assertEquals(0, self.order.reserved_quantity)

        self.order.reserve_quantity_for_tick(self.tick.order_id,
                                             self.tick.assets.first.amount)
        quantity = self.tick.assets.first.amount + 1
        self.assertRaises(ValueError, self.order.release_quantity_for_tick,
                          self.tick.order_id, quantity)

    def test_release_unreserved_quantity(self):
        # Test for release unreserved quantity
        with self.assertRaises(TickWasNotReserved):
            self.order.release_quantity_for_tick(self.tick.order_id,
                                                 AssetAmount(5, 'BTC'))

    def test_is_valid(self):
        self.assertTrue(self.order.is_valid())
        self.assertFalse(self.order2.is_valid())

    def test_status(self):
        """
        Test the status of an order
        """
        self.order._verified = False
        self.assertEqual(self.order.status, "unverified")
        self.order.set_verified()
        self.assertEqual(self.order.status, "open")
        self.order._timeout = Timeout(0)
        self.assertEqual(self.order.status, "expired")
        self.order._traded_quantity = self.order.total_quantity
        self.assertEqual(self.order.status, "completed")
        self.order._cancelled = True
        self.assertEqual(self.order.status, "cancelled")

    def test_to_dict(self):
        """
        Test the conversion of an order to a dictionary
        """
        self.assertEqual(
            self.order.to_dictionary(), {
                "trader_id": "0",
                "cancelled": False,
                "completed_timestamp": None,
                "is_ask": False,
                "order_number": 3,
                "assets": {
                    "first": {
                        "amount": 50,
                        "type": "BTC",
                    },
                    "second": {
                        "amount": 5,
                        "type": "MC"
                    }
                },
                "reserved_quantity": 0,
                "traded": 0,
                "status": "open",
                "timeout": 5000,
                "timestamp": float(self.order_timestamp)
            })
class PriceTimeStrategyTestSuite(AbstractServer):
    """Price time strategy test cases."""
    @blocking_call_on_reactor_thread
    @inlineCallbacks
    def setUp(self, annotate=True):
        yield super(PriceTimeStrategyTestSuite, self).setUp(annotate=annotate)
        # Object creation
        self.ask = Ask(MessageId(TraderId('0'), MessageNumber('1')),
                       OrderId(TraderId('0'), OrderNumber(1)),
                       Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(100),
                       Timestamp.now())
        self.ask2 = Ask(MessageId(TraderId('1'), MessageNumber('1')),
                        OrderId(TraderId('1'), OrderNumber(2)),
                        Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(100),
                        Timestamp.now())
        self.ask3 = Ask(MessageId(TraderId('3'), MessageNumber('1')),
                        OrderId(TraderId('0'), OrderNumber(3)),
                        Price(200, 'BTC'), Quantity(200, 'MC'), Timeout(100),
                        Timestamp.now())
        self.ask4 = Ask(MessageId(TraderId('4'), MessageNumber('1')),
                        OrderId(TraderId('1'), OrderNumber(4)),
                        Price(50, 'BTC'), Quantity(200, 'MC'), Timeout(100),
                        Timestamp.now())
        self.ask5 = Ask(MessageId(TraderId('4'), MessageNumber('1')),
                        OrderId(TraderId('1'), OrderNumber(4)),
                        Price(100, 'A'), Quantity(30, 'MC'), Timeout(100),
                        Timestamp.now())
        self.ask6 = Ask(MessageId(TraderId('4'), MessageNumber('1')),
                        OrderId(TraderId('1'), OrderNumber(4)),
                        Price(100, 'BTC'), Quantity(30, 'A'), Timeout(100),
                        Timestamp.now())

        self.bid = Bid(MessageId(TraderId('5'), MessageNumber('2')),
                       OrderId(TraderId('0'), OrderNumber(5)),
                       Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(100),
                       Timestamp.now())
        self.bid2 = Bid(MessageId(TraderId('6'), MessageNumber('2')),
                        OrderId(TraderId('0'), OrderNumber(6)),
                        Price(200, 'BTC'), Quantity(30, 'MC'), Timeout(100),
                        Timestamp.now())
        self.bid3 = Bid(MessageId(TraderId('7'), MessageNumber('2')),
                        OrderId(TraderId('0'), OrderNumber(7)),
                        Price(50, 'BTC'), Quantity(200, 'MC'), Timeout(100),
                        Timestamp.now())
        self.bid4 = Bid(MessageId(TraderId('8'), MessageNumber('2')),
                        OrderId(TraderId('0'), OrderNumber(8)),
                        Price(100, 'BTC'), Quantity(200, 'MC'), Timeout(100),
                        Timestamp.now())

        self.ask_order = Order(OrderId(TraderId('9'), OrderNumber(11)),
                               Price(100, 'BTC'), Quantity(30, 'MC'),
                               Timeout(100), Timestamp.now(), True)
        self.ask_order2 = Order(OrderId(TraderId('9'), OrderNumber(12)),
                                Price(10, 'BTC'), Quantity(60, 'MC'),
                                Timeout(100), Timestamp.now(), True)

        self.bid_order = Order(OrderId(TraderId('9'), OrderNumber(13)),
                               Price(100, 'BTC'), Quantity(30, 'MC'),
                               Timeout(100), Timestamp.now(), False)
        self.bid_order2 = Order(OrderId(TraderId('9'), OrderNumber(14)),
                                Price(100, 'BTC'), Quantity(60, 'MC'),
                                Timeout(100), Timestamp.now(), False)
        self.order_book = OrderBook(MemoryMessageRepository('0'))
        self.price_time_strategy = PriceTimeStrategy(self.order_book)

    @blocking_call_on_reactor_thread
    @inlineCallbacks
    def tearDown(self, annotate=True):
        self.order_book.cancel_all_pending_tasks()
        yield super(PriceTimeStrategyTestSuite,
                    self).tearDown(annotate=annotate)

    def test_empty_match_order(self):
        # Test for match order with an empty order book
        self.assertEquals([],
                          self.price_time_strategy.match_order(self.bid_order))
        self.assertEquals([],
                          self.price_time_strategy.match_order(self.ask_order))

    def test_match_order_other_price(self):
        """
        Test whether two ticks with different price types are not matched
        """
        self.order_book.insert_ask(self.ask5)
        self.assertEqual([],
                         self.price_time_strategy.match_order(self.bid_order))

    def test_match_order_other_quantity(self):
        """
        Test whether two ticks with different quantity types are not matched
        """
        self.order_book.insert_ask(self.ask6)
        self.assertEqual([],
                         self.price_time_strategy.match_order(self.bid_order))

    def test_match_order_ask(self):
        # Test for match order
        self.order_book.insert_bid(self.bid)
        proposed_trades = self.price_time_strategy.match_order(self.ask_order)
        self.assertEquals(1, len(proposed_trades))
        self.assertEquals(Price(100, 'BTC'), proposed_trades[0].price)
        self.assertEquals(Quantity(30, 'MC'), proposed_trades[0].quantity)

    def test_match_order_bid(self):
        # Test for match order
        self.order_book.insert_ask(self.ask)
        proposed_trades = self.price_time_strategy.match_order(self.bid_order)
        self.assertEquals(1, len(proposed_trades))
        self.assertEquals(Price(100, 'BTC'), proposed_trades[0].price)
        self.assertEquals(Quantity(30, 'MC'), proposed_trades[0].quantity)

    def test_match_order_divided(self):
        # Test for match order divided over two ticks
        self.order_book.insert_ask(self.ask)
        self.order_book.insert_ask(self.ask2)
        proposed_trades = self.price_time_strategy.match_order(self.bid_order2)
        self.assertEquals(2, len(proposed_trades))
        self.assertEquals(Price(100, 'BTC'), proposed_trades[0].price)
        self.assertEquals(Quantity(30, 'MC'), proposed_trades[0].quantity)
        self.assertEquals(Price(100, 'BTC'), proposed_trades[1].price)
        self.assertEquals(Quantity(30, 'MC'), proposed_trades[1].quantity)

    def test_match_order_partial_ask(self):
        """
        Test partial matching of a bid order with the matching engine
        """
        self.ask._quantity = Quantity(20, 'MC')
        self.order_book.insert_ask(self.ask)
        proposed_trades = self.price_time_strategy.match_order(self.bid_order2)
        self.assertEquals(1, len(proposed_trades))

    def test_match_order_partial_bid(self):
        """
        Test partial matching of an ask order with the matching engine
        """
        self.bid._quantity = Quantity(20, 'MC')
        self.order_book.insert_bid(self.bid)
        proposed_trades = self.price_time_strategy.match_order(self.ask_order2)
        self.assertEquals(1, len(proposed_trades))

    def test_match_order_different_price_level(self):
        # Test for match order given an ask order and bid in different price levels
        self.order_book.insert_bid(self.bid2)
        proposed_trades = self.price_time_strategy.match_order(self.ask_order)
        self.assertEquals(1, len(proposed_trades))
        self.assertEquals(Price(200, 'BTC'), proposed_trades[0].price)
        self.assertEquals(Quantity(30, 'MC'), proposed_trades[0].quantity)

    def test_search_for_quantity_in_order_book_partial_ask_low(self):
        # Test for protected search for quantity in order book partial ask when price is too low
        self.order_book.insert_bid(self.bid)
        self.order_book.insert_bid(self.bid2)
        self.order_book.insert_bid(self.bid3)
        self.order_book.insert_bid(self.bid4)
        quantity_to_trade, proposed_trades = self.price_time_strategy._search_for_quantity_in_order_book_partial_ask(
            Price(100, 'BTC'), Quantity(30, 'MC'), [], self.ask_order2)
        self.assertEquals(1, len(proposed_trades))
        self.assertEquals(Quantity(0, 'MC'), quantity_to_trade)

    def test_search_for_quantity_in_order_book_partial_ask(self):
        # Test for protected search for quantity in order book partial ask
        self.order_book.insert_bid(self.bid)
        self.order_book.insert_bid(self.bid2)
        self.order_book.insert_bid(self.bid3)
        self.order_book.insert_bid(self.bid4)
        quantity_to_trade, proposed_trades = self.price_time_strategy._search_for_quantity_in_order_book_partial_ask(
            Price(100, 'BTC'), Quantity(30, 'MC'), [], self.ask_order)
        self.assertEquals(0, len(proposed_trades))
        self.assertEquals(Quantity(30, 'MC'), quantity_to_trade)

    def test_search_for_quantity_in_order_book_partial_bid_high(self):
        # Test for protected search for quantity in order book partial bid when price is too high
        self.order_book.insert_ask(self.ask)
        self.order_book.insert_ask(self.ask2)
        self.order_book.insert_ask(self.ask3)
        self.order_book.insert_ask(self.ask4)
        quantity_to_trade, proposed_trades = self.price_time_strategy._search_for_quantity_in_order_book_partial_bid(
            Price(100, 'BTC'), Quantity(30, 'MC'), [], self.bid_order)
        self.assertEquals(0, len(proposed_trades))
        self.assertEquals(Quantity(30, 'MC'), quantity_to_trade)

    def test_search_for_quantity_in_order_book_partial_bid(self):
        # Test for protected search for quantity in order book partial bid
        self.order_book.insert_ask(self.ask)
        self.order_book.insert_ask(self.ask2)
        self.order_book.insert_ask(self.ask3)
        self.order_book.insert_ask(self.ask4)
        quantity_to_trade, proposed_trades = self.price_time_strategy._search_for_quantity_in_order_book_partial_bid(
            Price(50, 'BTC'), Quantity(30, 'MC'), [], self.bid_order)
        self.assertEquals(1, len(proposed_trades))
        self.assertEquals(Quantity(0, 'MC'), quantity_to_trade)

    def test_search_for_quantity_in_price_level(self):
        """
        Test searching within a price level
        """
        self.bid_order._order_id = self.ask.order_id
        self.order_book.insert_ask(self.ask)
        self.order_book.insert_ask(self.ask2)
        _, trades = self.price_time_strategy._search_for_quantity_in_price_level(
            None, Quantity(10, 'MC'), self.bid_order)
        self.assertFalse(trades)

        _, trades = self.price_time_strategy._search_for_quantity_in_price_level(
            self.order_book.get_tick(self.bid_order.order_id),
            Quantity(10, 'MC'), self.bid_order)
        self.assertFalse(trades)

        self.bid_order2.reserve_quantity_for_tick(self.ask2.order_id,
                                                  Quantity(60, 'MC'))
        _, trades = self.price_time_strategy._search_for_quantity_in_price_level(
            self.order_book.get_tick(self.ask2.order_id), Quantity(10, 'MC'),
            self.bid_order2)
        self.assertFalse(trades)
Exemple #9
0
class OrderTestSuite(unittest.TestCase):
    """Order test cases."""
    def setUp(self):
        # Object creation
        self.transaction_id = TransactionId(TraderId("0"),
                                            TransactionNumber(1))
        self.transaction = Transaction(self.transaction_id, Price(100, 'BTC'),
                                       Quantity(30, 'MC'),
                                       OrderId(TraderId('0'), OrderNumber(2)),
                                       OrderId(TraderId('1'), OrderNumber(1)),
                                       Timestamp(0.0))
        self.proposed_trade = Trade.propose(
            MessageId(TraderId('0'), MessageNumber('1')),
            OrderId(TraderId('0'), OrderNumber(2)),
            OrderId(TraderId('1'), OrderNumber(3)), Price(100, 'BTC'),
            Quantity(30, 'MC'), Timestamp(0.0))

        self.tick = Tick(
            MessageId(TraderId('0'), MessageNumber('message_number')),
            OrderId(TraderId('0'), OrderNumber(1)), Price(100, 'BTC'),
            Quantity(5, 'MC'), Timeout(0.0), Timestamp(float("inf")), True)
        self.tick2 = Tick(
            MessageId(TraderId('0'), MessageNumber('message_number')),
            OrderId(TraderId('0'), OrderNumber(2)), Price(100, 'BTC'),
            Quantity(100, 'MC'), Timeout(0.0), Timestamp(float("inf")), True)
        self.order = Order(OrderId(TraderId("0"), OrderNumber(3)),
                           Price(100, 'BTC'), Quantity(30, 'MC'),
                           Timeout(5000), Timestamp(time.time()), False)
        self.order2 = Order(OrderId(TraderId("0"), OrderNumber(4)),
                            Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(5),
                            Timestamp(time.time() - 1000), True)

    def test_add_trade(self):
        """
        Test the add trade method of an order
        """
        self.order.reserve_quantity_for_tick(
            OrderId(TraderId('5'), OrderNumber(1)), Quantity(10, 'MC'))
        self.assertEquals(self.order.traded_quantity, Quantity(0, 'MC'))
        self.order.add_trade(OrderId(TraderId('5'), OrderNumber(1)),
                             Quantity(10, 'MC'))
        self.assertEquals(self.order.traded_quantity, Quantity(10, 'MC'))

    def test_is_ask(self):
        # Test for is ask
        self.assertTrue(self.order2.is_ask())
        self.assertFalse(self.order.is_ask())

    def test_reserve_quantity_insufficient(self):
        # Test for reserve insufficient quantity
        self.assertRaises(ValueError, self.order.reserve_quantity_for_tick,
                          self.tick2.order_id, self.tick2.quantity)

    def test_reserve_quantity(self):
        # Test for reserve quantity
        self.assertEquals(Quantity(0, 'MC'), self.order.reserved_quantity)
        self.order.reserve_quantity_for_tick(self.tick.order_id,
                                             self.tick.quantity)
        self.assertEquals(Quantity(5, 'MC'), self.order.reserved_quantity)
        self.order.reserve_quantity_for_tick(self.tick.order_id,
                                             self.tick.quantity)
        self.assertEquals(Quantity(10, 'MC'), self.order.reserved_quantity)

    def test_release_quantity(self):
        # Test for release quantity
        self.order.reserve_quantity_for_tick(self.tick.order_id,
                                             self.tick.quantity)
        self.assertEquals(Quantity(5, 'MC'), self.order.reserved_quantity)
        self.order.release_quantity_for_tick(self.tick.order_id,
                                             Quantity(5, 'MC'))
        self.assertEquals(Quantity(0, 'MC'), self.order.reserved_quantity)

        self.order.reserve_quantity_for_tick(self.tick.order_id,
                                             self.tick.quantity)
        quantity = self.tick.quantity + Quantity(1,
                                                 self.tick.quantity.wallet_id)
        self.assertRaises(ValueError, self.order.release_quantity_for_tick,
                          self.tick.order_id, quantity)

    def test_release_unreserved_quantity(self):
        # Test for release unreserved quantity
        with self.assertRaises(TickWasNotReserved):
            self.order.release_quantity_for_tick(self.tick.order_id,
                                                 Quantity(5, 'MC'))

    def test_is_valid(self):
        self.assertTrue(self.order.is_valid())
        self.assertFalse(self.order2.is_valid())

    def test_status(self):
        """
        Test the status of an order
        """
        self.assertEqual(self.order.status, "open")
        self.order._timeout = Timeout(0)
        self.assertEqual(self.order.status, "expired")
        self.order._traded_quantity = self.order.total_quantity
        self.assertEqual(self.order.status, "completed")
        self.order._cancelled = True
        self.assertEqual(self.order.status, "cancelled")
Exemple #10
0
class OrderTestSuite(unittest.TestCase):
    """Order test cases."""

    def setUp(self):
        # Object creation
        self.transaction_id = TransactionId(TraderId("0"), TransactionNumber(1))
        self.transaction = Transaction(self.transaction_id, Price(100, 'BTC'), Quantity(30, 'MC'),
                                       OrderId(TraderId('0'), OrderNumber(2)),
                                       OrderId(TraderId('1'), OrderNumber(1)), Timestamp(0.0))
        self.proposed_trade = Trade.propose(MessageId(TraderId('0'), MessageNumber(1)),
                                            OrderId(TraderId('0'), OrderNumber(2)),
                                            OrderId(TraderId('1'), OrderNumber(3)),
                                            Price(100, 'BTC'), Quantity(30, 'MC'), Timestamp(0.0))

        self.tick = Tick(OrderId(TraderId('0'), OrderNumber(1)), Price(100, 'BTC'), Quantity(5, 'MC'),
                         Timeout(0.0), Timestamp(float("inf")), True)
        self.tick2 = Tick(OrderId(TraderId('0'), OrderNumber(2)), Price(100, 'BTC'), Quantity(100, 'MC'),
                          Timeout(0.0), Timestamp(float("inf")), True)

        self.order_timestamp = Timestamp.now()
        self.order = Order(OrderId(TraderId("0"), OrderNumber(3)), Price(100, 'BTC'), Quantity(30, 'MC'),
                           Timeout(5000), self.order_timestamp, False)
        self.order.set_verified()
        self.order2 = Order(OrderId(TraderId("0"), OrderNumber(4)), Price(100, 'BTC'), Quantity(30, 'MC'),
                            Timeout(5), Timestamp(time.time() - 1000), True)
        self.order2.set_verified()

    def test_add_trade(self):
        """
        Test the add trade method of an order
        """
        self.order.reserve_quantity_for_tick(OrderId(TraderId('5'), OrderNumber(1)), Quantity(10, 'MC'))
        self.assertEquals(self.order.traded_quantity, Quantity(0, 'MC'))
        self.order.add_trade(OrderId(TraderId('5'), OrderNumber(1)), Quantity(10, 'MC'))
        self.assertEquals(self.order.traded_quantity, Quantity(10, 'MC'))

        self.order.reserve_quantity_for_tick(OrderId(TraderId('6'), OrderNumber(1)), Quantity(20, 'MC'))
        self.order.add_trade(OrderId(TraderId('6'), OrderNumber(1)), Quantity(20, 'MC'))
        self.assertTrue(self.order.is_complete())
        self.assertFalse(self.order.cancelled)

    def test_is_ask(self):
        # Test for is ask
        self.assertTrue(self.order2.is_ask())
        self.assertFalse(self.order.is_ask())

    def test_reserve_quantity_insufficient(self):
        # Test for reserve insufficient quantity
        self.assertRaises(ValueError, self.order.reserve_quantity_for_tick, self.tick2.order_id, self.tick2.quantity)

    def test_reserve_quantity(self):
        # Test for reserve quantity
        self.assertEquals(Quantity(0, 'MC'), self.order.reserved_quantity)
        self.order.reserve_quantity_for_tick(self.tick.order_id, self.tick.quantity)
        self.assertEquals(Quantity(5, 'MC'), self.order.reserved_quantity)
        self.order.reserve_quantity_for_tick(self.tick.order_id, self.tick.quantity)
        self.assertEquals(Quantity(10, 'MC'), self.order.reserved_quantity)

    def test_release_quantity(self):
        # Test for release quantity
        self.order.reserve_quantity_for_tick(self.tick.order_id, self.tick.quantity)
        self.assertEquals(Quantity(5, 'MC'), self.order.reserved_quantity)
        self.order.release_quantity_for_tick(self.tick.order_id, Quantity(5, 'MC'))
        self.assertEquals(Quantity(0, 'MC'), self.order.reserved_quantity)

        self.order.reserve_quantity_for_tick(self.tick.order_id, self.tick.quantity)
        quantity = self.tick.quantity + Quantity(1, self.tick.quantity.wallet_id)
        self.assertRaises(ValueError, self.order.release_quantity_for_tick, self.tick.order_id, quantity)

    def test_release_unreserved_quantity(self):
        # Test for release unreserved quantity
        with self.assertRaises(TickWasNotReserved):
            self.order.release_quantity_for_tick(self.tick.order_id, Quantity(5, 'MC'))

    def test_is_valid(self):
        self.assertTrue(self.order.is_valid())
        self.assertFalse(self.order2.is_valid())

    def test_status(self):
        """
        Test the status of an order
        """
        self.order._verified = False
        self.assertEqual(self.order.status, "unverified")
        self.order.set_verified()
        self.assertEqual(self.order.status, "open")
        self.order._timeout = Timeout(0)
        self.assertEqual(self.order.status, "expired")
        self.order._traded_quantity = self.order.total_quantity
        self.assertEqual(self.order.status, "completed")
        self.order._cancelled = True
        self.assertEqual(self.order.status, "cancelled")

    def test_to_dict(self):
        """
        Test the conversion of an order to a dictionary
        """
        self.assertEqual(self.order.to_dictionary(), {
            "trader_id": "0",
            "cancelled": False,
            "completed_timestamp": None,
            "is_ask": False,
            "order_number": 3,
            "price": 100.0,
            "price_type": "BTC",
            "quantity": 30.0,
            "quantity_type": "MC",
            "reserved_quantity": 0.0,
            "traded_quantity": 0.0,
            "status": "open",
            "timeout": 5000.0,
            "timestamp": float(self.order_timestamp)
        })