#!/usr/bin/python

# Copyright 2012 Google Inc. All Rights Reserved.

"""Unittest for machine_manager."""
import unittest

import label
import machine_manager


class MyMachineManager(machine_manager.MachineManager):

  def __init__(self, chromeos_root):
    super(MyMachineManager, self).__init__(chromeos_root, 0)

  def _TryToLockMachine(self, cros_machine):
    self._machines.append(cros_machine)
    cros_machine.checksum = ""

  def AddMachine(self, machine_name):
    with self._lock:
      for m in self._all_machines:
        assert m.name != machine_name, "Tried to double-add %s" % machine_name
      cm = machine_manager.MockCrosMachine(machine_name, self.chromeos_root)
      assert cm.machine_checksum, ("Could not find checksum for machine %s" %
                                   machine_name)
      self._all_machines.append(cm)

CHROMEOS_ROOT = "/tmp/chromeos-root"
MACHINE_NAMES = ["lumpy1", "lumpy2", "lumpy3", "daisy1", "daisy2"]
LABEL_LUMPY = label.MockLabel("lumpy", "image", CHROMEOS_ROOT, "lumpy",
                              ["lumpy1", "lumpy2", "lumpy3", "lumpy4"],
                              "", "", "")
LABEL_MIX = label.MockLabel("mix", "image", CHROMEOS_ROOT, "mix",
                            ["daisy1", "daisy2", "lumpy3", "lumpy4"],
                            "", "", "")


class MachineManagerTest(unittest.TestCase):

  def testAreAllMachineSame(self):
    manager = MyMachineManager(CHROMEOS_ROOT)
    for m in MACHINE_NAMES:
      manager.AddMachine(m)
    self.assertEqual(manager.AreAllMachineSame(LABEL_LUMPY), True)
    self.assertEqual(manager.AreAllMachineSame(LABEL_MIX), False)

  def testGetMachines(self):
    manager = MyMachineManager(CHROMEOS_ROOT)
    for m in MACHINE_NAMES:
      manager.AddMachine(m)
    names = [m.name for m in manager.GetMachines(LABEL_LUMPY)]
    self.assertEqual(names, ["lumpy1", "lumpy2", "lumpy3"])

  def testGetAvailableMachines(self):
    manager = MyMachineManager(CHROMEOS_ROOT)
    for m in MACHINE_NAMES:
      manager.AddMachine(m)
    for m in manager._all_machines:
      if int(m.name[-1]) % 2:
        manager._TryToLockMachine(m)
    names = [m.name for m in manager.GetAvailableMachines(LABEL_LUMPY)]
    self.assertEqual(names, ["lumpy1", "lumpy3"])

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