Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(981)

Unified Diff: appengine/cr-buildbucket/swarming/test/swarming_test.py

Issue 2213723002: swarmbucket: allow overriding config (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@sb-cfg-refactoring
Patch Set: security warning Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: appengine/cr-buildbucket/swarming/test/swarming_test.py
diff --git a/appengine/cr-buildbucket/swarming/test/swarming_test.py b/appengine/cr-buildbucket/swarming/test/swarming_test.py
index 206fd65fd89f67bff7bf3aaba7a87d539d63c51b..4ca16dd4189f17e872bc8e312e6f71e2ceefc760 100755
--- a/appengine/cr-buildbucket/swarming/test/swarming_test.py
+++ b/appengine/cr-buildbucket/swarming/test/swarming_test.py
@@ -6,6 +6,7 @@ import base64
import contextlib
import datetime
import json
+import logging
from components import auth
from components import config as config_component
@@ -34,6 +35,16 @@ class SwarmingTest(testing.AppengineTestCase):
def setUp(self):
super(SwarmingTest, self).setUp()
self.mock(utils, 'utcnow', lambda: datetime.datetime(2015, 11, 30))
+
+ self.json_response = None
+ def json_request_async(*_, **__):
+ if self.json_response is not None:
+ return futuristic(self.json_response)
+ self.fail('unexpected outbound request') # pragma: no cover
+
+ self.mock(
+ net, 'json_request_async', mock.Mock(side_effect=json_request_async))
+
self.bucket_cfg = project_config_pb2.Bucket(
name='bucket',
swarming=project_config_pb2.Swarming(
@@ -147,8 +158,33 @@ class SwarmingTest(testing.AppengineTestCase):
{'swarming': {'recipe': {'junk': 1}}},
{'swarming': {'recipe': {'revision': 1}}},
{'swarming': {'canary_template': 'yes'}},
+ {'swarming': {'override_cfg': 0}},
+ {'swarming': {'override_cfg': {'swarming': 0}}},
+ {
+ 'swarming': {
+ 'override_cfg': {
+ 'swarming': {'hostname': 0},
+ },
+ },
+ },
+ {
+ 'swarming': {
+ 'override_cfg': {
+ 'swarming': {'builders': [{}]},
+ },
+ },
+ },
+ {
+ 'swarming': {
+ 'override_cfg': {
+ 'swarming': {'common_dimensions': ['wrong_dimension']},
+ },
+ },
+ },
+ {'swarming': {'override_cfg': {'x': 0}}},
]
for p in bad:
+ logging.info('testing %s', p)
p['builder_name'] = 'foo'
with self.assertRaises(errors.InvalidInputError):
swarming.validate_build_parameters(p['builder_name'], p)
@@ -196,7 +232,7 @@ class SwarmingTest(testing.AppengineTestCase):
},
)
- self.mock(net, 'json_request_async', mock.Mock(return_value=futuristic({
+ self.json_response = {
'task_id': 'deadbeef',
'request': {
'properties': {
@@ -217,7 +253,7 @@ class SwarmingTest(testing.AppengineTestCase):
'recipe_revision:badcoffee',
]
}
- })))
+ }
swarming.create_task_async(build).get_result()
@@ -308,7 +344,7 @@ class SwarmingTest(testing.AppengineTestCase):
} },
)
- self.mock(net, 'json_request_async', mock.Mock(return_value=futuristic({
+ self.json_response = {
'task_id': 'deadbeef',
'request': {
'properties': {
@@ -328,7 +364,7 @@ class SwarmingTest(testing.AppengineTestCase):
'recipe_repository:https://example.com/repo',
]
}
- })))
+ }
swarming.create_task_async(build).get_result()
@@ -425,7 +461,7 @@ class SwarmingTest(testing.AppengineTestCase):
swarming.should_use_canary_template.return_value = True
self.task_template_canary = None
- self.mock(net, 'json_request_async', mock.Mock(return_value=futuristic({
+ self.json_response = {
'task_id': 'deadbeef',
'request': {
'properties': {
@@ -446,7 +482,7 @@ class SwarmingTest(testing.AppengineTestCase):
'recipe_revision:badcoffee',
]
}
- })))
+ }
build = model.Build(
bucket='bucket',
@@ -457,6 +493,107 @@ class SwarmingTest(testing.AppengineTestCase):
actual_task_def = net.json_request_async.call_args[1]['payload']
self.assertIn('buildbucket_template_canary:false', actual_task_def['tags'])
+ def test_create_task_async_override_cfg(self):
+ build = model.Build(
+ bucket='bucket',
+ parameters={
+ 'builder_name': 'builder',
+ 'swarming': {
+ 'override_builder_cfg': {
+ # Override cores dimension.
+ 'dimensions': ['cores:16'],
+ },
+ }
+ },
+ )
+
+ self.json_response = {
+ 'task_id': 'deadbeef',
+ 'request': {
+ 'properties': {
+ 'dimensions': [
+ {'key': 'cores', 'value': '16'},
+ {'key': 'os', 'value': 'Linux'},
+ {'key': 'pool', 'value': 'Chrome'},
+ ],
+ },
+ 'tags': [
+ 'builder:builder',
+ 'buildertag:yes',
+ 'commontag:yes',
+ 'master:master.bucket',
+ 'priority:108',
+ 'recipe_name:recipe',
+ 'recipe_repository:https://example.com/repo',
+ 'recipe_revision:badcoffee',
+ ]
+ }
+ }
+
+ swarming.create_task_async(build).get_result()
+
+ actual_task_def = net.json_request_async.call_args[1]['payload']
+ self.assertIn(
+ {'key': 'cores', 'value': '16'},
+ actual_task_def['properties']['dimensions'])
+
+ def test_create_task_async_override_cfg_malformed(self):
+ build = model.Build(
+ bucket='bucket',
+ parameters={
+ 'builder_name': 'builder',
+ 'swarming': {
+ 'override_builder_cfg': [],
+ }
+ },
+ )
+ with self.assertRaises(errors.InvalidInputError):
+ swarming.create_task_async(build).get_result()
+
+ build = model.Build(
+ bucket='bucket',
+ parameters={
+ 'builder_name': 'builder',
+ 'swarming': {
+ 'override_builder_cfg': {
+ 'name': 'x',
+ },
+ }
+ },
+ )
+ with self.assertRaises(errors.InvalidInputError):
+ swarming.create_task_async(build).get_result()
+
+ build = model.Build(
+ bucket='bucket',
+ parameters={
+ 'builder_name': 'builder',
+ 'swarming': {
+ 'override_builder_cfg': {
+ 'blabla': 'x',
+ },
+ }
+ },
+ )
+ with self.assertRaises(errors.InvalidInputError):
+ swarming.create_task_async(build).get_result()
+
+ # Remove a required dimension.
+ build = model.Build(
+ bucket='bucket',
+ parameters={
+ 'builder_name': 'builder',
+ 'swarming': {
+ 'override_builder_cfg': {
+ 'dimensions': ['pool:'],
+ },
+ }
+ },
+ )
+ with self.assertRaises(errors.InvalidInputError):
+ swarming.create_task_async(build).get_result()
+
+
def test_create_task_async_on_leased_build(self):
build = model.Build(
bucket='bucket',
@@ -467,7 +604,7 @@ class SwarmingTest(testing.AppengineTestCase):
swarming.create_task_async(build).get_result()
def test_cancel_task(self):
- self.mock(net, 'json_request_async', mock.Mock(return_value=futuristic({})))
+ self.json_response = {}
build = model.Build(
bucket='whatever',
swarming_hostname='chromium-swarm.appspot.com',
« no previous file with comments | « appengine/cr-buildbucket/swarming/swarmingcfg.py ('k') | appengine/cr-buildbucket/swarming/test/swarmingcfg_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698