# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from recipe_engine import post_process

DEPS = [
    'chromium',
    'recipe_engine/properties',
    'recipe_engine/raw_io',
]

def RunSteps(api):
  api.chromium.set_config(
      api.properties.get('chromium_config', 'chromium'),
      TARGET_PLATFORM=api.properties.get('target_platform', 'linux'),
      TARGET_CROS_BOARD=api.properties.get('target_cros_board'))

  gn_args = api.chromium.mb_lookup('test_mastername', 'test_buildername')
  expected_gn_args = api.properties.get('expected_gn_args')
  assert gn_args == expected_gn_args, (
      'expected:\n%s\n\nactual:\n%s' % (expected_gn_args, gn_args))

_MB_LOOKUP_OUTPUT_TEMPLATE = '''

Writing """\\
%s""" to _path_/args.gn

/fake-path/chromium/src/buildtools/linux64/gn gen _path_
'''

def GenTests(api):
  gn_args = '\n'.join((
      'goma_dir = "/b/build/slave/cache/goma_client"',
      'target_cpu = "x86"',
      'target_sysroot = "//build/linux"',
      'use_goma = true',
  ))
  expected_step_text = [
      '<br/>'.join(('target_cpu = "x86"', 'use_goma = true')),
      '<br/>'.join((
          'goma_dir = "/b/build/slave/cache/goma_client"',
          'target_sysroot = "//build/linux"'))
  ]

  yield (
      api.test('basic')
      + api.properties(expected_gn_args=gn_args)
      + api.step_data(
          'lookup GN args',
          stdout=api.raw_io.output_text(_MB_LOOKUP_OUTPUT_TEMPLATE % gn_args))
      + api.post_process(post_process.StepTextContains, 'lookup GN args',
                         expected_step_text)
      + api.post_process(post_process.DropExpectation)
  )

  yield (
      api.test('cros_board')
      + api.properties(target_platform='chromeos',
                       target_cros_board='x86-generic')
      + api.properties(expected_gn_args=gn_args)
      + api.step_data(
          'lookup GN args',
          stdout=api.raw_io.output_text(_MB_LOOKUP_OUTPUT_TEMPLATE % gn_args))
      + api.post_process(post_process.StepTextContains, 'lookup GN args',
                         expected_step_text)
      + api.post_process(post_process.DropExpectation)
  )

  output = '\n'.join(('output', 'not', 'in', '"mb lookup"', 'format'))
  yield (
      api.test('bad mb output')
      + api.step_data('lookup GN args',
                      stdout=api.raw_io.output_text(output))
      + api.post_process(post_process.StepTextContains, 'lookup GN args',
                         ['Failed to extract GN args'])
      + api.post_process(post_process.LogContains, 'lookup GN args',
                         'mb lookup output', [output])
      + api.post_process(post_process.StatusFailure)
      + api.post_process(post_process.ResultReasonRE,
                         'Failed to extract GN args')
      + api.post_process(post_process.DropExpectation)
  )
