"""Recipe for building and running JUnit tests."""
from slave import base_recipe
from slave.step import unittest_step, jacoco_coverage_processing_step

BUILD_BRANDING = 'chrome'
BUILD_ARCH = 'x86'
BUILD_FLAVOR = 'Release'
BUILD_PRODUCT = 'android'

# This is needed to override the "DEFAULT_MANIFEST_STRING" in test_generator.py
# by adding the chromium/tools/depot_tools project.
SAMPLE_MANIFEST_STRING = """
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote fetch="https://chromium.googlesource.com/" name="chromium" review="https://chromium-review.googlesource.com/"/>
  <remote fetch="https://eureka-internal.googlesource.com/" name="eureka" review="sso://eureka-internal"/>
  <remote fetch="https://github.com/" name="github"/>

  <default revision="master"/>

  <project name="chromium/src" remote="eureka" revision="unfork_m43"/>
  <project name="chromium/tools/depot_tools" remote="chromium"/>
  <project name="chromiumos/chromite" path="chromite/chromite" remote="chromium"/>
  <project name="chromiumos/third_party/autotest" path="autotest" remote="chromium"/>
  <project name="continuous-tests" remote="eureka"/>
  <project name="fake/unittest" remote="eureka"/>
  <project name="fragglerock" remote="eureka"/>
  <project name="prebuilt/toolchain" path="toolchain" remote="eureka"/>
  <project name="google/sprockets" path="test/sprockets" remote="github"/>
  <project name="test" remote="eureka"/>
  <project name="chromecast/internal" path="chromium/src/chromecast/internal" remote="eureka"/>
  <project name="chromecast/internal/voice_ui" path="chromium/src/chromecast/internal/chirp" remote="eureka"/>
  <project name="vendor/amlogic" remote="eureka"/>
  <project name="vendor/marvell" remote="eureka"/>
</manifest>
"""

BUILD_CONFIGS = {
    'junit_androidtv': {
        'build_args_product': 'atv_x86_user',
        'build_args_official': False,
        'code_coverage': True,
    },
    'junit_soba': {
        'build_args_product': 'soba_arm_internal',
        'build_args_official': False,
        'code_coverage': True,
    },
    'junit_udon': {
        'build_args_product': 'udon_x64_user',
        'build_args_official': False,
        'code_coverage': True,
    },
}


def GetValidBuildNames():
  return BUILD_CONFIGS.keys()


def CreateRecipe(build_name: str, **kwargs):
  """Builds a recipe object."""
  config = BUILD_CONFIGS[build_name]
  return JunitRecipe(config, **kwargs)

class JunitRecipe(base_recipe.BaseRecipe):
  """Recipe to build and run JUnit tests."""

  def __init__(self, config, **kwargs):
    base_recipe.BaseRecipe.__init__(
        self, enable_build_accelerator=True, **kwargs)
    self._config = config

  def get_steps(self):
    build_args_product = self._config['build_args_product']
    build_args_official = self._config['build_args_official']
    code_coverage = self._config['code_coverage']

    steps = []
    steps += [
        unittest_step.BuildAffectedUnitTestsStep(
            BUILD_BRANDING, BUILD_ARCH, BUILD_PRODUCT,
            BUILD_FLAVOR, enable_assistant=False, sanitizer=None,
            build_args_product=build_args_product,
            build_args_official=build_args_official,
            halt_on_failure=True, junit=True,
            code_coverage=code_coverage, **self._step_kwargs),
        unittest_step.RunAffectedUnitTestsStep(
            BUILD_BRANDING, BUILD_ARCH, BUILD_PRODUCT, BUILD_FLAVOR,
            report_url='', recipe_steps=steps, sanitizer=None,
            build_args_product=build_args_product,
            build_args_official=build_args_official,
            enable_network_service=False, junit=True, **self._step_kwargs),
    ]

    # If code coverage is enabled we must process coverage
    # files and generate a report.
    if code_coverage:
      steps.append(
        jacoco_coverage_processing_step.JacocoCoverageProcessingStep(
          BUILD_BRANDING, BUILD_ARCH, BUILD_PRODUCT, BUILD_FLAVOR,
          'coverage',  build_args_product=build_args_product,
          build_args_official=build_args_official, **self._step_kwargs
        )
      )

    return steps
