configurationengine/source/cone/validation/tests/unittest_schemavalidation.py
changeset 3 e7e0ae78773e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/validation/tests/unittest_schemavalidation.py	Tue Aug 10 14:29:28 2010 +0300
@@ -0,0 +1,192 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os
+import StringIO
+
+from testautomation.base_testcase import BaseTestCase
+from cone.public import api, plugin, utils, exceptions
+from cone.validation import schemavalidation 
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+CONFML1_NAMESPACE = 'http://www.s60.com/xml/confml/1'
+CONFML2_NAMESPACE = 'http://www.s60.com/xml/confml/2'
+
+class DummyResource(object):
+    def __init__(self, data):
+        self.data = data
+    def read(self):
+        return self.data
+    def close(self):
+        pass
+
+class DummyConfiguration(object):
+    def __init__(self, resources):
+        self.resources = resources
+    
+    def get_resource(self, ref):
+        if ref in self.resources:
+            return DummyResource(self.resources[ref])
+        else:
+            raise exceptions.NotFound("No such resource '%s'!" % ref)
+
+class TestConfmlSchemaValidation(BaseTestCase, schemavalidation.SchemaValidationTestMixin):
+    
+    def test_valid_confml2_files(self):
+        self.assert_schemavalidation_succeeds(
+            type = 'confml',
+            dir = os.path.join(ROOT_PATH, 'testdata/schema/confml2/valid'),
+            namespace = CONFML2_NAMESPACE)
+    
+    def test_invalid_confml2_files(self):
+        self.assert_schemavalidation_fails(
+            type = 'confml',
+            dir = os.path.join(ROOT_PATH, 'testdata/schema/confml2/invalid'),
+            namespace = CONFML2_NAMESPACE)
+    
+    def test_valid_confml1_files(self):
+        self.assert_schemavalidation_succeeds(
+            type = 'confml',
+            dir = os.path.join(ROOT_PATH, 'testdata/schema/confml1/valid'),
+            namespace = CONFML1_NAMESPACE)
+    
+    def test_invalid_confml1_files(self):
+        self.assert_schemavalidation_fails(
+            type = 'confml',
+            dir = os.path.join(ROOT_PATH, 'testdata/schema/confml1/invalid'),
+            namespace = CONFML1_NAMESPACE)
+    
+    def test_validate_confml_invalid_xml_data(self):
+        config = DummyConfiguration({'foo.confml': 'foo'})
+        problems = schemavalidation.validate_confml_file(config, 'foo.confml')
+        self.assertEquals(len(problems), 1)
+        prob = problems[0]
+        #self.assertEquals(prob.type, api.Problem.TYPE_XML_PROBLEM)
+        self.assertEquals(prob.severity, api.Problem.SEVERITY_ERROR)
+        self.assertEquals(prob.line, 1)
+    
+    def test_validate_confml_invalid_xml_data_but_valid_root(self):
+        REF = 'test.confml'
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+            <configuration xmlns="http://www.s60.com/xml/confml/2">
+            <test someattr/>
+            </configuration>""".encode('utf-8')
+        config = DummyConfiguration({REF: DATA})
+        problems = schemavalidation.validate_confml_file(config, REF)
+        self.assertEquals(len(problems), 1)
+        prob = problems[0]
+        #self.assertEquals(prob.type, api.Problem.TYPE_XML_PROBLEM)
+        self.assertEquals(prob.severity, api.Problem.SEVERITY_ERROR)
+        self.assertEquals(prob.line, 3)
+    
+    def test_validate_confml_unsupported_namespace(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+            <unsupported xmlns="http://www.test.com/xml/unsupported">
+                <test someattr="yay"/>
+            </unsupported>""".encode('utf-8')
+        self.assertRaises(exceptions.ConfmlParseError, schemavalidation.validate_confml_data, DATA)
+
+
+
+
+class TestImplmlSchemaValidation(BaseTestCase, schemavalidation.SchemaValidationTestMixin):
+    
+    DUMMY1_XSD_DATA = """<?xml version="1.0" encoding="UTF-8"?>
+    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+               targetNamespace="http://www.dummy.com/dummy1"
+               elementFormDefault="qualified">
+        
+        <xs:element name="dummy1">
+            <xs:complexType>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element name="myElem" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+                </xs:choice>
+            </xs:complexType>
+        </xs:element>
+    </xs:schema>"""
+    
+    DUMMY2_XSD_DATA = """<?xml version="1.0" encoding="UTF-8"?>
+    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+               targetNamespace="http://www.dummy.com/dummy2"
+               elementFormDefault="qualified">
+        
+        <xs:element name="dummy2">
+            <xs:complexType>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element name="someElem" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+                </xs:choice>
+            </xs:complexType>
+        </xs:element>
+    </xs:schema>"""
+    
+    def setUp(self):
+        class MockReader1(plugin.ReaderBase):
+            NAMESPACE = "http://www.dummy.com/dummy1"
+            NAMESPACE_ID = "dummy1ml"
+            FILE_EXTENSIONS = ['dummy1ml']
+            ROOT_ELEMENT_NAME = 'dummy1'
+            @classmethod
+            def get_schema_data(cls):
+                return self.DUMMY1_XSD_DATA
+        class MockReader2(plugin.ReaderBase):
+            NAMESPACE = "http://www.dummy.com/dummy2"
+            NAMESPACE_ID = "dummy2ml"
+            FILE_EXTENSIONS = ['dummy2ml']
+            ROOT_ELEMENT_NAME = 'dummy2'
+            @classmethod
+            def get_schema_data(cls):
+                return self.DUMMY2_XSD_DATA
+        class MockReader3(plugin.ReaderBase):
+            NAMESPACE = "http://www.dummy.com/dummy3"
+            NAMESPACE_ID = "dummy3ml"
+            FILE_EXTENSIONS = ['dummy3ml']
+            ROOT_ELEMENT_NAME = 'dummy3'
+        plugin.ImplFactory.set_reader_classes_override([MockReader1, MockReader2, MockReader3])
+    
+    def tearDown(self):
+        plugin.ImplFactory.set_reader_classes_override(None)
+    
+    def test_valid_implml_files(self):
+        self.assert_schemavalidation_succeeds(
+            type = 'implml',
+            dir = os.path.join(ROOT_PATH, 'testdata/schema/implml/valid'))
+    
+    def test_invalid_implml_files(self):
+        self.assert_schemavalidation_fails(
+            type = 'implml',
+            dir = os.path.join(ROOT_PATH, 'testdata/schema/implml/invalid'))
+    
+    def test_validate_implml_invalid_xml_data(self):
+        self.assertRaises(exceptions.XmlParseError, schemavalidation.validate_implml_data, "foo")
+    
+    def test_validate_implml_invalid_xml_data_but_valid_root(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+            <implml>
+            <test someattr/>
+            </implml>""".encode('utf-8')
+        self.assertRaises(exceptions.ImplmlParseError, schemavalidation.validate_implml_data, DATA)
+    
+    def test_validate_implml_unsupported_namespace(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+            <unsupported xmlns="http://www.test.com/xml/unsupported">
+                <test someattr="yay"/>
+            </unsupported>""".encode('utf-8')
+        self.assertRaises(exceptions.ImplmlParseError, schemavalidation.validate_implml_data, DATA)
+
+if __name__ == '__main__':
+    unittest.main()