add more xmpp tests
- test xmpp server - test starttls upgrade
This commit is contained in:
parent
105f0ad632
commit
2a4c369d58
3 changed files with 107 additions and 6 deletions
|
|
@ -14,6 +14,7 @@ class XMPPServer:
|
||||||
server_id = "ecouser.net"
|
server_id = "ecouser.net"
|
||||||
clients = []
|
clients = []
|
||||||
exit_flag = False
|
exit_flag = False
|
||||||
|
server = None
|
||||||
|
|
||||||
def __init__(self, address):
|
def __init__(self, address):
|
||||||
# Initialize bot server
|
# Initialize bot server
|
||||||
|
|
@ -27,12 +28,11 @@ class XMPPServer:
|
||||||
|
|
||||||
loop = asyncio.get_running_loop()
|
loop = asyncio.get_running_loop()
|
||||||
|
|
||||||
server = await loop.create_server(
|
self.server = await loop.create_server(
|
||||||
self.xmpp_protocol, host=self.address[0], port=self.address[1]
|
self.xmpp_protocol, host=self.address[0], port=self.address[1]
|
||||||
)
|
)
|
||||||
|
|
||||||
async with server:
|
self.server_coro = loop.create_task(self.server.serve_forever())
|
||||||
await server.serve_forever()
|
|
||||||
|
|
||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
try:
|
try:
|
||||||
|
|
@ -42,6 +42,7 @@ class XMPPServer:
|
||||||
|
|
||||||
self.exit_flag = True
|
self.exit_flag = True
|
||||||
xmppserverlog.debug("shutting down")
|
xmppserverlog.debug("shutting down")
|
||||||
|
self.server_coro.cancel()
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
xmppserverlog.error("{}".format(e))
|
xmppserverlog.error("{}".format(e))
|
||||||
|
|
|
||||||
|
|
@ -366,7 +366,6 @@ async def test_mqttserver():
|
||||||
) # Check fake_bot is connected
|
) # Check fake_bot is connected
|
||||||
await fake_bot.Client.disconnect()
|
await fake_bot.Client.disconnect()
|
||||||
|
|
||||||
await mqtt_helperbot.Client.reconnect() # This forces the above disconnect
|
await asyncio.sleep(0.1)
|
||||||
|
|
||||||
|
|
||||||
await mqtt_server.broker.shutdown()
|
await mqtt_server.broker.shutdown()
|
||||||
|
|
@ -7,6 +7,9 @@ import json
|
||||||
import tinydb
|
import tinydb
|
||||||
import pytest_asyncio
|
import pytest_asyncio
|
||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
|
import socket
|
||||||
|
from testfixtures import LogCapture
|
||||||
|
import ssl
|
||||||
|
|
||||||
|
|
||||||
def return_send_data(data, *args, **kwargs):
|
def return_send_data(data, *args, **kwargs):
|
||||||
|
|
@ -14,7 +17,45 @@ def return_send_data(data, *args, **kwargs):
|
||||||
|
|
||||||
|
|
||||||
def mock_transport_extra_info(*args, **kwargs):
|
def mock_transport_extra_info(*args, **kwargs):
|
||||||
return ("127.0.0.1", 1234)
|
return ("127.0.0.1", 5223)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_xmpp_server():
|
||||||
|
with LogCapture("xmppserver") as l:
|
||||||
|
xmpp_address = ("127.0.0.1", 5223)
|
||||||
|
xmpp_server = bumper.XMPPServer(xmpp_address)
|
||||||
|
await xmpp_server.start_async_server()
|
||||||
|
|
||||||
|
reader, writer = await asyncio.open_connection("127.0.0.1", 5223)
|
||||||
|
|
||||||
|
writer.write(b"<stream:stream />") # Start stream
|
||||||
|
await writer.drain()
|
||||||
|
|
||||||
|
await asyncio.sleep(0.1)
|
||||||
|
|
||||||
|
assert len(xmpp_server.clients) == 1 # Client count increased
|
||||||
|
assert (
|
||||||
|
xmpp_server.clients[0].address[1]
|
||||||
|
== writer.transport.get_extra_info("sockname")[1]
|
||||||
|
)
|
||||||
|
|
||||||
|
writer.close() # Close connection
|
||||||
|
await writer.wait_closed()
|
||||||
|
|
||||||
|
await asyncio.sleep(0.1)
|
||||||
|
|
||||||
|
assert len(xmpp_server.clients) == 0 # Client count decreased
|
||||||
|
|
||||||
|
reader, writer = await asyncio.open_connection("127.0.0.1", 5223)
|
||||||
|
|
||||||
|
writer.write(b"<stream:stream />") # Start stream
|
||||||
|
await writer.drain()
|
||||||
|
|
||||||
|
await asyncio.sleep(0.1)
|
||||||
|
xmpp_server.disconnect()
|
||||||
|
await asyncio.sleep(0.1)
|
||||||
|
assert len(xmpp_server.clients) == 0 # Client count decreased
|
||||||
|
print(l)
|
||||||
|
|
||||||
|
|
||||||
async def test_client_connect_no_starttls(*args, **kwargs):
|
async def test_client_connect_no_starttls(*args, **kwargs):
|
||||||
|
|
@ -167,6 +208,66 @@ async def test_client_connect_starttls_called(*args, **kwargs):
|
||||||
assert xmppclient.state == xmppclient.INIT # Client moved to INIT state
|
assert xmppclient.state == xmppclient.INIT # Client moved to INIT state
|
||||||
|
|
||||||
|
|
||||||
|
async def test_xmpp_server_client_tls():
|
||||||
|
with LogCapture("xmppserver") as l:
|
||||||
|
|
||||||
|
async def do_stuff_after_start_tls(
|
||||||
|
ssl_reader, ssl_writer
|
||||||
|
): # Used after starttls
|
||||||
|
|
||||||
|
writer.write(
|
||||||
|
b"<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' to='ecouser.net'>"
|
||||||
|
) # New Stream
|
||||||
|
|
||||||
|
await writer.drain()
|
||||||
|
|
||||||
|
await asyncio.sleep(0.1)
|
||||||
|
|
||||||
|
writer.write(
|
||||||
|
b'<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="PLAIN">AGZ1aWRfdG1wdXNlcgAwL0lPU0Y1M0QwN0JBL3VzXzg5ODgwMmZkYmM0NDQxYjBiYzgxNWIxZDFjNjgzMDJl</auth>'
|
||||||
|
) # Send Auth
|
||||||
|
|
||||||
|
await writer.drain()
|
||||||
|
|
||||||
|
await asyncio.sleep(0.1)
|
||||||
|
|
||||||
|
xmpp_address = ("127.0.0.1", 5223)
|
||||||
|
xmpp_server = bumper.XMPPServer(xmpp_address)
|
||||||
|
await xmpp_server.start_async_server()
|
||||||
|
|
||||||
|
reader, writer = await asyncio.open_connection("127.0.0.1", 5223)
|
||||||
|
|
||||||
|
writer.write(
|
||||||
|
b"<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' to='ecouser.net'>"
|
||||||
|
) # Start stream
|
||||||
|
await writer.drain()
|
||||||
|
|
||||||
|
await asyncio.sleep(0.1)
|
||||||
|
|
||||||
|
writer.write(
|
||||||
|
b"<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
|
||||||
|
) # Send StartTLS
|
||||||
|
await writer.drain()
|
||||||
|
|
||||||
|
await asyncio.sleep(0.1)
|
||||||
|
|
||||||
|
# Below will upgrade connection to TLS then callback to "do_stuff_after_start_tls"
|
||||||
|
ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
|
||||||
|
ssl_context.check_hostname = False
|
||||||
|
ssl_context.load_verify_locations(cafile=bumper.ca_cert)
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
transport = writer.transport
|
||||||
|
protocol = writer.transport.get_protocol()
|
||||||
|
new_transport = await loop.start_tls(
|
||||||
|
transport, protocol, ssl_context, server_side=False
|
||||||
|
)
|
||||||
|
protocol._stream_reader = asyncio.StreamReader(loop=loop)
|
||||||
|
protocol._client_connected_cb = do_stuff_after_start_tls
|
||||||
|
protocol.connection_made(new_transport)
|
||||||
|
|
||||||
|
print(l)
|
||||||
|
|
||||||
|
|
||||||
async def test_client_init(*args, **kwargs):
|
async def test_client_init(*args, **kwargs):
|
||||||
test_transport = asyncio.Transport()
|
test_transport = asyncio.Transport()
|
||||||
test_transport.get_extra_info = mock.Mock(return_value=mock_transport_extra_info())
|
test_transport.get_extra_info = mock.Mock(return_value=mock_transport_extra_info())
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue