# -*- coding: utf-8 -*-
# Copyright 2019 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.

"""Unittests for workspace stages."""

from __future__ import print_function

import mock
import os
import shutil

from chromite.cbuildbot.builders import workspace_builders_unittest
from chromite.cbuildbot import commands
from chromite.cbuildbot import manifest_version
from chromite.cbuildbot.stages import branch_archive_stages
from chromite.cbuildbot.stages import generic_stages
from chromite.cbuildbot.stages import workspace_stages_unittest
from chromite.lib import cros_build_lib
from chromite.lib import gs
from chromite.lib import gs_unittest
from chromite.lib import osutils
from chromite.lib import portage_util

# pylint: disable=too-many-ancestors
# pylint: disable=protected-access

class BranchArchiveStageTestBase(workspace_stages_unittest.WorkspaceStageBase,
                                 gs_unittest.AbstractGSContextTest):
  """Base class for test suites."""

  def setUp(self):
    self.CreateMockOverlay('board', self.workspace)

    self.upload_mock = self.PatchObject(
        generic_stages.ArchivingStageMixin, 'UploadArtifact')

    # It would be nice to include the prefix in the return path. How?
    tempdir_mock = self.PatchObject(osutils, 'TempDir')
    tempdir_mock.return_value.__enter__.return_value = '/tempdir'

    self.copy_mock = self.PatchObject(shutil, 'copyfile')
    self.gs_copy_mock = self.PatchObject(gs.GSContext, 'CopyInto')

    self.push_mock = self.PatchObject(
        commands, 'PushImages')

    self.write_mock = self.PatchObject(osutils, 'WriteFile')

    self.read_overlay_file_mock = self.PatchObject(
        portage_util, 'ReadOverlayFile',
        return_value='{"extra_upload_urls":["gs://chromeos-extra-archive"]}')

  def ConstructStage(self):
    """Returns an instance of the stage to be tested.

    Note: Must be implemented in subclasses.
    """
    raise NotImplementedError(self, "ConstructStage: Implement in your test")


class FirmwareArchiveStageTest(BranchArchiveStageTestBase):
  """Test FirmwareArchiveStage."""

  def ConstructStage(self):
    self._run.attrs.version_info = manifest_version.VersionInfo(
        '10.0.0', chrome_branch='10')
    self._run.attrs.release_tag = 'infra-tag'

    return branch_archive_stages.FirmwareArchiveStage(
        self._run, self.buildstore, build_root=self.workspace, board='board')

  def testProd(self):
    """Tests sync command used by default."""
    self.PatchObject(commands, 'BuildFirmwareArchive',
                     return_value='/tempdir/firmware_from_source.tar.bz2')
    self._Prepare(
        'test-firmwarebranch',
        site_config=workspace_builders_unittest.CreateMockSiteConfig())

    self.RunStage()

    # Validate properties.
    self.assertEqual(self.stage.dummy_config,
                     'board-firmware')
    self.assertEqual(self.stage.dummy_version,
                     'R1-1.2.3')
    self.assertEqual(self.stage.dummy_archive_url,
                     'gs://chromeos-image-archive/board-firmware/R1-1.2.3')

    self.assertEqual(self.copy_mock.call_args_list, [
        mock.call(
            '/tempdir/firmware_from_source.tar.bz2',
            '/tempdir/board_firmware_from_source.tar.bz2'),
        mock.call(
            '/tempdir/metadata.json',
            '/tempdir/board_metadata.json'),
    ])

    self.assertEqual(self.upload_mock.call_args_list, [
        mock.call('/tempdir/board_firmware_from_source.tar.bz2', archive=True),
        mock.call('/tempdir/board_metadata.json', archive=True),
    ])

    self.assertEqual(self.read_overlay_file_mock.call_args_list, 2 * [
        mock.call(
            'scripts/artifacts.json', buildroot=self.workspace, board='board'),
    ])

    self.assertEqual(self.gs_copy_mock.call_args_list, [
        mock.call(
            '/tempdir/firmware_from_source.tar.bz2',
            'gs://chromeos-image-archive/board-firmware/R1-1.2.3',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/firmware_from_source.tar.bz2',
            'gs://chromeos-extra-archive/board-firmware/R1-1.2.3',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/metadata.json',
            'gs://chromeos-image-archive/board-firmware/R1-1.2.3',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/metadata.json',
            'gs://chromeos-extra-archive/board-firmware/R1-1.2.3',
            recursive=True, parallel=True),
    ])

    self.assertEqual(self.push_mock.call_args_list, [
        mock.call(
            profile=None,
            buildroot=self.workspace,
            sign_types=['firmware', 'accessory_rwsig'],
            dryrun=False,
            archive_url=('gs://chromeos-image-archive/'
                         'board-firmware/R1-1.2.3'),
            board='board'),
    ])

  def testDebug(self):
    """Tests sync command used by default."""
    self.PatchObject(commands, 'BuildFirmwareArchive',
                     return_value='/tempdir/firmware_from_source.tar.bz2')
    self._Prepare(
        'test-firmwarebranch',
        site_config=workspace_builders_unittest.CreateMockSiteConfig(),
        extra_cmd_args=['--debug'])

    self.RunStage()

    # Validate properties.
    self.assertEqual(self.stage.dummy_config,
                     'board-firmware-tryjob')
    self.assertEqual(self.stage.dummy_version,
                     'R1-1.2.3-bNone')
    self.assertEqual(self.stage.dummy_archive_url,
                     'gs://chromeos-image-archive/board-firmware-tryjob/'
                     'R1-1.2.3-bNone')

    self.assertEqual(self.copy_mock.call_args_list, [
        mock.call(
            '/tempdir/firmware_from_source.tar.bz2',
            '/tempdir/board_firmware_from_source.tar.bz2'),
        mock.call(
            '/tempdir/metadata.json',
            '/tempdir/board_metadata.json'),
    ])

    self.assertEqual(self.upload_mock.call_args_list, [
        mock.call('/tempdir/board_firmware_from_source.tar.bz2', archive=True),
        mock.call('/tempdir/board_metadata.json', archive=True),
    ])

    self.assertEqual(self.read_overlay_file_mock.call_args_list, 2 * [
        mock.call(
            'scripts/artifacts.json', buildroot=self.workspace, board='board'),
    ])

    self.assertEqual(self.gs_copy_mock.call_args_list, [
        mock.call(
            '/tempdir/firmware_from_source.tar.bz2',
            'gs://chromeos-image-archive/board-firmware-tryjob/R1-1.2.3-bNone',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/firmware_from_source.tar.bz2',
            'gs://chromeos-extra-archive/board-firmware-tryjob/R1-1.2.3-bNone',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/metadata.json',
            'gs://chromeos-image-archive/board-firmware-tryjob/R1-1.2.3-bNone',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/metadata.json',
            'gs://chromeos-extra-archive/board-firmware-tryjob/R1-1.2.3-bNone',
            recursive=True, parallel=True),
    ])

    self.assertEqual(self.push_mock.call_args_list, [
        mock.call(
            profile=None,
            buildroot=self.workspace,
            sign_types=['firmware', 'accessory_rwsig'],
            dryrun=True,
            archive_url=('gs://chromeos-image-archive/'
                         'board-firmware-tryjob/R1-1.2.3-bNone'),
            board='board'),
    ])


class FactoryArchiveStageTest(BranchArchiveStageTestBase):
  """Test FactoryArchiveStage."""

  def setUp(self):
    self.build_image_mock = self.PatchObject(
        commands, 'BuildFactoryInstallImage',
        return_value='/factory_image')
    self.net_boot_mock = self.PatchObject(
        commands, 'MakeNetboot')
    self.factory_zip_mock = self.PatchObject(
        commands, 'BuildFactoryZip',
        return_value='/factory.zip')
    self.create_tar_mock = self.PatchObject(
        cros_build_lib, 'CreateTarball')

  def ConstructStage(self):
    self._run.attrs.version_info = manifest_version.VersionInfo(
        '10.0.0', chrome_branch='10')
    self._run.attrs.release_tag = 'infra-tag'

    return branch_archive_stages.FactoryArchiveStage(
        self._run, self.buildstore, build_root=self.workspace, board='board')

  def testProd(self):
    """Tests sync command used by default."""
    self._Prepare(
        'test-factorybranch',
        site_config=workspace_builders_unittest.CreateMockSiteConfig())

    self.RunStage()

    # Validate properties.
    self.assertEqual(self.stage.dummy_config,
                     'board-factory')
    self.assertEqual(self.stage.dummy_version,
                     'R1-1.2.3')
    self.assertEqual(self.stage.dummy_archive_url,
                     'gs://chromeos-image-archive/board-factory/R1-1.2.3')

    self.assertEqual(self.build_image_mock.call_args_list, [
        mock.call(
            self.workspace,
            'board',
            extra_env={
                'FEATURES': 'separatedebug',
                'USE': '-cros-debug chrome_internal',
            }),
    ])

    self.assertEqual(self.net_boot_mock.call_args_list, [
        mock.call(
            self.workspace,
            'board',
            '/factory_image'),
    ])

    self.assertEqual(self.factory_zip_mock.call_args_list, [
        mock.call(
            self.workspace,
            'board',
            '/tempdir',
            '/factory_image',
            'R1-1.2.3'),
    ])

    self.assertEqual(self.create_tar_mock.call_args_list, [
        mock.call(
            '/tempdir/chromiumos_test_image.tar.xz',
            inputs=['chromiumos_test_image.bin'],
            compression=1,
            cwd=os.path.join(self.workspace,
                             'src/build/images/board/latest')),
    ])

    self.assertEqual(self.copy_mock.call_args_list, [
        mock.call(
            '/factory.zip',
            '/tempdir/board_factory.zip'),
        mock.call(
            '/tempdir/chromiumos_test_image.tar.xz',
            '/tempdir/board_chromiumos_test_image.tar.xz'),
        mock.call(
            '/tempdir/metadata.json',
            '/tempdir/board_metadata.json'),
    ])

    self.assertEqual(self.upload_mock.call_args_list, [
        mock.call('/tempdir/board_factory.zip', archive=True),
        mock.call('/tempdir/board_chromiumos_test_image.tar.xz', archive=True),
        mock.call('/tempdir/board_metadata.json', archive=True),
    ])

    self.assertEqual(self.read_overlay_file_mock.call_args_list, 3 * [
        mock.call(
            'scripts/artifacts.json', buildroot=self.workspace, board='board')
    ])

    self.assertEqual(self.gs_copy_mock.call_args_list, [
        mock.call(
            '/factory.zip',
            'gs://chromeos-image-archive/board-factory/R1-1.2.3',
            recursive=True, parallel=True),
        mock.call(
            '/factory.zip',
            'gs://chromeos-extra-archive/board-factory/R1-1.2.3',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/chromiumos_test_image.tar.xz',
            'gs://chromeos-image-archive/board-factory/R1-1.2.3',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/chromiumos_test_image.tar.xz',
            'gs://chromeos-extra-archive/board-factory/R1-1.2.3',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/metadata.json',
            'gs://chromeos-image-archive/board-factory/R1-1.2.3',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/metadata.json',
            'gs://chromeos-extra-archive/board-factory/R1-1.2.3',
            recursive=True, parallel=True),
    ])

    self.assertEqual(self.push_mock.call_args_list, [
        mock.call(
            profile=None,
            buildroot=self.workspace,
            sign_types=['factory'],
            dryrun=False,
            archive_url=('gs://chromeos-image-archive/'
                         'board-factory/R1-1.2.3'),
            board='board'),
    ])

  def testDebug(self):
    """Tests sync command used by default."""
    self._Prepare(
        'test-factorybranch',
        site_config=workspace_builders_unittest.CreateMockSiteConfig(),
        extra_cmd_args=['--debug'])

    self.RunStage()

    # Validate properties.
    self.assertEqual(self.stage.dummy_config,
                     'board-factory-tryjob')
    self.assertEqual(self.stage.dummy_version,
                     'R1-1.2.3-bNone')
    self.assertEqual(self.stage.dummy_archive_url,
                     'gs://chromeos-image-archive/board-factory-tryjob/'
                     'R1-1.2.3-bNone')

    self.assertEqual(self.build_image_mock.call_args_list, [
        mock.call(
            self.workspace,
            'board',
            extra_env={
                'FEATURES': 'separatedebug',
                'USE': '-cros-debug chrome_internal',
            }),
    ])

    self.assertEqual(self.net_boot_mock.call_args_list, [
        mock.call(
            self.workspace,
            'board',
            '/factory_image'),
    ])

    self.assertEqual(self.factory_zip_mock.call_args_list, [
        mock.call(
            self.workspace,
            'board',
            '/tempdir',
            '/factory_image',
            'R1-1.2.3-bNone'),
    ])

    self.assertEqual(self.create_tar_mock.call_args_list, [
        mock.call(
            '/tempdir/chromiumos_test_image.tar.xz',
            inputs=['chromiumos_test_image.bin'],
            compression=1,
            cwd=os.path.join(self.workspace,
                             'src/build/images/board/latest')),
    ])


    self.assertEqual(self.copy_mock.call_args_list, [
        mock.call(
            '/factory.zip',
            '/tempdir/board_factory.zip'),
        mock.call(
            '/tempdir/chromiumos_test_image.tar.xz',
            '/tempdir/board_chromiumos_test_image.tar.xz'),
        mock.call(
            '/tempdir/metadata.json',
            '/tempdir/board_metadata.json'),
    ])

    self.assertEqual(self.upload_mock.call_args_list, [
        mock.call('/tempdir/board_factory.zip', archive=True),
        mock.call('/tempdir/board_chromiumos_test_image.tar.xz', archive=True),
        mock.call('/tempdir/board_metadata.json', archive=True),
    ])

    self.assertEqual(self.read_overlay_file_mock.call_args_list, 3 * [
        mock.call(
            'scripts/artifacts.json', buildroot=self.workspace, board='board'),
    ])

    self.assertEqual(self.gs_copy_mock.call_args_list, [
        mock.call(
            '/factory.zip',
            'gs://chromeos-image-archive/board-factory-tryjob/R1-1.2.3-bNone',
            recursive=True, parallel=True),
        mock.call(
            '/factory.zip',
            'gs://chromeos-extra-archive/board-factory-tryjob/R1-1.2.3-bNone',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/chromiumos_test_image.tar.xz',
            'gs://chromeos-image-archive/board-factory-tryjob/R1-1.2.3-bNone',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/chromiumos_test_image.tar.xz',
            'gs://chromeos-extra-archive/board-factory-tryjob/R1-1.2.3-bNone',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/metadata.json',
            'gs://chromeos-image-archive/board-factory-tryjob/R1-1.2.3-bNone',
            recursive=True, parallel=True),
        mock.call(
            '/tempdir/metadata.json',
            'gs://chromeos-extra-archive/board-factory-tryjob/R1-1.2.3-bNone',
            recursive=True, parallel=True),
    ])

    self.assertEqual(self.push_mock.call_args_list, [
        mock.call(
            profile=None,
            buildroot=self.workspace,
            sign_types=['factory'],
            dryrun=True,
            archive_url=('gs://chromeos-image-archive/'
                         'board-factory-tryjob/R1-1.2.3-bNone'),
            board='board'),
    ])
