iro/tests/testWorker.py
author Sandro Knauß <knauss@netzguerilla.net>
Wed, 06 Oct 2010 04:42:23 +0200
changeset 45 4bde195af39f
parent 42 1a9f191389a4
child 48 32763e344d3b
permissions -rw-r--r--
merging MyIro_deamon
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
42
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
    35
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
    36
class BadJob(Job):
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
    37
    def start(self):
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
    38
        Job.start(self)
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
    39
        raise Exception("Error")
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
    40
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
    41
#einen Manager anlegen, der Job und eine Liste anbietet
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    42
class MyManager(BaseManager):
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    43
    pass
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    44
MyManager.register('Job', Job) 
42
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
    45
MyManager.register('BadJob', BadJob) 
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    46
MyManager.register('list', list, ListProxy)
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    47
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    48
class TestWorker(unittest.TestCase):
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    49
    def setUp(self):
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    50
        #erstelle eine Queue&Manager
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    51
        self.manager = MyManager()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    52
        self.queue = Queue()
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
        #manager starten, damit wir Logging anpassen können
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    55
        self.manager.start()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    56
        self.setUpLogging()
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
        #eigentlich Workerprocess starten
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    59
        self.worker= Worker(self.queue)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    60
        self.worker.start()
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 tearDown(self):
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    63
        #Thread&Queue stoppen
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    64
        self.stop()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    65
        
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    66
        #Logging änderungen rückgängig
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    67
        self.tearDownLogging()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    68
        self.manager.shutdown()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    69
    
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    70
    def stop(self):
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    71
        self.queue.close()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    72
        self.queue.join_thread()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    73
        self.worker.terminate()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    74
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    75
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    76
    def setUpLogging(self):
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    77
        '''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
    78
        #wir brauchen eine threadsichere liste
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    79
        self.buffer=self.manager.list()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    80
        
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    81
        #Handler erstellen, der in den Buffer schreibt
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    82
        self.handler = h = MyHandler(self.buffer)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    83
        self.logger =l= logging.getLogger()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    84
        
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    85
        #Level anpassen 
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    86
        l.setLevel(logging.DEBUG)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    87
        h.setLevel(logging.DEBUG)
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    88
        l.addHandler(h)
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    89
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    90
    def tearDownLogging(self):
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    91
        '''crazy logging hacks wieder entfernen'''
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    92
        self.logger.removeHandler(self.handler)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    93
        self.logger.setLevel(logging.NOTSET)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    94
        self.handler.close()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    95
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    96
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    97
    def testJob(self):
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    98
        '''einen Job verarbeiten'''
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
    99
        job=self.manager.Job(None,None,"test")
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
   100
        self.assertEqual(job.getStatus(),"init")
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   101
        self.queue.put(job)
41
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
   102
        sleep(.1)
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
   103
        self.stop()
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
   104
        self.assertEqual(job.getStatus(),"started")
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
   105
        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
   106
                [(20,'Workerprocess läuft nun...'),
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
   107
                 (20,'ein neuer Job(1)'),
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
   108
                 (20,'Job(1) fertig ;)')])
02e9b54ef4f0 testWorker benutzbar machen & test laufen lassen
Sandro Knauß <knauss@netzguerilla.net>
parents: 40
diff changeset
   109
42
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   110
    def testBadJob(self):
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   111
        '''einen Job verarbeiten, der fehlschlägt'''
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   112
        job=self.manager.BadJob(None,None,"test")
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   113
        self.assertEqual(job.getStatus(),"init")
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   114
        self.queue.put(job)
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   115
        sleep(.1)
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   116
        self.stop()
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   117
        self.assertEqual(job.getStatus(),"error")
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   118
        print self.buffer
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   119
        self.assertEqual([(l['levelno'],l['msg']) for l in self.buffer if l['name']=="iro.worker"],
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   120
                [(20,'Workerprocess läuft nun...'),
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   121
                 (20,'ein neuer Job(1)'),
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   122
                 (40,'Job(1) fehlgeschlagen :(')])
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   123
        error=Exception('Error')
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   124
        self.assertEqual(self.buffer[-1]['exc_info'][0],type(error))
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   125
        self.assertEqual(str(self.buffer[-1]['exc_info'][1]),str(error))
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   126
1a9f191389a4 test mit fehlschlagendem Job
Sandro Knauß <knauss@netzguerilla.net>
parents: 41
diff changeset
   127
40
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   128
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   129
if __name__ == "__main__":
5d177c9d7fd2 testWorker.py hinzugefügt
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   130
    unittest.main()