commit
953c580b0e
10 changed files with 49 additions and 157 deletions
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
|
@ -9,7 +9,7 @@ on:
|
||||||
- dev
|
- dev
|
||||||
|
|
||||||
env:
|
env:
|
||||||
DEFAULT_PYTHON: 3.7
|
DEFAULT_PYTHON: 3.9
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
code-quality:
|
code-quality:
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ repos:
|
||||||
rev: v2.31.0
|
rev: v2.31.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: pyupgrade
|
- id: pyupgrade
|
||||||
args: [--py37-plus]
|
args: [--py39-plus]
|
||||||
- repo: https://github.com/psf/black
|
- repo: https://github.com/psf/black
|
||||||
rev: 21.12b0
|
rev: 22.1.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: black
|
- id: black
|
||||||
args:
|
args:
|
||||||
|
|
@ -38,7 +38,7 @@ repos:
|
||||||
<<: &python-files
|
<<: &python-files
|
||||||
files: ^(bumper/.+)?[^/]+\.py$
|
files: ^(bumper/.+)?[^/]+\.py$
|
||||||
- repo: https://github.com/PyCQA/bandit
|
- repo: https://github.com/PyCQA/bandit
|
||||||
rev: 1.7.1
|
rev: 1.7.2
|
||||||
hooks:
|
hooks:
|
||||||
- id: bandit
|
- id: bandit
|
||||||
args:
|
args:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
ARG ARCH=amd64
|
ARG ARCH=amd64
|
||||||
|
|
||||||
FROM $ARCH/python:3.7-alpine
|
FROM $ARCH/python:3.9-alpine
|
||||||
|
|
||||||
EXPOSE 443
|
EXPOSE 443
|
||||||
EXPOSE 5223
|
EXPOSE 5223
|
||||||
|
|
|
||||||
|
|
@ -159,17 +159,9 @@ class ConfServer:
|
||||||
)
|
)
|
||||||
|
|
||||||
await self.site.start()
|
await self.site.start()
|
||||||
|
|
||||||
except PermissionError as e:
|
|
||||||
confserverlog.error(e.strerror)
|
|
||||||
asyncio.create_task(bumper.shutdown())
|
|
||||||
|
|
||||||
except asyncio.CancelledError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
confserverlog.exception(f"{e}")
|
confserverlog.exception(f"{e}")
|
||||||
asyncio.create_task(bumper.shutdown())
|
raise e
|
||||||
|
|
||||||
async def stop_server(self):
|
async def stop_server(self):
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,7 @@ class OAuth:
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
def include_EcoVacsHomeProducts_info(bot) -> Dict[str, Any]:
|
def include_EcoVacsHomeProducts_info(bot) -> dict[str, Any]:
|
||||||
result = copy.deepcopy(bot)
|
result = copy.deepcopy(bot)
|
||||||
|
|
||||||
for botprod in EcoVacsHomeProducts:
|
for botprod in EcoVacsHomeProducts:
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ class CommandDto:
|
||||||
self._event = asyncio.Event()
|
self._event = asyncio.Event()
|
||||||
self._response: Union[str, bytes]
|
self._response: Union[str, bytes]
|
||||||
|
|
||||||
async def wait_for_response(self) -> Union[str, Dict[str, Any]]:
|
async def wait_for_response(self) -> Union[str, dict[str, Any]]:
|
||||||
await self._event.wait()
|
await self._event.wait()
|
||||||
if self._payload_type == "j":
|
if self._payload_type == "j":
|
||||||
return json.loads(self._response)
|
return json.loads(self._response)
|
||||||
|
|
@ -87,7 +87,7 @@ class MQTTHelperBot:
|
||||||
|
|
||||||
async def _wait_for_resp(
|
async def _wait_for_resp(
|
||||||
self, command_dto: CommandDto, request_id: str
|
self, command_dto: CommandDto, request_id: str
|
||||||
) -> Dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
try:
|
try:
|
||||||
payload = await asyncio.wait_for(
|
payload = await asyncio.wait_for(
|
||||||
command_dto.wait_for_response(), timeout=self.timeout
|
command_dto.wait_for_response(), timeout=self.timeout
|
||||||
|
|
@ -108,8 +108,8 @@ class MQTTHelperBot:
|
||||||
}
|
}
|
||||||
|
|
||||||
async def send_command(
|
async def send_command(
|
||||||
self, cmdjson: Dict[str, Any], request_id: str
|
self, cmdjson: dict[str, Any], request_id: str
|
||||||
) -> Dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
if self.client is None:
|
if self.client is None:
|
||||||
await self.start()
|
await self.start()
|
||||||
assert self.client is not None
|
assert self.client is not None
|
||||||
|
|
@ -148,7 +148,7 @@ class MQTTHelperBot:
|
||||||
|
|
||||||
|
|
||||||
class MQTTServer:
|
class MQTTServer:
|
||||||
def __init__(self, host: str, port: int, **kwargs: Dict[str, Any]) -> None:
|
def __init__(self, host: str, port: int, **kwargs: dict[str, Any]) -> None:
|
||||||
try:
|
try:
|
||||||
self._host = host
|
self._host = host
|
||||||
self._port = port
|
self._port = port
|
||||||
|
|
@ -226,7 +226,7 @@ class BumperMQTTServer_Plugin:
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
mqttserverlog.exception(f"{e}")
|
mqttserverlog.exception(f"{e}")
|
||||||
|
|
||||||
async def authenticate(self, session: Session, **kwargs: Dict[str, Any]) -> bool:
|
async def authenticate(self, session: Session, **kwargs: dict[str, Any]) -> bool:
|
||||||
authenticated = False
|
authenticated = False
|
||||||
username = session.username
|
username = session.username
|
||||||
password = session.password
|
password = session.password
|
||||||
|
|
@ -314,9 +314,9 @@ class BumperMQTTServer_Plugin:
|
||||||
|
|
||||||
return authenticated
|
return authenticated
|
||||||
|
|
||||||
def _read_password_file(self) -> Dict[str, str]:
|
def _read_password_file(self) -> dict[str, str]:
|
||||||
password_file = self.auth_config.get("password-file", None)
|
password_file = self.auth_config.get("password-file", None)
|
||||||
users: Dict[str, str] = {}
|
users: dict[str, str] = {}
|
||||||
if password_file:
|
if password_file:
|
||||||
try:
|
try:
|
||||||
with open(password_file) as f:
|
with open(password_file) as f:
|
||||||
|
|
@ -357,7 +357,7 @@ class BumperMQTTServer_Plugin:
|
||||||
bumper.client_set_mqtt(client["resource"], connected)
|
bumper.client_set_mqtt(client["resource"], connected)
|
||||||
|
|
||||||
async def on_broker_message_received(
|
async def on_broker_message_received(
|
||||||
self, message: IncomingApplicationMessage, **kwargs: Dict[str, Any]
|
self, message: IncomingApplicationMessage, **kwargs: dict[str, Any]
|
||||||
) -> None:
|
) -> None:
|
||||||
topic = message.topic
|
topic = message.topic
|
||||||
topic_split = str(topic).split("/")
|
topic_split = str(topic).split("/")
|
||||||
|
|
|
||||||
|
|
@ -40,17 +40,9 @@ class XMPPServer:
|
||||||
|
|
||||||
self.server_coro = loop.create_task(self.server.serve_forever())
|
self.server_coro = loop.create_task(self.server.serve_forever())
|
||||||
|
|
||||||
except PermissionError as e:
|
|
||||||
xmppserverlog.error(e.strerror)
|
|
||||||
asyncio.create_task(bumper.shutdown())
|
|
||||||
pass
|
|
||||||
|
|
||||||
except asyncio.CancelledError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
xmppserverlog.exception(f"{e}")
|
xmppserverlog.exception(f"{e}")
|
||||||
asyncio.create_task(bumper.shutdown())
|
raise e
|
||||||
|
|
||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
|
|
||||||
|
|
|
||||||
2
mypy.ini
2
mypy.ini
|
|
@ -1,5 +1,5 @@
|
||||||
[mypy]
|
[mypy]
|
||||||
python_version = 3.7
|
python_version = 3.9
|
||||||
show_error_codes = true
|
show_error_codes = true
|
||||||
follow_imports = silent
|
follow_imports = silent
|
||||||
ignore_missing_imports = true
|
ignore_missing_imports = true
|
||||||
|
|
|
||||||
|
|
@ -28,48 +28,13 @@ def remove_existing_db():
|
||||||
|
|
||||||
|
|
||||||
async def test_confserver_ssl():
|
async def test_confserver_ssl():
|
||||||
conf_server = bumper.ConfServer((HOST, 111111), usessl=True)
|
conf_server = bumper.ConfServer((HOST, 11111), usessl=True)
|
||||||
conf_server.confserver_app()
|
conf_server.confserver_app()
|
||||||
asyncio.create_task(conf_server.start_server())
|
await conf_server.start_server()
|
||||||
|
|
||||||
|
|
||||||
async def test_confserver_exceptions():
|
|
||||||
with LogCapture() as l:
|
|
||||||
|
|
||||||
conf_server = bumper.ConfServer((HOST, 8007), usessl=True)
|
|
||||||
conf_server.confserver_app()
|
|
||||||
conf_server.site = web.TCPSite
|
|
||||||
|
|
||||||
# bind permission
|
|
||||||
conf_server.site.start = mock.Mock(
|
|
||||||
side_effect=OSError(
|
|
||||||
1,
|
|
||||||
"error while attempting to bind on address ('127.0.0.1', 8007): permission denied",
|
|
||||||
)
|
|
||||||
)
|
|
||||||
await conf_server.start_server()
|
|
||||||
|
|
||||||
# asyncio Cancel
|
|
||||||
conf_server.site = web.TCPSite
|
|
||||||
conf_server.site.start = mock.Mock(side_effect=asyncio.CancelledError)
|
|
||||||
await conf_server.start_server()
|
|
||||||
|
|
||||||
# general exception
|
|
||||||
conf_server.site = web.TCPSite
|
|
||||||
conf_server.site.start = mock.Mock(side_effect=Exception(1, "general"))
|
|
||||||
await conf_server.start_server()
|
|
||||||
|
|
||||||
l.check_present(
|
|
||||||
(
|
|
||||||
"confserver",
|
|
||||||
"ERROR",
|
|
||||||
"error while attempting to bind on address ('127.0.0.1', 8007): permission denied",
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
async def test_confserver_no_ssl():
|
async def test_confserver_no_ssl():
|
||||||
conf_server = bumper.ConfServer((HOST, 111111), usessl=False)
|
conf_server = bumper.ConfServer((HOST, 11112), usessl=False)
|
||||||
conf_server.confserver_app()
|
conf_server.confserver_app()
|
||||||
await conf_server.start_server()
|
await conf_server.start_server()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,11 @@ from testfixtures import LogCapture
|
||||||
import bumper
|
import bumper
|
||||||
|
|
||||||
|
|
||||||
def return_send_data(data, *args, **kwargs):
|
def return_send_data(data):
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
def mock_transport_extra_info(*args, **kwargs):
|
def mock_transport_extra_info():
|
||||||
return ("127.0.0.1", 5223)
|
return ("127.0.0.1", 5223)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -59,8 +59,8 @@ async def test_xmpp_server():
|
||||||
xmpp_server.disconnect()
|
xmpp_server.disconnect()
|
||||||
|
|
||||||
|
|
||||||
async def test_client_connect_no_starttls(*args, **kwargs):
|
async def test_client_connect_no_starttls():
|
||||||
test_transport = asyncio.Transport()
|
test_transport = mock.Mock()
|
||||||
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())
|
||||||
test_transport.write = mock.Mock(return_value=return_send_data)
|
test_transport.write = mock.Mock(return_value=return_send_data)
|
||||||
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
||||||
|
|
@ -98,8 +98,8 @@ async def test_client_connect_no_starttls(*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_client_end_stream(*args, **kwargs):
|
async def test_client_end_stream():
|
||||||
test_transport = asyncio.Transport()
|
test_transport = mock.Mock()
|
||||||
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())
|
||||||
test_transport.write = mock.Mock(return_value=return_send_data)
|
test_transport.write = mock.Mock(return_value=return_send_data)
|
||||||
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
||||||
|
|
@ -130,8 +130,8 @@ async def test_client_end_stream(*args, **kwargs):
|
||||||
xmppclient._parse_data(test_data)
|
xmppclient._parse_data(test_data)
|
||||||
|
|
||||||
|
|
||||||
async def test_client_connect_starttls_called(*args, **kwargs):
|
async def test_client_connect_starttls_called():
|
||||||
test_transport = asyncio.Transport()
|
test_transport = mock.Mock()
|
||||||
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())
|
||||||
test_transport.write = mock.Mock(return_value=return_send_data)
|
test_transport.write = mock.Mock(return_value=return_send_data)
|
||||||
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
||||||
|
|
@ -199,65 +199,9 @@ 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():
|
|
||||||
|
|
||||||
xmpp_address = ("127.0.0.1", 5223)
|
async def test_client_init():
|
||||||
xmpp_server = bumper.XMPPServer(xmpp_address)
|
test_transport = mock.Mock()
|
||||||
await xmpp_server.start_async_server()
|
|
||||||
|
|
||||||
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()
|
|
||||||
|
|
||||||
writer.write(
|
|
||||||
b'<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="PLAIN">AGZ1aWRfdG1wdXNlcgAwL0lPU0Y1M0QwN0JBL3VzXzg5ODgwMmZkYmM0NDQxYjBiYzgxNWIxZDFjNjgzMDJl</auth>'
|
|
||||||
) # Send Auth
|
|
||||||
|
|
||||||
await writer.drain()
|
|
||||||
|
|
||||||
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):
|
|
||||||
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())
|
||||||
test_transport.write = mock.Mock(return_value=return_send_data)
|
test_transport.write = mock.Mock(return_value=return_send_data)
|
||||||
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
||||||
|
|
@ -324,8 +268,8 @@ async def test_client_init(*args, **kwargs):
|
||||||
) # client presence - dummy response
|
) # client presence - dummy response
|
||||||
|
|
||||||
|
|
||||||
async def test_bot_connect(*args, **kwargs):
|
async def test_bot_connect():
|
||||||
test_transport = asyncio.Transport()
|
test_transport = mock.Mock()
|
||||||
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())
|
||||||
test_transport.write = mock.Mock(return_value=return_send_data)
|
test_transport.write = mock.Mock(return_value=return_send_data)
|
||||||
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
||||||
|
|
@ -364,8 +308,8 @@ async def test_bot_connect(*args, **kwargs):
|
||||||
assert xmppclient.type == xmppclient.BOT # Client type is now bot
|
assert xmppclient.type == xmppclient.BOT # Client type is now bot
|
||||||
|
|
||||||
|
|
||||||
async def test_bot_init(*args, **kwargs):
|
async def test_bot_init():
|
||||||
test_transport = asyncio.Transport()
|
test_transport = mock.Mock()
|
||||||
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())
|
||||||
test_transport.write = mock.Mock(return_value=return_send_data)
|
test_transport.write = mock.Mock(return_value=return_send_data)
|
||||||
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
||||||
|
|
@ -430,8 +374,8 @@ async def test_bot_init(*args, **kwargs):
|
||||||
) # bot presence - dummy response
|
) # bot presence - dummy response
|
||||||
|
|
||||||
|
|
||||||
async def test_ping_server(*args, **kwargs):
|
async def test_ping_server():
|
||||||
test_transport = asyncio.Transport()
|
test_transport = mock.Mock()
|
||||||
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())
|
||||||
test_transport.write = mock.Mock(return_value=return_send_data)
|
test_transport.write = mock.Mock(return_value=return_send_data)
|
||||||
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
||||||
|
|
@ -450,9 +394,8 @@ async def test_ping_server(*args, **kwargs):
|
||||||
) # ping response
|
) # ping response
|
||||||
|
|
||||||
|
|
||||||
async def test_ping_client_to_client(*args, **kwargs):
|
async def test_ping_client_to_client():
|
||||||
|
test_transport = mock.Mock()
|
||||||
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())
|
||||||
test_transport.write = mock.Mock(return_value=return_send_data)
|
test_transport.write = mock.Mock(return_value=return_send_data)
|
||||||
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
||||||
|
|
@ -478,7 +421,7 @@ async def test_ping_client_to_client(*args, **kwargs):
|
||||||
|
|
||||||
assert (
|
assert (
|
||||||
mock_send2.mock_calls[0][1][0]
|
mock_send2.mock_calls[0][1][0]
|
||||||
== '<iq from="E0000000000000001234@159.ecorobot.net/atom" id="104934615" to="fuid_tmpuser@ecouser.net/IOSF53D07BA" type="get"><ping xmlns="urn:xmpp:ping" /></iq>'
|
== '<iq id="104934615" to="fuid_tmpuser@ecouser.net/IOSF53D07BA" type="get" from="E0000000000000001234@159.ecorobot.net/atom"><ping xmlns="urn:xmpp:ping" /></iq>'
|
||||||
) # ping response
|
) # ping response
|
||||||
|
|
||||||
# Ping response from bot to user
|
# Ping response from bot to user
|
||||||
|
|
@ -487,12 +430,12 @@ async def test_ping_client_to_client(*args, **kwargs):
|
||||||
|
|
||||||
assert (
|
assert (
|
||||||
mock_send.mock_calls[0][1][0]
|
mock_send.mock_calls[0][1][0]
|
||||||
== '<iq from="fuid_tmpuser@ecouser.net/IOSF53D07BA" id="104934615" to="E0000000000000001234@159.ecorobot.net/atom" type="result" />'
|
== '<iq type="result" to="E0000000000000001234@159.ecorobot.net/atom" id="104934615" from="fuid_tmpuser@ecouser.net/IOSF53D07BA" />'
|
||||||
) # ping response
|
) # ping response
|
||||||
|
|
||||||
|
|
||||||
async def test_client_send_iq(*args, **kwargs):
|
async def test_client_send_iq():
|
||||||
test_transport = asyncio.Transport()
|
test_transport = mock.Mock()
|
||||||
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())
|
||||||
test_transport.write = mock.Mock(return_value=return_send_data)
|
test_transport.write = mock.Mock(return_value=return_send_data)
|
||||||
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
|
||||||
|
|
@ -534,7 +477,7 @@ async def test_client_send_iq(*args, **kwargs):
|
||||||
|
|
||||||
assert (
|
assert (
|
||||||
mock_send2.mock_calls[0][1][0]
|
mock_send2.mock_calls[0][1][0]
|
||||||
== '<iq from="fuid_tmpuser@ecouser.net/IOSF53D07BA" id="7" to="E0000000000000001234@159.ecorobot.net/atom" type="set"><query xmlns="com:ctl"><ctl id="72107787" td="GetCleanState" /></query></iq>'
|
== '<iq id="7" to="E0000000000000001234@159.ecorobot.net/atom" type="set" from="fuid_tmpuser@ecouser.net/IOSF53D07BA"><query xmlns="com:ctl"><ctl id="72107787" td="GetCleanState" /></query></iq>'
|
||||||
) # command was sent to bot
|
) # command was sent to bot
|
||||||
|
|
||||||
# Reset mock calls
|
# Reset mock calls
|
||||||
|
|
@ -546,7 +489,7 @@ async def test_client_send_iq(*args, **kwargs):
|
||||||
|
|
||||||
assert (
|
assert (
|
||||||
mock_send.mock_calls[0][1][0]
|
mock_send.mock_calls[0][1][0]
|
||||||
== '<iq from="E0000000000000001234@159.ecorobot.net/atom" id="2679" to="fuid_tmpuser@ecouser.net/IOSF53D07BA" type="set"><query xmlns="com:ctl"><ctl td="ChargeState"><charge h="0" r="a" type="Going" /></ctl></query></iq>'
|
== '<iq id="2679" to="fuid_tmpuser@ecouser.net/IOSF53D07BA" type="set" from="E0000000000000001234@159.ecorobot.net/atom"><query xmlns="com:ctl"><ctl td="ChargeState"><charge h="0" r="a" type="Going" /></ctl></query></iq>'
|
||||||
) # result sent to client
|
) # result sent to client
|
||||||
|
|
||||||
# Reset mock calls
|
# Reset mock calls
|
||||||
|
|
@ -558,7 +501,7 @@ async def test_client_send_iq(*args, **kwargs):
|
||||||
|
|
||||||
assert (
|
assert (
|
||||||
mock_send.mock_calls[0][1][0]
|
mock_send.mock_calls[0][1][0]
|
||||||
== '<iq from="E0000000000000001234@159.ecorobot.net/atom" id="s2c1" to="ecouser.net" type="result" />'
|
== '<iq type="result" from="E0000000000000001234@159.ecorobot.net/atom" to="ecouser.net" id="s2c1" />'
|
||||||
) # result sent to ecouser.net
|
) # result sent to ecouser.net
|
||||||
|
|
||||||
# Reset mock calls
|
# Reset mock calls
|
||||||
|
|
@ -570,7 +513,7 @@ async def test_client_send_iq(*args, **kwargs):
|
||||||
|
|
||||||
assert (
|
assert (
|
||||||
mock_send.mock_calls[0][1][0]
|
mock_send.mock_calls[0][1][0]
|
||||||
== '<iq from="E0000000000000001234@159.ecorobot.net/atom" id="2700" to="fuid_tmpuser@ecouser.net/IOSF53D07BA" type="set"><query xmlns="com:ctl"><ctl td="BatteryInfo"><battery power="100" /></ctl></query></iq>'
|
== '<iq to="fuid_tmpuser@ecouser.net/IOSF53D07BA" type="set" id="2700" from="E0000000000000001234@159.ecorobot.net/atom"><query xmlns="com:ctl"><ctl td="BatteryInfo"><battery power="100" /></ctl></query></iq>'
|
||||||
) # result sent to ecouser.net
|
) # result sent to ecouser.net
|
||||||
|
|
||||||
# Reset mock calls
|
# Reset mock calls
|
||||||
|
|
@ -582,7 +525,7 @@ async def test_client_send_iq(*args, **kwargs):
|
||||||
|
|
||||||
assert (
|
assert (
|
||||||
mock_send.mock_calls[0][1][0]
|
mock_send.mock_calls[0][1][0]
|
||||||
== '<iq from="E0000000000000001234@159.ecorobot.net/atom" id="631" to="fuid_tmpuser@ecouser.net/IOSF53D07BA" type="set"><query xmlns="com:ctl"><ctl errs="102" td="error" /></query></iq>'
|
== '<iq to="fuid_tmpuser@ecouser.net/IOSF53D07BA" type="set" id="631" from="E0000000000000001234@159.ecorobot.net/atom"><query xmlns="com:ctl"><ctl td="error" errs="102" /></query></iq>'
|
||||||
) # result sent to ecouser.net
|
) # result sent to ecouser.net
|
||||||
|
|
||||||
# Reset mock calls
|
# Reset mock calls
|
||||||
|
|
@ -593,7 +536,7 @@ async def test_client_send_iq(*args, **kwargs):
|
||||||
xmppclient2._parse_data(test_data)
|
xmppclient2._parse_data(test_data)
|
||||||
assert (
|
assert (
|
||||||
mock_send.mock_calls[0][1][0]
|
mock_send.mock_calls[0][1][0]
|
||||||
== '<iq xmlns="com:sf" from="E0000000000000001234@159.ecorobot.net/atom" id="1234" to="rl.ecorobot.net" type="set"><query xmlns="com:ctl"><sf f="E0000000000000001234@159.ecorobot.net" g="fuid_tmpuser@ecouser.net" k="DeviceAlert" t="log" td="pub" tp="p" ts="1559893796000" v="DorpError" /></query></iq>'
|
== ('<iq xmlns="com:sf" to="rl.ecorobot.net" type="set" id="1234" from="E0000000000000001234@159.ecorobot.net/atom"><query xmlns="com:ctl"><sf td="pub" t="log" ts="1559893796000" tp="p" k="DeviceAlert" v="DorpError" f="E0000000000000001234@159.ecorobot.net" g="fuid_tmpuser@ecouser.net" /></query></iq>')
|
||||||
) # result sent to ecouser.net
|
) # result sent to ecouser.net
|
||||||
|
|
||||||
# Reset mock calls
|
# Reset mock calls
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue