piker/tests/test_feeds.py

100 lines
3.0 KiB
Python
Raw Normal View History

'''
Data feed layer APIs, performance, msg throttling.
'''
from pprint import pprint
import pytest
# import tractor
import trio
from piker import (
open_piker_runtime,
open_feed,
)
from piker.data import ShmArray
@pytest.mark.parametrize(
'fqsns',
[
2022-11-08 21:09:18 +00:00
['btcusdt.binance', 'ethusdt.binance']
],
ids=lambda param: f'fqsns={param}',
)
def test_basic_rt_feed(
fqsns: list[str],
):
'''
Start a real-time data feed for provided fqsn and pull
a few quotes then simply shut down.
'''
async def main():
async with (
2022-11-08 21:09:18 +00:00
open_piker_runtime(
'test_basic_rt_feed',
# XXX tractor BUG: this doesn't translate through to the
# ``tractor._state._runtimevars``...
registry_addr=('127.0.0.1', 6666),
debug_mode=True,
loglevel='runtime',
2022-11-08 21:09:18 +00:00
),
open_feed(
fqsns,
loglevel='info',
# TODO: ensure throttle rate is applied
# limit to at least display's FPS
# avoiding needless Qt-in-guest-mode context switches
# tick_throttle=_quote_throttle_rate,
) as feed
):
2022-11-08 21:09:18 +00:00
# verify shm buffers exist
for fqin in fqsns:
2022-11-08 21:09:18 +00:00
flume = feed.flumes[fqin]
ohlcv: ShmArray = flume.rt_shm
hist_ohlcv: ShmArray = flume.hist_shm
# stream some ticks and ensure we see data from both symbol
# subscriptions.
2022-11-08 21:09:18 +00:00
quote_count: int = 0
stream = feed.streams['binance']
# pull the first couple startup quotes and ensure
# they match the history buffer last entries.
for _ in range(1):
first_quotes = await stream.receive()
for fqsn, quote in first_quotes.items():
assert fqsn in fqsns
flume = feed.flumes[fqsn]
assert quote['last'] == flume.first_quote['last']
2022-11-08 21:09:18 +00:00
async for quotes in stream:
for fqsn, quote in quotes.items():
2022-11-08 21:09:18 +00:00
# await tractor.breakpoint()
flume = feed.flumes[fqsn]
ohlcv: ShmArray = flume.rt_shm
hist_ohlcv: ShmArray = flume.hist_shm
2022-11-08 21:09:18 +00:00
# print quote msg, rt and history
# buffer values on console.
rt_row = ohlcv.array[-1]
hist_row = hist_ohlcv.array[-1]
# last = quote['last']
2022-11-08 21:09:18 +00:00
# assert last == rt_row['close']
# assert last == hist_row['close']
pprint(
f'{fqsn}: {quote}\n'
f'rt_ohlc: {rt_row}\n'
f'hist_ohlc: {hist_row}\n'
)
quote_count += 1
2022-11-08 21:09:18 +00:00
if quote_count >= 100:
break
trio.run(main)