You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
# 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
|
|
import os
|
|
import struct
|
|
import sys
|
|
from recipe_engine import recipe_test_api
|
|
|
|
# TODO(phajdan.jr): Clean up this somewhat ugly import.
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'resources'))
|
|
import bot_update
|
|
|
|
|
|
class BotUpdateTestApi(recipe_test_api.RecipeTestApi):
|
|
def output_json(self, master, builder, slave, root, first_sln,
|
|
revision_mapping, git_mode, force=False, fail_patch=False,
|
|
output_manifest=False, fixed_revisions=None):
|
|
"""Deterministically synthesize json.output test data for gclient's
|
|
--output-json option.
|
|
"""
|
|
active = bot_update.check_valid_host(master, builder, slave) or force
|
|
|
|
output = {
|
|
'did_run': active,
|
|
'patch_failure': False
|
|
}
|
|
|
|
# Add in extra json output if active.
|
|
if active:
|
|
properties = {
|
|
property_name: self.gen_revision(project_name, git_mode)
|
|
for project_name, property_name in revision_mapping.iteritems()
|
|
}
|
|
properties.update({
|
|
'%s_cp' % property_name: ('refs/heads/master@{#%s}' %
|
|
self.gen_revision(project_name, False))
|
|
for project_name, property_name in revision_mapping.iteritems()
|
|
})
|
|
|
|
# We also want to simulate outputting "got_revision_git": ...
|
|
# when git mode is off to match what bot_update.py does.
|
|
if not git_mode:
|
|
properties.update({
|
|
'%s_git' % property_name: self.gen_revision(project_name, True)
|
|
for project_name, property_name in revision_mapping.iteritems()
|
|
})
|
|
|
|
output.update({
|
|
'patch_root': root or first_sln,
|
|
'root': first_sln,
|
|
'properties': properties,
|
|
'step_text': 'Some step text'
|
|
})
|
|
|
|
if output_manifest:
|
|
output.update({
|
|
'manifest': {
|
|
project_name: {
|
|
'repository': 'https://fake.org/%s.git' % project_name,
|
|
'revision': self.gen_revision(project_name, git_mode),
|
|
}
|
|
for project_name in revision_mapping
|
|
}
|
|
})
|
|
|
|
if fixed_revisions:
|
|
output['fixed_revisions'] = fixed_revisions
|
|
|
|
if fail_patch:
|
|
output['log_lines'] = [('patch error', 'Patch failed to apply'),]
|
|
output['patch_failure'] = True
|
|
output['patch_apply_return_code'] = 1
|
|
if fail_patch == 'download':
|
|
output['patch_apply_return_code'] = 3
|
|
return self.m.json.output(output)
|
|
|
|
@staticmethod
|
|
def gen_revision(project, GIT_MODE):
|
|
"""Hash project to bogus deterministic revision values."""
|
|
h = hashlib.sha1(project)
|
|
if GIT_MODE:
|
|
return h.hexdigest()
|
|
else:
|
|
return struct.unpack('!I', h.digest()[:4])[0] % 300000
|