from test import test_support

import unittest

import dummy_threading as _threading

import time



class DummyThreadingTestCase(unittest.TestCase):



    class TestThread(_threading.Thread):



        def run(self):

            global running

            global sema

            global mutex

            # Uncomment if testing another module, such as the real 'threading'

            # module.

            #delay = random.random() * 2

            delay = 0

            if test_support.verbose:

                print 'task', self.name, 'will run for', delay, 'sec'

            sema.acquire()

            mutex.acquire()

            running += 1

            if test_support.verbose:

                print running, 'tasks are running'

            mutex.release()

            time.sleep(delay)

            if test_support.verbose:

                print 'task', self.name, 'done'

            mutex.acquire()

            running -= 1

            if test_support.verbose:

                print self.name, 'is finished.', running, 'tasks are running'

            mutex.release()

            sema.release()



    def setUp(self):

        self.numtasks = 10

        global sema

        sema = _threading.BoundedSemaphore(value=3)

        global mutex

        mutex = _threading.RLock()

        global running

        running = 0

        self.threads = []



    def test_tasks(self):

        for i in range(self.numtasks):

            t = self.TestThread(name="<thread %d>"%i)

            self.threads.append(t)

            t.start()



        if test_support.verbose:

            print 'waiting for all tasks to complete'

        for t in self.threads:

            t.join()

        if test_support.verbose:

            print 'all tasks done'



def test_main():

    test_support.run_unittest(DummyThreadingTestCase)



if __name__ == '__main__':

    test_main()

