configurationengine/source/cone/public/tests/unittest_xml_parsing.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
permissions -rw-r--r--
Adding EPL version of configurationengine.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
# *-* coding: utf-8 *-*
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
import sys, os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
import unittest
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
import StringIO
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
import __init__
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
from cone.public import utils, exceptions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
class ElementTreeBackendTester(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
    Base tester class that contains all test cases.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
    The actual test case classes derive from this and set the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
    class attributes BACKEND_ID and LINE_NUMBERS.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    DATA = u"""<?xml version="1.0" encoding="UTF-8"?>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
            <root xmlns="http://www.test.com/xml/1">
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
                <!-- Comment -->
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
                <elem1 attr1="test" attr2="test 2"/>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
                <elem2>カタカナ</elem2>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
                <elem3>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
                    <!-- Comment 2 -->
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
                    some text
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
                </elem3>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
            </root>""".encode('utf-8')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
    # ID of the ElementTree back-end to use in the tests
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
    BACKEND_ID = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
    # Whether to check if line numbers in elements are correct or None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
    LINE_NUMBERS = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
    def setUp(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
        self.orig_backend_id = utils.etree.get_backend_id()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        utils.etree.set_backend_id(self.BACKEND_ID)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
    def tearDown(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
        utils.etree.set_backend_id(self.orig_backend_id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
    def assert_lineno_equals(self, actual, expected):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
        if self.LINE_NUMBERS:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
            self.assertEquals(actual, expected)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
            self.assertEquals(actual, None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
    def test_correct_parser_set(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
        self.assertEquals(utils.etree.get_backend_id(), self.BACKEND_ID)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
    def test_fromstring_successful(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
        root = utils.etree.fromstring(self.DATA)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
        self.assertEquals(root.tag, '{http://www.test.com/xml/1}root')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
        children = [e for e in root]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
        self.assertEquals(len(children), 3)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
        self.assertEquals(children[0].tag, '{http://www.test.com/xml/1}elem1')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        self.assertEquals(children[1].tag, '{http://www.test.com/xml/1}elem2')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
        self.assertEquals(children[2].tag, '{http://www.test.com/xml/1}elem3')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
        self.assertEquals(children[1].text, u'カタカナ')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
        self.assert_lineno_equals(utils.etree.get_lineno(root), 2)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
        self.assert_lineno_equals(utils.etree.get_lineno(children[0]), 4)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        self.assert_lineno_equals(utils.etree.get_lineno(children[1]), 5)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
        self.assert_lineno_equals(utils.etree.get_lineno(children[2]), 6)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
    def test_tostring_ascii(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        root = utils.etree.fromstring(self.DATA)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        output = utils.etree.tostring(root)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
    def test_tostring_utf_8(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
        root = utils.etree.fromstring(self.DATA)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
        output = utils.etree.tostring(root, 'UTF-8')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
    def test_tostring_utf_16(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
        root = utils.etree.fromstring(self.DATA)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
        output = utils.etree.tostring(root, 'UTF-16')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
    def test_fromstring_failed(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        data = """<?xml version="1.0" encoding="UTF-8"?>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
            <root xmlns="http://www.test.com/xml/1">
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
                <elem1 attr1="test" attr2="test 2"/>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
                <elem2>testing</elem3>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
            </root>"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
            etree = utils.etree.fromstring(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
            self.fail("XmlParseError not raised!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        except exceptions.XmlParseError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
            self.assertEquals(e.lineno, 4)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
# ============================================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
# Actual test cases
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
# ============================================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
# NOTE:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
# The test classes MUST inherit the two super-classes in the order
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
# (ElementTreeBackendTester, unittest.TestCase), or otherwise setUp() and
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
# tearDown() will not be overridden correctly
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
class TestElementTreeBackend(ElementTreeBackendTester, unittest.TestCase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
    BACKEND_ID = utils.etree.BACKEND_ELEMENT_TREE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
    LINE_NUMBERS = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
class TestCElementTreeBackend(ElementTreeBackendTester, unittest.TestCase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
    BACKEND_ID = utils.etree.BACKEND_C_ELEMENT_TREE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
    LINE_NUMBERS = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
class TestLxmlBackend(ElementTreeBackendTester, unittest.TestCase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
    BACKEND_ID = utils.etree.BACKEND_LXML
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
    LINE_NUMBERS = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
if __name__ == '__main__':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
    unittest.main()