import mock
import bumper
import asyncio
import pytest
import os
import json
import tinydb
import pytest_asyncio
import xml.etree.ElementTree as ET
def return_send_data(data, *args, **kwargs):
return data
def mock_transport_extra_info(*args, **kwargs):
return ("127.0.0.1", 1234)
async def test_client_connect_no_starttls(*args, **kwargs):
test_transport = asyncio.Transport()
test_transport.get_extra_info = mock.Mock(return_value=mock_transport_extra_info())
test_transport.write = mock.Mock(return_value=return_send_data)
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
xmppclient.state = xmppclient.CONNECT # Set client state to CONNECT
mock_send = xmppclient.send = mock.Mock(side_effect=return_send_data)
# Send connect stream from "client"
test_data = "".encode(
"utf-8"
)
xmppclient._parse_data(test_data)
# Expect 2 calls to send
assert mock_send.call_count == 2
# Server opens stream
assert (
mock_send.mock_calls[0].args[0]
== ''
)
# Server tells client available features
assert (
mock_send.mock_calls[1].args[0]
== 'PLAIN'
)
# Reset mock calls
mock_send.reset_mock()
# Client sendss auth - Ignoring the starttls, we don't force this with bumper
test_data = 'AGZ1aWRfdG1wdXNlcgAwL0lPU0Y1M0QwN0JBL3VzXzg5ODgwMmZkYmM0NDQxYjBiYzgxNWIxZDFjNjgzMDJl'.encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== ''
) # Client successfully authenticated
assert xmppclient.state == xmppclient.INIT # Client moved to INIT state
async def test_client_end_stream(*args, **kwargs):
test_transport = asyncio.Transport()
test_transport.get_extra_info = mock.Mock(return_value=mock_transport_extra_info())
test_transport.write = mock.Mock(return_value=return_send_data)
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
xmppclient.state = xmppclient.CONNECT # Set client state to CONNECT
mock_send = xmppclient.send = mock.Mock(side_effect=return_send_data)
# Send end stream from "client"
test_data = "".encode("utf-8")
xmppclient._parse_data(test_data)
# Expect 2 calls to send
assert mock_send.call_count == 1
# Server opens stream
assert mock_send.mock_calls[0].args[0] == ""
# Reset mock calls
mock_send.reset_mock()
# Send abnormal stream from "client"
test_data = "".encode("utf-8")
xmppclient._parse_data(test_data)
# Reset mock calls
mock_send.reset_mock()
# Send blank from "client"
test_data = "".encode("utf-8")
xmppclient._parse_data(test_data)
async def test_client_connect_starttls_called(*args, **kwargs):
test_transport = asyncio.Transport()
test_transport.get_extra_info = mock.Mock(return_value=mock_transport_extra_info())
test_transport.write = mock.Mock(return_value=return_send_data)
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
xmppclient.state = xmppclient.CONNECT # Set client state to CONNECT
mock_send = xmppclient.send = mock.Mock(side_effect=return_send_data)
# Send connect stream from "client"
test_data = "".encode(
"utf-8"
)
xmppclient._parse_data(test_data)
# Expect 2 calls to send
assert mock_send.call_count == 2
# Server opens stream
assert (
mock_send.mock_calls[0].args[0]
== ''
)
# Server tells client available features
assert (
mock_send.mock_calls[1].args[0]
== 'PLAIN'
)
# Reset mock calls
mock_send.reset_mock()
mock_tls = xmppclient._handle_starttls = mock.Mock()
# Send start tls from "client"
test_data = "".encode("utf-8")
xmppclient._parse_data(test_data)
# After upgrading connection, server tells client to proceed with auth again
assert mock_tls.called
xmppclient.TLSUpgraded = True
# After TLS is upgraded, Client establishes session again and will auth this time
# Send connect stream from "client"
test_data = "".encode(
"utf-8"
)
xmppclient._parse_data(test_data)
# Expect 2 calls to send
assert mock_send.call_count == 2
# Server opens stream
assert (
mock_send.mock_calls[0].args[0]
== ''
)
# Server tells client available features (without STARTTLS)
assert (
mock_send.mock_calls[1].args[0]
== 'PLAIN'
)
# Reset mock calls
mock_send.reset_mock()
# Client sends auth
test_data = 'AGZ1aWRfdG1wdXNlcgAwL0lPU0Y1M0QwN0JBL3VzXzg5ODgwMmZkYmM0NDQxYjBiYzgxNWIxZDFjNjgzMDJl'.encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== ''
) # Client successfully authenticated
assert xmppclient.state == xmppclient.INIT # Client moved to INIT state
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.write = mock.Mock(return_value=return_send_data)
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
xmppclient.state = xmppclient.INIT # Set client state to INIT
xmppclient.uid = "fuid_tmpuser"
xmppclient.resource = "IOSF53D07BA"
xmppclient.bumper_jid = "fuid_tmpuser@ecouser.net/IOSF53D07BA"
xmppclient.type = xmppclient.CONTROLLER
mock_send = xmppclient.send = mock.Mock(side_effect=return_send_data)
# Send connect stream from "client"
test_data = "".encode(
"utf-8"
)
xmppclient._parse_data(test_data)
# Expect 2 calls to send
assert mock_send.call_count == 2
# Server opens stream
assert (
mock_send.mock_calls[0].args[0]
== ''
)
# Server tells client binds
assert (
mock_send.mock_calls[1].args[0]
== ''
)
# Reset mock calls
mock_send.reset_mock()
# Send bind from "client"
test_data = 'IOSF53D07BA'.encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== 'fuid_tmpuser@ecouser.net/IOSF53D07BA'
) # client successfully binded
assert xmppclient.state == xmppclient.BIND # client moved to BIND state
# Reset mock calls
mock_send.reset_mock()
# Send set session from client
test_data = ''.encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert xmppclient.state == xmppclient.READY # client moved to READY state
assert (
mock_send.mock_calls[0].args[0]
== ''
) # client ready
# Reset mock calls
mock_send.reset_mock()
# Send presense from client
test_data = ''.encode("utf-8")
xmppclient._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== ' dummy '
) # client presence - dummy response
async def test_bot_connect(*args, **kwargs):
test_transport = asyncio.Transport()
test_transport.get_extra_info = mock.Mock(return_value=mock_transport_extra_info())
test_transport.write = mock.Mock(return_value=return_send_data)
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
xmppclient.state = xmppclient.CONNECT # Set client state to CONNECT
mock_send = xmppclient.send = mock.Mock(side_effect=return_send_data)
# Send connect stream from "bot"
test_data = "".encode(
"utf-8"
)
xmppclient._parse_data(test_data)
# Expect 2 calls to send
assert mock_send.call_count == 2
# Server opens stream
assert (
mock_send.mock_calls[0].args[0]
== ''
)
# Server tells client available features
assert (
mock_send.mock_calls[1].args[0]
== 'PLAIN'
)
# Reset mock calls
mock_send.reset_mock()
# Send auth from "bot"
test_data = "AEUwMDAwMDAwMDAwMDAwMDAxMjM0AGVuY3J5cHRlZF9wYXNz".encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== ''
) # Bot successfully authenticated
assert xmppclient.state == xmppclient.INIT # Bot moved to INIT state
assert xmppclient.type == xmppclient.BOT # Client type is now bot
async def test_bot_init(*args, **kwargs):
test_transport = asyncio.Transport()
test_transport.get_extra_info = mock.Mock(return_value=mock_transport_extra_info())
test_transport.write = mock.Mock(return_value=return_send_data)
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
xmppclient.state = xmppclient.INIT # Set client state to INIT
xmppclient.uid = "E0000000000000001234"
xmppclient.devclass = "159"
xmppclient.type = xmppclient.BOT
mock_send = xmppclient.send = mock.Mock(side_effect=return_send_data)
# Send connect stream from "bot"
test_data = "".encode(
"utf-8"
)
xmppclient._parse_data(test_data)
# Expect 2 calls to send
assert mock_send.call_count == 2
# Server opens stream
assert (
mock_send.mock_calls[0].args[0]
== ''
)
# Server tells client binds
assert (
mock_send.mock_calls[1].args[0]
== ''
)
# Reset mock calls
mock_send.reset_mock()
# Send bind from "bot"
test_data = "atom".encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== 'E0000000000000001234@159.ecorobot.net/atom'
) # Bot successfully binded
assert xmppclient.state == xmppclient.BIND # Bot moved to BIND state
# Reset mock calls
mock_send.reset_mock()
# Send set session from bot
test_data = "".encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert xmppclient.state == xmppclient.READY # Bot moved to READY state
assert (
mock_send.mock_calls[0].args[0] == ''
) # Bot ready
# Reset mock calls
mock_send.reset_mock()
# Send presense from bot
test_data = "hello world".encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== ' dummy '
) # bot presence - dummy response
async def test_ping_server(*args, **kwargs):
test_transport = asyncio.Transport()
test_transport.get_extra_info = mock.Mock(return_value=mock_transport_extra_info())
test_transport.write = mock.Mock(return_value=return_send_data)
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
xmppclient.state = xmppclient.READY # Set client state to READY
xmppclient.uid = "E0000000000000001234"
xmppclient.devclass = "159"
mock_send = xmppclient.send = mock.Mock(side_effect=return_send_data)
# Ping from bot
test_data = ''.encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== ''
) # ping response
async def test_ping_client_to_client(*args, **kwargs):
test_transport = asyncio.Transport()
test_transport.get_extra_info = mock.Mock(return_value=mock_transport_extra_info())
test_transport.write = mock.Mock(return_value=return_send_data)
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
xmppclient.state = xmppclient.READY # Set client state to READY
xmppclient.uid = "E0000000000000001234"
xmppclient.devclass = "159"
xmppclient.bumper_jid = "E0000000000000001234@159.ecorobot.net/atom"
mock_send = xmppclient.send = mock.Mock(side_effect=return_send_data)
xmppclient2 = bumper.xmppserver.XMPPAsyncClient(test_transport)
xmppclient2.state = xmppclient.READY # Set client state to READY
xmppclient2.uid = "fuid_tmpuser"
xmppclient2.resource = "IOSF53D07BA"
xmppclient2.bumper_jid = "fuid_tmpuser@ecouser.net/IOSF53D07BA"
mock_send2 = xmppclient2.send = mock.Mock(side_effect=return_send_data)
bumper.xmppserver.XMPPServer.clients.append(xmppclient)
bumper.xmppserver.XMPPServer.clients.append(xmppclient2)
# Ping from user to bot
test_data = ''.encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert (
mock_send2.mock_calls[0].args[0]
== ''
) # ping response
# Ping response from bot to user
test_data = "".encode(
"utf-8"
)
xmppclient2._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== ''
) # ping response
async def test_client_send_iq(*args, **kwargs):
test_transport = asyncio.Transport()
test_transport.get_extra_info = mock.Mock(return_value=mock_transport_extra_info())
test_transport.write = mock.Mock(return_value=return_send_data)
xmppclient = bumper.xmppserver.XMPPAsyncClient(test_transport)
xmppclient.state = xmppclient.READY # Set client state to READY
xmppclient.uid = "fuid_tmpuser"
xmppclient.resource = "IOSF53D07BA"
xmppclient.bumper_jid = "fuid_tmpuser@ecouser.net/IOSF53D07BA"
xmppclient.type - xmppclient.CONTROLLER
mock_send = xmppclient.send = mock.Mock(side_effect=return_send_data)
bumper.xmppserver.XMPPServer.clients.append(xmppclient)
xmppclient2 = bumper.xmppserver.XMPPAsyncClient(test_transport)
xmppclient2.state = xmppclient.READY # Set client state to READY
xmppclient2.uid = "E0000000000000001234"
xmppclient2.devclass = "159"
xmppclient2.bumper_jid = "E0000000000000001234@159.ecorobot.net/atom"
xmppclient2.type = xmppclient2.BOT
mock_send2 = xmppclient2.send = mock.Mock(side_effect=return_send_data)
bumper.xmppserver.XMPPServer.clients.append(xmppclient2)
# Roster IQ - Only seen from Android app so far
test_data = ''.encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== ''
) # feature not implemented response
# Reset mock calls
mock_send.reset_mock()
# Bot Command
test_data = ''.encode(
"utf-8"
)
xmppclient._parse_data(test_data)
assert (
mock_send2.mock_calls[0].args[0]
== ''
) # command was sent to bot
# Reset mock calls
mock_send.reset_mock()
# Bot response to query
test_data = ''.encode(
"utf-8"
)
xmppclient2._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== ''
) # result sent to client
# Reset mock calls
mock_send.reset_mock()
# Bot result
test_data = "".encode(
"utf-8"
)
xmppclient2._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== ''
) # result sent to ecouser.net
# Reset mock calls
mock_send.reset_mock()
# Bot iq set
test_data = "".encode(
"utf-8"
)
xmppclient2._parse_data(test_data)
assert (
mock_send.mock_calls[0].args[0]
== ''
) # result sent to ecouser.net
# Reset mock calls
mock_send.reset_mock()