__init__.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. import json
  2. import random
  3. import re
  4. import sys
  5. from datetime import datetime
  6. from time import perf_counter
  7. from typing import Dict, Callable
  8. from uuid import uuid4
  9. import requests
  10. import connection
  11. import test.do_some_requests.current_websocket
  12. from test import failed_requests
  13. from util import round_to_n
  14. DEFAULT_PW = 'pw'
  15. PORT = connection.PORT
  16. HOST = 'http://127.0.0.1' + ':' + str(PORT)
  17. # HOST = 'http://koljastrohm-games.com' + ':' + str(PORT)
  18. JSON_HEADERS = {'Content-type': 'application/json'}
  19. EXIT_ON_FAILED_REQUEST = True
  20. response_collection: Dict[str, Dict] = {}
  21. default_request_method: Callable[[str, Dict], Dict]
  22. def receive_answer(token):
  23. """Waits until the server sends an answer that contains the desired request_token.
  24. All intermediate requests are also collected for later use, or, if they contain no token, they are just printed out.
  25. """
  26. if token in response_collection:
  27. json_content = response_collection[token]
  28. del response_collection[token]
  29. return json_content
  30. json_content = {}
  31. while 'request_token' not in json_content or json_content['request_token'] != token:
  32. if 'request_token' in json_content:
  33. response_collection[json_content['request_token']] = json_content
  34. received = test.do_some_requests.current_websocket.current_websocket.recv_data_frame()[1].data
  35. content = received.decode('utf-8')
  36. formatted_content = re.sub(r'{([^}]*?):(.*?)}', r'\n{\g<1>:\g<2>}', content)
  37. print('Received through websocket: ' + formatted_content)
  38. json_content = json.loads(content)
  39. return json_content
  40. def websocket_request(route: str, data: Dict) -> Dict:
  41. original_data = data
  42. if not test.do_some_requests.current_websocket.current_websocket.connected:
  43. ws_host = HOST.replace('http://', 'ws://')
  44. test.do_some_requests.current_websocket.current_websocket.connect(ws_host + '/websocket')
  45. token = str(uuid4())
  46. data = json.dumps({'route': route, 'body': data, 'request_token': token})
  47. print('Sending to websocket:', str(data).replace('{', '\n{')[1:])
  48. test.do_some_requests.current_websocket.current_websocket.send(data, opcode=2)
  49. json_content = receive_answer(token)
  50. print()
  51. status_code = json_content['http_status_code']
  52. if status_code == 200:
  53. pass
  54. elif status_code == 451: # Copyright problems, likely a bug in the upload filter
  55. # Try again
  56. return websocket_request(route, original_data)
  57. else:
  58. if EXIT_ON_FAILED_REQUEST:
  59. if not test.do_some_requests.current_websocket.current_websocket.connected:
  60. test.do_some_requests.current_websocket.current_websocket.close()
  61. sys.exit(status_code)
  62. failed_requests.append((route, status_code))
  63. return json_content['body']
  64. def http_request(route: str, data: Dict) -> Dict:
  65. original_data = data
  66. data = json.dumps(data)
  67. print('Sending to /' + route + ':', str(data).replace('{', '\n{')[1:])
  68. r = requests.post(HOST + '/json/' + route, data=data,
  69. headers=JSON_HEADERS)
  70. content = r.content.decode()
  71. print('Request returned: ' + content.replace('{', '\n{'))
  72. print()
  73. if r.status_code == 200:
  74. pass
  75. elif r.status_code == 451:
  76. return http_request(route, original_data)
  77. else:
  78. if EXIT_ON_FAILED_REQUEST:
  79. sys.exit(r.status_code)
  80. failed_requests.append((route, r.status_code))
  81. return json.loads(content)
  82. default_request_method: Callable[[str, Dict], Dict] = http_request
  83. # default_request_method = websocket_request
  84. def random_time():
  85. start = random.randrange(140)
  86. start = 1561960800 + start * 21600 # somewhere in july or at the beginning of august 2019
  87. return {
  88. 'dt_start': start,
  89. 'dt_end': start + random.choice([1800, 3600, 7200, 86400]),
  90. }
  91. def run_tests():
  92. print('You are currently in debug mode.')
  93. print('Host:', str(HOST))
  94. usernames = [f'user{datetime.now().timestamp()}',
  95. f'user{datetime.now().timestamp()}+1']
  96. session_ids = {}
  97. message = {}
  98. route = 'news'
  99. default_request_method(route, message)
  100. message = {}
  101. route = 'leaderboard'
  102. default_request_method(route, message)
  103. message = {}
  104. route = 'tradables'
  105. default_request_method(route, message)
  106. for username in usernames:
  107. message = {'username': username, 'password': DEFAULT_PW}
  108. route = 'register'
  109. default_request_method(route, message)
  110. message = {'username': username, 'password': DEFAULT_PW}
  111. route = 'login'
  112. session_ids[username] = default_request_method(route, message)['session_id']
  113. message = {'session_id': session_ids[username]}
  114. route = 'logout'
  115. default_request_method(route, message)
  116. message = {'username': username, 'password': DEFAULT_PW}
  117. route = 'login'
  118. session_ids[username] = default_request_method(route, message)['session_id']
  119. message = {'session_id': session_ids[username]}
  120. route = 'depot'
  121. default_request_method(route, message)
  122. message = {'session_id': session_ids[username]}
  123. route = 'orders'
  124. default_request_method(route, message)
  125. message = {'session_id': session_ids[username], "ownable": "\u20adollar"}
  126. route = 'orders_on'
  127. default_request_method(route, message)
  128. for password in ['pw2', DEFAULT_PW]:
  129. message = {'session_id': session_ids[username], 'password': password}
  130. route = 'change_password'
  131. default_request_method(route, message)
  132. message = {'session_id': session_ids[username]}
  133. route = 'logout'
  134. default_request_method(route, message)
  135. message = {'username': username, 'password': DEFAULT_PW}
  136. route = 'login'
  137. session_ids[username] = default_request_method(route, message)['session_id']
  138. for limit in [0, 5, 10, 20, 50]:
  139. message = {'session_id': session_ids[username], 'limit': limit}
  140. route = 'trades'
  141. data = default_request_method(route, message)['data']
  142. assert len(data) <= limit
  143. for session_id in session_ids:
  144. message = {'session_id': session_id}
  145. route = 'logout'
  146. default_request_method(route, message)
  147. def main():
  148. global default_request_method
  149. for m in [
  150. test.do_some_requests.websocket_request,
  151. # test.do_some_requests.http_request
  152. ]:
  153. # print('Removing existing database (if exists)...', end='')
  154. # try:
  155. # os.remove(DB_NAME + '.db')
  156. # except PermissionError:
  157. # print('Could not recreate database')
  158. # sys.exit(-1)
  159. # except FileNotFoundError:
  160. # pass
  161. # print('done')
  162. default_request_method = m
  163. start = perf_counter()
  164. run_tests()
  165. print()
  166. print('Failed requests:', failed_requests)
  167. print('Total time:' + str(round_to_n(perf_counter() - start, 4)) + 's,')
  168. if test.do_some_requests.current_websocket.current_websocket.connected:
  169. test.do_some_requests.current_websocket.current_websocket.close()
  170. sys.exit(len(failed_requests))
  171. if __name__ == '__main__':
  172. main()