Index: appengine/swarming/server/task_to_run_test.py |
diff --git a/appengine/swarming/server/task_to_run_test.py b/appengine/swarming/server/task_to_run_test.py |
index b9a16b7ca6afadaf0615d730655f0df71d205452..774c361d7d1be780a32aef8a81a023bc3e3a6cd1 100755 |
--- a/appengine/swarming/server/task_to_run_test.py |
+++ b/appengine/swarming/server/task_to_run_test.py |
@@ -55,15 +55,6 @@ def _gen_request(properties=None, **kwargs): |
return task_request.TaskRequest(**args) |
-def mkreq(req): |
- # This function fits the old style where TaskRequest was stored first, before |
- # TaskToRun and TaskResultSummary. |
- task_request.init_new_request(req, True, None) |
- req.key = task_request.new_request_key() |
- req.put() |
- return req |
- |
- |
def _task_to_run_to_dict(i): |
"""Converts the queue_number to hex for easier testing.""" |
out = i.to_dict() |
@@ -85,15 +76,6 @@ def _yield_next_available_task_to_dispatch(bot_dimensions, deadline): |
] |
-def _gen_new_task_to_run(**kwargs): |
- """Returns a TaskToRun saved in the DB.""" |
- request = mkreq(_gen_request(**kwargs)) |
- to_run = task_to_run.new_task_to_run(request) |
- to_run.put() |
- task_queues.assert_task(request) |
- return to_run |
- |
- |
def _hash_dimensions(dimensions): |
return task_to_run._hash_dimensions(utils.encode_to_json(dimensions)) |
@@ -274,6 +256,26 @@ class TaskToRunApiTest(TestCase): |
# The default expiration_secs for _gen_request(). |
self.expiration_ts = self.now + datetime.timedelta(seconds=60) |
+ def mkreq(self, req, nb_tasks=0): |
+ """Stores a new initialized TaskRequest. |
+ |
+ nb_task is 1 or 0. It is 1 when the request.properties.dimensions was new |
+ (unseen before) and 0 otherwise. |
+ """ |
+ task_request.init_new_request(req, True, None) |
+ task_queues.assert_task(req) |
+ self.assertEqual(nb_tasks, self.execute_tasks()) |
+ req.key = task_request.new_request_key() |
+ req.put() |
+ return req |
+ |
+ def _gen_new_task_to_run(self, **kwargs): |
+ """Returns a TaskToRun saved in the DB.""" |
+ request = self.mkreq(_gen_request(**kwargs)) |
+ to_run = task_to_run.new_task_to_run(request) |
+ to_run.put() |
+ return to_run |
+ |
def test_all_apis_are_tested(self): |
actual = frozenset(i[5:] for i in dir(self) if i.startswith('test_')) |
# Contains the list of all public APIs. |
@@ -284,21 +286,21 @@ class TaskToRunApiTest(TestCase): |
self.assertFalse(missing) |
def test_task_to_run_key_to_request_key(self): |
- request = mkreq(_gen_request()) |
+ request = self.mkreq(_gen_request()) |
task_key = task_to_run.request_to_task_to_run_key(request) |
actual = task_to_run.task_to_run_key_to_request_key(task_key) |
self.assertEqual(request.key, actual) |
def test_request_to_task_to_run_key(self): |
self.mock(random, 'getrandbits', lambda _: 0x88) |
- request = mkreq(_gen_request()) |
+ request = self.mkreq(_gen_request()) |
# Ensures that the hash value is constant for the same input. |
self.assertEqual( |
ndb.Key('TaskRequest', 0x7e296460f77ff77e, 'TaskToRun', 3420117132), |
task_to_run.request_to_task_to_run_key(request)) |
def test_validate_to_run_key(self): |
- request = mkreq(_gen_request()) |
+ request = self.mkreq(_gen_request()) |
task_key = task_to_run.request_to_task_to_run_key(request) |
task_to_run.validate_to_run_key(task_key) |
with self.assertRaises(ValueError): |
@@ -343,7 +345,7 @@ class TaskToRunApiTest(TestCase): |
priority=20, |
created_ts=now, |
expiration_ts=now+datetime.timedelta(seconds=31)) |
- task_to_run.new_task_to_run(mkreq(data)).put() |
+ task_to_run.new_task_to_run(self.mkreq(data)).put() |
# Create a second with higher priority. |
self.mock(random, 'getrandbits', lambda _: 0x23) |
@@ -357,7 +359,7 @@ class TaskToRunApiTest(TestCase): |
priority=10, |
created_ts=now, |
expiration_ts=now+datetime.timedelta(seconds=31)) |
- task_to_run.new_task_to_run(mkreq(data)).put() |
+ task_to_run.new_task_to_run(self.mkreq(data, nb_tasks=0)).put() |
expected = [ |
{ |
@@ -420,7 +422,7 @@ class TaskToRunApiTest(TestCase): |
task_to_run.match_dimensions(request_dimensions, bot_dimensions)) |
def test_yield_next_available_task_to_dispatch_none(self): |
- _gen_new_task_to_run( |
+ self._gen_new_task_to_run( |
properties={ |
'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'}, |
}) |
@@ -430,7 +432,7 @@ class TaskToRunApiTest(TestCase): |
self.assertEqual([], actual) |
def test_yield_next_available_task_to_dispatch_none_mismatch(self): |
- _gen_new_task_to_run( |
+ self._gen_new_task_to_run( |
properties={ |
'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'}, |
}) |
@@ -449,7 +451,7 @@ class TaskToRunApiTest(TestCase): |
u'os': u'Windows-3.1.1', |
u'pool': u'default', |
} |
- _gen_new_task_to_run( |
+ self._gen_new_task_to_run( |
properties=dict(dimensions=request_dimensions)) |
# Bot declares exactly same dimensions so it matches. |
bot_dimensions = {k: [v] for k, v in request_dimensions.iteritems()} |
@@ -469,7 +471,7 @@ class TaskToRunApiTest(TestCase): |
u'os': u'Windows-3.1.1', |
u'pool': u'default', |
} |
- _gen_new_task_to_run( |
+ self._gen_new_task_to_run( |
properties=dict(dimensions=request_dimensions)) |
# Bot declares more dimensions than needed, this is fine and it matches. |
bot_dimensions = { |
@@ -492,7 +494,7 @@ class TaskToRunApiTest(TestCase): |
u'os': u'Windows-3.1.1', |
u'pool': u'default', |
} |
- _gen_new_task_to_run(properties=dict(dimensions=request_dimensions)) |
+ self._gen_new_task_to_run(properties=dict(dimensions=request_dimensions)) |
bot_dimensions = {k: [v] for k, v in request_dimensions.iteritems()} |
bot_dimensions[u'id'] = [u'bot1'] |
actual = _yield_next_available_task_to_dispatch(bot_dimensions, None) |
@@ -510,7 +512,7 @@ class TaskToRunApiTest(TestCase): |
u'os': u'Windows-3.1.1', |
u'pool': u'default', |
} |
- _gen_new_task_to_run( |
+ self._gen_new_task_to_run( |
properties=dict(dimensions=request_dimensions)) |
# Bot declares more dimensions than needed. |
bot_dimensions = { |
@@ -535,12 +537,12 @@ class TaskToRunApiTest(TestCase): |
u'os': u'Windows-3.1.1', |
u'pool': u'default', |
} |
- _gen_new_task_to_run(properties=dict(dimensions=request_dimensions_1)) |
+ self._gen_new_task_to_run(properties=dict(dimensions=request_dimensions_1)) |
# It's normally time ordered. |
self.mock_now(self.now, 1) |
request_dimensions_2 = {u'id': u'localhost', u'pool': u'default'} |
- _gen_new_task_to_run(properties=dict(dimensions=request_dimensions_2)) |
+ self._gen_new_task_to_run(properties=dict(dimensions=request_dimensions_2)) |
bot_dimensions = { |
u'foo': [u'bar'], |
@@ -573,13 +575,13 @@ class TaskToRunApiTest(TestCase): |
u'os': u'Windows-3.1.1', |
u'pool': u'default', |
} |
- _gen_new_task_to_run(properties=dict(dimensions=request_dimensions_1)) |
+ self._gen_new_task_to_run(properties=dict(dimensions=request_dimensions_1)) |
# The second shard is added before the first, potentially because of a |
# desynchronized clock. It'll have higher priority. |
self.mock_now(self.now, -1) |
request_dimensions_2 = {u'id': u'localhost', u'pool': u'default'} |
- _gen_new_task_to_run(properties=dict(dimensions=request_dimensions_2)) |
+ self._gen_new_task_to_run(properties=dict(dimensions=request_dimensions_2)) |
bot_dimensions = { |
u'foo': [u'bar'], |
@@ -606,13 +608,16 @@ class TaskToRunApiTest(TestCase): |
def test_yield_next_available_task_to_dispatch_priority(self): |
# Task added later but with higher priority are returned first. |
request_dimensions_1 = {u'os': u'Windows-3.1.1', u'pool': u'default'} |
- _gen_new_task_to_run(properties=dict(dimensions=request_dimensions_1)) |
+ self._gen_new_task_to_run(properties=dict(dimensions=request_dimensions_1)) |
# This one is later but has higher priority. |
self.mock_now(self.now, 60) |
request_dimensions_2 = {u'os': u'Windows-3.1.1', u'pool': u'default'} |
- _gen_new_task_to_run( |
- properties=dict(dimensions=request_dimensions_2), priority=10) |
+ request = self.mkreq( |
+ _gen_request( |
+ properties=dict(dimensions=request_dimensions_2), priority=10), |
+ nb_tasks=0) |
+ task_to_run.new_task_to_run(request).put() |
# It should return them all, in the expected order. |
expected = [ |
@@ -642,7 +647,7 @@ class TaskToRunApiTest(TestCase): |
u'os': u'Windows-3.1.1', |
u'pool': u'default', |
} |
- _gen_new_task_to_run( |
+ self._gen_new_task_to_run( |
properties=dict(dimensions=request_dimensions)) |
# Bot declares exactly same dimensions so it matches. |
bot_dimensions = {k: [v] for k, v in request_dimensions.iteritems()} |
@@ -657,7 +662,7 @@ class TaskToRunApiTest(TestCase): |
u'os': u'Windows-3.1.1', |
u'pool': u'default', |
} |
- _gen_new_task_to_run( |
+ self._gen_new_task_to_run( |
properties=dict(dimensions=request_dimensions)) |
# Bot declares exactly same dimensions so it matches. |
bot_dimensions = {k: [v] for k, v in request_dimensions.iteritems()} |
@@ -676,7 +681,7 @@ class TaskToRunApiTest(TestCase): |
request_dimensions = { |
u'id': u'fake-id', |
} |
- task = _gen_new_task_to_run( |
+ task = self._gen_new_task_to_run( |
priority=0, |
properties=dict( |
command=[], dimensions=request_dimensions, execution_timeout_secs=0, |
@@ -697,7 +702,7 @@ class TaskToRunApiTest(TestCase): |
def test_yield_expired_task_to_run(self): |
now = utils.utcnow() |
- _gen_new_task_to_run( |
+ self._gen_new_task_to_run( |
created_ts=now, |
expiration_ts=now+datetime.timedelta(seconds=60)) |
bot_dimensions = {u'id': [u'bot1'], u'pool': [u'default']} |
@@ -718,7 +723,8 @@ class TaskToRunApiTest(TestCase): |
def test_is_reapable(self): |
req_dimensions = {u'os': u'Windows-3.1.1', u'pool': u'default'} |
- to_run = _gen_new_task_to_run(properties=dict(dimensions=req_dimensions)) |
+ to_run = self._gen_new_task_to_run( |
+ properties=dict(dimensions=req_dimensions)) |
bot_dimensions = { |
u'id': [u'localhost'], |
u'os': [u'Windows-3.1.1'], |
@@ -733,7 +739,7 @@ class TaskToRunApiTest(TestCase): |
self.assertEqual(False, to_run.is_reapable) |
def test_set_lookup_cache(self): |
- to_run = _gen_new_task_to_run( |
+ to_run = self._gen_new_task_to_run( |
properties={ |
'dimensions': {u'os': u'Windows-3.1.1', u'pool': u'default'}, |
}) |