mirror of
https://chromium.googlesource.com/chromium/tools/depot_tools.git
synced 2026-01-11 10:41:31 +00:00
These tools are still being evaluated and may change. get_build vs get_build_from_id and get_build_from_build_number in particular are two distinct ways of implementing the same tool that need to be compared. get_build gives flexibility but is extremely verbose which means it might be too flaky or consume unnecessary tokens. The return of these might also need filtering for unnecessary output. Particularly steps which can be very verbose without much information. Bug: 430952168 Change-Id: Ia9b092a6b6c546198939deb36ea1b89ff33d7fc6 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/6758660 Auto-Submit: Struan Shrimpton <sshrimp@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Erik Staab <estaab@chromium.org> Commit-Queue: Struan Shrimpton <sshrimp@google.com>
205 lines
6.6 KiB
Python
205 lines
6.6 KiB
Python
# Copyright 2025 The Chromium Authors
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
"""Tests for buildbucket tools."""
|
|
|
|
import json
|
|
import os
|
|
import pathlib
|
|
import subprocess
|
|
import sys
|
|
import unittest
|
|
from unittest.mock import AsyncMock, patch
|
|
|
|
sys.path.insert(
|
|
0,
|
|
os.path.abspath(
|
|
pathlib.Path(__file__).resolve().parent.parent.joinpath(
|
|
pathlib.Path('infra_lib'))))
|
|
import buildbucket
|
|
|
|
|
|
class BuildbucketTest(unittest.IsolatedAsyncioTestCase):
|
|
|
|
def setUp(self):
|
|
self.mock_context = AsyncMock()
|
|
self.mock_context.info = AsyncMock()
|
|
|
|
@patch('subprocess.run')
|
|
async def test_get_build_status_success(self, mock_subprocess_run):
|
|
build_id = '12345'
|
|
expected_status = 'SUCCESS'
|
|
mock_subprocess_run.return_value = subprocess.CompletedProcess(
|
|
args=[],
|
|
returncode=0,
|
|
stdout=json.dumps({'status': expected_status}),
|
|
stderr='')
|
|
|
|
status = await buildbucket.get_build_status(
|
|
self.mock_context,
|
|
build_id,
|
|
)
|
|
|
|
self.assertEqual(status, expected_status)
|
|
expected_command = [
|
|
'prpc', 'call', 'cr-buildbucket.appspot.com',
|
|
'buildbucket.v2.Builds.GetBuildStatus'
|
|
]
|
|
mock_subprocess_run.assert_called_once_with(
|
|
expected_command,
|
|
capture_output=True,
|
|
input=json.dumps({'id': build_id}),
|
|
check=False,
|
|
text=True,
|
|
)
|
|
|
|
@patch('subprocess.run')
|
|
async def test_get_build_status_exception(self, mock_subprocess_run):
|
|
build_id = '12345'
|
|
mock_subprocess_run.side_effect = Exception('PRPC call failed')
|
|
|
|
result = await buildbucket.get_build_status(self.mock_context, build_id)
|
|
|
|
self.assertIn('Exception calling prpc', result)
|
|
self.assertIn('PRPC call failed', result)
|
|
|
|
@patch('subprocess.run')
|
|
async def test_get_build_from_id_success(self, mock_subprocess_run):
|
|
build_id = '12345'
|
|
fields = ['steps', 'tags']
|
|
expected_output = '{"id": "12345", "steps": [], "tags": []}'
|
|
mock_subprocess_run.return_value = subprocess.CompletedProcess(
|
|
args=[], returncode=0, stdout=expected_output, stderr='')
|
|
|
|
output = await buildbucket.get_build_from_id(
|
|
self.mock_context,
|
|
build_id,
|
|
fields,
|
|
)
|
|
|
|
self.assertEqual(output, expected_output)
|
|
expected_command = [
|
|
'prpc', 'call', 'cr-buildbucket.appspot.com',
|
|
'buildbucket.v2.Builds.GetBuild'
|
|
]
|
|
expected_request = {'id': build_id, 'mask': {'fields': 'steps,tags'}}
|
|
mock_subprocess_run.assert_called_once_with(
|
|
expected_command,
|
|
capture_output=True,
|
|
input=json.dumps(expected_request),
|
|
check=False,
|
|
text=True)
|
|
|
|
@patch('subprocess.run')
|
|
async def test_get_build_from_id_exception(self, mock_subprocess_run):
|
|
build_id = '12345'
|
|
fields = ['steps']
|
|
mock_subprocess_run.side_effect = Exception('PRPC call failed')
|
|
|
|
result = await buildbucket.get_build_from_id(
|
|
self.mock_context,
|
|
build_id,
|
|
fields,
|
|
)
|
|
|
|
self.assertIn('Exception calling prpc', result)
|
|
self.assertIn('PRPC call failed', result)
|
|
|
|
@patch('subprocess.run')
|
|
async def test_get_build_from_build_number_success(
|
|
self,
|
|
mock_subprocess_run,
|
|
):
|
|
build_number = 987
|
|
builder_name = 'test_builder'
|
|
builder_bucket = 'try'
|
|
builder_project = 'chromium'
|
|
fields = ['status']
|
|
expected_output = '{"status": "SUCCESS"}'
|
|
mock_subprocess_run.return_value = subprocess.CompletedProcess(
|
|
args=[], returncode=0, stdout=expected_output, stderr='')
|
|
|
|
output = await buildbucket.get_build_from_build_number(
|
|
self.mock_context, build_number, builder_name, builder_bucket,
|
|
builder_project, fields)
|
|
|
|
self.assertEqual(output, expected_output)
|
|
expected_command = [
|
|
'prpc', 'call', 'cr-buildbucket.appspot.com',
|
|
'buildbucket.v2.Builds.GetBuild'
|
|
]
|
|
expected_request = {
|
|
'buildNumber': build_number,
|
|
'builder': {
|
|
'builder': builder_name,
|
|
'bucket': builder_bucket,
|
|
'project': builder_project
|
|
},
|
|
'mask': {
|
|
'fields': 'status'
|
|
}
|
|
}
|
|
mock_subprocess_run.assert_called_once_with(
|
|
expected_command,
|
|
capture_output=True,
|
|
input=json.dumps(expected_request),
|
|
check=False,
|
|
text=True)
|
|
|
|
@patch('subprocess.run')
|
|
async def test_get_build_from_build_number_exception(
|
|
self, mock_subprocess_run):
|
|
build_number = 987
|
|
builder_name = 'test_builder'
|
|
builder_bucket = 'try'
|
|
builder_project = 'chromium'
|
|
fields = ['status']
|
|
mock_subprocess_run.side_effect = Exception('PRPC call failed')
|
|
|
|
result = await buildbucket.get_build_from_build_number(
|
|
self.mock_context, build_number, builder_name, builder_bucket,
|
|
builder_project, fields)
|
|
|
|
self.assertIn('Exception calling prpc', result)
|
|
self.assertIn('PRPC call failed', result)
|
|
|
|
@patch('subprocess.run')
|
|
async def test_get_build_success(self, mock_subprocess_run):
|
|
request = {"id": "12345"}
|
|
expected_output = '{"id": "12345"}'
|
|
mock_subprocess_run.return_value = subprocess.CompletedProcess(
|
|
args=[],
|
|
returncode=0,
|
|
stdout=expected_output,
|
|
stderr='',
|
|
)
|
|
|
|
output = await buildbucket.get_build(self.mock_context, request)
|
|
|
|
self.assertEqual(output, expected_output)
|
|
expected_command = [
|
|
'prpc', 'call', 'cr-buildbucket.appspot.com',
|
|
'buildbucket.v2.Builds.GetBuild'
|
|
]
|
|
mock_subprocess_run.assert_called_once_with(
|
|
expected_command,
|
|
capture_output=True,
|
|
input=json.dumps(request),
|
|
check=False,
|
|
text=True,
|
|
)
|
|
|
|
@patch('subprocess.run')
|
|
async def test_get_build_exception(self, mock_subprocess_run):
|
|
request = {"id": "12345"}
|
|
mock_subprocess_run.side_effect = Exception('PRPC call failed')
|
|
|
|
result = await buildbucket.get_build(self.mock_context, request)
|
|
|
|
self.assertIn('Exception calling prpc', result)
|
|
self.assertIn('PRPC call failed', result)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|