[Lxml-checkins] r54978 - in lxml/trunk: . src/lxml/tests

scoder at codespeak.net scoder at codespeak.net
Tue May 20 00:02:17 CEST 2008


Author: scoder
Date: Tue May 20 00:02:14 2008
New Revision: 54978

Modified:
   lxml/trunk/   (props changed)
   lxml/trunk/src/lxml/tests/common_imports.py
   lxml/trunk/src/lxml/tests/test_classlookup.py
   lxml/trunk/src/lxml/tests/test_dtd.py
   lxml/trunk/src/lxml/tests/test_elementtree.py
   lxml/trunk/src/lxml/tests/test_errors.py
   lxml/trunk/src/lxml/tests/test_etree.py
   lxml/trunk/src/lxml/tests/test_htmlparser.py
   lxml/trunk/src/lxml/tests/test_io.py
   lxml/trunk/src/lxml/tests/test_nsclasses.py
   lxml/trunk/src/lxml/tests/test_objectify.py
   lxml/trunk/src/lxml/tests/test_pyclasslookup.py
   lxml/trunk/src/lxml/tests/test_relaxng.py
   lxml/trunk/src/lxml/tests/test_sax.py
   lxml/trunk/src/lxml/tests/test_schematron.py
   lxml/trunk/src/lxml/tests/test_threading.py
   lxml/trunk/src/lxml/tests/test_xmlschema.py
   lxml/trunk/src/lxml/tests/test_xpathevaluator.py
   lxml/trunk/src/lxml/tests/test_xslt.py
Log:
 r4235 at delle:  sbehnel | 2008-05-19 23:57:56 +0200
 Py3 test fixes


Modified: lxml/trunk/src/lxml/tests/common_imports.py
==============================================================================
--- lxml/trunk/src/lxml/tests/common_imports.py	(original)
+++ lxml/trunk/src/lxml/tests/common_imports.py	Tue May 20 00:02:14 2008
@@ -1,6 +1,6 @@
 import unittest
 import os.path
-import re, gc
+import re, gc, sys
 
 from lxml import etree
 
@@ -56,38 +56,41 @@
         seq = list(seq)
         seq.sort(**kwargs)
         return seq
+else:
+    locals()['sorted'] = sorted
 
-try:
-    unicode
-except NameError:
+if sys.version_info >= (3,):
     # Python 3
     unicode = str
-    def unicode_literal(s, encoding="UTF-8"):
+    def _str(s, encoding="UTF-8"):
         return s
-    def byte_literal(s, encoding="UTF-8"):
+    def _bytes(s, encoding="UTF-8"):
         return s.encode(encoding)
+    from io import StringIO, BytesIO as _BytesIO
+    def BytesIO(*args):
+        if args and isinstance(args[0], str):
+            args = (args[0].encode("UTF-8"),)
+        return _BytesIO(*args)
 else:
     # Python 2
-    unicode_literal = unicode
-    def byte_literal(s, encoding="UTF-8"):
+    def _str(s, encoding="UTF-8"):
+        return unicode(s, encoding=encoding)
+    def _bytes(s, encoding="UTF-8"):
         return s
-
-try:
     from StringIO import StringIO
-except ImportError:
-    # Python 3
-    from io import StringIO
+    BytesIO = StringIO
 
 class HelperTestCase(unittest.TestCase):
     def tearDown(self):
         gc.collect()
 
     def parse(self, text, parser=None):
-        f = StringIO(text)
+        f = BytesIO(text)
         return etree.parse(f, parser=parser)
     
     def _rootstring(self, tree):
-        return etree.tostring(tree.getroot()).replace(' ', '').replace('\n', '')
+        return etree.tostring(tree.getroot()).replace(
+            _bytes(' '), _bytes('')).replace(_bytes('\n'), _bytes(''))
 
     # assertFalse doesn't exist in Python 2.3
     try:
@@ -149,13 +152,13 @@
         return result
 
 def fileInTestDir(name):
-    _testdir = os.path.split(__file__)[0]
+    _testdir = os.path.dirname(__file__)
     return os.path.join(_testdir, name)
 
 def canonicalize(xml):
-    f = StringIO(xml)
+    f = BytesIO(xml)
     tree = etree.parse(f)
-    f = StringIO()
+    f = BytesIO()
     tree.write_c14n(f)
     return f.getvalue()
 

Modified: lxml/trunk/src/lxml/tests/test_classlookup.py
==============================================================================
--- lxml/trunk/src/lxml/tests/test_classlookup.py	(original)
+++ lxml/trunk/src/lxml/tests/test_classlookup.py	Tue May 20 00:02:14 2008
@@ -160,4 +160,4 @@
     return suite
 
 if __name__ == '__main__':
-    print 'to test use test.py %s' % __file__
+    print('to test use test.py %s' % __file__)

Modified: lxml/trunk/src/lxml/tests/test_dtd.py
==============================================================================
--- lxml/trunk/src/lxml/tests/test_dtd.py	(original)
+++ lxml/trunk/src/lxml/tests/test_dtd.py	Tue May 20 00:02:14 2008
@@ -130,4 +130,4 @@
     return suite
 
 if __name__ == '__main__':
-    print 'to test use test.py %s' % __file__
+    print('to test use test.py %s' % __file__)

Modified: lxml/trunk/src/lxml/tests/test_elementtree.py
==============================================================================
--- lxml/trunk/src/lxml/tests/test_elementtree.py	(original)
+++ lxml/trunk/src/lxml/tests/test_elementtree.py	Tue May 20 00:02:14 2008
@@ -15,9 +15,9 @@
 if this_dir not in sys.path:
     sys.path.insert(0, this_dir) # needed for Py3
 
-from common_imports import StringIO, etree, ElementTree, cElementTree
+from common_imports import StringIO, BytesIO, etree, ElementTree, cElementTree
 from common_imports import fileInTestDir, canonicalize, HelperTestCase
-from common_imports import unicode_literal, byte_literal
+from common_imports import _str, _bytes
 
 if cElementTree is not None:
     if tuple([int(n) for n in
@@ -59,7 +59,7 @@
     def test_weird_dict_interaction(self):
         root = self.etree.Element('root')
         self.assertEquals(root.tag, "root")
-        add = self.etree.ElementTree(file=StringIO('<foo>Foo</foo>'))
+        add = self.etree.ElementTree(file=BytesIO('<foo>Foo</foo>'))
         self.assertEquals(add.getroot().tag, "foo")
         self.assertEquals(add.getroot().text, "Foo")
         root.append(self.etree.Element('baz'))
@@ -100,7 +100,7 @@
     def test_element_indexing_with_text(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc>Test<one>One</one></doc>')
+        f = BytesIO('<doc>Test<one>One</one></doc>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals(1, len(root))
@@ -110,7 +110,7 @@
     def test_element_indexing_with_text2(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc><one>One</one><two>Two</two>hm<three>Three</three></doc>')
+        f = BytesIO('<doc><one>One</one><two>Two</two>hm<three>Three</three></doc>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals(3, len(root))
@@ -121,7 +121,7 @@
     def test_element_indexing_only_text(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc>Test</doc>')
+        f = BytesIO('<doc>Test</doc>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals(0, len(root))
@@ -145,7 +145,7 @@
     def test_elementtree(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc><one>One</one><two>Two</two></doc>')
+        f = BytesIO('<doc><one>One</one><two>Two</two></doc>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals(2, len(root))
@@ -155,7 +155,7 @@
     def test_text(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc>This is a text</doc>')
+        f = BytesIO('<doc>This is a text</doc>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals('This is a text', root.text)
@@ -163,7 +163,7 @@
     def test_text_empty(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc></doc>')
+        f = BytesIO('<doc></doc>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals(None, root.text)
@@ -171,7 +171,7 @@
     def test_text_other(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc><one>One</one></doc>')
+        f = BytesIO('<doc><one>One</one></doc>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals(None, root.text)
@@ -180,7 +180,7 @@
     def test_text_escape_in(self):
         ElementTree = self.etree.ElementTree
 
-        f = StringIO('<doc>This is &gt; than a text</doc>')
+        f = BytesIO('<doc>This is &gt; than a text</doc>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals('This is > than a text', root.text)
@@ -190,7 +190,7 @@
 
         a = Element("a")
         a.text = "<>&"
-        self.assertXML('<a>&lt;&gt;&amp;</a>',
+        self.assertXML(_bytes('<a>&lt;&gt;&amp;</a>'),
                        a)
 
     def test_text_escape_tostring(self):
@@ -199,7 +199,7 @@
 
         a = Element("a")
         a.text = "<>&"
-        self.assertEquals('<a>&lt;&gt;&amp;</a>',
+        self.assertEquals(_bytes('<a>&lt;&gt;&amp;</a>'),
                          tostring(a))
 
     def test_text_str_subclass(self):
@@ -210,13 +210,13 @@
 
         a = Element("a")
         a.text = strTest("text")
-        self.assertXML('<a>text</a>',
+        self.assertXML(_bytes('<a>text</a>'),
                        a)
 
     def test_tail(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc>This is <i>mixed</i> content.</doc>')
+        f = BytesIO('<doc>This is <i>mixed</i> content.</doc>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals(1, len(root))
@@ -234,14 +234,14 @@
 
         a = Element("a")
         SubElement(a, "t").tail = strTest("tail")
-        self.assertXML('<a><t></t>tail</a>',
+        self.assertXML(_bytes('<a><t></t>tail</a>'),
                        a)
 
     def _test_del_tail(self):
         # this is discouraged for ET compat, should not be tested...
         XML = self.etree.XML
         
-        root = XML('<doc>This is <i>mixed</i> content.</doc>')
+        root = XML(_bytes('<doc>This is <i>mixed</i> content.</doc>'))
         self.assertEquals(1, len(root))
         self.assertEquals('This is ', root.text)
         self.assertEquals(None, root.tail)
@@ -277,7 +277,7 @@
     def test_attributes(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc one="One" two="Two"/>')
+        f = BytesIO('<doc one="One" two="Two"/>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals('One', root.attrib['one'])
@@ -287,7 +287,7 @@
     def test_attributes2(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc one="One" two="Two"/>')
+        f = BytesIO('<doc one="One" two="Two"/>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals('One', root.attrib.get('one'))
@@ -298,7 +298,7 @@
     def test_attributes3(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc one="One" two="Two"/>')
+        f = BytesIO('<doc one="One" two="Two"/>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals('One', root.get('one'))
@@ -309,7 +309,7 @@
     def test_attrib_clear(self):
         XML = self.etree.XML
         
-        root = XML('<doc one="One" two="Two"/>')
+        root = XML(_bytes('<doc one="One" two="Two"/>'))
         self.assertEquals('One', root.get('one'))
         self.assertEquals('Two', root.get('two'))
         root.attrib.clear()
@@ -348,7 +348,7 @@
     def test_attrib_pop(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<doc one="One" two="Two"/>')
+        f = BytesIO('<doc one="One" two="Two"/>')
         doc = ElementTree(file=f)
         root = doc.getroot()
         self.assertEquals('One', root.attrib['one'])
@@ -360,29 +360,29 @@
         self.assertEquals('Two', root.attrib['two'])
 
     def test_attrib_pop_unknown(self):
-        root = self.etree.XML('<doc one="One" two="Two"/>')
+        root = self.etree.XML(_bytes('<doc one="One" two="Two"/>'))
         self.assertRaises(KeyError, root.attrib.pop, 'NONE')
 
         self.assertEquals('One', root.attrib['one'])
         self.assertEquals('Two', root.attrib['two'])
 
     def test_attrib_pop_default(self):
-        root = self.etree.XML('<doc one="One" two="Two"/>')
+        root = self.etree.XML(_bytes('<doc one="One" two="Two"/>'))
         self.assertEquals('Three', root.attrib.pop('three', 'Three'))
 
     def test_attrib_pop_empty_default(self):
-        root = self.etree.XML('<doc/>')
+        root = self.etree.XML(_bytes('<doc/>'))
         self.assertEquals('Three', root.attrib.pop('three', 'Three'))
 
     def test_attrib_pop_invalid_args(self):
-        root = self.etree.XML('<doc one="One" two="Two"/>')
+        root = self.etree.XML(_bytes('<doc one="One" two="Two"/>'))
         self.assertRaises(TypeError, root.attrib.pop, 'One', None, None)
 
     def test_attribute_update_dict(self):
         XML = self.etree.XML
         
-        root = XML('<doc alpha="Alpha" beta="Beta"/>')
-        items = root.attrib.items()
+        root = XML(_bytes('<doc alpha="Alpha" beta="Beta"/>'))
+        items = list(root.attrib.items())
         items.sort()
         self.assertEquals(
             [('alpha', 'Alpha'), ('beta', 'Beta')],
@@ -390,7 +390,7 @@
 
         root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'})
 
-        items = root.attrib.items()
+        items = list(root.attrib.items())
         items.sort()
         self.assertEquals(
             [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')],
@@ -399,8 +399,8 @@
     def test_attribute_update_sequence(self):
         XML = self.etree.XML
         
-        root = XML('<doc alpha="Alpha" beta="Beta"/>')
-        items = root.attrib.items()
+        root = XML(_bytes('<doc alpha="Alpha" beta="Beta"/>'))
+        items = list(root.attrib.items())
         items.sort()
         self.assertEquals(
             [('alpha', 'Alpha'), ('beta', 'Beta')],
@@ -408,7 +408,7 @@
 
         root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}.items())
 
-        items = root.attrib.items()
+        items = list(root.attrib.items())
         items.sort()
         self.assertEquals(
             [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')],
@@ -417,16 +417,16 @@
     def test_attribute_update_iter(self):
         XML = self.etree.XML
         
-        root = XML('<doc alpha="Alpha" beta="Beta"/>')
-        items = root.attrib.items()
+        root = XML(_bytes('<doc alpha="Alpha" beta="Beta"/>'))
+        items = list(root.attrib.items())
         items.sort()
         self.assertEquals(
             [('alpha', 'Alpha'), ('beta', 'Beta')],
             items)
 
-        root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}.iteritems())
+        root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}.items())
 
-        items = root.attrib.items()
+        items = list(root.attrib.items())
         items.sort()
         self.assertEquals(
             [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')],
@@ -435,7 +435,7 @@
     def test_attribute_keys(self):
         XML = self.etree.XML
         
-        root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
+        root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>'))
         keys = root.attrib.keys()
         keys.sort()
         self.assertEquals(['alpha', 'beta', 'gamma'], keys)
@@ -443,7 +443,7 @@
     def test_attribute_keys2(self):
         XML = self.etree.XML
         
-        root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
+        root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>'))
         keys = root.keys()
         keys.sort()
         self.assertEquals(['alpha', 'beta', 'gamma'], keys)
@@ -451,8 +451,8 @@
     def test_attribute_items2(self):
         XML = self.etree.XML
         
-        root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
-        items = root.items()
+        root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>'))
+        items = list(root.items())
         items.sort()
         self.assertEquals(
             [('alpha','Alpha'), ('beta','Beta'), ('gamma','Gamma')],
@@ -461,7 +461,7 @@
     def test_attribute_keys_ns(self):
         XML = self.etree.XML
 
-        root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
+        root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />'))
         keys = root.keys()
         keys.sort()
         self.assertEquals(['bar', '{http://ns.codespeak.net/test}baz'],
@@ -470,7 +470,7 @@
     def test_attribute_values(self):
         XML = self.etree.XML
         
-        root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
+        root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>'))
         values = root.attrib.values()
         values.sort()
         self.assertEquals(['Alpha', 'Beta', 'Gamma'], values)
@@ -478,7 +478,7 @@
     def test_attribute_values_ns(self):
         XML = self.etree.XML
         
-        root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
+        root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />'))
         values = root.attrib.values()
         values.sort()
         self.assertEquals(
@@ -487,8 +487,8 @@
     def test_attribute_items(self):
         XML = self.etree.XML
         
-        root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
-        items = root.attrib.items()
+        root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>'))
+        items = list(root.attrib.items())
         items.sort()
         self.assertEquals([
             ('alpha', 'Alpha'),
@@ -500,8 +500,8 @@
     def test_attribute_items_ns(self):
         XML = self.etree.XML
         
-        root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
-        items = root.attrib.items()
+        root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />'))
+        items = list(root.attrib.items())
         items.sort()
         self.assertEquals(
             [('bar', 'Bar'), ('{http://ns.codespeak.net/test}baz', 'Baz')],
@@ -513,7 +513,7 @@
         expected = "{'{http://ns.codespeak.net/test}baz': 'Baz', 'bar': 'Bar'}"
         alternative = "{'bar': 'Bar', '{http://ns.codespeak.net/test}baz': 'Baz'}"
         
-        root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
+        root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />'))
         try:
             self.assertEquals(expected, str(root.attrib))
         except AssertionError:
@@ -522,7 +522,7 @@
     def test_attribute_has_key(self):
         XML = self.etree.XML
 
-        root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
+        root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />'))
         self.assertEquals(
             True, root.attrib.has_key('bar'))
         self.assertEquals(
@@ -536,7 +536,7 @@
     def test_attribute_contains(self):
         XML = self.etree.XML
 
-        root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
+        root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />'))
         self.assertEquals(
             True, 'bar' in root.attrib)
         self.assertEquals(
@@ -557,14 +557,14 @@
     def test_XML(self):
         XML = self.etree.XML
         
-        root = XML('<doc>This is a text.</doc>')
+        root = XML(_bytes('<doc>This is a text.</doc>'))
         self.assertEquals(0, len(root))
         self.assertEquals('This is a text.', root.text)
 
     def test_XMLID(self):
         XMLID = self.etree.XMLID
         XML   = self.etree.XML
-        xml_text = '''
+        xml_text = _bytes('''
         <document>
           <h1 id="chapter1">...</h1>
           <p id="note1" class="note">...</p>
@@ -572,7 +572,7 @@
           <p xml:id="xmlid">XML:ID paragraph.</p>
           <p id="warn1" class="warning">...</p>
         </document>
-        '''
+        ''')
 
         root, dic = XMLID(xml_text)
         root2 = XML(xml_text)
@@ -625,7 +625,7 @@
         el = Element('hoi')
         self.assert_(iselement(el))
 
-        el2 = XML('<foo/>')
+        el2 = XML(_bytes('<foo/>'))
         self.assert_(iselement(el2))
 
         tree = ElementTree(element=Element('dag'))
@@ -641,7 +641,7 @@
     def test_iteration(self):
         XML = self.etree.XML
         
-        root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
+        root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>'))
         result = []
         for el in root:
             result.append(el.tag)
@@ -650,7 +650,7 @@
     def test_iteration_empty(self):
         XML = self.etree.XML
         
-        root = XML('<doc></doc>')
+        root = XML(_bytes('<doc></doc>'))
         result = []
         for el in root:
             result.append(el.tag)
@@ -659,7 +659,7 @@
     def test_iteration_text_only(self):
         XML = self.etree.XML
         
-        root = XML('<doc>Text</doc>')
+        root = XML(_bytes('<doc>Text</doc>'))
         result = []
         for el in root:
             result.append(el.tag)
@@ -674,7 +674,7 @@
 
     def test_iteration_reversed(self):
         XML = self.etree.XML
-        root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
+        root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>'))
         result = []
         for el in reversed(root):
             result.append(el.tag)
@@ -683,7 +683,7 @@
     def test_iteration_subelement(self):
         XML = self.etree.XML
 
-        root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
+        root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>'))
         result = []
         add = True
         for el in root:
@@ -696,7 +696,7 @@
     def test_iteration_del_child(self):
         XML = self.etree.XML
 
-        root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
+        root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>'))
         result = []
         for el in root:
             result.append(el.tag)
@@ -706,7 +706,7 @@
     def test_iteration_double(self):
         XML = self.etree.XML
 
-        root = XML('<doc><one/><two/></doc>')
+        root = XML(_bytes('<doc><one/><two/></doc>'))
         result = []
         for el0 in root:
             result.append(el0.tag)
@@ -717,7 +717,7 @@
     def test_attribute_iterator(self):
         XML = self.etree.XML
         
-        root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma" />')
+        root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma" />'))
         result = []
         for key in root.attrib:
             result.append(key)
@@ -727,7 +727,7 @@
     def test_itertext(self):
         # ET 1.3+
         XML = self.etree.XML
-        root = XML("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>")
+        root = XML(_bytes("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>"))
 
         text = list(root.itertext())
         self.assertEquals(["RTEXT", "ATAIL", "CTEXT", "CTAIL"],
@@ -736,7 +736,7 @@
     def test_itertext_child(self):
         # ET 1.3+
         XML = self.etree.XML
-        root = XML("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>")
+        root = XML(_bytes("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>"))
 
         text = list(root[2].itertext())
         self.assertEquals(["CTEXT"],
@@ -744,7 +744,7 @@
 
     def test_findall(self):
         XML = self.etree.XML
-        root = XML('<a><b><c/></b><b/><c><b/></c></a>')
+        root = XML(_bytes('<a><b><c/></b><b/><c><b/></c></a>'))
         self.assertEquals(len(list(root.findall("c"))), 1)
         self.assertEquals(len(list(root.findall(".//c"))), 2)
         self.assertEquals(len(list(root.findall(".//b"))), 3)
@@ -754,7 +754,7 @@
 
     def test_findall_ns(self):
         XML = self.etree.XML
-        root = XML('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>')
+        root = XML(_bytes('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>'))
         self.assertEquals(len(list(root.findall(".//{X}b"))), 2)
         self.assertEquals(len(list(root.findall(".//b"))), 3)
         self.assertEquals(len(list(root.findall("b"))), 2)
@@ -803,13 +803,13 @@
         XML = self.etree.XML
 
         for i in range(10):
-            f = StringIO() 
-            root = XML('<doc%s>This is a test.</doc%s>' % (i, i))
+            f = BytesIO() 
+            root = XML(_bytes('<doc%s>This is a test.</doc%s>' % (i, i)))
             tree = ElementTree(element=root)
             tree.write(f)
             data = f.getvalue()
             self.assertEquals(
-                '<doc%s>This is a test.</doc%s>' % (i, i),
+                _bytes('<doc%s>This is a test.</doc%s>' % (i, i)),
                 canonicalize(data))
 
     def test_write_method_html(self):
@@ -824,11 +824,11 @@
         SubElement(p, 'br').tail = "test"
 
         tree = ElementTree(element=html)
-        f = StringIO() 
+        f = BytesIO() 
         tree.write(f, method="html")
-        data = f.getvalue().replace('\n','')
+        data = f.getvalue().replace(_bytes('\n'),_bytes(''))
 
-        self.assertEquals('<html><body><p>html<br>test</p></body></html>',
+        self.assertEquals(_bytes('<html><body><p>html<br>test</p></body></html>'),
                           data)
 
     def test_write_method_text(self):
@@ -846,18 +846,18 @@
         c.text = "C"
         
         tree = ElementTree(element=a)
-        f = StringIO() 
+        f = BytesIO() 
         tree.write(f, method="text")
         data = f.getvalue()
 
-        self.assertEquals('ABTAILCtail',
+        self.assertEquals(_bytes('ABTAILCtail'),
                           data)
         
     def test_write_fail(self):
         ElementTree = self.etree.ElementTree
         XML = self.etree.XML
 
-        tree = ElementTree( XML('<doc>This is a test.</doc>') )
+        tree = ElementTree( XML(_bytes('<doc>This is a test.</doc>')) )
         self.assertRaises(IOError, tree.write,
                           "definitely////\\-\\nonexisting\\-\\////FILE")
 
@@ -877,7 +877,7 @@
         Element = self.etree.Element
         ElementTree = self.etree.ElementTree
         
-        f = StringIO()
+        f = BytesIO()
         for i in range(10):
             element = Element('tag%s' % i)
             self._check_element(element)
@@ -947,7 +947,7 @@
         self.assertEquals(
             None,
             a.text)
-        self.assertXML('<a></a>', a)
+        self.assertXML(_bytes('<a></a>'), a)
         
     def test_set_text_empty(self):
         Element = self.etree.Element
@@ -957,7 +957,7 @@
 
         a.text = ''
         self.assertEquals('', a.text)
-        self.assertXML('<a></a>', a)
+        self.assertXML(_bytes('<a></a>'), a)
         
     def test_tail1(self):
         Element = self.etree.Element
@@ -994,7 +994,7 @@
         b.tail = 'bar'
         self.assertEquals('bar',
                           b.tail)
-        self.assertXML('<a><b></b>bar</a>', a)
+        self.assertXML(_bytes('<a><b></b>bar</a>'), a)
         
     def test_tail_set_none(self):
         Element = self.etree.Element
@@ -1004,7 +1004,7 @@
         self.assertEquals(
             None,
             a.tail)
-        self.assertXML('<a></a>', a)
+        self.assertXML(_bytes('<a></a>'), a)
 
     def test_extend(self):
         root = self.etree.Element('foo')
@@ -1042,68 +1042,54 @@
         self.assertEquals(a[0].tag, Comment)
         self.assertEquals(a[0].text, 'foo')
 
+    # ElementTree < 1.3 adds whitespace around comments
     def test_comment_text(self):
         Element = self.etree.Element
         SubElement = self.etree.SubElement
         Comment = self.etree.Comment
+        tostring = self.etree.tostring
 
         a = Element('a')
         a.append(Comment('foo'))
         self.assertEquals(a[0].text, 'foo')
 
+        self.assertEquals(
+            _bytes('<a><!--foo--></a>'),
+            tostring(a))
+
         a[0].text = "TEST"
         self.assertEquals(a[0].text, 'TEST')
+
+        self.assertEquals(
+            _bytes('<a><!--TEST--></a>'),
+            tostring(a))
         
+    # ElementTree < 1.3 adds whitespace around comments
     def test_comment_whitespace(self):
         Element = self.etree.Element
         SubElement = self.etree.SubElement
         Comment = self.etree.Comment
+        tostring = self.etree.tostring
 
         a = Element('a')
         a.append(Comment(' foo  '))
         self.assertEquals(a[0].text, ' foo  ')
+        self.assertEquals(
+            _bytes('<a><!-- foo  --></a>'),
+            tostring(a))
         
     def test_comment_nonsense(self):
         Comment = self.etree.Comment
         c = Comment('foo')
         self.assertEquals({}, c.attrib)
-        self.assertEquals([], c.keys())
-        self.assertEquals([], c.items())
+        self.assertEquals([], list(c.keys()))
+        self.assertEquals([], list(c.items()))
         self.assertEquals(None, c.get('hoi'))
         self.assertEquals(0, len(c))
         # should not iterate
         for i in c:
             pass
 
-    # ElementTree < 1.3 adds whitespace around comments
-    def test_comment_text(self):
-        Element  = self.etree.Element
-        Comment  = self.etree.Comment
-        tostring = self.etree.tostring
-
-        a = Element('a')
-        a.append(Comment('foo'))
-        self.assertEquals(
-            '<a><!--foo--></a>',
-            tostring(a))
-
-        a[0].text = "TEST"
-        self.assertEquals(
-            '<a><!--TEST--></a>',
-            tostring(a))
-
-    # ElementTree < 1.3 adds whitespace around comments
-    def test_comment_whitespace(self):
-        Element = self.etree.Element
-        Comment = self.etree.Comment
-        tostring = self.etree.tostring
-
-        a = Element('a')
-        a.append(Comment(' foo  '))
-        self.assertEquals(
-            '<a><!-- foo  --></a>',
-            tostring(a))
-
     def test_pi(self):
         # lxml.etree separates target and text
         Element = self.etree.Element
@@ -1113,7 +1099,7 @@
         a = Element('a')
         a.append(ProcessingInstruction('foo', 'some more text'))
         self.assertEquals(a[0].tag, ProcessingInstruction)
-        self.assertXML("<a><?foo some more text?></a>",
+        self.assertXML(_bytes("<a><?foo some more text?></a>"),
                        a)
 
     def test_processinginstruction(self):
@@ -1125,15 +1111,15 @@
         a = Element('a')
         a.append(ProcessingInstruction('foo', 'some more text'))
         self.assertEquals(a[0].tag, ProcessingInstruction)
-        self.assertXML("<a><?foo some more text?></a>",
+        self.assertXML(_bytes("<a><?foo some more text?></a>"),
                        a)
 
     def test_pi_nonsense(self):
         ProcessingInstruction = self.etree.ProcessingInstruction
         pi = ProcessingInstruction('foo')
         self.assertEquals({}, pi.attrib)
-        self.assertEquals([], pi.keys())
-        self.assertEquals([], pi.items())
+        self.assertEquals([], list(pi.keys()))
+        self.assertEquals([], list(pi.items()))
         self.assertEquals(None, pi.get('hoi'))
         self.assertEquals(0, len(pi))
         # should not iterate
@@ -1151,9 +1137,9 @@
         self.assertEquals(
             c,
             a[0])
-        self.assertXML('<a><c></c></a>',
+        self.assertXML(_bytes('<a><c></c></a>'),
                        a)
-        self.assertXML('<b></b>',
+        self.assertXML(_bytes('<b></b>'),
                        b)
         
     def test_setitem2(self):
@@ -1169,9 +1155,9 @@
             e = SubElement(d, 'e')
             a[i] = d
         self.assertXML(
-            '<a><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d></a>',
+            _bytes('<a><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d></a>'),
             a)
-        self.assertXML('<c></c>',
+        self.assertXML(_bytes('<c></c>'),
                        c)
 
     def test_setitem_replace(self):
@@ -1182,7 +1168,7 @@
         SubElement(a, 'b')
         d = Element('d')
         a[0] = d
-        self.assertXML('<a><d></d></a>', a)
+        self.assertXML(_bytes('<a><d></d></a>'), a)
 
     def test_setitem_indexerror(self):
         Element = self.etree.Element
@@ -1205,7 +1191,7 @@
 
         a[0] = c
         self.assertXML(
-            '<a><c></c>C2</a>',
+            _bytes('<a><c></c>C2</a>'),
             a)
 
     def test_tag_write(self):
@@ -1222,7 +1208,7 @@
             a.tag)
 
         self.assertXML(
-            '<c><b></b></c>',
+            _bytes('<c><b></b></c>'),
             a)
 
     def test_tag_reset_ns(self):
@@ -1240,8 +1226,8 @@
 
         # can't use C14N here!
         self.assertEquals('c', b1.tag)
-        self.assertEquals('<c', tostring(b1)[:2])
-        self.assert_('<c' in tostring(a))
+        self.assertEquals(_bytes('<c'), tostring(b1)[:2])
+        self.assert_(_bytes('<c') in tostring(a))
 
     def test_tag_reset_root_ns(self):
         Element = self.etree.Element
@@ -1260,7 +1246,7 @@
 
         # can't use C14N here!
         self.assertEquals('c',  a.tag)
-        self.assertEquals('<c', tostring(a)[:2])
+        self.assertEquals(_bytes('<c'), tostring(a)[:2])
 
     def test_tag_str_subclass(self):
         Element = self.etree.Element
@@ -1270,7 +1256,7 @@
 
         a = Element("a")
         a.tag = strTest("TAG")
-        self.assertXML('<TAG></TAG>',
+        self.assertXML(_bytes('<TAG></TAG>'),
                        a)
 
     def test_delitem(self):
@@ -1284,23 +1270,23 @@
 
         del a[1]
         self.assertXML(
-            '<a><b></b><d></d></a>',
+            _bytes('<a><b></b><d></d></a>'),
             a)
 
         del a[0]
         self.assertXML(
-            '<a><d></d></a>',
+            _bytes('<a><d></d></a>'),
             a)
 
         del a[0]
         self.assertXML(
-            '<a></a>',
+            _bytes('<a></a>'),
             a)
         # move deleted element into other tree afterwards
         other = Element('other')
         other.append(c)
         self.assertXML(
-            '<other><c></c></other>',
+            _bytes('<other><c></c></other>'),
             other)
     
     def test_del_insert(self):
@@ -1315,24 +1301,24 @@
 
         el = a[0]
         self.assertXML(
-            '<a><b><bs></bs></b><c><cs></cs></c></a>',
+            _bytes('<a><b><bs></bs></b><c><cs></cs></c></a>'),
             a)
-        self.assertXML('<b><bs></bs></b>', b)
-        self.assertXML('<c><cs></cs></c>', c)
+        self.assertXML(_bytes('<b><bs></bs></b>'), b)
+        self.assertXML(_bytes('<c><cs></cs></c>'), c)
 
         del a[0]
         self.assertXML(
-            '<a><c><cs></cs></c></a>',
+            _bytes('<a><c><cs></cs></c></a>'),
             a)
-        self.assertXML('<b><bs></bs></b>', b)
-        self.assertXML('<c><cs></cs></c>', c)
+        self.assertXML(_bytes('<b><bs></bs></b>'), b)
+        self.assertXML(_bytes('<c><cs></cs></c>'), c)
 
         a.insert(0, el)
         self.assertXML(
-            '<a><b><bs></bs></b><c><cs></cs></c></a>',
+            _bytes('<a><b><bs></bs></b><c><cs></cs></c></a>'),
             a)
-        self.assertXML('<b><bs></bs></b>', b)
-        self.assertXML('<c><cs></cs></c>', c)
+        self.assertXML(_bytes('<b><bs></bs></b>'), b)
+        self.assertXML(_bytes('<c><cs></cs></c>'), c)
 
     def test_del_setitem(self):
         Element = self.etree.Element
@@ -1348,10 +1334,10 @@
         del a[0]
         a[0] = el
         self.assertXML(
-            '<a><b><bs></bs></b></a>',
+            _bytes('<a><b><bs></bs></b></a>'),
             a)
-        self.assertXML('<b><bs></bs></b>', b)
-        self.assertXML('<c><cs></cs></c>', c)
+        self.assertXML(_bytes('<b><bs></bs></b>'), b)
+        self.assertXML(_bytes('<c><cs></cs></c>'), c)
 
     def test_del_setslice(self):
         Element = self.etree.Element
@@ -1367,14 +1353,14 @@
         del a[0]
         a[0:0] = [el]
         self.assertXML(
-            '<a><b><bs></bs></b><c><cs></cs></c></a>',
+            _bytes('<a><b><bs></bs></b><c><cs></cs></c></a>'),
             a)
-        self.assertXML('<b><bs></bs></b>', b)
-        self.assertXML('<c><cs></cs></c>', c)
+        self.assertXML(_bytes('<b><bs></bs></b>'), b)
+        self.assertXML(_bytes('<c><cs></cs></c>'), c)
 
     def test_replace_slice_tail(self):
         XML = self.etree.XML
-        a = XML('<a><b></b>B2<c></c>C2</a>')
+        a = XML(_bytes('<a><b></b>B2<c></c>C2</a>'))
         b, c = a
 
         a[:] = []
@@ -1384,12 +1370,12 @@
 
     def test_delitem_tail(self):
         ElementTree = self.etree.ElementTree
-        f = StringIO('<a><b></b>B2<c></c>C2</a>')
+        f = BytesIO('<a><b></b>B2<c></c>C2</a>')
         doc = ElementTree(file=f)
         a = doc.getroot()
         del a[0]
         self.assertXML(
-            '<a><c></c>C2</a>',
+            _bytes('<a><c></c>C2</a>'),
             a)
         
     def test_clear(self):
@@ -1421,19 +1407,19 @@
         self.assertEquals(None, a.get('hoi'))
         self.assertEquals('a', a.tag)
         self.assertEquals(0, len(a))
-        self.assertXML('<a></a>',
+        self.assertXML(_bytes('<a></a>'),
                        a)
-        self.assertXML('<b><c></c></b>',
+        self.assertXML(_bytes('<b><c></c></b>'),
                        b)
     
     def test_clear_tail(self):
         ElementTree = self.etree.ElementTree
-        f = StringIO('<a><b></b>B2<c></c>C2</a>')
+        f = BytesIO('<a><b></b>B2<c></c>C2</a>')
         doc = ElementTree(file=f)
         a = doc.getroot()
         a.clear()
         self.assertXML(
-            '<a></a>',
+            _bytes('<a></a>'),
             a)
 
     def test_insert(self):
@@ -1451,7 +1437,7 @@
             a[0])
 
         self.assertXML(
-            '<a><d></d><b></b><c></c></a>',
+            _bytes('<a><d></d><b></b><c></c></a>'),
             a)
 
         e = Element('e')
@@ -1460,7 +1446,7 @@
             e,
             a[2])
         self.assertXML(
-            '<a><d></d><b></b><e></e><c></c></a>',
+            _bytes('<a><d></d><b></b><e></e><c></c></a>'),
             a)
 
     def test_insert_beyond_index(self):
@@ -1476,7 +1462,7 @@
             c,
             a[1])
         self.assertXML(
-            '<a><b></b><c></c></a>',
+            _bytes('<a><b></b><c></c></a>'),
             a)
 
     def test_insert_negative(self):
@@ -1493,7 +1479,7 @@
             d,
             a[-2])
         self.assertXML(
-            '<a><b></b><d></d><c></c></a>',
+            _bytes('<a><b></b><d></d><c></c></a>'),
             a)
 
     def test_insert_tail(self):
@@ -1508,7 +1494,7 @@
 
         a.insert(0, c)
         self.assertXML(
-            '<a><c></c>C2<b></b></a>',
+            _bytes('<a><c></c>C2<b></b></a>'),
             a)
         
     def test_remove(self):
@@ -1524,7 +1510,7 @@
             c,
             a[0])
         self.assertXML(
-            '<a><c></c></a>',
+            _bytes('<a><c></c></a>'),
             a)
         
     def test_remove_ns(self):
@@ -1537,10 +1523,10 @@
 
         a.remove(b)
         self.assertXML(
-            '<ns0:a xmlns:ns0="http://test"><ns0:c></ns0:c></ns0:a>',
+            _bytes('<ns0:a xmlns:ns0="http://test"><ns0:c></ns0:c></ns0:a>'),
             a)
         self.assertXML(
-            '<ns0:b xmlns:ns0="http://test"></ns0:b>',
+            _bytes('<ns0:b xmlns:ns0="http://test"></ns0:b>'),
             b)
 
     def test_remove_nonexisting(self):
@@ -1563,7 +1549,7 @@
         b.tail = 'b2'
         a.remove(b)
         self.assertXML(
-            '<a></a>',
+            _bytes('<a></a>'),
             a)
         self.assertEquals('b2', b.tail)
 
@@ -1577,7 +1563,7 @@
         d = SubElement(b, 'd')
         e = SubElement(c, 'e')
         self.assertXML(
-            '<a><b><d></d></b><c><e></e></c></a>',
+            _bytes('<a><b><d></d></b><c><e></e></c></a>'),
             a)
         self.assertEquals(
             [b, c],
@@ -1595,7 +1581,7 @@
         a = Element('a')
         b = a.makeelement('c', {'hoi':'dag'})
         self.assertXML(
-            '<c hoi="dag"></c>',
+            _bytes('<c hoi="dag"></c>'),
             b)
 
     def test_iter(self):
@@ -1882,7 +1868,7 @@
     def test_getslice_text(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<a><b>B</b>B1<c>C</c>C1</a>')
+        f = BytesIO('<a><b>B</b>B1<c>C</c>C1</a>')
         doc = ElementTree(file=f)
         a = doc.getroot()
         b = a[0]
@@ -1918,7 +1904,7 @@
             new,
             a[1])
         self.assertXML(
-            '<a><b></b><new></new><c></c></a>',
+            _bytes('<a><b></b><new></new><c></c></a>'),
             a)
         
     def test_delslice(self):
@@ -2013,17 +1999,17 @@
 
     def test_delslice_child_tail(self):
         ElementTree = self.etree.ElementTree
-        f = StringIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>')
+        f = BytesIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>')
         doc = ElementTree(file=f)
         a = doc.getroot()
         del a[1:3]
         self.assertXML(
-            '<a><b></b>B2<e></e>E2</a>',
+            _bytes('<a><b></b>B2<e></e>E2</a>'),
             a)
 
     def test_delslice_tail(self):
         XML = self.etree.XML
-        a = XML('<a><b></b>B2<c></c>C2</a>')
+        a = XML(_bytes('<a><b></b>B2<c></c>C2</a>'))
         b, c = a
 
         del a[:]
@@ -2220,7 +2206,7 @@
     def test_setslice_tail(self):
         ElementTree = self.etree.ElementTree
         Element = self.etree.Element
-        f = StringIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>')
+        f = BytesIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>')
         doc = ElementTree(file=f)
         a = doc.getroot()
         x = Element('x')
@@ -2231,7 +2217,7 @@
         z.tail = 'Z2'
         a[1:3] = [x, y, z]
         self.assertXML(
-            '<a><b></b>B2<x></x>X2<y></y>Y2<z></z>Z2<e></e>E2</a>',
+            _bytes('<a><b></b>B2<x></x>X2<y></y>Y2<z></z>Z2<e></e>E2</a>'),
             a)
 
     def test_setslice_negative(self):
@@ -2348,7 +2334,7 @@
     def test_ns_access(self):
         ElementTree = self.etree.ElementTree
         ns = 'http://xml.infrae.com/1'
-        f = StringIO('<x:a xmlns:x="%s"><x:b></x:b></x:a>' % ns)
+        f = BytesIO('<x:a xmlns:x="%s"><x:b></x:b></x:a>' % ns)
         t = ElementTree(file=f)
         a = t.getroot()
         self.assertEquals('{%s}a' % ns,
@@ -2360,7 +2346,7 @@
         ElementTree = self.etree.ElementTree
         ns = 'http://xml.infrae.com/1'
         ns2 = 'http://xml.infrae.com/2'
-        f = StringIO('<x:a xmlns:x="%s" xmlns:y="%s"><x:b></x:b><y:b></y:b></x:a>' % (ns, ns2))
+        f = BytesIO('<x:a xmlns:x="%s" xmlns:y="%s"><x:b></x:b><y:b></y:b></x:a>' % (ns, ns2))
         t = ElementTree(file=f)
         a = t.getroot()
         self.assertEquals('{%s}a' % ns,
@@ -2398,7 +2384,7 @@
 
         ns = 'http://xml.infrae.com/1'
         ns2 = 'http://xml.infrae.com/2'
-        f = StringIO('<a xmlns="%s" xmlns:x="%s"><x:b></x:b><b></b></a>' % (ns, ns2))
+        f = BytesIO('<a xmlns="%s" xmlns:x="%s"><x:b></x:b><b></b></a>' % (ns, ns2))
         t = ElementTree(file=f)
 
         a = t.getroot()
@@ -2424,17 +2410,17 @@
             a.get('{%s}bar' % ns2))
         try:
             self.assertXML(
-                '<a xmlns:ns0="%s" xmlns:ns1="%s" ns0:foo="Foo" ns1:bar="Bar"></a>' % (ns, ns2),
+                _bytes('<a xmlns:ns0="%s" xmlns:ns1="%s" ns0:foo="Foo" ns1:bar="Bar"></a>' % (ns, ns2)),
                 a)
         except AssertionError:
             self.assertXML(
-                '<a xmlns:ns0="%s" xmlns:ns1="%s" ns1:foo="Foo" ns0:bar="Bar"></a>' % (ns2, ns),
+                _bytes('<a xmlns:ns0="%s" xmlns:ns1="%s" ns1:foo="Foo" ns0:bar="Bar"></a>' % (ns2, ns)),
                 a)
 
     def test_ns_move(self):
         Element = self.etree.Element
         one = self.etree.fromstring(
-            '<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>')
+            _bytes('<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>'))
         baz = one[0][0]
 
         two = Element('root')
@@ -2447,33 +2433,33 @@
     def test_ns_decl_tostring(self):
         tostring = self.etree.tostring
         root = self.etree.XML(
-            '<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>')
+            _bytes('<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>'))
         baz = root[0][0]
 
-        nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']",
+        nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"),
                             tostring(baz))
-        self.assertEquals(["http://a.b.c"], nsdecl)
+        self.assertEquals([_bytes("http://a.b.c")], nsdecl)
 
     def test_ns_decl_tostring_default(self):
         tostring = self.etree.tostring
         root = self.etree.XML(
-            '<foo><bar xmlns="http://a.b.c"><baz/></bar></foo>')
+            _bytes('<foo><bar xmlns="http://a.b.c"><baz/></bar></foo>'))
         baz = root[0][0]
 
-        nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']",
+        nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"),
                             tostring(baz))
-        self.assertEquals(["http://a.b.c"], nsdecl)
+        self.assertEquals([_bytes("http://a.b.c")], nsdecl)
         
     def test_ns_decl_tostring_root(self):
         tostring = self.etree.tostring
         root = self.etree.XML(
-            '<foo xmlns:ns="http://a.b.c"><bar><ns:baz/></bar></foo>')
+            _bytes('<foo xmlns:ns="http://a.b.c"><bar><ns:baz/></bar></foo>'))
         baz = root[0][0]
 
-        nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']",
+        nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"),
                             tostring(baz))
 
-        self.assertEquals(["http://a.b.c"], nsdecl)
+        self.assertEquals([_bytes("http://a.b.c")], nsdecl)
         
     def test_ns_decl_tostring_element(self):
         Element = self.etree.Element
@@ -2483,10 +2469,10 @@
         bar = SubElement(root, "{http://a.b.c}bar")
         baz = SubElement(bar, "{http://a.b.c}baz")
 
-        nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']",
+        nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"),
                             self.etree.tostring(baz))
 
-        self.assertEquals(["http://a.b.c"], nsdecl)
+        self.assertEquals([_bytes("http://a.b.c")], nsdecl)
 
     def test_attribute_xmlns_move(self):
         Element = self.etree.Element
@@ -2503,8 +2489,8 @@
         root.append(subelement)
         self.assertEquals(1, len(subelement.attrib))
         self.assertEquals(
-            {"{http://www.w3.org/XML/1998/namespace}id" : "foo"}.items(),
-            subelement.attrib.items())
+            list({"{http://www.w3.org/XML/1998/namespace}id" : "foo"}.items()),
+            list(subelement.attrib.items()))
         self.assertEquals(
             "foo",
             subelement.get("{http://www.w3.org/XML/1998/namespace}id"))
@@ -2515,10 +2501,10 @@
 
         ns_href = "http://a.b.c"
         one = parse(
-            StringIO('<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href))
+            BytesIO('<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href))
         baz = one.getroot()[0][0]
 
-        parsed = parse(StringIO( tostring(baz) )).getroot()
+        parsed = parse(BytesIO( tostring(baz) )).getroot()
         self.assertEquals('{%s}baz' % ns_href, parsed.tag)
 
     def test_tostring(self):
@@ -2530,7 +2516,7 @@
         b = SubElement(a, 'b')
         c = SubElement(a, 'c')
         
-        self.assertEquals('<a><b></b><c></c></a>',
+        self.assertEquals(_bytes('<a><b></b><c></c></a>'),
                           canonicalize(tostring(a)))
 
     def test_tostring_element(self):
@@ -2542,9 +2528,9 @@
         b = SubElement(a, 'b')
         c = SubElement(a, 'c')
         d = SubElement(c, 'd')
-        self.assertEquals('<b></b>',
+        self.assertEquals(_bytes('<b></b>'),
                           canonicalize(tostring(b)))
-        self.assertEquals('<c><d></d></c>',
+        self.assertEquals(_bytes('<c><d></d></c>'),
                           canonicalize(tostring(c)))
         
     def test_tostring_element_tail(self):
@@ -2558,8 +2544,8 @@
         d = SubElement(c, 'd')
         b.tail = 'Foo'
 
-        self.assert_(tostring(b) == '<b/>Foo' or
-                     tostring(b) == '<b />Foo')
+        self.assert_(tostring(b) == _bytes('<b/>Foo') or
+                     tostring(b) == _bytes('<b />Foo'))
 
     def test_tostring_method_html(self):
         tostring = self.etree.tostring
@@ -2572,7 +2558,7 @@
         p.text = "html"
         SubElement(p, 'br').tail = "test"
 
-        self.assertEquals('<html><body><p>html<br>test</p></body></html>',
+        self.assertEquals(_bytes('<html><body><p>html<br>test</p></body></html>'),
                           tostring(html, method="html"))
 
     def test_tostring_method_text(self):
@@ -2589,12 +2575,12 @@
         c = SubElement(a, 'c')
         c.text = "C"
         
-        self.assertEquals('ABTAILCtail',
+        self.assertEquals(_bytes('ABTAILCtail'),
                           tostring(a, method="text"))
 
     def test_iterparse(self):
         iterparse = self.etree.iterparse
-        f = StringIO('<a><b></b><c/></a>')
+        f = BytesIO('<a><b></b><c/></a>')
 
         iterator = iterparse(f)
         self.assertEquals(None,
@@ -2618,7 +2604,7 @@
 
     def test_iterparse_start(self):
         iterparse = self.etree.iterparse
-        f = StringIO('<a><b></b><c/></a>')
+        f = BytesIO('<a><b></b><c/></a>')
 
         iterator = iterparse(f, events=('start',))
         events = list(iterator)
@@ -2629,7 +2615,7 @@
 
     def test_iterparse_start_end(self):
         iterparse = self.etree.iterparse
-        f = StringIO('<a><b></b><c/></a>')
+        f = BytesIO('<a><b></b><c/></a>')
 
         iterator = iterparse(f, events=('start','end'))
         events = list(iterator)
@@ -2641,7 +2627,7 @@
 
     def test_iterparse_clear(self):
         iterparse = self.etree.iterparse
-        f = StringIO('<a><b></b><c/></a>')
+        f = BytesIO('<a><b></b><c/></a>')
 
         iterator = iterparse(f)
         for event, elem in iterator:
@@ -2654,7 +2640,7 @@
     def test_iterparse_large(self):
         iterparse = self.etree.iterparse
         CHILD_COUNT = 12345
-        f = StringIO('<a>%s</a>' % ('<b>test</b>'*CHILD_COUNT))
+        f = BytesIO('<a>%s</a>' % ('<b>test</b>'*CHILD_COUNT))
 
         i = 0
         for key in iterparse(f):
@@ -2664,7 +2650,7 @@
 
     def test_iterparse_attrib_ns(self):
         iterparse = self.etree.iterparse
-        f = StringIO('<a xmlns="ns1"><b><c xmlns="ns2"/></b></a>')
+        f = BytesIO('<a xmlns="ns1"><b><c xmlns="ns2"/></b></a>')
 
         attr_name = '{testns}bla'
         events = []
@@ -2690,7 +2676,7 @@
 
     def test_iterparse_getiterator(self):
         iterparse = self.etree.iterparse
-        f = StringIO('<a><b><d/></b><c/></a>')
+        f = BytesIO('<a><b><d/></b><c/></a>')
 
         counts = []
         for event, elem in iterparse(f):
@@ -2701,7 +2687,7 @@
 
     def test_iterparse_move_elements(self):
         iterparse = self.etree.iterparse
-        f = StringIO('<a><b><d/></b><c/></a>')
+        f = BytesIO('<a><b><d/></b><c/></a>')
 
         for event, node in etree.iterparse(f): pass
 
@@ -2714,12 +2700,12 @@
 
     def test_iterparse_cdata(self):
         tostring = self.etree.tostring
-        f = StringIO('<root><![CDATA[test]]></root>')
+        f = BytesIO('<root><![CDATA[test]]></root>')
         context = self.etree.iterparse(f)
         content = [ el.text for event,el in context ]
 
         self.assertEquals(['test'], content)
-        self.assertEquals('<root>test</root>',
+        self.assertEquals(_bytes('<root>test</root>'),
                           tostring(context.root))
 
     def test_parse_file(self):
@@ -2727,7 +2713,7 @@
         # from file
         tree = parse(fileInTestDir('test.xml'))
         self.assertXML(
-            '<a><b></b></a>',
+            _bytes('<a><b></b></a>'),
             tree.getroot())
 
     def test_parse_file_nonexistent(self):
@@ -2741,60 +2727,59 @@
     def test_parse_error(self):
         # ET < 1.3 raises ExpatError
         parse = self.etree.parse
-        f = StringIO('<a><b></c></b></a>')
+        f = BytesIO('<a><b></c></b></a>')
         self.assertRaises(SyntaxError, parse, f)
         f.close()
 
     def test_parse_error_from_file(self):
         parse = self.etree.parse
         # from file
-        f = open(fileInTestDir('test_broken.xml'), 'r')
+        f = open(fileInTestDir('test_broken.xml'), 'rb')
         self.assertRaises(SyntaxError, parse, f)
         f.close()
 
     def test_parse_file_object(self):
         parse = self.etree.parse
         # from file object
-        f = open(fileInTestDir('test.xml'), 'r')
+        f = open(fileInTestDir('test.xml'), 'rb')
         tree = parse(f)
         f.close()
         self.assertXML(
-            '<a><b></b></a>',
+            _bytes('<a><b></b></a>'),
             tree.getroot())
 
     def test_parse_stringio(self):
         parse = self.etree.parse
-        # from StringIO
-        f = StringIO('<a><b></b></a>')
+        f = BytesIO('<a><b></b></a>')
         tree = parse(f)
         f.close()
         self.assertXML(
-            '<a><b></b></a>',
+            _bytes('<a><b></b></a>'),
             tree.getroot()
            )
 
     def test_parse_cdata(self):
         tostring = self.etree.tostring
-        root = self.etree.XML('<root><![CDATA[test]]></root>')
+        root = self.etree.XML(_bytes('<root><![CDATA[test]]></root>'))
 
         self.assertEquals('test', root.text)
-        self.assertEquals('<root>test</root>',
+        self.assertEquals(_bytes('<root>test</root>'),
                           tostring(root))
 
     def test_parse_with_encoding(self):
         # this can fail in libxml2 <= 2.6.22
         parse = self.etree.parse
-        tree = parse(StringIO('<?xml version="1.0" encoding="ascii"?><html/>'))
-        self.assertXML('<html></html>',
+        tree = parse(BytesIO('<?xml version="1.0" encoding="ascii"?><html/>'))
+        self.assertXML(_bytes('<html></html>'),
                        tree.getroot())
 
     def test_encoding(self):
         Element = self.etree.Element
 
         a = Element('a')
-        a.text = unicode_literal('Søk på nettet')
+        a.text = _str('Søk på nettet')
         self.assertXML(
-            unicode_literal('<a>Søk på nettet</a>').encode('UTF-8'),
+            _str('<a>Søk på nettet</a>').encode('UTF-8'),
             a, 'utf-8')
 
     def test_encoding_exact(self):
@@ -2802,30 +2787,30 @@
         Element = self.etree.Element
 
         a = Element('a')
-        a.text = unicode_literal('Søk på nettet')
+        a.text = _str('Søk på nettet')
         
-        f = StringIO()
+        f = BytesIO()
         tree = ElementTree(element=a)
         tree.write(f, encoding='utf-8')
-        self.assertEquals(unicode_literal('<a>Søk på nettet</a>').encode('UTF-8'),
-                          f.getvalue().replace('\n',''))
+        self.assertEquals(_str('<a>Søk på nettet</a>').encode('UTF-8'),
+                          f.getvalue().replace(_bytes('\n'),_bytes('')))
 
     def test_parse_file_encoding(self):
         parse = self.etree.parse
         # from file
         tree = parse(fileInTestDir('test-string.xml'))
         self.assertXML(
-            unicode_literal('<a>Søk på nettet</a>').encode('UTF-8'),
+            _str('<a>Søk på nettet</a>').encode('UTF-8'),
             tree.getroot(), 'UTF-8')
 
     def test_parse_file_object_encoding(self):
         parse = self.etree.parse
         # from file object
-        f = open(fileInTestDir('test-string.xml'), 'r')
+        f = open(fileInTestDir('test-string.xml'), 'rb')
         tree = parse(f)
         f.close()
         self.assertXML(
-            unicode_literal('<a>Søk på nettet</a>').encode('UTF-8'),
+            _str('<a>Søk på nettet</a>').encode('UTF-8'),
             tree.getroot(), 'UTF-8')
 
     def test_encoding_8bit_latin1(self):
@@ -2833,29 +2818,29 @@
         Element = self.etree.Element
 
         a = Element('a')
-        a.text = unicode_literal('Søk på nettet')
+        a.text = _str('Søk på nettet')
 
-        f = StringIO()
+        f = BytesIO()
         tree = ElementTree(element=a)
         tree.write(f, encoding='iso-8859-1')
         result = f.getvalue()
-        declaration = "<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>"
-        self.assertEncodingDeclaration(result,'iso-8859-1')
-        result = result.split('?>', 1)[-1].replace('\n','')
-        self.assertEquals(unicode_literal('<a>Søk på nettet</a>').encode('iso-8859-1'),
+        declaration = _bytes("<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>")
+        self.assertEncodingDeclaration(result, _bytes('iso-8859-1'))
+        result = result.split(_bytes('?>'), 1)[-1].replace(_bytes('\n'),_bytes(''))
+        self.assertEquals(_str('<a>Søk på nettet</a>').encode('iso-8859-1'),
                           result)
 
     def test_parse_encoding_8bit_explicit(self):
         XMLParser = self.etree.XMLParser
 
-        text = unicode_literal('Søk på nettet')
-        xml_latin1 = (unicode_literal('<a>%s</a>') % text).encode('iso-8859-1')
+        text = _str('Søk på nettet')
+        xml_latin1 = (_str('<a>%s</a>') % text).encode('iso-8859-1')
 
         self.assertRaises(self.etree.ParseError,
                           self.etree.parse,
-                          StringIO(xml_latin1))
+                          BytesIO(xml_latin1))
 
-        tree = self.etree.parse(StringIO(xml_latin1),
+        tree = self.etree.parse(BytesIO(xml_latin1),
                                 XMLParser(encoding="iso-8859-1"))
         a = tree.getroot()
         self.assertEquals(a.text, text)
@@ -2863,16 +2848,16 @@
     def test_parse_encoding_8bit_override(self):
         XMLParser = self.etree.XMLParser
 
-        text = unicode_literal('Søk på nettet')
-        wrong_declaration = "<?xml version='1.0' encoding='UTF-8'?>"
-        xml_latin1 = (unicode_literal('%s<a>%s</a>') % (wrong_declaration, text)
+        text = _str('Søk på nettet')
+        wrong_declaration = _str("<?xml version='1.0' encoding='UTF-8'?>")
+        xml_latin1 = (_str('%s<a>%s</a>') % (wrong_declaration, text)
                       ).encode('iso-8859-1')
 
         self.assertRaises(self.etree.ParseError,
                           self.etree.parse,
-                          StringIO(xml_latin1))
+                          BytesIO(xml_latin1))
 
-        tree = self.etree.parse(StringIO(xml_latin1),
+        tree = self.etree.parse(BytesIO(xml_latin1),
                                 XMLParser(encoding="iso-8859-1"))
         a = tree.getroot()
         self.assertEquals(a.text, text)
@@ -2880,8 +2865,8 @@
     def _test_wrong_unicode_encoding(self):
         # raise error on wrong encoding declaration in unicode strings
         XML = self.etree.XML
-        test_utf = (unicode_literal('<?xml version="1.0" encoding="iso-8859-1"?>') +
-                    unicode_literal('<a>Søk på nettet</a>'))
+        test_utf = (_str('<?xml version="1.0" encoding="iso-8859-1"?>') +
+                    _str('<a>Søk på nettet</a>'))
         self.assertRaises(SyntaxError, XML, test_utf)
 
     def test_encoding_write_default_encoding(self):
@@ -2889,14 +2874,14 @@
         Element = self.etree.Element
 
         a = Element('a')
-        a.text = unicode_literal('Søk på nettet')
+        a.text = _str('Søk på nettet')
         
-        f = StringIO()
+        f = BytesIO()
         tree = ElementTree(element=a)
         tree.write(f)
-        data = f.getvalue().replace('\n','')
+        data = f.getvalue().replace(_bytes('\n'),_bytes(''))
         self.assertEquals(
-            unicode_literal('<a>Søk på nettet</a>').encode('ASCII', 'xmlcharrefreplace'),
+            _str('<a>Søk på nettet</a>').encode('ASCII', 'xmlcharrefreplace'),
             data)
 
     def test_encoding_tostring(self):
@@ -2904,8 +2889,8 @@
         tostring = self.etree.tostring
 
         a = Element('a')
-        a.text = unicode_literal('Søk på nettet')
-        self.assertEquals(unicode_literal('<a>Søk på nettet</a>').encode('UTF-8'),
+        a.text = _str('Søk på nettet')
+        self.assertEquals(_str('<a>Søk på nettet</a>').encode('UTF-8'),
                          tostring(a, encoding='utf-8'))
 
     def test_encoding_tostring_unknown(self):
@@ -2913,7 +2898,7 @@
         tostring = self.etree.tostring
         
         a = Element('a')
-        a.text = unicode_literal('Søk på nettet')
+        a.text = _str('Søk på nettet')
         self.assertRaises(LookupError, tostring, a,
                           encoding='Invalid Encoding')
 
@@ -2924,8 +2909,8 @@
 
         a = Element('a')
         b = SubElement(a, 'b')
-        b.text = unicode_literal('Søk på nettet')
-        self.assertEquals(unicode_literal('<b>Søk på nettet</b>').encode('UTF-8'),
+        b.text = _str('Søk på nettet')
+        self.assertEquals(_str('<b>Søk på nettet</b>').encode('UTF-8'),
                          tostring(b, encoding='utf-8'))
 
     def test_encoding_tostring_sub_tail(self):
@@ -2935,9 +2920,9 @@
 
         a = Element('a')
         b = SubElement(a, 'b')
-        b.text = unicode_literal('Søk på nettet')
-        b.tail = unicode_literal('Søk')
-        self.assertEquals(unicode_literal('<b>Søk på nettet</b>Søk').encode('UTF-8'),
+        b.text = _str('Søk på nettet')
+        b.tail = _str('Søk')
+        self.assertEquals(_str('<b>Søk på nettet</b>Søk').encode('UTF-8'),
                          tostring(b, encoding='utf-8'))
         
     def test_encoding_tostring_default_encoding(self):
@@ -2946,9 +2931,9 @@
         tostring = self.etree.tostring
 
         a = Element('a')
-        a.text = unicode_literal('Søk på nettet')
+        a.text = _str('Søk på nettet')
 
-        expected = '<a>S&#248;k p&#229; nettet</a>'
+        expected = _bytes('<a>S&#248;k p&#229; nettet</a>')
         self.assertEquals(
             expected,
             tostring(a))
@@ -2960,36 +2945,36 @@
 
         a = Element('a')
         b = SubElement(a, 'b')
-        b.text = unicode_literal('Søk på nettet')
+        b.text = _str('Søk på nettet')
 
-        expected = '<b>S&#248;k p&#229; nettet</b>'
+        expected = _bytes('<b>S&#248;k p&#229; nettet</b>')
         self.assertEquals(
             expected,
             tostring(b))
 
     def test_encoding_8bit_xml(self):
-        utext = unicode_literal('Søk på nettet')
-        uxml = unicode_literal('<p>%s</p>') % utext
-        prologue = '<?xml version="1.0" encoding="iso-8859-1" ?>'
+        utext = _str('Søk på nettet')
+        uxml = _str('<p>%s</p>') % utext
+        prologue = _bytes('<?xml version="1.0" encoding="iso-8859-1" ?>')
         isoxml = prologue + uxml.encode('iso-8859-1')
         tree = self.etree.XML(isoxml)
         self.assertEquals(utext, tree.text)
 
     def test_encoding_utf8_bom(self):
-        utext = unicode_literal('Søk på nettet')
-        uxml = (unicode_literal('<?xml version="1.0" encoding="UTF-8"?>') +
-                unicode_literal('<p>%s</p>') % utext)
-        bom = '\xEF\xBB\xBF'
+        utext = _str('Søk på nettet')
+        uxml = (_str('<?xml version="1.0" encoding="UTF-8"?>') +
+                _str('<p>%s</p>') % utext)
+        bom = _bytes('\xEF\xBB\xBF')
         xml = bom + uxml.encode("utf-8")
         tree = etree.XML(xml)
         self.assertEquals(utext, tree.text)
 
     def test_encoding_8bit_parse_stringio(self):
-        utext = unicode_literal('Søk på nettet')
-        uxml = unicode_literal('<p>%s</p>') % utext
-        prologue = '<?xml version="1.0" encoding="iso-8859-1" ?>'
+        utext = _str('Søk på nettet')
+        uxml = _str('<p>%s</p>') % utext
+        prologue = _bytes('<?xml version="1.0" encoding="iso-8859-1" ?>')
         isoxml = prologue + uxml.encode('iso-8859-1')
-        el = self.etree.parse(StringIO(isoxml)).getroot()
+        el = self.etree.parse(BytesIO(isoxml)).getroot()
         self.assertEquals(utext, el.text)
 
     def test_deepcopy_elementtree(self):
@@ -3063,9 +3048,9 @@
         self.assertEquals('BarText', b.text)
 
     def test_deepcopy_namespaces(self):
-        root = self.etree.XML('''<doc xmlns="dns" xmlns:t="tns">
+        root = self.etree.XML(_bytes('''<doc xmlns="dns" xmlns:t="tns">
         <parent><node t:foo="bar" /></parent>
-        </doc>''')
+        </doc>'''))
         self.assertEquals(
             root[0][0].get('{tns}foo'),
             copy.deepcopy(root[0])[0].get('{tns}foo') )
@@ -3083,10 +3068,10 @@
         a.append( Element('C') )
         b.append( Element('X') )
 
-        self.assertEquals('<a><C/></a>',
-                          tostring(a).replace(' ', ''))
-        self.assertEquals('<a><X/></a>',
-                          tostring(b).replace(' ', ''))
+        self.assertEquals(_bytes('<a><C/></a>'),
+                          tostring(a).replace(_bytes(' '), _bytes('')))
+        self.assertEquals(_bytes('<a><X/></a>'),
+                          tostring(b).replace(_bytes(' '), _bytes('')))
 
     def test_deepcopy_comment(self):
         # previously caused a crash
@@ -3151,16 +3136,16 @@
         b = etree.SubElement(a, 'b')
 
         t = etree.ElementTree(a)
-        self.assertEquals(self._rootstring(t), '<a><b/></a>')
+        self.assertEquals(self._rootstring(t), _bytes('<a><b/></a>'))
 
         t1 = etree.ElementTree(a)
-        self.assertEquals(self._rootstring(t1), '<a><b/></a>')
-        self.assertEquals(self._rootstring(t),  '<a><b/></a>')
+        self.assertEquals(self._rootstring(t1), _bytes('<a><b/></a>'))
+        self.assertEquals(self._rootstring(t),  _bytes('<a><b/></a>'))
 
         t2 = etree.ElementTree(b)
-        self.assertEquals(self._rootstring(t2), '<b/>')
-        self.assertEquals(self._rootstring(t1), '<a><b/></a>')
-        self.assertEquals(self._rootstring(t),  '<a><b/></a>')
+        self.assertEquals(self._rootstring(t2), _bytes('<b/>'))
+        self.assertEquals(self._rootstring(t1), _bytes('<a><b/></a>'))
+        self.assertEquals(self._rootstring(t),  _bytes('<a><b/></a>'))
 
     def test_qname(self):
         etree = self.etree
@@ -3209,7 +3194,7 @@
         a.set(qname, qname)
 
         self.assertXML(
-            '<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>',
+            _bytes('<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>'),
             a)
 
     def test_qname_attribute_resolve_new(self):
@@ -3219,7 +3204,7 @@
         a.set('a', qname)
 
         self.assertXML(
-            '<a xmlns:ns0="http://myns" a="ns0:a"></a>',
+            _bytes('<a xmlns:ns0="http://myns" a="ns0:a"></a>'),
             a)
 
     def test_qname_attrib_resolve(self):
@@ -3229,7 +3214,7 @@
         a.attrib[qname] = qname
 
         self.assertXML(
-            '<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>',
+            _bytes('<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>'),
             a)
 
     def test_parser_version(self):
@@ -3330,7 +3315,7 @@
         class Target(object):
             def start(self, tag, attrib):
                 events.append("start-" + tag)
-                for name, value in attrib.iteritems():
+                for name, value in attrib.items():
                     assertEquals(tag + name, value)
             def end(self, tag):
                 events.append("end-" + tag)
@@ -3476,7 +3461,7 @@
         """
         data = self.etree.tostring(element, encoding=encoding)
         if encoding != 'us-ascii':
-            data = unicode(data, encoding)
+            data = data.decode(encoding)
         return canonicalize(data)
 
     def _writeElementFile(self, element, encoding='us-ascii'):
@@ -3496,13 +3481,13 @@
             os.close(handle)
             os.remove(filename)
         if encoding != 'us-ascii':
-            data = unicode(data, encoding)
+            data = data.decode(encoding)
         return canonicalize(data)
 
     def assertXML(self, expected, element, encoding='us-ascii'):
         """Writes element out and checks whether it is expected.
 
-        Does this two ways; once using StringIO, once using a real file.
+        Does this two ways; once using BytesIO, once using a real file.
         """
         self.assertEquals(expected, self._writeElement(element, encoding))
         self.assertEquals(expected, self._writeElementFile(element, encoding))
@@ -3515,7 +3500,8 @@
         self.assertEquals(result_encoding.upper(), encoding.upper())
         
     def _rootstring(self, tree):
-        return self.etree.tostring(tree.getroot()).replace(' ', '').replace('\n', '')
+        return self.etree.tostring(tree.getroot()).replace(
+            _bytes(' '), _bytes('')).replace(_bytes('\n'), _bytes(''))
 
     def _check_element_tree(self, tree):
         self._check_element(tree.getroot())
@@ -3543,6 +3529,7 @@
     def _check_mapping(self, mapping):
         len(mapping)
         keys = mapping.keys()
+        values = mapping.values()
         items = mapping.items()
         for key in keys:
             item = mapping[key]
@@ -3573,4 +3560,4 @@
     return suite
 
 if __name__ == '__main__':
-    print ('to test use test.py %s' % __file__)
+    print('to test use test.py %s' % __file__)

Modified: lxml/trunk/src/lxml/tests/test_errors.py
==============================================================================
--- lxml/trunk/src/lxml/tests/test_errors.py	(original)
+++ lxml/trunk/src/lxml/tests/test_errors.py	Tue May 20 00:02:14 2008
@@ -43,4 +43,4 @@
     return suite
 
 if __name__ == '__main__':
-    print 'to test use test.py %s' % __file__
+    print('to test use test.py %s' % __file__)

Modified: lxml/trunk/src/lxml/tests/test_etree.py
==============================================================================
--- lxml/trunk/src/lxml/tests/test_etree.py	(original)
+++ lxml/trunk/src/lxml/tests/test_etree.py	Tue May 20 00:02:14 2008
@@ -7,30 +7,31 @@
 test_elementtree
 """
 
+import os.path, unittest, copy, sys, operator
 
-import unittest, copy, sys, operator
+this_dir = os.path.dirname(__file__)
+if this_dir not in sys.path:
+    sys.path.insert(0, this_dir) # needed for Py3
 
-from common_imports import etree, StringIO, HelperTestCase, fileInTestDir
+from common_imports import etree, StringIO, BytesIO, HelperTestCase, fileInTestDir
 from common_imports import SillyFileLike, canonicalize, doctest
+from common_imports import sorted, _str, _bytes
 
-print
-print "TESTED VERSION:", etree.__version__
-print "    Python:           ", sys.version_info
-print "    lxml.etree:       ", etree.LXML_VERSION
-print "    libxml used:      ", etree.LIBXML_VERSION
-print "    libxml compiled:  ", etree.LIBXML_COMPILED_VERSION
-print "    libxslt used:     ", etree.LIBXSLT_VERSION
-print "    libxslt compiled: ", etree.LIBXSLT_COMPILED_VERSION
-print
+print("")
+print("TESTED VERSION: %s" % etree.__version__)
+print("    Python:           " + repr(sys.version_info))
+print("    lxml.etree:       " + repr(etree.LXML_VERSION))
+print("    libxml used:      " + repr(etree.LIBXML_VERSION))
+print("    libxml compiled:  " + repr(etree.LIBXML_COMPILED_VERSION))
+print("    libxslt used:     " + repr(etree.LIBXSLT_VERSION))
+print("    libxslt compiled: " + repr(etree.LIBXSLT_COMPILED_VERSION))
+print("")
 
 try:
-    sorted
+    _unicode = unicode
 except NameError:
-    # Python 2.3
-    def sorted(seq):
-        seq = list(seq)
-        seq.sort()
-        return seq
+    # Python 3
+    _unicode = str
 
 class ETreeOnlyTestCase(HelperTestCase):
     """Tests only for etree, not ElementTree"""
@@ -198,7 +199,7 @@
 
     def test_pi_parse(self):
         XML = self.etree.XML
-        root = XML("<test><?mypi my test ?></test>")
+        root = XML(_bytes("<test><?mypi my test ?></test>"))
         self.assertEquals(root[0].target, "mypi")
         self.assertEquals(root[0].text, "my test ")
 
@@ -228,11 +229,11 @@
         tostring = self.etree.tostring
         XMLParser = self.etree.XMLParser
 
-        xml = '<a><!--A--><b><!-- B --><c/></b><!--C--></a>'
+        xml = _bytes('<a><!--A--><b><!-- B --><c/></b><!--C--></a>')
         parser = XMLParser(remove_comments=True)
         root = fromstring(xml, parser)
         self.assertEquals(
-            '<a><b><c/></b></a>',
+            _bytes('<a><b><c/></b></a>'),
             tostring(root))
 
     def test_parse_remove_pis(self):
@@ -240,9 +241,9 @@
         tostring = self.etree.tostring
         XMLParser = self.etree.XMLParser
 
-        xml = '<?test?><a><?A?><b><?B?><c/></b><?C?></a><?tail?>'
+        xml = _bytes('<?test?><a><?A?><b><?B?><c/></b><?C?></a><?tail?>')
 
-        f = StringIO(xml)
+        f = BytesIO(xml)
         tree = parse(f)
         self.assertEquals(
             xml,
@@ -251,7 +252,7 @@
         parser = XMLParser(remove_pis=True)
         tree = parse(f, parser)
         self.assertEquals(
-            '<a><b><c/></b></a>',
+            _bytes('<a><b><c/></b></a>'),
             tostring(tree))
 
     def test_parse_parser_type_error(self):
@@ -261,13 +262,13 @@
 
     def test_parse_error_logging(self):
         parse = self.etree.parse
-        # from StringIO
-        f = StringIO('<a><b></c></b></a>')
+        f = BytesIO('<a><b></c></b></a>')
         self.etree.clear_error_log()
         try:
             parse(f)
             logs = None
-        except SyntaxError, e:
+        except SyntaxError:
+            e = sys.exc_info()[1]
             logs = e.error_log
         f.close()
         self.assert_([ log for log in logs
@@ -286,12 +287,12 @@
         iterparse = self.etree.iterparse
         tostring = self.etree.tostring
 
-        f = StringIO('<a><!--A--><b><!-- B --><c/></b><!--C--></a>')
+        f = BytesIO('<a><!--A--><b><!-- B --><c/></b><!--C--></a>')
         events = list(iterparse(f))
         root = events[-1][1]
         self.assertEquals(3, len(events))
         self.assertEquals(
-            '<a><!--A--><b><!-- B --><c/></b><!--C--></a>',
+            _bytes('<a><!--A--><b><!-- B --><c/></b><!--C--></a>'),
             tostring(root))
 
     def test_iterparse_comments(self):
@@ -305,14 +306,14 @@
             else:
                 return el.tag
 
-        f = StringIO('<a><!--A--><b><!-- B --><c/></b><!--C--></a>')
+        f = BytesIO('<a><!--A--><b><!-- B --><c/></b><!--C--></a>')
         events = list(iterparse(f, events=('end', 'comment')))
         root = events[-1][1]
         self.assertEquals(6, len(events))
         self.assertEquals(['A', ' B ', 'c', 'b', 'C', 'a'],
                           [ name(*item) for item in events ])
         self.assertEquals(
-            '<a><!--A--><b><!-- B --><c/></b><!--C--></a>',
+            _bytes('<a><!--A--><b><!-- B --><c/></b><!--C--></a>'),
             tostring(root))
 
     def test_iterparse_pis(self):
@@ -327,7 +328,7 @@
             else:
                 return el.tag
 
-        f = StringIO('<?pia a?><a><?pib b?><b><?pic c?><c/></b><?pid d?></a><?pie e?>')
+        f = BytesIO('<?pia a?><a><?pib b?><b><?pic c?><c/></b><?pid d?></a><?pie e?>')
         events = list(iterparse(f, events=('end', 'pi')))
         root = events[-2][1]
         self.assertEquals(8, len(events))
@@ -335,14 +336,14 @@
                            ('pid','d'), 'a', ('pie','e')],
                           [ name(*item) for item in events ])
         self.assertEquals(
-            '<?pia a?><a><?pib b?><b><?pic c?><c/></b><?pid d?></a><?pie e?>',
+            _bytes('<?pia a?><a><?pib b?><b><?pic c?><c/></b><?pid d?></a><?pie e?>'),
             tostring(ElementTree(root)))
 
     def test_iterparse_remove_comments(self):
         iterparse = self.etree.iterparse
         tostring = self.etree.tostring
 
-        f = StringIO('<a><!--A--><b><!-- B --><c/></b><!--C--></a>')
+        f = BytesIO('<a><!--A--><b><!-- B --><c/></b><!--C--></a>')
         events = list(iterparse(f, remove_comments=True,
                                 events=('end', 'comment')))
         root = events[-1][1]
@@ -350,18 +351,18 @@
         self.assertEquals(['c', 'b', 'a'],
                           [ el.tag for (event, el) in events ])
         self.assertEquals(
-            '<a><b><c/></b></a>',
+            _bytes('<a><b><c/></b></a>'),
             tostring(root))
 
     def test_iterparse_broken(self):
         iterparse = self.etree.iterparse
-        f = StringIO('<a><b><c/></a>')
+        f = BytesIO('<a><b><c/></a>')
         # ET raises ExpatError, lxml raises XMLSyntaxError
         self.assertRaises(self.etree.XMLSyntaxError, list, iterparse(f))
 
     def test_iterparse_strip(self):
         iterparse = self.etree.iterparse
-        f = StringIO("""
+        f = BytesIO("""
                <a>  \n \n  <b> b test </b>  \n
 
                \n\t <c> \n </c> </a>  \n """)
@@ -374,7 +375,7 @@
 
     def test_iterparse_tag(self):
         iterparse = self.etree.iterparse
-        f = StringIO('<a><b><d/></b><c/></a>')
+        f = BytesIO('<a><b><d/></b><c/></a>')
 
         iterator = iterparse(f, tag="b", events=('start', 'end'))
         events = list(iterator)
@@ -385,7 +386,7 @@
 
     def test_iterparse_tag_all(self):
         iterparse = self.etree.iterparse
-        f = StringIO('<a><b><d/></b><c/></a>')
+        f = BytesIO('<a><b><d/></b><c/></a>')
 
         iterator = iterparse(f, tag="*", events=('start', 'end'))
         events = list(iterator)
@@ -394,21 +395,21 @@
             len(events))
 
     def test_iterparse_encoding_error(self):
-        text = u'Søk på nettet'
+        text = _str('Søk på nettet')
         wrong_declaration = "<?xml version='1.0' encoding='UTF-8'?>"
-        xml_latin1 = (u'%s<a>%s</a>' % (wrong_declaration, text)
+        xml_latin1 = (_str('%s<a>%s</a>') % (wrong_declaration, text)
                       ).encode('iso-8859-1')
 
         self.assertRaises(self.etree.ParseError,
-                          list, self.etree.iterparse(StringIO(xml_latin1)))
+                          list, self.etree.iterparse(BytesIO(xml_latin1)))
 
     def test_iterparse_encoding_8bit_override(self):
-        text = u'Søk på nettet'
+        text = _str('Søk på nettet', encoding="UTF-8")
         wrong_declaration = "<?xml version='1.0' encoding='UTF-8'?>"
-        xml_latin1 = (u'%s<a>%s</a>' % (wrong_declaration, text)
+        xml_latin1 = (_str('%s<a>%s</a>') % (wrong_declaration, text)
                       ).encode('iso-8859-1')
 
-        iterator = self.etree.iterparse(StringIO(xml_latin1),
+        iterator = self.etree.iterparse(BytesIO(xml_latin1),
                                         encoding="iso-8859-1")
         self.assertEquals(1, len(list(iterator)))
 
@@ -417,12 +418,12 @@
 
     def test_iterparse_keep_cdata(self):
         tostring = self.etree.tostring
-        f = StringIO('<root><![CDATA[test]]></root>')
+        f = BytesIO('<root><![CDATA[test]]></root>')
         context = self.etree.iterparse(f, strip_cdata=False)
         content = [ el.text for event,el in context ]
 
         self.assertEquals(['test'], content)
-        self.assertEquals('<root><![CDATA[test]]></root>',
+        self.assertEquals(_bytes('<root><![CDATA[test]]></root>'),
                           tostring(context.root))
 
     def test_parser_encoding_unknown(self):
@@ -445,7 +446,7 @@
 
         parser = self.etree.XMLParser(target=Target())
 
-        parser.feed('<!--a--><root>A<!--b--><sub/><!--c-->B</root><!--d-->')
+        parser.feed(_bytes('<!--a--><root>A<!--b--><sub/><!--c-->B</root><!--d-->'))
         done = parser.close()
 
         self.assertEquals("DONE", done)
@@ -470,7 +471,7 @@
 
         parser = self.etree.XMLParser(target=Target())
 
-        parser.feed('<?test a?><root>A<?test b?>B</root><?test c?>')
+        parser.feed(_bytes('<?test a?><root>A<?test b?>B</root><?test c?>'))
         done = parser.close()
 
         self.assertEquals("DONE", done)
@@ -493,7 +494,7 @@
         parser = self.etree.XMLParser(target=Target(),
                                       strip_cdata=False)
 
-        parser.feed('<root>A<a><![CDATA[ca]]></a>B</root>')
+        parser.feed(_bytes('<root>A<a><![CDATA[ca]]></a>B</root>'))
         done = parser.close()
 
         self.assertEquals("DONE", done)
@@ -503,7 +504,7 @@
 
     def test_iterwalk_tag(self):
         iterwalk = self.etree.iterwalk
-        root = self.etree.XML('<a><b><d/></b><c/></a>')
+        root = self.etree.XML(_bytes('<a><b><d/></b><c/></a>'))
 
         iterator = iterwalk(root, tag="b", events=('start', 'end'))
         events = list(iterator)
@@ -513,7 +514,7 @@
 
     def test_iterwalk_tag_all(self):
         iterwalk = self.etree.iterwalk
-        root = self.etree.XML('<a><b><d/></b><c/></a>')
+        root = self.etree.XML(_bytes('<a><b><d/></b><c/></a>'))
 
         iterator = iterwalk(root, tag="*", events=('start', 'end'))
         events = list(iterator)
@@ -523,7 +524,7 @@
 
     def test_iterwalk(self):
         iterwalk = self.etree.iterwalk
-        root = self.etree.XML('<a><b></b><c/></a>')
+        root = self.etree.XML(_bytes('<a><b></b><c/></a>'))
 
         events = list(iterwalk(root))
         self.assertEquals(
@@ -532,7 +533,7 @@
 
     def test_iterwalk_start(self):
         iterwalk = self.etree.iterwalk
-        root = self.etree.XML('<a><b></b><c/></a>')
+        root = self.etree.XML(_bytes('<a><b></b><c/></a>'))
 
         iterator = iterwalk(root, events=('start',))
         events = list(iterator)
@@ -542,7 +543,7 @@
 
     def test_iterwalk_start_end(self):
         iterwalk = self.etree.iterwalk
-        root = self.etree.XML('<a><b></b><c/></a>')
+        root = self.etree.XML(_bytes('<a><b></b><c/></a>'))
 
         iterator = iterwalk(root, events=('start','end'))
         events = list(iterator)
@@ -553,7 +554,7 @@
 
     def test_iterwalk_clear(self):
         iterwalk = self.etree.iterwalk
-        root = self.etree.XML('<a><b></b><c/></a>')
+        root = self.etree.XML(_bytes('<a><b></b><c/></a>'))
 
         iterator = iterwalk(root)
         for event, elem in iterator:
@@ -564,7 +565,7 @@
 
     def test_iterwalk_attrib_ns(self):
         iterwalk = self.etree.iterwalk
-        root = self.etree.XML('<a xmlns="ns1"><b><c xmlns="ns2"/></b></a>')
+        root = self.etree.XML(_bytes('<a xmlns="ns1"><b><c xmlns="ns2"/></b></a>'))
 
         attr_name = '{testns}bla'
         events = []
@@ -589,7 +590,7 @@
 
     def test_iterwalk_getiterator(self):
         iterwalk = self.etree.iterwalk
-        root = self.etree.XML('<a><b><d/></b><c/></a>')
+        root = self.etree.XML(_bytes('<a><b><d/></b><c/></a>'))
 
         counts = []
         for event, elem in iterwalk(root):
@@ -602,18 +603,18 @@
         parse = self.etree.parse
         parser = self.etree.XMLParser(dtd_validation=True)
         assertEqual = self.assertEqual
-        test_url = u"__nosuch.dtd"
+        test_url = _str("__nosuch.dtd")
 
         class MyResolver(self.etree.Resolver):
             def resolve(self, url, id, context):
                 assertEqual(url, test_url)
                 return self.resolve_string(
-                    u'''<!ENTITY myentity "%s">
-                        <!ELEMENT doc ANY>''' % url, context)
+                    _str('''<!ENTITY myentity "%s">
+                        <!ELEMENT doc ANY>''') % url, context)
 
         parser.resolvers.add(MyResolver())
 
-        xml = u'<!DOCTYPE doc SYSTEM "%s"><doc>&myentity;</doc>' % test_url
+        xml = _str('<!DOCTYPE doc SYSTEM "%s"><doc>&myentity;</doc>') % test_url
         tree = parse(StringIO(xml), parser)
         root = tree.getroot()
         self.assertEquals(root.text, test_url)
@@ -622,7 +623,7 @@
         parse = self.etree.parse
         parser = self.etree.XMLParser(attribute_defaults=True)
         assertEqual = self.assertEqual
-        test_url = u"__nosuch.dtd"
+        test_url = _str("__nosuch.dtd")
 
         class MyResolver(self.etree.Resolver):
             def resolve(self, url, id, context):
@@ -632,7 +633,7 @@
 
         parser.resolvers.add(MyResolver())
 
-        xml = u'<!DOCTYPE a SYSTEM "%s"><a><b/></a>' % test_url
+        xml = _str('<!DOCTYPE a SYSTEM "%s"><a><b/></a>') % test_url
         tree = parse(StringIO(xml), parser)
         root = tree.getroot()
         self.assertEquals(
@@ -644,7 +645,7 @@
         parse = self.etree.parse
         parser = self.etree.XMLParser(load_dtd=True)
         assertEqual = self.assertEqual
-        test_url = u"__nosuch.dtd"
+        test_url = _str("__nosuch.dtd")
 
         class check(object):
             resolved = False
@@ -657,14 +658,13 @@
 
         parser.resolvers.add(MyResolver())
 
-        xml = u'<!DOCTYPE doc SYSTEM "%s"><doc>&myentity;</doc>' % test_url
+        xml = _str('<!DOCTYPE doc SYSTEM "%s"><doc>&myentity;</doc>') % test_url
         self.assertRaises(etree.XMLSyntaxError, parse, StringIO(xml), parser)
         self.assert_(check.resolved)
 
     def test_resolve_error(self):
         parse = self.etree.parse
         parser = self.etree.XMLParser(dtd_validation=True)
-        test_url = u"__nosuch.dtd"
 
         class _LocalException(Exception):
             pass
@@ -675,8 +675,8 @@
 
         parser.resolvers.add(MyResolver())
 
-        xml = u'<!DOCTYPE doc SYSTEM "test"><doc>&myentity;</doc>'
-        self.assertRaises(_LocalException, parse, StringIO(xml), parser)
+        xml = '<!DOCTYPE doc SYSTEM "test"><doc>&myentity;</doc>'
+        self.assertRaises(_LocalException, parse, BytesIO(xml), parser)
 
     if etree.LIBXML_VERSION > (2,6,20):
         def test_entity_parse(self):
@@ -686,14 +686,14 @@
             Entity = self.etree.Entity
 
             xml = '<!DOCTYPE doc SYSTEM "test"><doc>&myentity;</doc>'
-            tree = parse(StringIO(xml), parser)
+            tree = parse(BytesIO(xml), parser)
             root = tree.getroot()
             self.assertEquals(root[0].tag, Entity)
             self.assertEquals(root[0].text, "&myentity;")
             self.assertEquals(root[0].tail, None)
             self.assertEquals(root[0].name, "myentity")
 
-            self.assertEquals('<doc>&myentity;</doc>',
+            self.assertEquals(_bytes('<doc>&myentity;</doc>'),
                               tostring(root))
 
     def test_entity_append(self):
@@ -709,7 +709,7 @@
         self.assertEquals(root[0].tail, None)
         self.assertEquals(root[0].name, "test")
 
-        self.assertEquals('<root>&test;</root>',
+        self.assertEquals(_bytes('<root>&test;</root>'),
                           tostring(root))
 
     def test_entity_values(self):
@@ -737,7 +737,7 @@
 
         self.assertEquals('test',
                           root.text)
-        self.assertEquals('<root><![CDATA[test]]></root>',
+        self.assertEquals(_bytes('<root><![CDATA[test]]></root>'),
                           tostring(root))
 
     def test_cdata_type(self):
@@ -748,7 +748,7 @@
         root.text = CDATA("test")
         self.assertEquals('test', root.text)
 
-        root.text = CDATA(u"test")
+        root.text = CDATA(_str("test"))
         self.assertEquals('test', root.text)
 
         self.assertRaises(TypeError, CDATA, 1)
@@ -770,10 +770,10 @@
     def test_cdata_parser(self):
         tostring = self.etree.tostring
         parser = self.etree.XMLParser(strip_cdata=False)
-        root = self.etree.XML('<root><![CDATA[test]]></root>', parser)
+        root = self.etree.XML(_bytes('<root><![CDATA[test]]></root>'), parser)
 
         self.assertEquals('test', root.text)
-        self.assertEquals('<root><![CDATA[test]]></root>',
+        self.assertEquals(_bytes('<root><![CDATA[test]]></root>'),
                           tostring(root))
 
     # TypeError in etree, AssertionError in ElementTree;
@@ -839,10 +839,10 @@
         pi = PI('TARGET', 'TEXT')
         pi.tail = "TAIL"
 
-        self.assertEquals('<root><a></a></root>',
+        self.assertEquals(_bytes('<root><a></a></root>'),
                           self._writeElement(root))
         root[0].addprevious(pi)
-        self.assertEquals('<root><?TARGET TEXT?>TAIL<a></a></root>',
+        self.assertEquals(_bytes('<root><?TARGET TEXT?>TAIL<a></a></root>'),
                           self._writeElement(root))
 
     def test_addprevious_root_pi(self):
@@ -852,10 +852,10 @@
         pi = PI('TARGET', 'TEXT')
         pi.tail = "TAIL"
 
-        self.assertEquals('<root></root>',
+        self.assertEquals(_bytes('<root></root>'),
                           self._writeElement(root))
         root.addprevious(pi)
-        self.assertEquals('<?TARGET TEXT?>\n<root></root>',
+        self.assertEquals(_bytes('<?TARGET TEXT?>\n<root></root>'),
                           self._writeElement(root))
 
     def test_addnext_pi(self):
@@ -867,10 +867,10 @@
         pi = PI('TARGET', 'TEXT')
         pi.tail = "TAIL"
 
-        self.assertEquals('<root><a></a></root>',
+        self.assertEquals(_bytes('<root><a></a></root>'),
                           self._writeElement(root))
         root[0].addnext(pi)
-        self.assertEquals('<root><a></a><?TARGET TEXT?>TAIL</root>',
+        self.assertEquals(_bytes('<root><a></a><?TARGET TEXT?>TAIL</root>'),
                           self._writeElement(root))
 
     def test_addnext_root_pi(self):
@@ -880,10 +880,10 @@
         pi = PI('TARGET', 'TEXT')
         pi.tail = "TAIL"
 
-        self.assertEquals('<root></root>',
+        self.assertEquals(_bytes('<root></root>'),
                           self._writeElement(root))
         root.addnext(pi)
-        self.assertEquals('<root></root>\n<?TARGET TEXT?>',
+        self.assertEquals(_bytes('<root></root>\n<?TARGET TEXT?>'),
                           self._writeElement(root))
 
     def test_addnext_comment(self):
@@ -895,10 +895,10 @@
         comment = Comment('TEXT ')
         comment.tail = "TAIL"
 
-        self.assertEquals('<root><a></a></root>',
+        self.assertEquals(_bytes('<root><a></a></root>'),
                           self._writeElement(root))
         root[0].addnext(comment)
-        self.assertEquals('<root><a></a><!--TEXT -->TAIL</root>',
+        self.assertEquals(_bytes('<root><a></a><!--TEXT -->TAIL</root>'),
                           self._writeElement(root))
 
     def test_addnext_root_comment(self):
@@ -908,10 +908,10 @@
         comment = Comment('TEXT ')
         comment.tail = "TAIL"
 
-        self.assertEquals('<root></root>',
+        self.assertEquals(_bytes('<root></root>'),
                           self._writeElement(root))
         root.addnext(comment)
-        self.assertEquals('<root></root>\n<!--TEXT -->',
+        self.assertEquals(_bytes('<root></root>\n<!--TEXT -->'),
                           self._writeElement(root))
 
     def test_addprevious_comment(self):
@@ -923,10 +923,10 @@
         comment = Comment('TEXT ')
         comment.tail = "TAIL"
 
-        self.assertEquals('<root><a></a></root>',
+        self.assertEquals(_bytes('<root><a></a></root>'),
                           self._writeElement(root))
         root[0].addprevious(comment)
-        self.assertEquals('<root><!--TEXT -->TAIL<a></a></root>',
+        self.assertEquals(_bytes('<root><!--TEXT -->TAIL<a></a></root>'),
                           self._writeElement(root))
 
     def test_addprevious_root_comment(self):
@@ -936,17 +936,17 @@
         comment = Comment('TEXT ')
         comment.tail = "TAIL"
 
-        self.assertEquals('<root></root>',
+        self.assertEquals(_bytes('<root></root>'),
                           self._writeElement(root))
         root.addprevious(comment)
-        self.assertEquals('<!--TEXT -->\n<root></root>',
+        self.assertEquals(_bytes('<!--TEXT -->\n<root></root>'),
                           self._writeElement(root))
 
     # ET's Elements have items() and key(), but not values()
     def test_attribute_values(self):
         XML = self.etree.XML
         
-        root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
+        root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>'))
         values = root.values()
         values.sort()
         self.assertEquals(['Alpha', 'Beta', 'Gamma'], values)
@@ -959,7 +959,7 @@
         a = Element('a')
         a.append(Comment())
         self.assertEquals(
-            '<a><!----></a>',
+            _bytes('<a><!----></a>'),
             self._writeElement(a))
 
     # ElementTree ignores comments
@@ -967,8 +967,8 @@
         ElementTree = self.etree.ElementTree
         tostring = self.etree.tostring
 
-        xml = '<a><b/><!----><c/></a>'
-        f = StringIO(xml)
+        xml = _bytes('<a><b/><!----><c/></a>')
+        f = BytesIO(xml)
         doc = ElementTree(file=f)
         a = doc.getroot()
         self.assertEquals(
@@ -982,7 +982,7 @@
     def test_comment_no_proxy_yet(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<a><b></b><!-- hoi --><c></c></a>')
+        f = BytesIO('<a><b></b><!-- hoi --><c></c></a>')
         doc = ElementTree(file=f)
         a = doc.getroot()
         self.assertEquals(
@@ -1008,7 +1008,7 @@
     def test_prefix(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<a xmlns:foo="http://www.infrae.com/ns/1"><foo:b/></a>')
+        f = BytesIO('<a xmlns:foo="http://www.infrae.com/ns/1"><foo:b/></a>')
         doc = ElementTree(file=f)
         a = doc.getroot()
         self.assertEquals(
@@ -1021,7 +1021,7 @@
     def test_prefix_default_ns(self):
         ElementTree = self.etree.ElementTree
         
-        f = StringIO('<a xmlns="http://www.infrae.com/ns/1"><b/></a>')
+        f = BytesIO('<a xmlns="http://www.infrae.com/ns/1"><b/></a>')
         doc = ElementTree(file=f)
         a = doc.getroot()
         self.assertEquals(
@@ -1055,7 +1055,7 @@
     def test_iterchildren(self):
         XML = self.etree.XML
         
-        root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
+        root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>'))
         result = []
         for el in root.iterchildren():
             result.append(el.tag)
@@ -1064,7 +1064,7 @@
     def test_iterchildren_reversed(self):
         XML = self.etree.XML
         
-        root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
+        root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>'))
         result = []
         for el in root.iterchildren(reversed=True):
             result.append(el.tag)
@@ -1073,7 +1073,7 @@
     def test_iterchildren_tag(self):
         XML = self.etree.XML
         
-        root = XML('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>')
+        root = XML(_bytes('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>'))
         result = []
         for el in root.iterchildren(tag='two'):
             result.append(el.text)
@@ -1082,7 +1082,7 @@
     def test_iterchildren_tag_reversed(self):
         XML = self.etree.XML
         
-        root = XML('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>')
+        root = XML(_bytes('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>'))
         result = []
         for el in root.iterchildren(reversed=True, tag='two'):
             result.append(el.text)
@@ -1103,8 +1103,8 @@
             [a],
             list(b.iterancestors()))
         self.assertEquals(
-            a,
-            c.iterancestors().next())
+            [a],
+            list(c.iterancestors()))
         self.assertEquals(
             [b, a],
             list(d.iterancestors()))
@@ -1227,9 +1227,6 @@
             [c],
             list(b.itersiblings()))
         self.assertEquals(
-            c,
-            b.itersiblings().next())
-        self.assertEquals(
             [],
             list(c.itersiblings()))
         self.assertEquals(
@@ -1263,7 +1260,7 @@
     def test_parseid(self):
         parseid = self.etree.parseid
         XML     = self.etree.XML
-        xml_text = '''
+        xml_text = _bytes('''
         <!DOCTYPE document [
         <!ELEMENT document (h1,p)*>
         <!ELEMENT h1 (#PCDATA)>
@@ -1278,9 +1275,9 @@
           <p xml:id="xmlid">XML:ID paragraph.</p>
           <p someid="warn1" class="warning">...</p>
         </document>
-        '''
+        ''')
 
-        tree, dic = parseid(StringIO(xml_text))
+        tree, dic = parseid(BytesIO(xml_text))
         root = tree.getroot()
         root2 = XML(xml_text)
         self.assertEquals(self._writeElement(root),
@@ -1298,7 +1295,7 @@
     def test_XMLDTDID(self):
         XMLDTDID = self.etree.XMLDTDID
         XML      = self.etree.XML
-        xml_text = '''
+        xml_text = _bytes('''
         <!DOCTYPE document [
         <!ELEMENT document (h1,p)*>
         <!ELEMENT h1 (#PCDATA)>
@@ -1313,7 +1310,7 @@
           <p xml:id="xmlid">XML:ID paragraph.</p>
           <p someid="warn1" class="warning">...</p>
         </document>
-        '''
+        ''')
 
         root, dic = XMLDTDID(xml_text)
         root2 = XML(xml_text)
@@ -1332,14 +1329,14 @@
     def test_XMLDTDID_empty(self):
         XMLDTDID = self.etree.XMLDTDID
         XML      = self.etree.XML
-        xml_text = '''
+        xml_text = _bytes('''
         <document>
           <h1 myid="chapter1">...</h1>
           <p id="note1" class="note">...</p>
           <p>Regular paragraph.</p>
           <p someid="warn1" class="warning">...</p>
         </document>
-        '''
+        ''')
 
         root, dic = XMLDTDID(xml_text)
         root2 = XML(xml_text)
@@ -1349,21 +1346,23 @@
         self._checkIDDict(dic, expected)
 
     def _checkIDDict(self, dic, expected):
-        self.assertEquals(dic, expected)
         self.assertEquals(len(dic),
                           len(expected))
         self.assertEquals(sorted(dic.items()),
                           sorted(expected.items()))
-        self.assertEquals(sorted(dic.iteritems()),
-                          sorted(expected.iteritems()))
+        if sys.version_info < (3,):
+            self.assertEquals(sorted(dic.iteritems()),
+                              sorted(expected.iteritems()))
         self.assertEquals(sorted(dic.keys()),
                           sorted(expected.keys()))
-        self.assertEquals(sorted(dic.iterkeys()),
-                          sorted(expected.iterkeys()))
-        self.assertEquals(sorted(dic.values()),
-                          sorted(expected.values()))
-        self.assertEquals(sorted(dic.itervalues()),
-                          sorted(expected.itervalues()))
+        if sys.version_info < (3,):
+            self.assertEquals(sorted(dic.iterkeys()),
+                              sorted(expected.iterkeys()))
+        if sys.version_info < (3,):
+            self.assertEquals(sorted(dic.values()),
+                              sorted(expected.values()))
+            self.assertEquals(sorted(dic.itervalues()),
+                              sorted(expected.itervalues()))
 
     def test_namespaces(self):
         etree = self.etree
@@ -1374,7 +1373,7 @@
             'foo',
             e.prefix)
         self.assertEquals(
-            '<foo:bar xmlns:foo="http://ns.infrae.com/foo"></foo:bar>',
+            _bytes('<foo:bar xmlns:foo="http://ns.infrae.com/foo"></foo:bar>'),
             self._writeElement(e))
         
     def test_namespaces_default(self):
@@ -1389,7 +1388,7 @@
             '{http://ns.infrae.com/foo}bar',
             e.tag)
         self.assertEquals(
-            '<bar xmlns="http://ns.infrae.com/foo"></bar>',
+            _bytes('<bar xmlns="http://ns.infrae.com/foo"></bar>'),
             self._writeElement(e))
 
     def test_namespaces_default_and_attr(self):
@@ -1400,7 +1399,7 @@
         e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
         e.set('{http://ns.infrae.com/hoi}test', 'value')
         self.assertEquals(
-            '<bar xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi" hoi:test="value"></bar>',
+            _bytes('<bar xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi" hoi:test="value"></bar>'),
             self._writeElement(e))
 
     def test_namespaces_elementtree(self):
@@ -1411,7 +1410,7 @@
         tree = etree.ElementTree(element=e)
         etree.SubElement(e, '{http://ns.infrae.com/hoi}x')
         self.assertEquals(
-            '<z xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi"><hoi:x></hoi:x></z>',
+            _bytes('<z xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi"><hoi:x></hoi:x></z>'),
             self._writeElement(e))
 
     def test_namespaces_default_copy_element(self):
@@ -1461,17 +1460,17 @@
     def test_namespaces_reuse_after_move(self):
         ns_href = "http://a.b.c"
         one = self.etree.fromstring(
-            '<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href)
+            _bytes('<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href))
         baz = one[0][0]
 
         two = self.etree.fromstring(
-            '<root xmlns:ns="%s"/>' % ns_href)
+            _bytes('<root xmlns:ns="%s"/>' % ns_href))
         two.append(baz)
         del one # make sure the source document is deallocated
 
         self.assertEquals('{%s}baz' % ns_href, baz.tag)
         self.assertEquals(
-            '<root xmlns:ns="%s"><ns:baz/></root>' % ns_href,
+            _bytes('<root xmlns:ns="%s"><ns:baz/></root>' % ns_href),
             self.etree.tostring(two))
 
     def test_element_nsmap(self):
@@ -1593,14 +1592,14 @@
         XML = self.etree.XML
         ElementTree = self.etree.ElementTree
         QName = self.etree.QName
-        tree = ElementTree(XML('<a><b><c/></b><b/><c><b/></c></a>'))
+        tree = ElementTree(XML(_bytes('<a><b><c/></b><b/><c><b/></c></a>')))
         self.assertEquals(tree.find(QName("c")), tree.getroot()[2])
 
     def test_elementtree_findall_qname(self):
         XML = self.etree.XML
         ElementTree = self.etree.ElementTree
         QName = self.etree.QName
-        tree = ElementTree(XML('<a><b><c/></b><b/><c><b/></c></a>'))
+        tree = ElementTree(XML(_bytes('<a><b><c/></b><b/><c><b/></c></a>')))
         self.assertEquals(len(list(tree.findall(QName("c")))), 1)
 
     def test_elementtree_findall_ns_qname(self):
@@ -1608,13 +1607,13 @@
         ElementTree = self.etree.ElementTree
         QName = self.etree.QName
         tree = ElementTree(XML(
-                '<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>'))
+                _bytes('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>')))
         self.assertEquals(len(list(tree.findall(QName("b")))), 2)
         self.assertEquals(len(list(tree.findall(QName("X", "b")))), 1)
 
     def test_findall_ns(self):
         XML = self.etree.XML
-        root = XML('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>')
+        root = XML(_bytes('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>'))
         self.assertEquals(len(root.findall(".//{X}b")), 2)
         self.assertEquals(len(root.findall(".//{X}*")), 2)
         self.assertEquals(len(root.findall(".//b")), 3)
@@ -1779,7 +1778,7 @@
         try:
             slice
         except NameError:
-            print "slice() not found"
+            print("slice() not found")
             return
 
         a = Element('a')
@@ -1802,12 +1801,12 @@
 
     def test_sourceline_XML(self):
         XML = self.etree.XML
-        root = XML('''<?xml version="1.0"?>
+        root = XML(_bytes('''<?xml version="1.0"?>
         <root><test>
 
         <bla/></test>
         </root>
-        ''')
+        '''))
 
         self.assertEquals(
             [2, 2, 4],
@@ -1852,13 +1851,13 @@
 
     def test_XML_base_url_docinfo(self):
         etree = self.etree
-        root = etree.XML("<root/>", base_url="http://no/such/url")
+        root = etree.XML(_bytes("<root/>"), base_url="http://no/such/url")
         docinfo = root.getroottree().docinfo
         self.assertEquals(docinfo.URL, "http://no/such/url")
 
     def test_XML_set_base_url_docinfo(self):
         etree = self.etree
-        root = etree.XML("<root/>", base_url="http://no/such/url")
+        root = etree.XML(_bytes("<root/>"), base_url="http://no/such/url")
         docinfo = root.getroottree().docinfo
         self.assertEquals(docinfo.URL, "http://no/such/url")
         docinfo.URL = "https://secret/url"
@@ -1866,7 +1865,7 @@
 
     def test_parse_stringio_base_url(self):
         etree = self.etree
-        tree = etree.parse(StringIO("<root/>"), base_url="http://no/such/url")
+        tree = etree.parse(BytesIO("<root/>"), base_url="http://no/such/url")
         docinfo = tree.docinfo
         self.assertEquals(docinfo.URL, "http://no/such/url")
 
@@ -1879,7 +1878,7 @@
 
     def test_HTML_base_url_docinfo(self):
         etree = self.etree
-        root = etree.HTML("<html/>", base_url="http://no/such/url")
+        root = etree.HTML(_bytes("<html/>"), base_url="http://no/such/url")
         docinfo = root.getroottree().docinfo
         self.assertEquals(docinfo.URL, "http://no/such/url")
 
@@ -1890,9 +1889,9 @@
         sys_id = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
         doctype_string = '<!DOCTYPE html PUBLIC "%s" "%s">' % (pub_id, sys_id)
 
-        xml = xml_header + doctype_string + '<html><body></body></html>'
+        xml = _bytes(xml_header + doctype_string + '<html><body></body></html>')
 
-        tree = etree.parse(StringIO(xml))
+        tree = etree.parse(BytesIO(xml))
         docinfo = tree.docinfo
         self.assertEquals(docinfo.encoding,    "ascii")
         self.assertEquals(docinfo.xml_version, "1.0")
@@ -1906,9 +1905,9 @@
         xml_header = '<?xml version="1.0" encoding="UTF-8"?>'
         sys_id = "some.dtd"
         doctype_string = '<!DOCTYPE html SYSTEM "%s">' % sys_id
-        xml = xml_header + doctype_string + '<html><body></body></html>'
+        xml = _bytes(xml_header + doctype_string + '<html><body></body></html>')
 
-        tree = etree.parse(StringIO(xml))
+        tree = etree.parse(BytesIO(xml))
         docinfo = tree.docinfo
         se