configurationengine/source/cone/public/tests/unittest_xml_parsing.py
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
permissions -rw-r--r--
ConE 1.2.11 release
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
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
from cone.public import utils, exceptions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
class ElementTreeBackendTester(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
    Base tester class that contains all test cases.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
    The actual test case classes derive from this and set the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
    class attributes BACKEND_ID and LINE_NUMBERS.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    DATA = u"""<?xml version="1.0" encoding="UTF-8"?>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
            <root xmlns="http://www.test.com/xml/1">
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
                <!-- Comment -->
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
                <elem1 attr1="test" attr2="test 2"/>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
                <elem2>カタカナ</elem2>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
                <elem3>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
                    <!-- Comment 2 -->
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
                    some text
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
                </elem3>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
            </root>""".encode('utf-8')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
    # ID of the ElementTree back-end to use in the tests
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
    BACKEND_ID = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
    # Whether to check if line numbers in elements are correct or None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
    LINE_NUMBERS = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
    def setUp(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
        self.orig_backend_id = utils.etree.get_backend_id()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
        utils.etree.set_backend_id(self.BACKEND_ID)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
    def tearDown(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
        utils.etree.set_backend_id(self.orig_backend_id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
    def assert_lineno_equals(self, actual, expected):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
        if self.LINE_NUMBERS:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
            self.assertEquals(actual, expected)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
            self.assertEquals(actual, None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    64
    def assert_elem_tag(self, actual, expected):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    65
        if self.LINE_NUMBERS:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    66
            self.assertEquals(actual.tag, expected)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    67
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    68
            self.assertEquals(actual, None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    69
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
    def test_correct_parser_set(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
        self.assertEquals(utils.etree.get_backend_id(), self.BACKEND_ID)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
    def test_fromstring_successful(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        root = utils.etree.fromstring(self.DATA)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
        self.assertEquals(root.tag, '{http://www.test.com/xml/1}root')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
        children = [e for e in root]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
        self.assertEquals(len(children), 3)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
        self.assertEquals(children[0].tag, '{http://www.test.com/xml/1}elem1')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
        self.assertEquals(children[1].tag, '{http://www.test.com/xml/1}elem2')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        self.assertEquals(children[2].tag, '{http://www.test.com/xml/1}elem3')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
        self.assertEquals(children[1].text, u'カタカナ')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
        self.assert_lineno_equals(utils.etree.get_lineno(root), 2)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        self.assert_lineno_equals(utils.etree.get_lineno(children[0]), 4)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        self.assert_lineno_equals(utils.etree.get_lineno(children[1]), 5)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
        self.assert_lineno_equals(utils.etree.get_lineno(children[2]), 6)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    87
        self.assert_elem_tag(utils.etree.get_elem_from_lineno(root, 5), '{http://www.test.com/xml/1}elem2')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    88
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
    def test_tostring_ascii(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
        root = utils.etree.fromstring(self.DATA)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        output = utils.etree.tostring(root)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
    def test_tostring_utf_8(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        root = utils.etree.fromstring(self.DATA)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        output = utils.etree.tostring(root, 'UTF-8')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
    def test_tostring_utf_16(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        root = utils.etree.fromstring(self.DATA)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
        output = utils.etree.tostring(root, 'UTF-16')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
    def test_fromstring_failed(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
        data = """<?xml version="1.0" encoding="UTF-8"?>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
            <root xmlns="http://www.test.com/xml/1">
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
                <elem1 attr1="test" attr2="test 2"/>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
                <elem2>testing</elem3>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
            </root>"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
            etree = utils.etree.fromstring(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
            self.fail("XmlParseError not raised!")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        except exceptions.XmlParseError, e:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   111
            self.assertEquals(e.problem_lineno, 4)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
# ============================================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
# Actual test cases
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
# ============================================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
# NOTE:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
# The test classes MUST inherit the two super-classes in the order
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
# (ElementTreeBackendTester, unittest.TestCase), or otherwise setUp() and
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
# tearDown() will not be overridden correctly
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
class TestElementTreeBackend(ElementTreeBackendTester, unittest.TestCase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
    BACKEND_ID = utils.etree.BACKEND_ELEMENT_TREE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
    LINE_NUMBERS = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
class TestCElementTreeBackend(ElementTreeBackendTester, unittest.TestCase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
    BACKEND_ID = utils.etree.BACKEND_C_ELEMENT_TREE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
    LINE_NUMBERS = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
class TestLxmlBackend(ElementTreeBackendTester, unittest.TestCase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
    BACKEND_ID = utils.etree.BACKEND_LXML
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
    LINE_NUMBERS = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
if __name__ == '__main__':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
    unittest.main()