#!/usr/bin/env python2
# -*- coding: utf-8 -*-
#
# Copyright (c) 2012 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.

"""Test module containing unittests for CTest."""

from __future__ import print_function

import mox
import os
import sys
import unittest

import constants
sys.path.append(constants.SOURCE_ROOT)
sys.path.append(constants.CROS_PLATFORM_ROOT)

from chromite.lib import cros_build_lib
from crostestutils.lib import image_extractor
import ctest


class CTestTest(mox.MoxTestBase):
  """Testing the test-worthy methods in CTest."""

  FAKE_ROOT = '/fake/root'
  ARCHIVE_DIR = os.path.join(FAKE_ROOT, 'x86-generic-full')

  def testFindTargetAndBaseImagesNoBaseNoArchive(self):
    """Tests whether we can set the right vars if no Base image found.

    If no base is found and there is no latest image, we should test the target
    against the base.
    """
    self.mox.StubOutWithMock(ctest.CTest, '__init__')
    self.mox.StubOutWithMock(image_extractor.ImageExtractor, 'GetLatestImage')

    # TODO(sosa): Can we create mock objects but call a real method in an easier
    # way?
    ctest.CTest.__init__(None)
    # pylint: disable=no-value-for-parameter
    # For some reason pylint is not happy with the way mox mocks out functions.
    image_extractor.ImageExtractor.GetLatestImage(
        'target_version').AndReturn(None)
    # pylint: enable=no-value-for-parameter

    self.mox.ReplayAll()
    ctester = ctest.CTest(None) # Calls mocked out __init__.
    ctester.target = 'some_image/target_version/file.bin'
    ctester.base = None
    ctester.FindTargetAndBaseImages()
    self.mox.VerifyAll()
    self.assertEqual(ctester.base, ctester.target)

  def testFindTargetAndBaseImagesBaseWithLatest(self):
    """Tests whether we can set the right vars if base image found in archive.

    Tests whether if we find a latest image, that we unzip it and set the
    base accordingly.
    """
    self.mox.StubOutWithMock(ctest.CTest, '__init__')
    self.mox.StubOutWithMock(image_extractor.ImageExtractor, 'GetLatestImage')
    self.mox.StubOutWithMock(image_extractor.ImageExtractor, 'UnzipImage')

    latest_base_dir = '/some/fake/path'
    latest_base_path = os.path.join(
        '/some/fake/path', image_extractor.ImageExtractor.IMAGE_TO_EXTRACT)

    ctest.CTest.__init__(None)
    # pylint: disable=no-value-for-parameter
    image_extractor.ImageExtractor.GetLatestImage('target_version').AndReturn(
        latest_base_dir)
    image_extractor.ImageExtractor.UnzipImage(latest_base_dir).AndReturn(
        latest_base_path)
    # pylint: enable=no-value-for-parameter

    self.mox.ReplayAll()
    ctester = ctest.CTest(None) # Calls mocked out __init__.
    ctester.target = 'some_image/target_version/file.bin'
    ctester.base = None
    ctester.FindTargetAndBaseImages()
    self.mox.VerifyAll()
    self.assertEqual(ctester.base, latest_base_path)

  def testFindTargetAndBaseImagesBaseNothingSetSimple(self):
    """Tests whether we can set the right vars if no target or base set.

    Tests whether if there is no local archive and no target set, vars are set
    correctly.  This means target should be inferred and base should be set to
    target.
    """
    self.mox.StubOutWithMock(cros_build_lib, 'RunCommand')
    self.mox.StubOutWithMock(ctest.CTest, '__init__')
    self.mox.StubOutWithMock(image_extractor.ImageExtractor, 'GetLatestImage')
    self.mox.StubOutWithMock(os, 'readlink')

    fake_crosutils = os.path.join(self.FAKE_ROOT, 'src', 'scripts')
    img_dir = os.path.join(constants.SOURCE_ROOT, 'src', 'build', 'images',
                           'board', 'latest')
    expected_base = os.path.join(constants.SOURCE_ROOT, 'src', 'build',
                                 'images', 'board', 'linkval')

    ctest.CTest.__init__(None)
    # pylint: disable=no-value-for-parameter
    os.readlink(img_dir).AndReturn('linkval')
    image_extractor.ImageExtractor.GetLatestImage('linkval').AndReturn(None)
    # pylint: enable=no-value-for-parameter

    self.mox.ReplayAll()
    ctester = ctest.CTest(None) # Calls mocked out __init__.
    ctester.target = None
    ctester.base = None
    ctester.board = 'board'
    ctester.crosutils_root = fake_crosutils
    ctester.FindTargetAndBaseImages()
    self.mox.VerifyAll()
    self.assertEqual(ctester.base, ctester.target)
    self.assertEqual(ctester.base, os.path.join(
        expected_base, image_extractor.ImageExtractor.IMAGE_TO_EXTRACT))


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