diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py index 156a34b6802b04833e74b1c2c70d86ab83c44d3b..b06e5003bef5bc8e47e5ebd82ae0ad18dfa689d5 100755 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py @@ -25,6 +25,7 @@ import os from datetime import datetime, timedelta from dateutil import parser import logging +from pprint import pformat logger = logging.getLogger(__name__) @@ -159,7 +160,7 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): # --- tests start here - # + # integrity tests of postgres database itself # # Note: These are meant to make sure the setup generally works and all sql scripts were applied. @@ -1290,6 +1291,73 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase): self.assertEqual(40, self.radb.get_max_resource_usage_between(117, task1['starttime'], task1['starttime'], 'claimed')['usage']) self.assertEqual(0, self.radb.get_max_resource_usage_between(117, task1['starttime']-timedelta(hours=2), task1['starttime']-timedelta(hours=1), 'claimed')['usage']) + def test_overlapping_claims(self): + # this is a special testcase to prove a bug found at 2017-08-16 + # the bug was that a claim that should fit, does not fit according to the radb claim-methods. + # first, we'll prove that the bug exists (and that this test fails), + # and then, we'll fix the code, (so this test succeeds) + + # for testing purposous let's give CEP4 storage a total size of 100 + self.assertTrue(self.radb.updateResourceAvailability(117, available_capacity=100, total_capacity=100)) + self.assertEqual(100, self.radb.getResources(117, include_availability=True)[0]['total_capacity']) + + now = datetime.utcnow() + now -= timedelta(minutes=now.minute, seconds=now.second, microseconds=now.microsecond) # round to full hour + + #insert one task, and reuse that for multiple overlapping claims + result = self.radb.insertSpecificationAndTask(0, 0, 'approved', 'observation', now, now+timedelta(hours=1), 'foo', 'CEP4') + self.assertTrue(result['inserted']) + task_id = result['task_id'] + + task = self.radb.getTask(task_id) + self.assertTrue(task) + self.assertEqual(task_id, task['id']) + + #create two overlapping claims + claims = [ { 'resource_id': 117, + 'starttime': now, + 'endtime': now+timedelta(hours=0.75), + 'status': 'tentative', + 'claim_size': 40 }, + {'resource_id': 117, + 'starttime': now+timedelta(hours=0.25), + 'endtime': now + timedelta(hours=1), + 'status': 'tentative', + 'claim_size': 40} ] + + # insert the claims + claim_ids = self.radb.insertResourceClaims(task_id, claims, 'foo', 1, 1) + self.assertEqual(2, len(claim_ids)) + claims_org = claims + + #get claim using t1_claim_ids, and check if db version is equal to original + claims = self.radb.getResourceClaims(claim_ids=claim_ids) + self.assertEqual(2, len(claims)) + for claim, claim_org in zip(claims, claims_org): + for key, value in claim_org.items(): + if key != 'status': + self.assertEqual(value, claim_org[key]) + + # try to update the claim status to claimed, should succeed. + self.assertTrue(self.radb.updateResourceClaims(claim_ids, status='claimed')) + for claim in self.radb.getResourceClaims(claim_ids=claim_ids): + self.assertEqual('claimed', claim['status']) + + # check the resource usage trend + logger.info("resource usages:\n%s", pformat(self.radb.getResourceUsages(now-timedelta(hours=1.0), now+timedelta(hours=2.0), 117))) + self.assertEqual(0, self.radb.get_max_resource_usage_between(117, now-timedelta(hours=1.0), now-timedelta(hours=0.01), 'claimed')['usage']) + self.assertEqual(40, self.radb.get_max_resource_usage_between(117, now+timedelta(hours=0.0), now+timedelta(hours=0.2), 'claimed')['usage']) + self.assertEqual(80, self.radb.get_max_resource_usage_between(117, now+timedelta(hours=0.3), now+timedelta(hours=0.6), 'claimed')['usage']) # AT THIS MOMENT THIS ASSERTS FAILS! (and should be fixed) + self.assertEqual(40, self.radb.get_max_resource_usage_between(117, now+timedelta(hours=0.80), now+timedelta(hours=1.0), 'claimed')['usage']) + self.assertEqual(80, self.radb.get_max_resource_usage_between(117, now+timedelta(hours=-0.1), now+timedelta(hours=1.1), 'claimed')['usage']) + self.assertEqual(0, self.radb.get_max_resource_usage_between(117, now+timedelta(hours=1.1), now+timedelta(hours=2.0), 'claimed')['usage']) + + # check that there are no overlapping conflicting claims/tasks + # AT THIS MOMENT THESE ASSERTS FAIL! (and should be fixed) + for claim in claims: + self.assertEqual(0, len(self.radb.get_conflicting_overlapping_claims(claim['id']))) + self.assertEqual(0, len(self.radb.get_conflicting_overlapping_tasks(claim['id']))) + if __name__ == "__main__": os.environ['TZ'] = 'UTC'