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', |