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 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 setUp(self, annotate=True): yield super(MatchingEngineTestSuite, self).setUp(annotate=annotate) # Object creation self.ask = Ask( OrderId(TraderId('2'), OrderNumber(1)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(30), Timestamp.now()) self.bid = Bid( OrderId(TraderId('4'), OrderNumber(2)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(30), Timestamp.now()) self.ask_order = Order( OrderId(TraderId('5'), OrderNumber(3)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(30), Timestamp.now(), True) self.bid_order = Order( OrderId(TraderId('6'), OrderNumber(4)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(30), Timestamp.now(), False) self.order_book = OrderBook() self.matching_engine = MatchingEngine( PriceTimeStrategy(self.order_book)) self.ask_count = 2 self.bid_count = 2
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)
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 setUp(self): yield super(PriceTimeStrategyTestSuite, self).setUp() # Object creation self.ask = Ask(OrderId(TraderId(b'0'), OrderNumber(1)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now()) self.ask2 = Ask(OrderId(TraderId(b'1'), OrderNumber(2)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now()) self.ask3 = Ask(OrderId(TraderId(b'0'), OrderNumber(3)), AssetPair(AssetAmount(40000, 'BTC'), AssetAmount(200, 'MB')), Timeout(100), Timestamp.now()) self.ask4 = Ask(OrderId(TraderId(b'1'), OrderNumber(4)), AssetPair(AssetAmount(3000, 'A'), AssetAmount(3000, 'MB')), Timeout(100), Timestamp.now()) self.ask5 = Ask(OrderId(TraderId(b'1'), OrderNumber(4)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'C')), Timeout(100), Timestamp.now()) self.bid = Bid(OrderId(TraderId(b'0'), OrderNumber(5)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now()) self.bid2 = Bid(OrderId(TraderId(b'0'), OrderNumber(6)), AssetPair(AssetAmount(6000, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now()) self.ask_order = Order(OrderId(TraderId(b'9'), OrderNumber(11)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now(), True) self.ask_order2 = Order(OrderId(TraderId(b'9'), OrderNumber(12)), AssetPair(AssetAmount(600, 'BTC'), AssetAmount(60, 'MB')), Timeout(100), Timestamp.now(), True) self.bid_order = Order(OrderId(TraderId(b'9'), OrderNumber(13)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now(), False) self.bid_order2 = Order(OrderId(TraderId(b'9'), OrderNumber(14)), AssetPair(AssetAmount(6000, 'BTC'), AssetAmount(60, 'MB')), Timeout(100), Timestamp.now(), False) self.order_book = OrderBook() self.price_time_strategy = PriceTimeStrategy(self.order_book)
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()) 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.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)
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 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 setUp(self): # Object creation self.memory_order_repository = MemoryOrderRepository("0") self.order_id = OrderId(TraderId(b"0"), OrderNumber(1)) self.order = Order(self.order_id, AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MC')), Timeout(0), Timestamp(10.0), False) self.order2 = Order(self.order_id, AssetPair(AssetAmount(1000, 'BTC'), AssetAmount(30, 'MC')), Timeout(0), Timestamp(10.0), False)
def setUp(self): # Object creation self.memory_order_repository = MemoryOrderRepository("0") self.order_id = OrderId(TraderId("0"), OrderNumber(1)) self.order = Order(self.order_id, Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(10.0), False) self.order2 = Order(self.order_id, Price(1000, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(10.0), False)
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 setUp(self): # Object creation self.timestamp_now = Timestamp.now() self.tick = Tick(OrderId(TraderId(b'0'), OrderNumber(1)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')), Timeout(30), Timestamp(0.0), True) self.tick2 = Tick(OrderId(TraderId(b'0'), OrderNumber(2)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')), Timeout(0), Timestamp(0.0), False) self.order_ask = Order(OrderId(TraderId(b'0'), OrderNumber(2)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')), Timeout(0), Timestamp(0.0), True) self.order_bid = Order(OrderId(TraderId(b'0'), OrderNumber(2)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')), Timeout(0), Timestamp(0.0), False)
def get_tx_done_block(ask_amount, bid_amount, traded_amount, ask_total_traded, bid_total_traded): ask_pair = AssetPair(AssetAmount(ask_amount, 'BTC'), AssetAmount(ask_amount, 'MB')) bid_pair = AssetPair(AssetAmount(bid_amount, 'BTC'), AssetAmount(bid_amount, 'MB')) ask = Order(OrderId(TraderId('0' * 40), OrderNumber(1)), ask_pair, Timeout(3600), Timestamp.now(), True) ask._traded_quantity = ask_total_traded bid = Order(OrderId(TraderId('1' * 40), OrderNumber(1)), bid_pair, Timeout(3600), Timestamp.now(), False) bid._traded_quantity = bid_total_traded tx = Transaction( TransactionId(TraderId('0' * 40), TransactionNumber(1)), AssetPair(AssetAmount(traded_amount, 'BTC'), AssetAmount(traded_amount, 'MB')), OrderId(TraderId('0' * 40), OrderNumber(1)), OrderId(TraderId('1' * 40), OrderNumber(1)), Timestamp(0.0)) tx.transferred_assets.first += AssetAmount(traded_amount, 'BTC') tx.transferred_assets.second += AssetAmount(traded_amount, 'MB') tx_done_block = MarketBlock() tx_done_block.type = 'tx_done' tx_done_block.transaction = { 'ask': ask.to_status_dictionary(), 'bid': bid.to_status_dictionary(), 'tx': tx.to_dictionary(), 'version': MarketCommunity.PROTOCOL_VERSION } tx_done_block.transaction['ask']['address'], tx_done_block.transaction[ 'ask']['port'] = "1.1.1.1", 1234 tx_done_block.transaction['bid']['address'], tx_done_block.transaction[ 'bid']['port'] = "1.1.1.1", 1234 return tx_done_block
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())
def setUp(self): # Object creation self.timestamp_now = Timestamp.now() self.tick = Tick(OrderId(TraderId('0'), OrderNumber(1)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(30), self.timestamp_now, True) self.tick2 = Tick(OrderId(TraderId('0'), OrderNumber(2)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(0.0), False) self.order_ask = Order(OrderId(TraderId('0'), OrderNumber(2)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(0.0), True) self.order_bid = Order(OrderId(TraderId('0'), OrderNumber(2)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(0.0), Timestamp(0.0), False)
def get_all_orders(self): """ Return all orders in the database. """ db_result = self.execute(u"SELECT * FROM orders") return [Order.from_database(db_item, self.get_reserved_ticks( OrderId(TraderId(str(db_item[0])), OrderNumber(db_item[1])))) for db_item in db_result]
def get_order(self, order_id): """ Return an order with a specific id. """ try: db_result = self.execute(u"SELECT * FROM orders WHERE trader_id = ? AND order_number = ?", (unicode(order_id.trader_id), unicode(order_id.order_number))).next() except StopIteration: return None return Order.from_database(db_result, self.get_reserved_ticks(order_id))
def get_order(self, order_id): """ Return an order with a specific id. """ try: db_result = next(self.execute(u"SELECT * FROM orders WHERE trader_id = ? AND order_number = ?", (database_blob(order_id.trader_id.to_bytes()), text_type(order_id.order_number)))) except StopIteration: return None return Order.from_database(db_result, self.get_reserved_ticks(order_id))
def get_order(self, order_id): """ Return an order with a specific id. """ db_result = self.execute( u"SELECT * FROM orders WHERE trader_id = ? AND order_number = ?", (unicode(order_id.trader_id), unicode( order_id.order_number))).fetchone() return Order.from_database( db_result, self.get_reserved_ticks(order_id)) if db_result else None
def setUp(self, annotate=True): yield super(MatchingEngineTestSuite, self).setUp(annotate=annotate) # Object creation self.ask = Ask( MessageId(TraderId('1'), MessageNumber('message_number1')), OrderId(TraderId('2'), OrderNumber(1)), Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(30), Timestamp.now()) self.bid = Bid( MessageId(TraderId('3'), MessageNumber('message_number2')), OrderId(TraderId('4'), OrderNumber(2)), Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(30), Timestamp.now()) self.ask_order = Order(OrderId(TraderId('5'), OrderNumber(3)), Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(30), Timestamp.now(), True) self.bid_order = Order(OrderId(TraderId('6'), OrderNumber(4)), Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(30), Timestamp.now(), False) self.order_book = OrderBook(MemoryMessageRepository('0')) self.matching_engine = MatchingEngine( PriceTimeStrategy(self.order_book))
def get_all_orders(self): """ Return all orders in the database. """ db_result = self.execute(u"SELECT * FROM orders") return [ Order.from_database( db_item, self.get_reserved_ticks( OrderId(TraderId(str(db_item[0])), OrderNumber(db_item[1])))) for db_item in db_result ]
def get_order(self, order_id): """ Return an order with a specific id. """ try: db_result = self.execute( u"SELECT * FROM orders WHERE trader_id = ? AND order_number = ?", (unicode(order_id.trader_id), unicode( order_id.order_number))).next() except StopIteration: return None return Order.from_database(db_result, self.get_reserved_ticks(order_id))
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_order(self, order_id): """ Return an order with a specific id. """ try: db_result = next( self.execute( u"SELECT * FROM orders WHERE trader_id = ? AND order_number = ?", (database_blob(order_id.trader_id.to_bytes()), text_type(order_id.order_number)))) except StopIteration: return None return Order.from_database(db_result, self.get_reserved_ticks(order_id))
def create_bid_order(self, assets, timeout): """ Create a bid order (buy order) :param assets: The assets to be exchanged :param timeout: The timeout of the order, when does the order need to be timed out :type assets: AssetPair :type timeout: Timeout :return: The order that is created :rtype: Order """ order = Order(self.order_repository.next_identity(), assets, timeout, Timestamp.now(), False) self.order_repository.add(order) self._logger.info("Bid order created with id: " + str(order.order_id)) return order
def create_bid_order(self, price, quantity, timeout): """ Create a bid order (buy order) :param price: The price for the order :param quantity: The quantity of the order :param timeout: The timeout of the order, when does the order need to be timed out :type price: Price :type quantity: Quantity :type timeout: Timeout :return: The order that is created :rtype: Order """ assert isinstance(price, Price), type(price) assert isinstance(quantity, Quantity), type(quantity) assert isinstance(timeout, Timeout), type(timeout) order = Order(self.order_repository.next_identity(), price, quantity, timeout, Timestamp.now(), False) self.order_repository.add(order) self._logger.info("Bid order created with id: " + str(order.order_id)) return order
def get_tx_done_block(ask_amount, bid_amount, traded_amount, ask_total_traded, bid_total_traded): ask_pair = AssetPair(AssetAmount(ask_amount, 'BTC'), AssetAmount(ask_amount, 'MB')) bid_pair = AssetPair(AssetAmount(bid_amount, 'BTC'), AssetAmount(bid_amount, 'MB')) ask = Order(OrderId(TraderId('0' * 40), OrderNumber(1)), ask_pair, Timeout(3600), Timestamp.now(), True) ask._traded_quantity = ask_total_traded bid = Order(OrderId(TraderId('1' * 40), OrderNumber(1)), bid_pair, Timeout(3600), Timestamp.now(), False) bid._traded_quantity = bid_total_traded tx = Transaction(TransactionId(TraderId('0' * 40), TransactionNumber(1)), AssetPair(AssetAmount(traded_amount, 'BTC'), AssetAmount(traded_amount, 'MB')), OrderId(TraderId('0' * 40), OrderNumber(1)), OrderId(TraderId('1' * 40), OrderNumber(1)), Timestamp(0.0)) tx.transferred_assets.first += AssetAmount(traded_amount, 'BTC') tx.transferred_assets.second += AssetAmount(traded_amount, 'MB') tx_done_block = MarketBlock() tx_done_block.type = 'tx_done' tx_done_block.transaction = { 'ask': ask.to_status_dictionary(), 'bid': bid.to_status_dictionary(), 'tx': tx.to_dictionary(), 'version': MarketCommunity.PROTOCOL_VERSION } tx_done_block.transaction['ask']['address'], tx_done_block.transaction['ask']['port'] = "1.1.1.1", 1234 tx_done_block.transaction['bid']['address'], tx_done_block.transaction['bid']['port'] = "1.1.1.1", 1234 return tx_done_block
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) })
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'))
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")
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)
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 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)
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 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)