#!/usr/bin/env python2
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import mox
import threading
import time
import unittest

import common
from autotest_lib.client.common_lib import decorators


class InContextTest(mox.MoxTestBase):
    """ Unit tests for the in_context decorator. """

    @decorators.in_context('lock')
    def inc_count(self):
        """ Do a slow, racy read/write. """
        temp = self.count
        time.sleep(0.0001)
        self.count = temp + 1


    def testDecorator(self):
        """ Test that the decorator works by using it with a lock. """
        self.count = 0
        self.lock = threading.RLock()
        iters = 100
        num_threads = 20
        # Note that it is important for us to go through all this bother to call
        # a method in_context N times rather than call a method in_context that
        # does something N times, because by doing the former, we acquire the
        # context N times (1 time for the latter).
        thread_body = lambda f, n: [f() for i in xrange(n)]
        threads = [threading.Thread(target=thread_body,
                                    args=(self.inc_count, iters))
                   for i in xrange(num_threads)]
        for thread in threads:
            thread.start()
        for thread in threads:
            thread.join()
        self.assertEquals(iters * num_threads, self.count)


class CachedPropertyTest(unittest.TestCase):
    def testIt(self):
        """cached_property"""
        class Example(object):
            def __init__(self, v=0):
                self.val = v

            @decorators.cached_property
            def prop(self):
                self.val = self.val + 1
                return self.val

        ex = Example()
        self.assertEquals(1, ex.prop)
        self.assertEquals(1, ex.prop)

        ex2 = Example(v=5)
        self.assertEquals(6, ex2.prop)


if __name__ == '__main__':
    unittest.main()
