| # 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), |
| }) |