#!/usr/bin/python
#
# Copyright 2010 Google Inc. All Rights Reserved.

"""lock_machine.py related unit-tests.

MachineManagerTest tests MachineManager.
"""

__author__ = "asharif@google.com (Ahmad Sharif)"

from multiprocessing import Process
import time
import unittest

import lock_machine


def LockAndSleep(machine):
  lock_machine.Machine(machine, auto=True).Lock(exclusive=True)
  time.sleep(1)


class MachineTest(unittest.TestCase):
  def setUp(self):
    pass

  def testRepeatedUnlock(self):
    mach = lock_machine.Machine("qqqraymes.mtv")
    for i in range(10):
      self.assertFalse(mach.Unlock())
    mach = lock_machine.Machine("qqqraymes.mtv", auto=True)
    for i in range(10):
      self.assertFalse(mach.Unlock())

  def testLockUnlock(self):
    mach = lock_machine.Machine("otter.mtv", "/tmp")
    for i in range(10):
      self.assertTrue(mach.Lock(exclusive=True))
      self.assertTrue(mach.Unlock(exclusive=True))

    mach = lock_machine.Machine("otter.mtv", "/tmp", True)
    for i in range(10):
      self.assertTrue(mach.Lock(exclusive=True))
      self.assertTrue(mach.Unlock(exclusive=True))

  def testSharedLock(self):
    mach = lock_machine.Machine("chrotomation.mtv")
    for i in range(10):
      self.assertTrue(mach.Lock(exclusive=False))
    for i in range(10):
      self.assertTrue(mach.Unlock(exclusive=False))
    self.assertTrue(mach.Lock(exclusive=True))
    self.assertTrue(mach.Unlock(exclusive=True))

    mach = lock_machine.Machine("chrotomation.mtv", auto=True)
    for i in range(10):
      self.assertTrue(mach.Lock(exclusive=False))
    for i in range(10):
      self.assertTrue(mach.Unlock(exclusive=False))
    self.assertTrue(mach.Lock(exclusive=True))
    self.assertTrue(mach.Unlock(exclusive=True))

  def testExclusiveLock(self):
    mach = lock_machine.Machine("atree.mtv")
    self.assertTrue(mach.Lock(exclusive=True))
    for i in range(10):
      self.assertFalse(mach.Lock(exclusive=True))
      self.assertFalse(mach.Lock(exclusive=False))
    self.assertTrue(mach.Unlock(exclusive=True))

    mach = lock_machine.Machine("atree.mtv", auto=True)
    self.assertTrue(mach.Lock(exclusive=True))
    for i in range(10):
      self.assertFalse(mach.Lock(exclusive=True))
      self.assertFalse(mach.Lock(exclusive=False))
    self.assertTrue(mach.Unlock(exclusive=True))

  def testExclusiveState(self):
    mach = lock_machine.Machine("testExclusiveState")
    self.assertTrue(mach.Lock(exclusive=True))
    for i in range(10):
      self.assertFalse(mach.Lock(exclusive=False))
    self.assertTrue(mach.Unlock(exclusive=True))

    mach = lock_machine.Machine("testExclusiveState", auto=True)
    self.assertTrue(mach.Lock(exclusive=True))
    for i in range(10):
      self.assertFalse(mach.Lock(exclusive=False))
    self.assertTrue(mach.Unlock(exclusive=True))

  def testAutoLockGone(self):
    mach = lock_machine.Machine("lockgone", auto=True)
    p = Process(target=LockAndSleep, args=("lockgone",))
    p.start()
    time.sleep(1.1)
    p.join()
    self.assertTrue(mach.Lock(exclusive=True))

  def testAutoLockFromOther(self):
    mach = lock_machine.Machine("other_lock", auto=True)
    p = Process(target=LockAndSleep, args=("other_lock",))
    p.start()
    time.sleep(0.5)
    self.assertFalse(mach.Lock(exclusive=True))
    p.join()
    time.sleep(0.6)
    self.assertTrue(mach.Lock(exclusive=True))

  def testUnlockByOthers(self):
    mach = lock_machine.Machine("other_unlock", auto=True)
    p = Process(target=LockAndSleep, args=("other_unlock",))
    p.start()
    time.sleep(0.5)
    self.assertTrue(mach.Unlock(exclusive=True))
    self.assertTrue(mach.Lock(exclusive=True))


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