# 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. webkit_layout_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
