X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/cc952178056bf6d29471f6986306fb673dcf394a..093ec98e4a065acfc537ea22c08c337c115fe273:/sdk/cwl/tests/test_pathmapper.py diff --git a/sdk/cwl/tests/test_pathmapper.py b/sdk/cwl/tests/test_pathmapper.py index fb3c257d93..194092db7a 100644 --- a/sdk/cwl/tests/test_pathmapper.py +++ b/sdk/cwl/tests/test_pathmapper.py @@ -32,6 +32,13 @@ class TestPathmap(unittest.TestCase): self.api = mock.MagicMock() self.api._rootDesc = get_rootDesc() + def tearDown(self): + root_logger = logging.getLogger('') + + # Remove existing RuntimeStatusLoggingHandlers if they exist + handlers = [h for h in root_logger.handlers if not isinstance(h, arvados_cwl.executor.RuntimeStatusLoggingHandler)] + root_logger.handlers = handlers + def test_keepref(self): """Test direct keep references.""" @@ -102,3 +109,145 @@ class TestPathmap(unittest.TestCase): "class": "File", "location": "file:tests/hw.py" }], "", "/test/%s", "/test/%s/%s") + + def test_needs_new_collection(self): + arvrunner = arvados_cwl.executor.ArvCwlExecutor(self.api) + + # Plain file. Don't need a new collection. + a = { + "class": "File", + "location": "keep:99999999999999999999999999999991+99/hw.py", + "basename": "hw.py" + } + p = ArvPathMapper(arvrunner, [], "", "%s", "%s/%s") + p._pathmap["keep:99999999999999999999999999999991+99/hw.py"] = True + self.assertFalse(p.needs_new_collection(a)) + + # A file that isn't in the pathmap (for some reason). Need a new collection. + p = ArvPathMapper(arvrunner, [], "", "%s", "%s/%s") + self.assertTrue(p.needs_new_collection(a)) + + # A file with a secondary file in the same collection. Don't need + # a new collection. + a = { + "class": "File", + "location": "keep:99999999999999999999999999999991+99/hw.py", + "basename": "hw.py", + "secondaryFiles": [{ + "class": "File", + "location": "keep:99999999999999999999999999999991+99/hw.pyc", + "basename": "hw.pyc" + }] + } + p = ArvPathMapper(arvrunner, [], "", "%s", "%s/%s") + p._pathmap["keep:99999999999999999999999999999991+99/hw.py"] = True + p._pathmap["keep:99999999999999999999999999999991+99/hw.pyc"] = True + self.assertFalse(p.needs_new_collection(a)) + + # Secondary file is in a different collection from the + # a new collectionprimary. Need a new collection. + a = { + "class": "File", + "location": "keep:99999999999999999999999999999991+99/hw.py", + "basename": "hw.py", + "secondaryFiles": [{ + "class": "File", + "location": "keep:99999999999999999999999999999992+99/hw.pyc", + "basename": "hw.pyc" + }] + } + p = ArvPathMapper(arvrunner, [], "", "%s", "%s/%s") + p._pathmap["keep:99999999999999999999999999999991+99/hw.py"] = True + p._pathmap["keep:99999999999999999999999999999992+99/hw.pyc"] = True + self.assertTrue(p.needs_new_collection(a)) + + # Secondary file should be staged to a different name than + # path in location. Need a new collection. + a = { + "class": "File", + "location": "keep:99999999999999999999999999999991+99/hw.py", + "basename": "hw.py", + "secondaryFiles": [{ + "class": "File", + "location": "keep:99999999999999999999999999999991+99/hw.pyc", + "basename": "hw.other" + }] + } + p = ArvPathMapper(arvrunner, [], "", "%s", "%s/%s") + p._pathmap["keep:99999999999999999999999999999991+99/hw.py"] = True + p._pathmap["keep:99999999999999999999999999999991+99/hw.pyc"] = True + self.assertTrue(p.needs_new_collection(a)) + + # Secondary file is a directory. Do not need a new collection. + a = { + "class": "File", + "location": "keep:99999999999999999999999999999991+99/hw.py", + "basename": "hw.py", + "secondaryFiles": [{ + "class": "Directory", + "location": "keep:99999999999999999999999999999991+99/hw", + "basename": "hw", + "listing": [{ + "class": "File", + "location": "keep:99999999999999999999999999999991+99/hw/h2", + "basename": "h2" + }] + }] + } + p = ArvPathMapper(arvrunner, [], "", "%s", "%s/%s") + p._pathmap["keep:99999999999999999999999999999991+99/hw.py"] = True + p._pathmap["keep:99999999999999999999999999999991+99/hw"] = True + p._pathmap["keep:99999999999999999999999999999991+99/hw/h2"] = True + self.assertFalse(p.needs_new_collection(a)) + + # Secondary file is a renamed directory. Need a new collection. + a = { + "class": "File", + "location": "keep:99999999999999999999999999999991+99/hw.py", + "basename": "hw.py", + "secondaryFiles": [{ + "class": "Directory", + "location": "keep:99999999999999999999999999999991+99/hw", + "basename": "wh", + "listing": [{ + "class": "File", + "location": "keep:99999999999999999999999999999991+99/hw/h2", + "basename": "h2" + }] + }] + } + p = ArvPathMapper(arvrunner, [], "", "%s", "%s/%s") + p._pathmap["keep:99999999999999999999999999999991+99/hw.py"] = True + p._pathmap["keep:99999999999999999999999999999991+99/hw"] = True + p._pathmap["keep:99999999999999999999999999999991+99/hw/h2"] = True + self.assertTrue(p.needs_new_collection(a)) + + # Secondary file is a file literal. Need a new collection. + a = { + "class": "File", + "location": "keep:99999999999999999999999999999991+99/hw.py", + "basename": "hw.py", + "secondaryFiles": [{ + "class": "File", + "location": "_:123", + "basename": "hw.pyc", + "contents": "123" + }] + } + p = ArvPathMapper(arvrunner, [], "", "%s", "%s/%s") + p._pathmap["keep:99999999999999999999999999999991+99/hw.py"] = True + p._pathmap["_:123"] = True + self.assertTrue(p.needs_new_collection(a)) + + def test_is_in_collection(self): + arvrunner = arvados_cwl.executor.ArvCwlExecutor(self.api) + self.maxDiff = 1000000 + + cwd = os.getcwd() + p = ArvPathMapper(arvrunner, [{ + "class": "File", + "location": "file://"+cwd+"/tests/fake-keep-mount/fake_collection_dir/subdir/banana.txt" + }], "", "/test/%s", "/test/%s/%s") + + self.assertEqual({"file://"+cwd+"/tests/fake-keep-mount/fake_collection_dir/subdir/banana.txt": MapperEnt(resolved='keep:99999999999999999999999999999991+99/subdir/banana.txt', target='/test/99999999999999999999999999999991+99/subdir/banana.txt', type='File', staged=True)}, + p._pathmap)