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


class TestResultsApi(recipe_api.RecipeApi):
  """Recipe module to upload gtest json results to test-results server."""

  def initialize(self):
    """Set the default config."""
    if self.m.runtime.is_experimental:
      self.set_config('staging_server')
    else:
      self.set_config('public_server')

  def upload(self, results_file, test_type, chrome_revision,
             test_results_server=None, downgrade_error_to_warning=True,
             builder_name_suffix=''):
    """Upload results json to test-results.

    Args:
      results_file: Path to file containing result json. Supported format are:
        ttest format & full json results format (
        http://www.chromium.org/developers/the-json-test-results-format).
      test_type: Test type string, e.g. blink_web_tests.
      test_results_server: Server where results should be uploaded.
      downgrade_error_to_warning: If True, treat a failure to upload as a
          warning.
      builder_name_suffix: Optional suffix to append to the builder name.

    Returns:
      The step result.
    """
    if builder_name_suffix:
      builder_name_suffix = '-%s' % builder_name_suffix
    try:
      upload_test_results_args = [
          '--input-json', results_file,
          '--master-name', self.m.properties['mastername'],
          '--builder-name', '%s%s' % (
              self.m.buildbucket.builder_name, builder_name_suffix),
          '--build-number', self.m.buildbucket.build.number,
          '--test-type', test_type,
          '--chrome-revision', chrome_revision
      ]
      if self.m.buildbucket.build_id is not None:
        upload_test_results_args.extend(['--build-id',
                                         self.m.buildbucket.build_id])

      test_results_server = test_results_server or self.c.test_results_server
      if test_results_server:
        upload_test_results_args.extend([
            '--test-results-server',
            test_results_server
        ])

      return self.m.python(
          name='Upload to test-results [%s]' % test_type,
          script=self.resource('upload_test_results.py'),
          args=upload_test_results_args)
    except self.m.step.StepFailure as f:
      if downgrade_error_to_warning:
        f.result.presentation.status = self.m.step.WARNING
      return f.result
