#!/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.

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import mox
from six.moves import range
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 range(n)]
        threads = [threading.Thread(target=thread_body,
                                    args=(self.inc_count, iters))
                   for i in range(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()
