iro/tests/testXMLRPCServer.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 08 Oct 2010 00:03:38 +0200
changeset 48 32763e344d3b
parent 43 72c472c87460
child 61 04dfd43dfecc
permissions -rw-r--r--
job nun mit start(id), status() gibt list zurück, tests angepasst

# -*- coding: utf-8 -*-

import unittest, ConfigParser

import threading, xmlrpclib
from multiprocessing import Queue
from multiprocessing.managers import BaseManager

from iro import xmlrpc,anbieter
from iro.iro import MySMTP,MySmstrade,MyUserDB
from iro.job import SMSJob, FAXJob, MailJob
from iro.joblist import Joblist
from iro.providerlist import Providerlist
from iro.user import User, Admin


class StoppableXMLRPCServer(xmlrpc.SecureUserDBXMLRPCServer, threading.Thread):
    running=False
    def __init__(self, *args, **kwargs):
        xmlrpc.SecureUserDBXMLRPCServer.__init__(self, *args, **kwargs)
        threading.Thread.__init__(self)
        self.timeout=.5
   
    def start(self):
        self.running=True
        threading.Thread.start(self)
 
   
    def run(self):
        # *serve_forever* muss in einem eigenen Thread laufen, damit man es
        # unterbrochen werden kann!
        while (self.running):
            self.handle_request()
   
    def stop(self):
        if (self.running):
            self.running=False
            self.server_close()
            self.join()

    def __del__(self):
        self.stop()
 
    def __enter__(self):
        self.start()
        return self

    def __exit__(self,type,value,traceback):
        self.stop()



def init_server():
    userlist=[{"name":"test","password":"test",  "class":User},
              {"name":"test2","password":"test2", "class": User},
              {"name":"admin","password":"admin", "class": Admin}]


    
    class MyManager(BaseManager):
        pass
    
    MyManager.register('SMSJob', SMSJob) 
    MyManager.register('FAXob', FAXJob) 
    MyManager.register('MailJob',MailJob) 
    MyManager.register('Providerlist',Providerlist) 
    manager = MyManager()
    manager.start()
    
    
    #anbieter erzeugen und konfigurieren
    sip=anbieter.sipgate()
    sip.read_basic_config("iro.conf")
    
    localhost=MySMTP()
    localhost.read_basic_config("iro.conf")

    smstrade=MySmstrade()
    smstrade.read_basic_config("iro.conf")

    #Benutzerdatenbank erstellen
    queue = Queue()
    provider=Providerlist()
    provider.add("sipgate", sip, ["sms", "fax", ])
    provider.add("smstrade", smstrade, ["sms", ])
    provider.add("geonet", None, ["sms", "fax", ])
    provider.add("fax.de", None, ["sms", "fax", ])
    provider.add("localhost", localhost, ["mail", ])
    provider.setDefault("sms","smstrade")
    provider.setDefault("fax","sipgate")
    provider.setDefault("mail","localhost")
    jobqueue=Joblist(manager,  queue, provider)
    userdb=MyUserDB(userlist,jobqueue)


    #Server starten
    cp = ConfigParser.ConfigParser()
    cp.read(["iro.conf"])
    cert=cp.get('server', 'cert')
    key=cp.get('server', 'key')
    serv = StoppableXMLRPCServer(addr=("localhost", 8000), 
                                      userdb=userdb,
                                      certificate=cert,privatekey=key,
                                      logRequests=False)
    serv.relam="xmlrpc"
    return serv
 
    
class TestServer(unittest.TestCase):
    
    def setUp(self):
        self.serv = init_server()
        self.serv.start()

    def tearDown(self):
        self.serv.stop()

    def testLogin(self):
        self.assertEqual(xmlrpclib.Server("https://test:test@localhost:8000").status(), {})
        self.assertEqual(xmlrpclib.Server("https://test2:test2@localhost:8000").status(), {})
        self.assertRaises(xmlrpclib.ProtocolError, xmlrpclib.Server("https://test2:test@localhost:8000").status)
        self.assertRaises(xmlrpclib.ProtocolError,xmlrpclib.Server ("https://test:test2@localhost:8000").status)
    
    def testsendSMS(self):
        servstr="https://test:test@localhost:8000"
        client=xmlrpclib.Server(servstr)
        id=client.startSMS("test",["01234", ] )
        self.assertEqual(client.status(id),{id: {'status': ['init',{}], 'name':  'test'}} )
        
    def testTwoUser(self):
        u1="https://test:test@localhost:8000"
        u2="https://test2:test2@localhost:8000"
        admin="https://admin:admin@localhost:8000"
        client1=xmlrpclib.Server(u1)
        client2=xmlrpclib.Server(u2)
        admin=xmlrpclib.Server(admin)
        id1=client1.startSMS("test",["01234"] )
        self.assertEqual(client2.status(),{} ) 
        self.assertEqual(admin.status(id1),{id1: {'status': ['init', {}], 'name':  'test'}} )
        id2=client2.startSMS("test2",["01234"] )
        self.assertNotEqual(id1, id2)
        self.assertEqual(client1.status(),{id1: {'status': ['init', {}], 'name':  'test'}})
        self.assertEqual(client2.status(),{id2: {'status': ['init', {}], 'name':  'test2'}})
        self.assertEqual(admin.status(),{id1: {'status': ['init', {}], 'name':   'test'},
                        id2: {'status': ['init', {}], 'name':   'test2'}} )
        
        self.assertEqual(client2.status(id1), {})
        self.assertEqual(client1.status(id2), {})
        
    def testGetProvider(self):
        servstr="https://test:test@localhost:8000"
        client=xmlrpclib.Server(servstr)       
        self.assertEqual(client.getProvider("sms"), ["fax.de","geonet", "sipgate", "smstrade"])
        self.assertEqual(client.getProvider("fax"), ["fax.de","geonet", "sipgate"])
        self.assertEqual(client.getProvider("mail"), ["localhost"])
        
        self.assertRaises(xmlrpclib.ProtocolError,client.getProvider, "temp")
    
    def testGetDefault(self):
        servstr="https://test:test@localhost:8000"
        client=xmlrpclib.Server(servstr)       
        self.assertEqual(client.getDefaultProvider("sms"), "smstrade")
        self.assertEqual(client.getDefaultProvider("fax"),"sipgate")
        self.assertEqual(client.getDefaultProvider("mail"), "localhost")       
        
        self.assertRaises(xmlrpclib.ProtocolError,client.getDefaultProvider, "temp")        

    
if __name__ == "__main__":
    unittest.main()