|
| 1 | +import unittest |
| 2 | +import _thread |
| 3 | +import time |
| 4 | + |
| 5 | +from mpos import App, PackageManager |
| 6 | +import mpos.apps |
| 7 | + |
| 8 | +from websocket import WebSocketApp |
| 9 | + |
| 10 | +class TestWebsocket(unittest.TestCase): |
| 11 | + |
| 12 | + ws = None |
| 13 | + |
| 14 | + on_open_called = None |
| 15 | + on_message_called = None |
| 16 | + on_ping_called = None |
| 17 | + on_close_called = None |
| 18 | + |
| 19 | + def on_message(self, wsapp, message: str): |
| 20 | + print(f"on_message received: {message}") |
| 21 | + self.on_message_called = True |
| 22 | + |
| 23 | + def on_open(self, wsapp): |
| 24 | + print(f"on_open called: {wsapp}") |
| 25 | + self.on_open_called = True |
| 26 | + self.ws.send('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker_batch"]}') |
| 27 | + |
| 28 | + def on_ping(wsapp, message): |
| 29 | + print("Got a ping!") |
| 30 | + self.on_ping_called = True |
| 31 | + |
| 32 | + def on_close(self, wsapp, close_status_code, close_msg): |
| 33 | + print(f"on_close called: {wsapp}") |
| 34 | + self.on_close_called = True |
| 35 | + |
| 36 | + def websocket_thread(self): |
| 37 | + wsurl = "wss://ws-feed.exchange.coinbase.com" |
| 38 | + |
| 39 | + self.ws = WebSocketApp( |
| 40 | + wsurl, |
| 41 | + on_open=self.on_open, |
| 42 | + on_close=self.on_close, |
| 43 | + on_message=self.on_message, |
| 44 | + on_ping=self.on_ping |
| 45 | + ) # maybe add other callbacks to reconnect when disconnected etc. |
| 46 | + self.ws.run_forever() |
| 47 | + |
| 48 | + def wait_for_ping(self): |
| 49 | + self.on_ping_called = False |
| 50 | + for _ in range(60): |
| 51 | + print("Waiting for on_ping to be called...") |
| 52 | + if self.on_ping_called: |
| 53 | + print("yes, it was called!") |
| 54 | + break |
| 55 | + time.sleep(1) |
| 56 | + self.assertTrue(self.on_ping_called) |
| 57 | + |
| 58 | + def test_it(self): |
| 59 | + on_open_called = False |
| 60 | + _thread.stack_size(mpos.apps.good_stack_size()) |
| 61 | + _thread.start_new_thread(self.websocket_thread, ()) |
| 62 | + |
| 63 | + self.on_open_called = False |
| 64 | + self.on_message_called = False # message might be received very quickly, before we expect it |
| 65 | + for _ in range(5): |
| 66 | + print("Waiting for on_open to be called...") |
| 67 | + if self.on_open_called: |
| 68 | + print("yes, it was called!") |
| 69 | + break |
| 70 | + time.sleep(1) |
| 71 | + self.assertTrue(self.on_open_called) |
| 72 | + |
| 73 | + self.on_message_called = False # message might be received very quickly, before we expect it |
| 74 | + for _ in range(5): |
| 75 | + print("Waiting for on_message to be called...") |
| 76 | + if self.on_message_called: |
| 77 | + print("yes, it was called!") |
| 78 | + break |
| 79 | + time.sleep(1) |
| 80 | + self.assertTrue(self.on_message_called) |
| 81 | + |
| 82 | + # Disabled because not all servers send pings: |
| 83 | + # self.wait_for_ping() |
| 84 | + |
| 85 | + self.on_close_called = False |
| 86 | + self.ws.close() |
| 87 | + for _ in range(5): |
| 88 | + print("Waiting for on_close to be called...") |
| 89 | + if self.on_close_called: |
| 90 | + print("yes, it was called!") |
| 91 | + break |
| 92 | + time.sleep(1) |
| 93 | + self.assertTrue(self.on_close_called) |
0 commit comments