blob: 0f10f32dcde752c0378f0b4ddc3faeac5f7173ed [file] [log] [blame]
# 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 base64
import hashlib
from recipe_engine import recipe_test_api
class GitilesTestApi(recipe_test_api.RecipeTestApi):
def _make_gitiles_response_json(self, data):
return self.m.json.output(data)
def make_refs_test_data(self, *refs):
return self._make_gitiles_response_json({ref: None for ref in refs})
def make_log_test_data(self, s, n=3, cursor=None):
result = {
'log': [
self.make_commit_gitiles_dict(
commit='fake %s hash %d' % (s, i),
msg='fake %s msg %d' % (s, i),
new_files=['%s.py' % (chr(i + ord('a')))],
email='fake_%s@fake_%i.email.com' % (s, i),
)
for i in xrange(n)
],
}
if cursor:
result['next'] = cursor
return self._make_gitiles_response_json(result)
def make_commit_test_data(self, commit, msg, new_files=None, email=None):
"""Constructs fake Gitiles commit JSON test output.
This data structure conforms to the JSON response that Gitiles provides when
a commit is queried. For example:
https://chromium.googlesource.com/chromium/src/+/875b896a3256c5b86c8725e81489e99ea6c2b4c9?format=json
Args:
commit (str): The fake commit hash.
msg (str): The commit message.
new_files (list): If not None, a list of filenames (str) to simulate being
added in this commit.
email: if not None, a proper email with '@' in it to be used for
committer's and author's emails.
Returns: (raw_io.Output) A simulated Gitiles fetch 'json' output.
"""
commit = self.make_commit_gitiles_dict(commit, msg, new_files, email)
return self._make_gitiles_response_json(commit)
def make_commit_gitiles_dict(self, commit, msg, new_files, email=None):
if email is None:
name = 'Test Author'
email = 'testauthor@fake.chromium.org'
else:
assert '@' in email
name = email.split('@')[0]
d = {
'commit': self.make_hash(commit),
'tree': self.make_hash('tree', commit),
'parents': [self.make_hash('parent', commit)],
'author': {
'name': name,
'email': email,
'time': 'Mon Jan 01 00:00:00 2015',
},
'committer': {
'name': name,
'email': email,
'time': 'Mon Jan 01 00:00:00 2015',
},
'message': msg,
'tree_diff': [],
}
if new_files:
d['tree_diff'].extend({
'type': 'add',
'old_id': 40 * '0',
'old_mode': 0,
'new_id': self.make_hash('file', f, commit),
'new_mode': 33188,
'new_path': f,
} for f in new_files)
return d
def make_hash(self, *bases):
return hashlib.sha1(':'.join(bases)).hexdigest()
def make_encoded_file(self, data):
return self.m.json.output({
'value': base64.b64encode(data),
})