def test_lock_offline(self): with TemporaryDirectory() as tmpdirname: list_file = os.path.join(tmpdirname, 'test.json') with open(list_file, 'w') as fp: fp.write('[{"id": 1, "hostname": "myhost", "online": false}]') lock_file = os.path.join(tmpdirname, '1.pid') lockable = Lockable(hostname='myhost', resource_list_file=list_file, lock_folder=tmpdirname) self.assertFalse(os.path.exists(lock_file)) with self.assertRaises(ResourceNotFound): self.assertFalse(os.path.exists(lock_file)) lockable.lock({}, timeout_s=0) self.assertFalse(os.path.exists(lock_file))
def test_constructor_file_not_found(self): with TemporaryDirectory() as tmpdirname: list_file = os.path.join(tmpdirname, 'test.json') with self.assertRaises(FileNotFoundError): Lockable(hostname='myhost', resource_list_file=list_file, lock_folder=tmpdirname)
def test_auto_lock(self): with TemporaryDirectory() as tmpdirname: list_file = os.path.join(tmpdirname, 'test.json') resource_info = {"id": 1, "hostname": "myhost", "online": True} with open(list_file, 'w') as fp: fp.write(f'[{json.dumps(resource_info)}]') lockable = Lockable(hostname='myhost', resource_list_file=list_file, lock_folder=tmpdirname) lock_file = os.path.join(tmpdirname, '1.pid') self.assertFalse(os.path.exists(lock_file)) with lockable.auto_lock({}) as context: resource = context.resource_info self.assertEqual(resource, resource_info) self.assertTrue(os.path.exists(lock_file)) self.assertFalse(os.path.exists(lock_file))
def test_missing_id(self): with TemporaryDirectory() as tmpdirname: list_file = os.path.join(tmpdirname, 'test.json') with open(list_file, 'w') as fp: fp.write('[{}]') with self.assertRaises(ValueError): Lockable(hostname='myhost', resource_list_file=list_file, lock_folder=tmpdirname)
def test_constructor(self): with TemporaryDirectory() as tmpdirname: list_file = os.path.join(tmpdirname, 'test.json') with open(list_file, 'w') as fp: fp.write('[]') lockable = Lockable(hostname='myhost', resource_list_file=list_file, lock_folder=tmpdirname) self.assertFalse(lockable._resource_list_file_mtime is None)
def create_lockable( data=[{ "id": 1, "hostname": "myhost", "online": True }], lock_folder=None): with TemporaryDirectory() as tmpdirname: lock_folder = lock_folder or tmpdirname yield Lockable(hostname='myhost', resource_list=data, lock_folder=lock_folder)
def test_reload_resource_list_file(self): with TemporaryDirectory() as tmpdirname: list_file = os.path.join(tmpdirname, 'test.json') with open(list_file, 'w') as fp: fp.write('[]') # mtime has at worst 1 second precision time.sleep(1) lockable = Lockable(hostname='myhost', resource_list_file=list_file, lock_folder=tmpdirname) lockable.load_resources_list_file = mock.MagicMock() self.assertEqual(lockable.load_resources_list_file.call_count, 0) lockable.reload_resource_list_file() self.assertEqual(lockable.load_resources_list_file.call_count, 0) with open(list_file, 'w') as fp: fp.write('[1]') lockable.reload_resource_list_file() self.assertEqual(lockable.load_resources_list_file.call_count, 1) # Check that stored mtime value is updated lockable.reload_resource_list_file() self.assertEqual(lockable.load_resources_list_file.call_count, 1)
def test_lock_require_resources_json_loaded(self): lockable = Lockable() with self.assertRaises(AssertionError) as error: lockable.lock({}) self.assertEqual(str(error.exception), 'resources list is not loaded')
def test_invalid_constructor(self): with self.assertRaises(AssertionError): Lockable(hostname='myhost', resource_list_file='asdf', resource_list=[], lock_folder='.')
def test_parse_requirements(self): self.assertEqual(Lockable.parse_requirements(''), {}) self.assertEqual(Lockable.parse_requirements('{}'), {}) self.assertEqual(Lockable.parse_requirements({'a': 'b'}), {'a': 'b'}) self.assertEqual(Lockable.parse_requirements('a=b'), {"a": "b"}) self.assertEqual(Lockable.parse_requirements('a=true'), {"a": True}) self.assertEqual(Lockable.parse_requirements('a=False'), {"a": False}) self.assertEqual(Lockable.parse_requirements('a=b&c=d'), { "a": "b", "c": "d" }) self.assertEqual(Lockable.parse_requirements('{"a":"b","c":"d"}'), { "a": "b", "c": "d" }) with self.assertRaises(ValueError): Lockable.parse_requirements('a') with self.assertRaises(ValueError): Lockable.parse_requirements('a=') with self.assertRaises(ValueError): Lockable.parse_requirements('{"a":"b","c":"d}')