iro/tests/testWorker.py
author Sandro Knauß <knauss@netzguerilla.net>
Wed, 06 Oct 2010 04:28:19 +0200
changeset 41 02e9b54ef4f0
parent 40 5d177c9d7fd2
child 42 1a9f191389a4
permissions -rw-r--r--
testWorker benutzbar machen & test laufen lassen
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     2
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     3
import unittest
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     4
import logging
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     5
from time import sleep
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     6
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     7
from multiprocessing import Queue
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
     8
from multiprocessing.managers import BaseManager,ListProxy
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
     9
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    10
from iro.worker import Worker
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    11
from iro.job import Job
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    12
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    13
from logging.handlers import BufferingHandler
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    14
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    15
class MyHandler(BufferingHandler):
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    16
    def __init__(self,buffer=None):
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    17
        '''BufferingHandler takes a "capacity" argument
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    18
        so as to know when to flush. As we're overriding
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    19
        shouldFlush anyway, we can set a capacity of zero.
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    20
        You can call flush() manually to clear out the
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    21
        buffer.
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    22
            buffer: log messages to this buffer, needed f.ex for processes or threads'''
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    23
        BufferingHandler.__init__(self, 0)
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    24
        self.buffer=buffer
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    25
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    26
    def shouldFlush(self):
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    27
        return False
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    28
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    29
    def emit(self, record):
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    30
        if record.exc_info:                                                      #sonst geht das append schief, weil nicht picklebar
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    31
            print record.exc_info
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    32
            record.exc_info=record.exc_info[:-1]                                              
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
        self.buffer.append(record.__dict__)
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    35
class MyManager(BaseManager):
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
    pass
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    37
MyManager.register('Job', Job) 
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    38
MyManager.register('list', list, ListProxy)
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    40
class TestWorker(unittest.TestCase):
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    41
    def setUp(self):
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    42
        #erstelle eine Queue&Manager
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    43
        self.manager = MyManager()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    44
        self.queue = Queue()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    45
        
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    46
        #manager starten, damit wir Logging anpassen können
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    47
        self.manager.start()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    48
        self.setUpLogging()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    49
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    50
        #eigentlich Workerprocess starten
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    51
        self.worker= Worker(self.queue)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    52
        self.worker.start()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    53
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    54
    def tearDown(self):
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    55
        #Thread&Queue stoppen
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    56
        self.stop()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    57
        
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    58
        #Logging änderungen rückgängig
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    59
        self.tearDownLogging()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    60
        self.manager.shutdown()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    61
    
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    62
    def stop(self):
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    63
        self.queue.close()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    64
        self.queue.join_thread()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    65
        self.worker.terminate()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    66
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    67
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    68
    def setUpLogging(self):
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    69
        '''Logging so umbasteln, das wir alle logging Meldung in self.buf sind'''
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    70
        #wir brauchen eine threadsichere liste
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    71
        self.buffer=self.manager.list()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    72
        
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    73
        #Handler erstellen, der in den Buffer schreibt
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    74
        self.handler = h = MyHandler(self.buffer)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    75
        self.logger =l= logging.getLogger()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    76
        
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    77
        #Level anpassen 
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    78
        l.setLevel(logging.DEBUG)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    79
        h.setLevel(logging.DEBUG)
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    80
        l.addHandler(h)
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    81
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    82
    def tearDownLogging(self):
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    83
        '''crazy logging hacks wieder entfernen'''
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    84
        self.logger.removeHandler(self.handler)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    85
        self.logger.setLevel(logging.NOTSET)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    86
        self.handler.close()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    87
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    88
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    89
    def testJob(self):
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    90
        '''einen Job verarbeiten'''
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    91
        job=self.manager.Job(None,None,"test")
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    92
        self.assertEqual(job.getStatus(),"init")
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    93
        self.queue.put(job)
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    94
        sleep(.1)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    95
        self.stop()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    96
        self.assertEqual(job.getStatus(),"started")
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    97
        self.assertEqual([(l['levelno'],l['msg']) for l in self.buffer if l['name']=="iro.worker"],
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    98
                [(20,'Workerprocess läuft nun...'),
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    99
                 (20,'ein neuer Job(1)'),
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
   100
                 (20,'Job(1) fertig ;)')])
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
   101
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   102
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   103
if __name__ == "__main__":
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   104
    unittest.main()