iro/tests/testloglock.py
author Sandro Knauß <knauss@netzguerilla.net>
Sat, 08 Oct 2011 12:32:58 +0200
changeset 66 eabb8ead183d
permissions -rw-r--r--
Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html Added testloglock.py from http://cherrypy.org/attachment/ticket/679/testloglock.py
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
66
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     1
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     2
import unittest
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     3
import os
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     4
import tempfile
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     5
import signal
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     6
import threading
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     7
import time
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     8
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     9
class testLogLock(unittest.TestCase):
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    10
    def test_ThreadingAndLocks(self):
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    11
        #create a thread, have that thread grab a lock, and sleep.
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    12
        fd, file = tempfile.mkstemp('.nonlog')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    13
        _lock = threading.RLock()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    14
        os.close(fd)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    15
        def locker():
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    16
            os.write(fd, 'Thread acquiring lock\n')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    17
            _lock.acquire()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    18
            os.write(fd, 'Thread acquired lock\n')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    19
            time.sleep(0.4)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    20
            os.write(fd, 'Thread releasing lock\n')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    21
            _lock.release()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    22
            os.write(fd, 'Thread released lock\n')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    23
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    24
        #Then in the main thread, throw a signal to self
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    25
        def handleSignal(sigNum, frame):
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    26
            os.write(fd, 'Main Thread acquiring lock\n')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    27
            lock = False
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    28
            endtime = time.time() + 1.0
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    29
            while not lock:
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    30
                lock = _lock.acquire(blocking=0)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
                time.sleep(0.01)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    32
                if time.time() > endtime:
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
                    break
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
            if not lock:
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    35
                os.write(fd, 'Main Thread could not acquire lock\n')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
                return
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    37
            os.write(fd, 'Main Thread acquired lock\n')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    38
            os.write(fd, 'Main Thread releasing lock\n')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39
            _lock.release()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    40
            os.write(fd, 'Main Thread released lock\n')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    41
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    42
        sighndlr = signal.signal(signal.SIGUSR1, handleSignal)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    43
        try:
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    44
            fd = os.open(file, os.O_SYNC | os.O_WRONLY | os.O_CREAT)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    45
            thread = threading.Thread(target=locker)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    46
            thread.start()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    47
            time.sleep(0.1)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    48
            os.kill(os.getpid(), signal.SIGUSR1)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    49
            thread.join()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    50
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    51
            #check the results
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    52
            os.close(fd)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    53
            fileconts = open(file, 'r').read()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    54
            self.assertTrue('Main Thread released lock' in fileconts)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    55
            self.assertEqual(fileconts,
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    56
                '''Thread acquiring lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    57
Thread acquired lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    58
Main Thread acquiring lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    59
Thread releasing lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    60
Thread released lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    61
Main Thread acquired lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    62
Main Thread releasing lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    63
Main Thread released lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    64
''')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    65
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    66
            #Now try after acquiring the lock from the main thread
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    67
            fd = os.open(file, os.O_SYNC | os.O_WRONLY | os.O_CREAT)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    68
            _lock.acquire()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    69
            thread = threading.Thread(target=locker)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    70
            thread.start()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    71
            time.sleep(0.1)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    72
            os.kill(os.getpid(), signal.SIGUSR1)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    73
            _lock.release()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    74
            thread.join()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    75
            os.close(fd)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    76
            fileconts = open(file, 'r').read()
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    77
            self.assertEqual(fileconts,
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    78
                '''Thread acquiring lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    79
Main Thread acquiring lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    80
Main Thread acquired lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    81
Main Thread releasing lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    82
Main Thread released lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    83
Thread acquired lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    84
Thread releasing lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    85
Thread released lock
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    86
''')
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    87
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    88
        finally:
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    89
            signal.signal(signal.SIGUSR1, sighndlr)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    90
            try:
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    91
                os.close(fd)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    92
            except OSError:
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    93
                pass
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    94
            try:
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    95
                os.unlink(file)
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    96
            except OSError:
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    97
                pass
eabb8ead183d Added dump_test_log.py from http://hieuhacking.blogspot.com/2009/09/log-rotation-for-python-process.html
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    98