10576: Tests & fixes for keep ref url join.
authorPeter Amstutz <peter.amstutz@curoverse.com>
Fri, 2 Dec 2016 22:17:25 +0000 (17:17 -0500)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Fri, 2 Dec 2016 22:17:25 +0000 (17:17 -0500)
sdk/cwl/arvados_cwl/fsaccess.py
sdk/cwl/tests/test_urljoin.py [new file with mode: 0644]

index 9d3fe1c1ba7b699f3491a3b69b30750051aadd33..9cb73d3582dc29ffe0b585bc97fca873ebcbdfa0 100644 (file)
@@ -145,7 +145,7 @@ class CollectionFetcher(DefaultFetcher):
             return base_url
 
         urlsp = urlparse.urlsplit(url)
-        if urlsp.scheme:
+        if urlsp.scheme or not base_url:
             return url
 
         basesp = urlparse.urlsplit(base_url)
@@ -154,7 +154,7 @@ class CollectionFetcher(DefaultFetcher):
                 raise IOError(errno.EINVAL, "Invalid Keep locator", base_url)
 
             baseparts = basesp.path.split("/")
-            urlparts = urlsp.path.split("/")
+            urlparts = urlsp.path.split("/") if urlsp.path else []
 
             pdh = baseparts.pop(0)
 
@@ -163,8 +163,9 @@ class CollectionFetcher(DefaultFetcher):
 
             if urlsp.path.startswith("/"):
                 baseparts = []
+                urlparts.pop(0)
 
-            if baseparts and urlparts:
+            if baseparts and urlsp.path:
                 baseparts.pop()
 
             path = "/".join([pdh] + baseparts + urlparts)
diff --git a/sdk/cwl/tests/test_urljoin.py b/sdk/cwl/tests/test_urljoin.py
new file mode 100644 (file)
index 0000000..eaede53
--- /dev/null
@@ -0,0 +1,53 @@
+import functools
+import mock
+import sys
+import unittest
+import json
+import logging
+import os
+
+import arvados
+import arvados.keep
+import arvados.collection
+import arvados_cwl
+
+from arvados_cwl.fsaccess import CollectionFetcher
+
+class TestUrljoin(unittest.TestCase):
+    def test_urljoin(self):
+        """Test path joining for keep references."""
+
+        cf = CollectionFetcher({}, None)
+
+        self.assertEquals("keep:99999999999999999999999999999991+99/hw.py",
+                          cf.urljoin("keep:99999999999999999999999999999991+99", "hw.py"))
+
+        self.assertEquals("keep:99999999999999999999999999999991+99/hw.py",
+                          cf.urljoin("keep:99999999999999999999999999999991+99/", "hw.py"))
+
+        self.assertEquals("keep:99999999999999999999999999999991+99/hw.py#main",
+                          cf.urljoin("keep:99999999999999999999999999999991+99", "hw.py#main"))
+
+        self.assertEquals("keep:99999999999999999999999999999991+99/hw.py#main",
+                          cf.urljoin("keep:99999999999999999999999999999991+99/hw.py", "#main"))
+
+        self.assertEquals("keep:99999999999999999999999999999991+99/dir/hw.py#main",
+                          cf.urljoin("keep:99999999999999999999999999999991+99/dir/hw.py", "#main"))
+
+        self.assertEquals("keep:99999999999999999999999999999991+99/dir/wh.py",
+                          cf.urljoin("keep:99999999999999999999999999999991+99/dir/hw.py", "wh.py"))
+
+        self.assertEquals("keep:99999999999999999999999999999991+99/wh.py",
+                          cf.urljoin("keep:99999999999999999999999999999991+99/dir/hw.py", "/wh.py"))
+
+        self.assertEquals("keep:99999999999999999999999999999991+99/wh.py#main",
+                          cf.urljoin("keep:99999999999999999999999999999991+99/dir/hw.py", "/wh.py#main"))
+
+        self.assertEquals("keep:99999999999999999999999999999991+99/wh.py",
+                          cf.urljoin("keep:99999999999999999999999999999991+99/hw.py#main", "wh.py"))
+
+        self.assertEquals("keep:99999999999999999999999999999992+99",
+                          cf.urljoin("keep:99999999999999999999999999999991+99", "keep:99999999999999999999999999999992+99"))
+
+        self.assertEquals("keep:99999999999999999999999999999991+99/dir/wh.py",
+                          cf.urljoin("keep:99999999999999999999999999999991+99/dir/", "wh.py"))