# Copyright 2014 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.

import hashlib

from recipe_engine import recipe_test_api

class GclientTestApi(recipe_test_api.RecipeTestApi):
  def diff_deps_test_data(self, files):
    return self.m.raw_io.stream_output(
        '\n'.join(['10>%s' % fname for fname in files]))

  def output_json(self, projects):
    """Deterministically synthesize json.output test data for gclient's
    --output-json option.

    Args:
      projects - a list of project paths (e.g. ['src', 'src/dependency'])
    """
    # TODO(iannucci): Account for parent_got_revision_mapping. Right now the
    # synthesized json output from this method will always use
    # gen_revision(project), but if parent_got_revision and its ilk are
    # specified, we should use those values instead.
    return self.m.json.output({
      'solutions': dict(
        (p+'/', {'revision': self.gen_revision(p)})
        for p in projects
      )
    })

  @staticmethod
  def gen_revision(project):
    """Hash project to bogus deterministic revision values."""
    h = hashlib.sha1(project)
    return h.hexdigest()
