[CalendarServer-changes] [8898] CalendarServer/trunk/txdav/xml

source_changes at macosforge.org source_changes at macosforge.org
Fri Mar 16 14:30:02 PDT 2012


Revision: 8898
          http://trac.macosforge.org/projects/calendarserver/changeset/8898
Author:   wsanchez at apple.com
Date:     2012-03-16 14:30:00 -0700 (Fri, 16 Mar 2012)
Log Message:
-----------
Flush out XML name encoding, add tests.

Modified Paths:
--------------
    CalendarServer/trunk/txdav/xml/base.py
    CalendarServer/trunk/txdav/xml/test/test_base.py

Modified: CalendarServer/trunk/txdav/xml/base.py
===================================================================
--- CalendarServer/trunk/txdav/xml/base.py	2012-03-16 20:42:15 UTC (rev 8897)
+++ CalendarServer/trunk/txdav/xml/base.py	2012-03-16 21:30:00 UTC (rev 8898)
@@ -1,6 +1,6 @@
 ##
+# Copyright (c) 2005-2012 Apple Computer, Inc. All rights reserved.
 # Copyright (c) 2007 Twisted Matrix Laboratories.
-# Copyright (c) 2005-2012 Apple Computer, Inc. All rights reserved.
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
@@ -70,25 +70,49 @@
     If namespace is None, returns "name", otherwise, returns
     "{namespace}name".
     """
-    if namespace is None: return name.encode("utf-8")
-    return (u"{%s}%s" % (namespace, name)).encode("utf-8")
+    if not namespace:
+        sname = name
+    else:
+        sname = u"{%s}%s" % (namespace, name)
 
+    return sname.encode("utf-8")
 
+
 def decodeXMLName(name):
     """
     Decodes an XML (namespace, name) pair from an ASCII string as
     encoded by encodeXMLName().
     """
-    if name[0] is not "{": return (None, name.decode("utf-8"))
+    def invalid():
+        raise ValueError("Invalid encoded name: %r" % (name,))
 
-    index = name.find("}")
+    if not name:
+        invalid()
 
-    if (index is -1 or not len(name) > index):
-        raise ValueError("Invalid encoded name: %r" % (name,))
+    if name[0] is "{":
+        index = name.find("}")
+        if (index is -1 or not len(name) > index):
+            invalid()
 
-    return (name[1:index].decode("utf-8"), name[index+1:].decode("utf-8"))
+        namespace = name[1:index].decode("utf-8")
+        localname = name[index+1:].decode("utf-8")
 
+        if not namespace:
+            namespace = None
 
+        if not localname:
+            invalid()
+
+    else:
+        namespace = None
+        localname = name.decode("utf-8")
+    
+    if "{" in localname or "}" in localname:
+        invalid()
+
+    return (namespace, localname)
+
+
 class WebDAVElement (object):
     """
     WebDAV XML element. (RFC 2518, section 12)

Modified: CalendarServer/trunk/txdav/xml/test/test_base.py
===================================================================
--- CalendarServer/trunk/txdav/xml/test/test_base.py	2012-03-16 20:42:15 UTC (rev 8897)
+++ CalendarServer/trunk/txdav/xml/test/test_base.py	2012-03-16 21:30:00 UTC (rev 8898)
@@ -1,8 +1,6 @@
-# Copyright (c) 2009 Twisted Matrix Laboratories.
-# See LICENSE for details.
-
 ##
 # Copyright (c) 2005-2012 Apple Computer, Inc. All rights reserved.
+# Copyright (c) 2009 Twisted Matrix Laboratories.
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
@@ -28,9 +26,47 @@
 """
 
 from twisted.trial.unittest import TestCase
+from txdav.xml.base import decodeXMLName, encodeXMLName
 from twext.web2.dav.davxml import WebDAVDocument, WebDAVUnknownElement
 
 
+class NameEncodeTests(TestCase):
+    """
+    Name encoding tests.
+    """
+    def test_decodeXMLName(self):
+        # Empty name
+        self.assertRaises(ValueError, decodeXMLName, "") 
+        self.assertRaises(ValueError, decodeXMLName, "{}")
+        self.assertRaises(ValueError, decodeXMLName, "{x}")
+
+        # Weird bracket cases
+        self.assertRaises(ValueError, decodeXMLName, "{")
+        self.assertRaises(ValueError, decodeXMLName, "x{")
+        self.assertRaises(ValueError, decodeXMLName, "{x")
+        self.assertRaises(ValueError, decodeXMLName, "}")
+        self.assertRaises(ValueError, decodeXMLName, "x}")
+        self.assertRaises(ValueError, decodeXMLName, "}x")  
+        self.assertRaises(ValueError, decodeXMLName, "{{}")
+        self.assertRaises(ValueError, decodeXMLName, "{{}}")
+        self.assertRaises(ValueError, decodeXMLName, "x{}")
+
+        # Empty namespace is OK
+        self.assertEquals(decodeXMLName(  "x"), (None, "x"))
+        self.assertEquals(decodeXMLName("{}x"), (None, "x"))
+
+        # Normal case
+        self.assertEquals(decodeXMLName("{namespace}name"), ("namespace", "name"))
+
+    def test_encodeXMLName(self):
+        # No namespace
+        self.assertEquals(encodeXMLName(None, "name"), "name")
+        self.assertEquals(encodeXMLName(""  , "name"), "name")
+
+        # Normal case
+        self.assertEquals(encodeXMLName("namespace", "name"), "{namespace}name")
+
+
 class WebDAVElementTestsMixin:
     """
     Mixin for L{TestCase}s which test a L{WebDAVElement} subclass.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120316/80a7d2fc/attachment-0001.html>


More information about the calendarserver-changes mailing list