# Copyright 2015 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.

"""This module tests the brillo blueprint command."""

from __future__ import print_function

from chromite.cli import command_unittest
from chromite.cli.brillo import brillo_blueprint
from chromite.lib import cros_test_lib


class MockBlueprintCommand(command_unittest.MockCommand):
  """Mock out the `brillo blueprint` command."""
  TARGET = 'chromite.cli.brillo.brillo_blueprint.BlueprintCommand'
  TARGET_CLASS = brillo_blueprint.BlueprintCommand
  COMMAND = 'blueprint'


class BlueprintCommandTest(cros_test_lib.OutputTestCase,
                           cros_test_lib.WorkspaceTestCase):
  """Test the flow of BlueprintCommand.Run()."""

  FOO_BRICK = '//bricks/foo'
  BAR_BRICK = '//bricks/bar'
  BSP_BRICK = '//bsp/my_bsp'

  def setUp(self):
    """Patches objects."""
    self.cmd_mock = None
    self.CreateWorkspace()
    # Create some fake bricks for testing.
    for brick in (self.FOO_BRICK, self.BAR_BRICK, self.BSP_BRICK):
      self.CreateBrick(brick)

  def SetupCommandMock(self, cmd_args):
    """Sets up the MockBlueprintCommand."""
    self.cmd_mock = MockBlueprintCommand(cmd_args)
    self.StartPatcher(self.cmd_mock)

  def RunCommandMock(self, *args, **kwargs):
    """Sets up and runs the MockBlueprintCommand."""
    self.SetupCommandMock(*args, **kwargs)
    self.cmd_mock.inst.Run()

  def testCreateBlueprint(self):
    """Tests basic blueprint creation."""
    with self.OutputCapturer():
      self.RunCommandMock(['create', 'foo'])
    self.AssertBlueprintExists('//blueprints/foo.json')
    # Also make sure we get a warning for the missing BSP.
    self.AssertOutputContainsWarning('No BSP was specified', check_stderr=True)

  def testCreateBlueprintBsp(self):
    """Tests --bsp argument."""
    self.RunCommandMock(['create', 'foo', '--bsp', self.BSP_BRICK])
    self.AssertBlueprintExists('//blueprints/foo.json', bsp=self.BSP_BRICK)

  def testCreateBlueprintBricks(self):
    """Tests --brick and -b arguments."""
    self.RunCommandMock(['create', 'foo', '--brick', self.FOO_BRICK,
                         '-b%s' % self.BAR_BRICK])
    self.AssertBlueprintExists('//blueprints/foo.json',
                               bricks=[self.FOO_BRICK, self.BAR_BRICK])

  def testCreateBlueprintAll(self):
    """Test --brick and --bsp arguments together."""
    self.RunCommandMock(['create', 'foo', '--brick', self.FOO_BRICK,
                         '--bsp', self.BSP_BRICK])
    self.AssertBlueprintExists('//blueprints/foo.json', bsp=self.BSP_BRICK,
                               bricks=[self.FOO_BRICK])

  def testBlueprintInvalidCommand(self):
    """Tests that `brillo blueprint` without `create` prints usage."""
    with self.OutputCapturer():
      with self.assertRaises(SystemExit):
        self.RunCommandMock([])
    self.AssertOutputContainsLine('usage:', check_stderr=True)
