#!/usr/bin/python2

# Copyright 2012 Google Inc. All Rights Reserved.
"""Unittest for machine_manager."""

from __future__ import print_function

import os.path
import time
import hashlib

import mock
import unittest

import label
import machine_manager
import image_checksummer
import test_flag

from benchmark import Benchmark
from benchmark_run import MockBenchmarkRun
from cros_utils import command_executer
from cros_utils import logger

# pylint: disable=protected-access


class MyMachineManager(machine_manager.MachineManager):
  """Machine manager for test."""

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

  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,
                                           'average')
      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', 'lumpy_chromeos_image', CHROMEOS_ROOT,
                              'lumpy', ['lumpy1', 'lumpy2', 'lumpy3', 'lumpy4'],
                              '', '', False, 'average,'
                              'gcc', None)
LABEL_MIX = label.MockLabel('mix', 'chromeos_image', CHROMEOS_ROOT, 'mix',
                            ['daisy1', 'daisy2', 'lumpy3', 'lumpy4'], '', '',
                            False, 'average', 'gcc', None)


class MachineManagerTest(unittest.TestCase):
  """Test for machine manager class."""

  msgs = []
  image_log = []
  log_fatal_msgs = []
  fake_logger_count = 0
  fake_logger_msgs = []

  mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter)

  mock_logger = mock.Mock(spec=logger.Logger)

  mock_lumpy1 = mock.Mock(spec=machine_manager.CrosMachine)
  mock_lumpy2 = mock.Mock(spec=machine_manager.CrosMachine)
  mock_lumpy3 = mock.Mock(spec=machine_manager.CrosMachine)
  mock_lumpy4 = mock.Mock(spec=machine_manager.CrosMachine)
  mock_daisy1 = mock.Mock(spec=machine_manager.CrosMachine)
  mock_daisy2 = mock.Mock(spec=machine_manager.CrosMachine)

  @mock.patch.object(os.path, 'isdir')

  # pylint: disable=arguments-differ
  def setUp(self, mock_isdir):

    mock_isdir.return_value = True
    self.mm = machine_manager.MachineManager(
        '/usr/local/chromeos', 0, 'average', None, self.mock_cmd_exec,
        self.mock_logger)

    self.mock_lumpy1.name = 'lumpy1'
    self.mock_lumpy2.name = 'lumpy2'
    self.mock_lumpy3.name = 'lumpy3'
    self.mock_lumpy4.name = 'lumpy4'
    self.mock_daisy1.name = 'daisy1'
    self.mock_daisy2.name = 'daisy2'
    self.mock_lumpy1.machine_checksum = 'lumpy123'
    self.mock_lumpy2.machine_checksum = 'lumpy123'
    self.mock_lumpy3.machine_checksum = 'lumpy123'
    self.mock_lumpy4.machine_checksum = 'lumpy123'
    self.mock_daisy1.machine_checksum = 'daisy12'
    self.mock_daisy2.machine_checksum = 'daisy12'
    self.mock_lumpy1.checksum_string = 'lumpy_checksum_str'
    self.mock_lumpy2.checksum_string = 'lumpy_checksum_str'
    self.mock_lumpy3.checksum_string = 'lumpy_checksum_str'
    self.mock_lumpy4.checksum_string = 'lumpy_checksum_str'
    self.mock_daisy1.checksum_string = 'daisy_checksum_str'
    self.mock_daisy2.checksum_string = 'daisy_checksum_str'
    self.mock_lumpy1.cpuinfo = 'lumpy_cpu_info'
    self.mock_lumpy2.cpuinfo = 'lumpy_cpu_info'
    self.mock_lumpy3.cpuinfo = 'lumpy_cpu_info'
    self.mock_lumpy4.cpuinfo = 'lumpy_cpu_info'
    self.mock_daisy1.cpuinfo = 'daisy_cpu_info'
    self.mock_daisy2.cpuinfo = 'daisy_cpu_info'
    self.mm._all_machines.append(self.mock_daisy1)
    self.mm._all_machines.append(self.mock_daisy2)
    self.mm._all_machines.append(self.mock_lumpy1)
    self.mm._all_machines.append(self.mock_lumpy2)
    self.mm._all_machines.append(self.mock_lumpy3)

  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'])

  @mock.patch.object(time, 'sleep')
  @mock.patch.object(command_executer.CommandExecuter, 'RunCommand')
  @mock.patch.object(command_executer.CommandExecuter, 'CrosRunCommand')
  @mock.patch.object(image_checksummer.ImageChecksummer, 'Checksum')
  def test_image_machine(self, mock_checksummer, mock_run_croscmd, mock_run_cmd,
                         mock_sleep):

    def FakeMD5Checksum(_input_str):
      return 'machine_fake_md5_checksum'

    self.fake_logger_count = 0
    self.fake_logger_msgs = []

    def FakeLogOutput(msg):
      self.fake_logger_count += 1
      self.fake_logger_msgs.append(msg)

    def ResetValues():
      self.fake_logger_count = 0
      self.fake_logger_msgs = []
      mock_run_cmd.reset_mock()
      mock_run_croscmd.reset_mock()
      mock_checksummer.reset_mock()
      mock_sleep.reset_mock()
      machine.checksum = 'fake_md5_checksum'
      self.mm.checksum = None
      self.mm.num_reimages = 0

    self.mock_cmd_exec.CrosRunCommand = mock_run_croscmd
    self.mock_cmd_exec.RunCommand = mock_run_cmd

    self.mm.logger.LogOutput = FakeLogOutput
    machine = self.mock_lumpy1
    machine._GetMD5Checksum = FakeMD5Checksum
    machine.checksum = 'fake_md5_checksum'
    mock_checksummer.return_value = 'fake_md5_checksum'
    self.mock_cmd_exec.log_level = 'verbose'

    test_flag.SetTestMode(True)
    # Test 1: label.image_type == "local"
    LABEL_LUMPY.image_type = 'local'
    self.mm.ImageMachine(machine, LABEL_LUMPY)
    self.assertEqual(mock_run_cmd.call_count, 0)
    self.assertEqual(mock_run_croscmd.call_count, 0)

    #Test 2: label.image_type == "trybot"
    ResetValues()
    LABEL_LUMPY.image_type = 'trybot'
    mock_run_cmd.return_value = 0
    self.mm.ImageMachine(machine, LABEL_LUMPY)
    self.assertEqual(mock_run_croscmd.call_count, 0)
    self.assertEqual(mock_checksummer.call_count, 0)

    # Test 3: label.image_type is neither local nor trybot; retval from
    # RunCommand is 1, i.e. image_chromeos fails...
    ResetValues()
    LABEL_LUMPY.image_type = 'other'
    mock_run_cmd.return_value = 1
    try:
      self.mm.ImageMachine(machine, LABEL_LUMPY)
    except Exception:
      self.assertEqual(mock_checksummer.call_count, 0)
      self.assertEqual(mock_run_cmd.call_count, 2)
      self.assertEqual(mock_run_croscmd.call_count, 1)
      self.assertEqual(mock_sleep.call_count, 1)
      image_call_args_str = mock_run_cmd.call_args[0][0]
      image_call_args = image_call_args_str.split(' ')
      self.assertEqual(image_call_args[0], 'python')
      self.assertEqual(image_call_args[1].split('/')[-1], 'image_chromeos.pyc')
      image_call_args = image_call_args[2:]
      self.assertEqual(image_call_args,
                       ['--chromeos_root=/tmp/chromeos-root',
                        '--image=lumpy_chromeos_image', '--image_args=',
                        '--remote=lumpy1', '--logging_level=average',
                        '--board=lumpy'])
      self.assertEqual(mock_run_croscmd.call_args[0][0], 'reboot && exit')

    # Test 4: Everything works properly. Trybot image type.
    ResetValues()
    LABEL_LUMPY.image_type = 'trybot'
    mock_run_cmd.return_value = 0
    self.mm.ImageMachine(machine, LABEL_LUMPY)
    self.assertEqual(mock_checksummer.call_count, 0)
    self.assertEqual(mock_run_croscmd.call_count, 0)
    self.assertEqual(mock_sleep.call_count, 0)

  def test_compute_common_checksum(self):

    self.mm.machine_checksum = {}
    self.mm.ComputeCommonCheckSum(LABEL_LUMPY)
    self.assertEqual(self.mm.machine_checksum['lumpy'], 'lumpy123')
    self.assertEqual(len(self.mm.machine_checksum), 1)

    self.mm.machine_checksum = {}
    self.assertRaises(machine_manager.BadChecksum,
                      self.mm.ComputeCommonCheckSum, LABEL_MIX)

  def test_compute_common_checksum_string(self):
    self.mm.machine_checksum_string = {}
    self.mm.ComputeCommonCheckSumString(LABEL_LUMPY)
    self.assertEqual(len(self.mm.machine_checksum_string), 1)
    self.assertEqual(self.mm.machine_checksum_string['lumpy'],
                     'lumpy_checksum_str')

    self.mm.machine_checksum_string = {}
    self.mm.ComputeCommonCheckSumString(LABEL_MIX)
    self.assertEqual(len(self.mm.machine_checksum_string), 1)
    self.assertEqual(self.mm.machine_checksum_string['mix'],
                     'daisy_checksum_str')

  @mock.patch.object(command_executer.CommandExecuter, 'CrosRunCommandWOutput')
  def test_try_to_lock_machine(self, mock_cros_runcmd):
    self.assertRaises(self.mm._TryToLockMachine, None)

    mock_cros_runcmd.return_value = [0, 'false_lock_checksum', '']
    self.mock_cmd_exec.CrosRunCommandWOutput = mock_cros_runcmd
    self.mm._machines = []
    self.mm._TryToLockMachine(self.mock_lumpy1)
    self.assertEqual(len(self.mm._machines), 1)
    self.assertEqual(self.mm._machines[0], self.mock_lumpy1)
    self.assertEqual(self.mock_lumpy1.checksum, 'false_lock_checksum')
    self.assertEqual(mock_cros_runcmd.call_count, 1)
    cmd_str = mock_cros_runcmd.call_args[0][0]
    self.assertEqual(cmd_str, 'cat /usr/local/osimage_checksum_file')
    args_dict = mock_cros_runcmd.call_args[1]
    self.assertEqual(len(args_dict), 2)
    self.assertEqual(args_dict['machine'], self.mock_lumpy1.name)
    self.assertEqual(args_dict['chromeos_root'], '/usr/local/chromeos')

  @mock.patch.object(machine_manager, 'CrosMachine')
  def test_add_machine(self, mock_machine):

    mock_machine.machine_checksum = 'daisy123'
    self.assertEqual(len(self.mm._all_machines), 5)
    self.mm.AddMachine('daisy3')
    self.assertEqual(len(self.mm._all_machines), 6)

    self.assertRaises(Exception, self.mm.AddMachine, 'lumpy1')

  def test_remove_machine(self):
    self.mm._machines = self.mm._all_machines
    self.assertTrue(self.mock_lumpy2 in self.mm._machines)
    self.mm.RemoveMachine(self.mock_lumpy2.name)
    self.assertFalse(self.mock_lumpy2 in self.mm._machines)

  def test_force_same_image_to_all_machines(self):
    self.image_log = []

    def FakeImageMachine(machine, label_arg):
      image = label_arg.chromeos_image
      self.image_log.append('Pushed %s onto %s' % (image, machine.name))

    def FakeSetUpChecksumInfo():
      pass

    self.mm.ImageMachine = FakeImageMachine
    self.mock_lumpy1.SetUpChecksumInfo = FakeSetUpChecksumInfo
    self.mock_lumpy2.SetUpChecksumInfo = FakeSetUpChecksumInfo
    self.mock_lumpy3.SetUpChecksumInfo = FakeSetUpChecksumInfo

    self.mm.ForceSameImageToAllMachines(LABEL_LUMPY)
    self.assertEqual(len(self.image_log), 3)
    self.assertEqual(self.image_log[0],
                     'Pushed lumpy_chromeos_image onto lumpy1')
    self.assertEqual(self.image_log[1],
                     'Pushed lumpy_chromeos_image onto lumpy2')
    self.assertEqual(self.image_log[2],
                     'Pushed lumpy_chromeos_image onto lumpy3')

  @mock.patch.object(image_checksummer.ImageChecksummer, 'Checksum')
  @mock.patch.object(hashlib, 'md5')
  def test_acquire_machine(self, mock_md5, mock_checksum):

    self.msgs = []
    self.log_fatal_msgs = []

    def FakeLock(machine):
      self.msgs.append('Tried to lock %s' % machine.name)

    def FakeLogFatal(msg):
      self.log_fatal_msgs.append(msg)

    self.mm._TryToLockMachine = FakeLock
    self.mm.logger.LogFatal = FakeLogFatal

    mock_md5.return_value = '123456'
    mock_checksum.return_value = 'fake_md5_checksum'

    self.mm._machines = self.mm._all_machines
    self.mock_lumpy1.locked = True
    self.mock_lumpy2.locked = True
    self.mock_lumpy3.locked = False
    self.mock_lumpy3.checksum = 'fake_md5_checksum'
    self.mock_daisy1.locked = True
    self.mock_daisy2.locked = False
    self.mock_daisy2.checksum = 'fake_md5_checksum'

    self.mock_lumpy1.released_time = time.time()
    self.mock_lumpy2.released_time = time.time()
    self.mock_lumpy3.released_time = time.time()
    self.mock_daisy1.released_time = time.time()
    self.mock_daisy2.released_time = time.time()

    # Test 1. Basic test. Acquire lumpy3.
    self.mm.AcquireMachine(LABEL_LUMPY)
    m = self.mock_lumpy1
    self.assertEqual(m, self.mock_lumpy1)
    self.assertTrue(self.mock_lumpy1.locked)
    self.assertEqual(mock_md5.call_count, 0)
    self.assertEqual(self.msgs, ['Tried to lock lumpy1', 'Tried to lock lumpy2',
                                 'Tried to lock lumpy3'])

    # Test the second return statment (machine is unlocked, has no checksum)
    save_locked = self.mock_lumpy1.locked
    self.mock_lumpy1.locked = False
    self.mock_lumpy1.checksum = None
    m = self.mm.AcquireMachine(LABEL_LUMPY)
    self.assertEqual(m, self.mock_lumpy1)
    self.assertTrue(self.mock_lumpy1.locked)

    # Test the third return statement:
    #   - machine is unlocked
    #   - checksums don't match
    #   - current time minus release time is > 20.
    self.mock_lumpy1.locked = False
    self.mock_lumpy1.checksum = '123'
    self.mock_lumpy1.released_time = time.time() - 8
    m = self.mm.AcquireMachine(LABEL_LUMPY)
    self.assertEqual(m, self.mock_lumpy1)
    self.assertTrue(self.mock_lumpy1.locked)

    # Test all machines are already locked.
    m = self.mm.AcquireMachine(LABEL_LUMPY)
    self.assertIsNone(m)

    # Restore values of mock_lumpy1, so other tests succeed.
    self.mock_lumpy1.locked = save_locked
    self.mock_lumpy1.checksum = '123'

  def test_get_available_machines(self):
    self.mm._machines = self.mm._all_machines

    machine_list = self.mm.GetAvailableMachines()
    self.assertEqual(machine_list, self.mm._all_machines)

    machine_list = self.mm.GetAvailableMachines(LABEL_MIX)
    self.assertEqual(machine_list, [self.mock_daisy1, self.mock_daisy2,
                                    self.mock_lumpy3])

    machine_list = self.mm.GetAvailableMachines(LABEL_LUMPY)
    self.assertEqual(machine_list, [self.mock_lumpy1, self.mock_lumpy2,
                                    self.mock_lumpy3])

  def test_get_machines(self):
    machine_list = self.mm.GetMachines()
    self.assertEqual(machine_list, self.mm._all_machines)

    machine_list = self.mm.GetMachines(LABEL_MIX)
    self.assertEqual(machine_list, [self.mock_daisy1, self.mock_daisy2,
                                    self.mock_lumpy3])

    machine_list = self.mm.GetMachines(LABEL_LUMPY)
    self.assertEqual(machine_list, [self.mock_lumpy1, self.mock_lumpy2,
                                    self.mock_lumpy3])

  def test_release_machines(self):

    self.mm._machines = [self.mock_lumpy1, self.mock_daisy2]

    self.mock_lumpy1.locked = True
    self.mock_daisy2.locked = True

    self.assertTrue(self.mock_lumpy1.locked)
    self.mm.ReleaseMachine(self.mock_lumpy1)
    self.assertFalse(self.mock_lumpy1.locked)
    self.assertEqual(self.mock_lumpy1.status, 'Available')

    self.assertTrue(self.mock_daisy2.locked)
    self.mm.ReleaseMachine(self.mock_daisy2)
    self.assertFalse(self.mock_daisy2.locked)
    self.assertEqual(self.mock_daisy2.status, 'Available')

    # Test double-relase...
    self.assertRaises(AssertionError, self.mm.ReleaseMachine, self.mock_lumpy1)

  def test_cleanup(self):
    self.mock_logger.reset_mock()
    self.mm.Cleanup()
    self.assertEqual(self.mock_logger.call_count, 0)

  OUTPUT_STR = ('Machine Status:\nMachine                        Thread     '
                'Lock Status                    Checksum'
                '                        \nlumpy1                         test '
                'run   True PENDING                   123'
                '                             \nlumpy2                         '
                'test run   False PENDING                   123'
                '                             \nlumpy3                         '
                'test run   False PENDING                   123'
                '                             \ndaisy1                         '
                'test run   False PENDING                   678'
                '                             \ndaisy2                         '
                'test run   True PENDING                   678'
                '                             ')

  def test_as_string(self):

    mock_logger = mock.Mock(spec=logger.Logger)

    bench = Benchmark('page_cycler.netsim.top_10',    # name
                      'page_cycler.netsim.top_10',    # test_name
                      '',             # test_args
                      1,              # iteratins
                      False,          # rm_chroot_tmp
                      '',             # perf_args
                      suite='telemetry_Crosperf')     # suite

    test_run = MockBenchmarkRun('test run', bench, LABEL_LUMPY, 1, [], self.mm,
                                mock_logger, 'verbose', '')

    self.mm._machines = [self.mock_lumpy1, self.mock_lumpy2, self.mock_lumpy3,
                         self.mock_daisy1, self.mock_daisy2]

    self.mock_lumpy1.test_run = test_run
    self.mock_lumpy2.test_run = test_run
    self.mock_lumpy3.test_run = test_run
    self.mock_daisy1.test_run = test_run
    self.mock_daisy2.test_run = test_run

    self.mock_lumpy1.locked = True
    self.mock_lumpy2.locked = False
    self.mock_lumpy3.locked = False
    self.mock_daisy1.locked = False
    self.mock_daisy2.locked = True

    self.mock_lumpy1.checksum = '123'
    self.mock_lumpy2.checksum = '123'
    self.mock_lumpy3.checksum = '123'
    self.mock_daisy1.checksum = '678'
    self.mock_daisy2.checksum = '678'

    output = self.mm.AsString()
    self.assertEqual(output, self.OUTPUT_STR)

  def test_get_all_cpu_info(self):
    info = self.mm.GetAllCPUInfo([LABEL_LUMPY, LABEL_MIX])
    self.assertEqual(info,
                     'lumpy\n-------------------\nlumpy_cpu_info\n\n\nmix\n-'
                     '------------------\ndaisy_cpu_info\n\n\n')


MEMINFO_STRING = """MemTotal:        3990332 kB
MemFree:         2608396 kB
Buffers:          147168 kB
Cached:           811560 kB
SwapCached:            0 kB
Active:           503480 kB
Inactive:         628572 kB
Active(anon):     174532 kB
Inactive(anon):    88576 kB
Active(file):     328948 kB
Inactive(file):   539996 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       5845212 kB
SwapFree:        5845212 kB
Dirty:              9384 kB
Writeback:             0 kB
AnonPages:        173408 kB
Mapped:           146268 kB
Shmem:             89676 kB
Slab:             188260 kB
SReclaimable:     169208 kB
SUnreclaim:        19052 kB
KernelStack:        2032 kB
PageTables:         7120 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     7840376 kB
Committed_AS:    1082032 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      364980 kB
VmallocChunk:   34359369407 kB
DirectMap4k:       45824 kB
DirectMap2M:     4096000 kB
"""

CPUINFO_STRING = """processor: 0
vendor_id: GenuineIntel
cpu family: 6
model: 42
model name: Intel(R) Celeron(R) CPU 867 @ 1.30GHz
stepping: 7
microcode: 0x25
cpu MHz: 1300.000
cache size: 2048 KB
physical id: 0
siblings: 2
core id: 0
cpu cores: 2
apicid: 0
initial apicid: 0
fpu: yes
fpu_exception: yes
cpuid level: 13
wp: yes
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave lahf_lm arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid
bogomips: 2594.17
clflush size: 64
cache_alignment: 64
address sizes: 36 bits physical, 48 bits virtual
power management:

processor: 1
vendor_id: GenuineIntel
cpu family: 6
model: 42
model name: Intel(R) Celeron(R) CPU 867 @ 1.30GHz
stepping: 7
microcode: 0x25
cpu MHz: 1300.000
cache size: 2048 KB
physical id: 0
siblings: 2
core id: 1
cpu cores: 2
apicid: 2
initial apicid: 2
fpu: yes
fpu_exception: yes
cpuid level: 13
wp: yes
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave lahf_lm arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid
bogomips: 2594.17
clflush size: 64
cache_alignment: 64
address sizes: 36 bits physical, 48 bits virtual
power management:
"""

CHECKSUM_STRING = ('processor: 0vendor_id: GenuineIntelcpu family: 6model: '
                   '42model name: Intel(R) Celeron(R) CPU 867 @ '
                   '1.30GHzstepping: 7microcode: 0x25cache size: 2048 '
                   'KBphysical id: 0siblings: 2core id: 0cpu cores: 2apicid: '
                   '0initial apicid: 0fpu: yesfpu_exception: yescpuid level: '
                   '13wp: yesflags: fpu vme de pse tsc msr pae mce cx8 apic sep'
                   ' mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse '
                   'sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc '
                   'arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc '
                   'aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 '
                   'ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt '
                   'tsc_deadline_timer xsave lahf_lm arat epb xsaveopt pln pts '
                   'dts tpr_shadow vnmi flexpriority ept vpidclflush size: '
                   '64cache_alignment: 64address sizes: 36 bits physical, 48 '
                   'bits virtualpower management:processor: 1vendor_id: '
                   'GenuineIntelcpu family: 6model: 42model name: Intel(R) '
                   'Celeron(R) CPU 867 @ 1.30GHzstepping: 7microcode: 0x25cache'
                   ' size: 2048 KBphysical id: 0siblings: 2core id: 1cpu cores:'
                   ' 2apicid: 2initial apicid: 2fpu: yesfpu_exception: yescpuid'
                   ' level: 13wp: yesflags: fpu vme de pse tsc msr pae mce cx8 '
                   'apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx '
                   'fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm '
                   'constant_tsc arch_perfmon pebs bts rep_good nopl xtopology '
                   'nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl '
                   'vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic '
                   'popcnt tsc_deadline_timer xsave lahf_lm arat epb xsaveopt '
                   'pln pts dts tpr_shadow vnmi flexpriority ept vpidclflush '
                   'size: 64cache_alignment: 64address sizes: 36 bits physical,'
                   ' 48 bits virtualpower management: 4194304')

DUMP_VPD_STRING = """
"PBA_SN"="Pba.txt"
"Product_S/N"="HT4L91SC300208"
"serial_number"="HT4L91SC300208Z"
"System_UUID"="12153006-1755-4f66-b410-c43758a71127"
"shipping_country"="US"
"initial_locale"="en-US"
"keyboard_layout"="xkb:us::eng"
"initial_timezone"="America/Los_Angeles"
"MACAddress"=""
"System_UUID"="29dd9c61-7fa1-4c83-b89a-502e7eb08afe"
"ubind_attribute"="0c433ce7585f486730b682bb05626a12ce2d896e9b57665387f8ce2ccfdcc56d2e2f1483"
"gbind_attribute"="7e9a851324088e269319347c6abb8d1572ec31022fa07e28998229afe8acb45c35a89b9d"
"ActivateDate"="2013-38"
"""

IFCONFIG_STRING = """
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.129.247  netmask 255.255.254.0  broadcast 172.17.129.255
        inet6 2620:0:1000:3002:143:fed4:3ff6:279d  prefixlen 64  scopeid 0x0<global>
        inet6 2620:0:1000:3002:4459:1399:1f02:9e4c  prefixlen 64  scopeid 0x0<global>
        inet6 2620:0:1000:3002:d9e4:87b:d4ec:9a0e  prefixlen 64  scopeid 0x0<global>
        inet6 2620:0:1000:3002:7d45:23f1:ea8a:9604  prefixlen 64  scopeid 0x0<global>
        inet6 2620:0:1000:3002:250:b6ff:fe63:db65  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::250:b6ff:fe63:db65  prefixlen 64  scopeid 0x20<link>
        ether 00:50:b6:63:db:65  txqueuelen 1000  (Ethernet)
        RX packets 9817166  bytes 10865181708 (10.1 GiB)
        RX errors 194  dropped 0  overruns 0  frame 194
        TX packets 0  bytes 2265811903 (2.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether e8:03:9a:9c:50:3d  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 16436
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 981004  bytes 1127468524 (1.0 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 981004  bytes 1127468524 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 44:6d:57:20:4a:c5  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
"""


class CrosMachineTest(unittest.TestCase):
  """Test for CrosMachine class."""

  mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter)

  @mock.patch.object(machine_manager.CrosMachine, 'SetUpChecksumInfo')
  def test_init(self, mock_setup):

    cm = machine_manager.CrosMachine('daisy.cros', '/usr/local/chromeos',
                                     'average', self.mock_cmd_exec)
    self.assertEqual(mock_setup.call_count, 1)
    self.assertEqual(cm.chromeos_root, '/usr/local/chromeos')
    self.assertEqual(cm.log_level, 'average')

  @mock.patch.object(machine_manager.CrosMachine, 'IsReachable')
  @mock.patch.object(machine_manager.CrosMachine, '_GetMemoryInfo')
  @mock.patch.object(machine_manager.CrosMachine, '_GetCPUInfo')
  @mock.patch.object(machine_manager.CrosMachine,
                     '_ComputeMachineChecksumString')
  @mock.patch.object(machine_manager.CrosMachine, '_GetMachineID')
  @mock.patch.object(machine_manager.CrosMachine, '_GetMD5Checksum')
  def test_setup_checksum_info(self, mock_md5sum, mock_machineid,
                               mock_checkstring, mock_cpuinfo, mock_meminfo,
                               mock_isreachable):

    # Test 1. Machine is not reachable; SetUpChecksumInfo is called via
    # __init__.
    mock_isreachable.return_value = False
    mock_md5sum.return_value = 'md5_checksum'
    cm = machine_manager.CrosMachine('daisy.cros', '/usr/local/chromeos',
                                     'average', self.mock_cmd_exec)
    cm.checksum_string = 'This is a checksum string.'
    cm.machine_id = 'machine_id1'
    self.assertEqual(mock_isreachable.call_count, 1)
    self.assertIsNone(cm.machine_checksum)
    self.assertEqual(mock_meminfo.call_count, 0)

    # Test 2. Machine is reachable. Call explicitly.
    mock_isreachable.return_value = True
    cm.checksum_string = 'This is a checksum string.'
    cm.machine_id = 'machine_id1'
    cm.SetUpChecksumInfo()
    self.assertEqual(mock_isreachable.call_count, 2)
    self.assertEqual(mock_meminfo.call_count, 1)
    self.assertEqual(mock_cpuinfo.call_count, 1)
    self.assertEqual(mock_checkstring.call_count, 1)
    self.assertEqual(mock_machineid.call_count, 1)
    self.assertEqual(mock_md5sum.call_count, 2)
    self.assertEqual(cm.machine_checksum, 'md5_checksum')
    self.assertEqual(cm.machine_id_checksum, 'md5_checksum')
    self.assertEqual(mock_md5sum.call_args_list[0][0][0],
                     'This is a checksum string.')
    self.assertEqual(mock_md5sum.call_args_list[1][0][0], 'machine_id1')

  @mock.patch.object(command_executer.CommandExecuter, 'CrosRunCommand')
  @mock.patch.object(machine_manager.CrosMachine, 'SetUpChecksumInfo')
  def test_is_reachable(self, mock_setup, mock_run_cmd):

    cm = machine_manager.CrosMachine('daisy.cros', '/usr/local/chromeos',
                                     'average', self.mock_cmd_exec)
    self.mock_cmd_exec.CrosRunCommand = mock_run_cmd

    # Test 1. CrosRunCommand returns 1 (fail)
    mock_run_cmd.return_value = 1
    result = cm.IsReachable()
    self.assertFalse(result)
    self.assertEqual(mock_setup.call_count, 1)
    self.assertEqual(mock_run_cmd.call_count, 1)

    # Test 2. CrosRunCommand returns 0 (success)
    mock_run_cmd.return_value = 0
    result = cm.IsReachable()
    self.assertTrue(result)
    self.assertEqual(mock_run_cmd.call_count, 2)
    first_args = mock_run_cmd.call_args_list[0]
    second_args = mock_run_cmd.call_args_list[1]
    self.assertEqual(first_args[0], second_args[0])
    self.assertEqual(first_args[1], second_args[1])
    self.assertEqual(len(first_args[0]), 1)
    self.assertEqual(len(first_args[1]), 2)
    self.assertEqual(first_args[0][0], 'ls')
    args_dict = first_args[1]
    self.assertEqual(args_dict['machine'], 'daisy.cros')
    self.assertEqual(args_dict['chromeos_root'], '/usr/local/chromeos')

  @mock.patch.object(machine_manager.CrosMachine, 'SetUpChecksumInfo')
  def test_parse_memory_info(self, _mock_setup):
    cm = machine_manager.CrosMachine('daisy.cros', '/usr/local/chromeos',
                                     'average', self.mock_cmd_exec)
    cm.meminfo = MEMINFO_STRING
    cm._ParseMemoryInfo()
    self.assertEqual(cm.phys_kbytes, 4194304)

  @mock.patch.object(command_executer.CommandExecuter, 'CrosRunCommandWOutput')
  @mock.patch.object(machine_manager.CrosMachine, 'SetUpChecksumInfo')
  def test_get_memory_info(self, _mock_setup, mock_run_cmd):
    cm = machine_manager.CrosMachine('daisy.cros', '/usr/local/chromeos',
                                     'average', self.mock_cmd_exec)
    self.mock_cmd_exec.CrosRunCommandWOutput = mock_run_cmd
    mock_run_cmd.return_value = [0, MEMINFO_STRING, '']
    cm._GetMemoryInfo()
    self.assertEqual(mock_run_cmd.call_count, 1)
    call_args = mock_run_cmd.call_args_list[0]
    self.assertEqual(call_args[0][0], 'cat /proc/meminfo')
    args_dict = call_args[1]
    self.assertEqual(args_dict['machine'], 'daisy.cros')
    self.assertEqual(args_dict['chromeos_root'], '/usr/local/chromeos')
    self.assertEqual(cm.meminfo, MEMINFO_STRING)
    self.assertEqual(cm.phys_kbytes, 4194304)

    mock_run_cmd.return_value = [1, MEMINFO_STRING, '']
    self.assertRaises(cm._GetMemoryInfo)

  @mock.patch.object(command_executer.CommandExecuter, 'CrosRunCommandWOutput')
  @mock.patch.object(machine_manager.CrosMachine, 'SetUpChecksumInfo')
  def test_get_cpu_info(self, _mock_setup, mock_run_cmd):
    cm = machine_manager.CrosMachine('daisy.cros', '/usr/local/chromeos',
                                     'average', self.mock_cmd_exec)
    self.mock_cmd_exec.CrosRunCommandWOutput = mock_run_cmd
    mock_run_cmd.return_value = [0, CPUINFO_STRING, '']
    cm._GetCPUInfo()
    self.assertEqual(mock_run_cmd.call_count, 1)
    call_args = mock_run_cmd.call_args_list[0]
    self.assertEqual(call_args[0][0], 'cat /proc/cpuinfo')
    args_dict = call_args[1]
    self.assertEqual(args_dict['machine'], 'daisy.cros')
    self.assertEqual(args_dict['chromeos_root'], '/usr/local/chromeos')
    self.assertEqual(cm.cpuinfo, CPUINFO_STRING)

  @mock.patch.object(machine_manager.CrosMachine, 'SetUpChecksumInfo')
  def test_compute_machine_checksum_string(self, _mock_setup):
    cm = machine_manager.CrosMachine('daisy.cros', '/usr/local/chromeos',
                                     'average', self.mock_cmd_exec)
    cm.cpuinfo = CPUINFO_STRING
    cm.meminfo = MEMINFO_STRING
    cm._ParseMemoryInfo()
    cm._ComputeMachineChecksumString()
    self.assertEqual(cm.checksum_string, CHECKSUM_STRING)

  @mock.patch.object(machine_manager.CrosMachine, 'SetUpChecksumInfo')
  def test_get_md5_checksum(self, _mock_setup):
    cm = machine_manager.CrosMachine('daisy.cros', '/usr/local/chromeos',
                                     'average', self.mock_cmd_exec)
    temp_str = 'abcde'
    checksum_str = cm._GetMD5Checksum(temp_str)
    self.assertEqual(checksum_str, 'ab56b4d92b40713acc5af89985d4b786')

    temp_str = ''
    checksum_str = cm._GetMD5Checksum(temp_str)
    self.assertEqual(checksum_str, '')

  @mock.patch.object(command_executer.CommandExecuter, 'CrosRunCommandWOutput')
  @mock.patch.object(machine_manager.CrosMachine, 'SetUpChecksumInfo')
  def test_get_machine_id(self, _mock_setup, mock_run_cmd):
    cm = machine_manager.CrosMachine('daisy.cros', '/usr/local/chromeos',
                                     'average', self.mock_cmd_exec)
    self.mock_cmd_exec.CrosRunCommandWOutput = mock_run_cmd
    mock_run_cmd.return_value = [0, DUMP_VPD_STRING, '']

    cm._GetMachineID()
    self.assertEqual(cm.machine_id, '"Product_S/N"="HT4L91SC300208"')

    mock_run_cmd.return_value = [0, IFCONFIG_STRING, '']
    cm._GetMachineID()
    self.assertEqual(
        cm.machine_id,
        '        ether 00:50:b6:63:db:65  txqueuelen 1000  (Ethernet)_        '
        'ether e8:03:9a:9c:50:3d  txqueuelen 1000  (Ethernet)_        ether '
        '44:6d:57:20:4a:c5  txqueuelen 1000  (Ethernet)')

    mock_run_cmd.return_value = [0, 'invalid hardware config', '']
    self.assertRaises(cm._GetMachineID)


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