diff --git a/test/README.md b/test/README.md new file mode 100644 index 0000000..8bd3744 --- /dev/null +++ b/test/README.md @@ -0,0 +1,7 @@ +# This directory contains tests for xmpp mirror bot +In order to run tests, execute test.sh script +You need docker to run this test +On debian based systems you can install docker with: +sudo apt install docker.io + +Test phrases used by testbot are in testmsgs.txt, each line is a new test message diff --git a/test/config.ini b/test/config.ini new file mode 100644 index 0000000..f66543d --- /dev/null +++ b/test/config.ini @@ -0,0 +1,6 @@ +[credentials] +JID = "xmppbot@localhost" +PASSWORD = "bottestpassword" +NICK = "xmppbot" +ROOM1 = "testroom1@conference.localhost" +ROOM2 = "testroom2@conference.localhost" diff --git a/test/test.sh b/test/test.sh new file mode 100755 index 0000000..b789706 --- /dev/null +++ b/test/test.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# Run ejabberd docker as a daemon +docker run --name xmppbot-test -d -p 25222:5222 ejabberd/ecs + +# Wait few seconds for ejabberd to boot +sleep 5 + +# Create acounts for admin and xmppbot +docker exec -it xmppbot-test bin/ejabberdctl register admin localhost admintestpassword + +docker exec -it xmppbot-test bin/ejabberdctl register xmppbot localhost bottestpassword + +# Create MUC rooms for testing +docker exec -it xmppbot-test bin/ejabberdctl create_room testroom1 conference.localhost localhost +docker exec -it xmppbot-test bin/ejabberdctl create_room testroom2 conference.localhost localhost + +# Run xmpp mirror bot +python3 ../xmppmirror & + +# Run xmpp test bot +python3 testbot + +# Stop and remove containter +docker stop xmppbot-test +docker rm xmppbot-test + diff --git a/test/testbot b/test/testbot new file mode 100755 index 0000000..473a131 --- /dev/null +++ b/test/testbot @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +# XMPP bot that tests mirror bot +import argparse +import slixmpp +import configparser + +CONFIG_PATH = "./testconfig.ini" + +VERSION='0.1.0' + +# Read test messages from testmsgs.txt +ftestmsgs=open("testmsgs.txt") +testmsgs=ftestmsgs.readlines() +ftestmsgs.close() + +# Generate lists with times that test messages are sent and recieved in rooms +results1=[] +for i in testmsgs: + results1.append([i,0,0]) + +results2=[] +for i in testmsgs: + results2.append([i,0,0]) + +# Check if all sent messages are recieved +def allmsgsrecv(): + ret = True + for i in results1: + if i[2] == 0: + return False + for i in results2: + if i[2] == 0: + return False + +# Print results and exit +def printandexit(): + print("Results of test:") + for i in results1: + print(i[0].rstrip + " : " + str(round(i[2]-i[1],2)) + " secounds") + for i in results2: + print(i[0].rstrip + " : " + str(round(i[2]-i[1],2)) + " secounds") + exit() + +def show_version(): + print("XMPP test bot " + VERSION) + print("License GPLv3+: GNU GPL version 3 or later ") + print("This is free software: you are free to change and redistribute it.") + print("There is NO WARRANTY, to the extent permitted by law.") + + +class MUCBot(slixmpp.ClientXMPP): + + def __init__(self, jid, password, nick, room1, room2): + slixmpp.ClientXMPP.__init__(self, jid, password) + + self.nick = nick + self.room1 = room1 + self.room2 = room2 + self.add_event_handler("session_start", self.start) + self.add_event_handler("groupchat_message", self.muc_message) + + async def start(self, event): + await self.get_roster() + self.send_presence() + self.plugin['xep_0045'].join_muc(self.room1,self.nick) + self.plugin['xep_0045'].join_muc(self.room2,self.nick) + # Send test messages to both rooms + for i in results1: + time.sleep(2) + self.send_message(mto=self.room1,mbody="%s" % i[0],mtype='groupchat') + i[1]=time.time() + + time.sleep(5) + + for i in results2: + time.sleep(2) + self.send_message(mto=self.room2,mbody="%s" % i[0],mtype='groupchat') + i[1]=time.time() + + # When message is recieved find the word in results and record time + + def muc_message(self, msg): + rtime=time.time() + rcpt=msg['from'].bare + body="%(body)s" % msg + if self.room1 in str(msg['from']): + for i in results2: + if i[0] == body: + i[2] = rtime + + if self.room2 in str(msg['from']): + for i in results1: + if i[0] == body: + i[2] = rtime + + if allmsgsrecv: + printandexit() + + +if __name__ == '__main__': + argparser = argparse.ArgumentParser(description="XMPP bot that mirrors chat between two MUC rooms") + argparser.add_argument("--version", dest="version", help="print version information and exit", action="store_true") + args=argparser.parse_args() + + ## Version argument + if args.version: + show_version() + exit() + + config = configparser.ConfigParser() + config.read(CONFIG_PATH) + JID = config.get('credentials', 'JID') + PASSWORD = config.get('credentials', 'PASSWORD') + NICK = config.get('credentials', 'NICK') + ROOM1 = config.get('credentials', 'ROOM1') + ROOM2 = config.get('credentials', 'ROOM2') + + + xmpp = MUCBot(JID, PASSWORD, NICK, ROOM1, ROOM2) + xmpp.register_plugin('xep_0030') # Service Discovery + xmpp.register_plugin('xep_0045') # Multi-User Chat + xmpp.register_plugin('xep_0199') # XMPP Ping + + # Connect to the XMPP server and start processing XMPP stanzas. + xmpp.connect(address=("localhost",25222)) + xmpp.process(forever=False) + diff --git a/test/testconfig.ini b/test/testconfig.ini new file mode 100644 index 0000000..97ce862 --- /dev/null +++ b/test/testconfig.ini @@ -0,0 +1,6 @@ +[credentials] +JID = "admin@localhost" +PASSWORD = "admintestpassword" +NICK = "admin" +ROOM1 = "testroom1@conference.localhost" +ROOM2 = "testroom2@conference.localhost" diff --git a/test/testmsgs.txt b/test/testmsgs.txt new file mode 100644 index 0000000..a4a6d0a --- /dev/null +++ b/test/testmsgs.txt @@ -0,0 +1,5 @@ +test message 1 +testasd +123123 +symbols @!:/ +>> Quote