test_server_list.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import base64
  2. import pytest
  3. from cq2_sdk.login.server_list import (
  4. ServerListError,
  5. decode_detailed_server_list,
  6. fetch_server_info,
  7. resolve_server,
  8. )
  9. ENCRYPTED_SERVER_LIST = (
  10. b"NG1lSm5QeWzEk/B+5xXXfjnMHIpGB/PPbL/y7tEPyFCzWvBJq2fmPD5PiYHcKj/FZ"
  11. b"+tehXBa0XEMs9YMS3E1N7HCzgBWTVsHbF5MEs9KDXnW4j1XaHjjnjRVMP2z94vFm"
  12. b"LOtIDVedS9/y8FZfCpM1CigHp3uJMWqZDWQMLiTVL9RZOrKik67VPrH3MBdtPhLRb"
  13. b"t00X1Uyd+JuagpL6xRX4nTFP3VdO9TWOvsw/ZqOK0C54GFugWGMAjsydz5A3A/mf"
  14. b"/x+A=="
  15. )
  16. def test_decode_and_resolve_compact_server_fields():
  17. data = decode_detailed_server_list(ENCRYPTED_SERVER_LIST)
  18. assert data["srvRoot"] == "edge.example"
  19. server = resolve_server(data, 7, channel_id="110585", game_id=206923)
  20. assert server.server_id == 7
  21. assert server.main_server_id == 9
  22. assert server.name == "Seven"
  23. assert server.host == "s9-edge.example"
  24. assert server.port == 8041
  25. assert server.proxy_port == 9000
  26. assert server.channel_id == "110585"
  27. assert server.game_id == 206923
  28. def test_resolve_server_prefers_explicit_ip():
  29. data = decode_detailed_server_list(ENCRYPTED_SERVER_LIST)
  30. server = resolve_server(data, 8, channel_id="c", game_id=1)
  31. assert server.host == "1.2.3.4"
  32. assert server.main_server_id == 8
  33. assert server.proxy_port is None
  34. @pytest.mark.parametrize(
  35. ("payload", "message"),
  36. [
  37. (b"not-base64!", "Base64"),
  38. (base64.b64encode(b"wrong-sign"), "marker"),
  39. (base64.b64encode(b"4meJnPyl" + b"short"), "XXTEA"),
  40. ],
  41. )
  42. def test_decode_rejects_malformed_payload(payload, message):
  43. with pytest.raises(ServerListError, match=message):
  44. decode_detailed_server_list(payload)
  45. def test_resolve_server_rejects_unknown_server_id():
  46. data = decode_detailed_server_list(ENCRYPTED_SERVER_LIST)
  47. with pytest.raises(ServerListError, match="server 999"):
  48. resolve_server(data, 999, channel_id="110585", game_id=206923)
  49. @pytest.mark.asyncio
  50. async def test_fetch_server_info_uses_channel_specific_endpoint():
  51. seen = []
  52. class Response:
  53. content = ENCRYPTED_SERVER_LIST
  54. def raise_for_status(self):
  55. return None
  56. class Client:
  57. async def get(self, url):
  58. seen.append(url)
  59. return Response()
  60. server = await fetch_server_info(
  61. 7,
  62. channel_id="110585",
  63. game_id=206923,
  64. client=Client(),
  65. )
  66. assert seen == [
  67. "https://list-box.dhsf.xqhuyu.com/serverlist/110585/serverlist.txt"
  68. ]
  69. assert server.host == "s9-edge.example"