def testThreadsafeCounterConstructor(self):
        """ Test ThreadsafeCounter constructor """

        # Test with default args
        counter = threading_utils.ThreadsafeCounter()
        self.assertEqual(counter.value, 0)

        # Test with explicit initial value
        counter = threading_utils.ThreadsafeCounter(999)
        self.assertEqual(counter.value, 999)
    def testThreadsafeCounterContextManager(self):
        """ Test ThreadsafeCounter context manager """

        counter = threading_utils.ThreadsafeCounter(10)
        with counter as currentValue1:
            self.assertEqual(currentValue1, 11)
            # We get away with it because in this test there is no true concurrency
            self.assertEqual(counter.value, 11)

            # Test reentrancy
            with counter as currentValue2:
                self.assertEqual(currentValue2, 12)
                self.assertEqual(counter.value, 12)

            self.assertEqual(counter.value, 11)

        self.assertEqual(counter.value, 10)
    def testThreadsafeCounterAdjust(self):
        """ test ThreadsafeCounter.adjust() """

        counter = threading_utils.ThreadsafeCounter(1)

        self.assertEqual(counter.value, 1)

        self.assertEqual(counter.adjust(7), 8)
        self.assertEqual(counter.value, 8)

        self.assertEqual(counter.adjust(-3), 5)
        self.assertEqual(counter.value, 5)

        # Test combination of context manager and adjust
        with counter as currentValue:
            self.assertEqual(currentValue, 6)
            self.assertEqual(counter.value, 6)

            self.assertEqual(counter.adjust(-6), 0)
            self.assertEqual(counter.value, 0)

        self.assertEqual(counter.value, -1)
  def __init__(self, listeningAddr, handlerClass):
    self.concurrencyTracker = threading_utils.ThreadsafeCounter()

    super(ThreadedTCPServer, self).__init__(listeningAddr, handlerClass)