configurationengine/source/cone/confml/tests/unittest_persistentconfml.py
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
equal deleted inserted replaced
-1:000000000000 0:2e8eeb919028
       
     1 #
       
     2 # Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 # All rights reserved.
       
     4 # This component and the accompanying materials are made available
       
     5 # under the terms of "Eclipse Public License v1.0"
       
     6 # which accompanies this distribution, and is available
       
     7 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 #
       
     9 # Initial Contributors:
       
    10 # Nokia Corporation - initial contribution.
       
    11 #
       
    12 # Contributors:
       
    13 #
       
    14 # Description: 
       
    15 #
       
    16 
       
    17 """
       
    18 Test the CPF root file parsing routines
       
    19 """
       
    20 
       
    21 import unittest
       
    22 import string
       
    23 import sys
       
    24 import os
       
    25 import shutil
       
    26 import __init__
       
    27 try:
       
    28     from cElementTree import ElementTree
       
    29 except ImportError:
       
    30     try:    
       
    31         from elementtree import ElementTree
       
    32     except ImportError:
       
    33         try:
       
    34             from xml.etree import cElementTree as ElementTree
       
    35         except ImportError:
       
    36             from xml.etree import ElementTree
       
    37 
       
    38 from cone.public import api, exceptions, persistence
       
    39 from cone.storage import filestorage
       
    40 from cone.confml import persistentconfml, model
       
    41 from testautomation.base_testcase import BaseTestCase
       
    42 ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
       
    43 
       
    44 testdata  = os.path.join(ROOT_PATH,'data')
       
    45 
       
    46 simplerootxml = \
       
    47 '''<?xml version="1.0" encoding="UTF-8"?>
       
    48 <configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/xinclude" name="simple" version="1">
       
    49   <xi:include href="platform/s60/confml/test.confml#/"/>
       
    50 </configuration>
       
    51 '''
       
    52 
       
    53 newincludexml = '''<?xml version="1.0" encoding="UTF-8"?>
       
    54 <configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="simple" version="1">
       
    55   <xi:include href="platform/s60/confml/test.confml"/>
       
    56 </configuration>'''
       
    57 
       
    58 complexrootxml = '''<?xml version="1.0" encoding="UTF-8"?>
       
    59 <configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/xinclude" name="simple" version="1">
       
    60   <xi:include href="platform/s60/confml/test.confml#/"/>
       
    61   <xi:include href="platform/jallaa/confml/root.confml#/"/>
       
    62   <xi:include href="configB/confml/configB.confml#/"/>
       
    63   <xi:include href="ncp33/prod/confml/root.confml#/"/>
       
    64 </configuration>'''
       
    65 
       
    66 
       
    67 morestuff='''<?xml version="1.0" encoding="UTF-8"?>
       
    68 <configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/xinclude" name="foobar" version="1">
       
    69   <meta xmlns:cv="http://www.nokia.com/xml/cpf-id/1">
       
    70     <cv:configuration-property name="coreplat_name" value="abc_123" />
       
    71     <cv:configuration-property name="product_name" value="qwerty" />
       
    72     <owner>Variant1 creator</owner>
       
    73     <origin>somestorage:somelocation_123/and/path</origin>
       
    74     <target>proto_b2</target>
       
    75   </meta>
       
    76   <desc>This is a configuration for Product1 Region1 Variant1 </desc>
       
    77   <xi:include href="platform/s60/confml/root.confml"/>
       
    78   <xi:include href="ncp11/confml/jallaa.confml"/>
       
    79   <xi:include href="ncp11/prodX/confml/root.confml"/>
       
    80   <xi:include href="regional/japan/confml/root.confml"/>
       
    81 </configuration>'''
       
    82 
       
    83 actualconfml='''<?xml version="1.0" encoding="UTF-8"?>
       
    84 <configuration xmlns="http://www.s60.com/xml/confml/1" name="accesspoints">
       
    85   <feature ref="KCRUidApEngineLV" name="KCRUidApEngineLV">
       
    86     <desc></desc>
       
    87     <setting ref="KApEngineLVFlags" name="KApEngineLVFlags"/>
       
    88   </feature>
       
    89   <feature ref="KCRUidApSettingsHandlerUiLV" name="KCRUidApSettingsHandlerUiLV">
       
    90     <desc></desc>
       
    91     <setting ref="KApSettingsHandlerUiLVFlags" name="KApSettingsHandlerUiLVFlags"/>
       
    92     <setting ref="KAIStatusPaneLayout" name="Status Pane Layout" type="selection">
       
    93       <desc>Status pane layout setting. 0 = normal, 1 = flat, 2 = hidden</desc>
       
    94       <option name="normal" value="0"/>
       
    95       <option name="flat" value="1"/>
       
    96       <option name="hidden" value="2"/>
       
    97     </setting>
       
    98   </feature>
       
    99   <feature name="Customer Menu" ref="CVC_OperatorMenu">
       
   100     <desc>Often referred to as the Operator Menu, the Customer Menu is an application that launches the browser as an embedded application with a predefined URL as parameter. The URL defines the xHTML Startup page that is shown when the Customer Menu application is launched, for example www.customername.com/index.html. The URL also defines the customer domain URL path, for example www.customername.com/. All user-browsed xHTML pages belonging to that path are automatically stored in the Customer Menu cache.The Customer Menu application can be configured as a shortcut just like any other application. In Main menu, the Customer Menu is placed by default to 11th position. When the Customer Menu is enabled, Help moves from position 11 to 12 and Apps moves from 12 to 13, which is not visible until the user scrolls the menu cursor.</desc>
       
   101        <setting name="Customer Menu icon" ref="CVC_OperatorMenuIconFile" type="file">
       
   102             <desc>Customer menu icon that will be present in Application Grid. Size: 65 x 65 pixels. Format: SVGT (preferred) or BMP. Color depth: 24 bit</desc>
       
   103         <localPath/>
       
   104         <targetPath readOnly="true"/>
       
   105       </setting>
       
   106   </feature>
       
   107   <data>
       
   108     <KCRUidApEngineLV>
       
   109       <KApEngineLVFlags>0</KApEngineLVFlags>
       
   110     </KCRUidApEngineLV>
       
   111     <KCRUidApSettingsHandlerUiLV>
       
   112       <KApSettingsHandlerUiLVFlags>0</KApSettingsHandlerUiLVFlags>
       
   113       <KAIStatusPaneLayout>0</KAIStatusPaneLayout>
       
   114     </KCRUidApSettingsHandlerUiLV>
       
   115     <CVC_OperatorMenu>
       
   116       <CVC_OperatorMenuIconFile>
       
   117         <localPath>UI/Customer Menu/Cache</localPath>
       
   118       </CVC_OperatorMenuIconFile>
       
   119     </CVC_OperatorMenu>
       
   120   </data>
       
   121   <rfs>
       
   122     <KCRUidApEngineLV>
       
   123       <KApEngineLVFlags>true</KApEngineLVFlags>
       
   124     </KCRUidApEngineLV>
       
   125     <KCRUidApSettingsHandlerUiLV>
       
   126       <KApSettingsHandlerUiLVFlags>false</KApSettingsHandlerUiLVFlags>
       
   127     </KCRUidApSettingsHandlerUiLV>
       
   128   </rfs>
       
   129 </configuration>
       
   130 '''
       
   131 
       
   132 sequencesettings = \
       
   133 '''<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/1" name="BrowserBookmarks">
       
   134 <feature name="BookmarkItems" ref="BookmarkItems">
       
   135   <setting name="BookmarkItem" ref="BookmarkItem" type="sequence">
       
   136     <setting name="Type Of Bookmark" ref="Type" type="selection">
       
   137       <desc>This defines the Type of the element created. To create a Folder item - select "Folder". To create a bookmark item - select "Item".</desc>
       
   138       <option name="Folder" value="Folder"/>
       
   139       <option name="Item" value="Item"/>
       
   140     </setting>
       
   141     <setting name="Name Of The New Entry" ref="Name" type="string">
       
   142       <desc>Text field containing name for the Folder or Bookmark.  Must be unique.</desc>
       
   143     </setting>
       
   144   </setting>
       
   145 </feature>
       
   146 <data>
       
   147   <BookmarkItems>
       
   148     <BookmarkItem template="true">
       
   149       <Type>Template</Type>
       
   150       <Name>Download Applications</Name>
       
   151     </BookmarkItem>
       
   152     <BookmarkItem>
       
   153       <Type>Folder1</Type>
       
   154       <Name>Download Applications</Name>
       
   155     </BookmarkItem>
       
   156     <BookmarkItem>
       
   157       <Type>Folder2</Type>
       
   158       <Name>Download Images</Name>
       
   159     </BookmarkItem>
       
   160     <BookmarkItem>
       
   161       <Type>Folder3</Type>
       
   162     </BookmarkItem>
       
   163   </BookmarkItems>
       
   164 </data>
       
   165 </configuration>
       
   166 '''
       
   167 
       
   168 simpleview = \
       
   169 '''<?xml version="1.0" encoding="UTF-8"?>
       
   170 <confml:configuration  xmlns:confml="http://www.s60.com/xml/confml/1" schemaLocation="http://www.s60.com/xml/confml/1 http://www.s60.com/xml/confml/1#//confml2">
       
   171   <feature ref="imaker" name="iMaker Image creation">
       
   172     <setting ref="imagetarget" name="IMAGE_TARGET" type="selection">
       
   173       <option name="core" value="0"/>
       
   174       <option name="rofs2" value="1"/>
       
   175       <option name="rofs3" value="2"/>
       
   176       <option name="rofs4" value="3"/>
       
   177       <option name="uda" value="4"/>
       
   178       <option name="rofs3_uda" value="4"/>
       
   179     </setting>
       
   180   </feature>
       
   181   <feature ref="imakerapi" name="iMaker API">
       
   182     <setting ref="imagetype" name="IMAGE_TYPE" type="selection">
       
   183       <option name="rnd" value="0"/>
       
   184       <option name="subcon" value="1"/>
       
   185       <option name="prd" value="2"/>
       
   186     </setting>
       
   187     <setting ref="rofs3version" name="ROFS3_VERSION" type="string"/>
       
   188     <setting ref="productname" name="PRODUCT_NAME" type="string"/>
       
   189     <setting ref="outputLocation" name="OUTPUT_LOCATION" type="string"/>
       
   190   </feature>
       
   191   <data>
       
   192     <imaker>
       
   193       <imagetarget>2</imagetarget>
       
   194     </imaker>
       
   195     <imakerapi>
       
   196       <imagetype>0</imagetype>
       
   197       <rofs3version>V .50.2009.04.0113 RND</rofs3version>
       
   198       <productname>myProduct</productname>
       
   199       <outputLocation>myProduct</outputLocation>
       
   200     </imakerapi>
       
   201   </data>
       
   202   <confml:view id="imakerimage" name="Image creation">
       
   203     <confml:desc>Image creation related settings</confml:desc>
       
   204     <confml:group name="Imageproperties">
       
   205       <confml:desc>Sample Description</confml:desc>
       
   206       <confml:setting ref="imakerapi/*"/>
       
   207       <confml:setting ref="imaker/*"/>
       
   208     </confml:group>
       
   209   </confml:view>
       
   210 </confml:configuration>
       
   211 '''
       
   212 
       
   213 class TestModuleGetters(unittest.TestCase):
       
   214     def test_get_reader_for_configuration(self):
       
   215         confread = persistentconfml.get_reader_for_elem("configuration")
       
   216         self.assertTrue(isinstance(confread, persistentconfml.ConfigurationReader))
       
   217 
       
   218     def test_get_writer_for_configuration(self):
       
   219         confread = persistentconfml.get_writer_for_class("Configuration")
       
   220         self.assertTrue(isinstance(confread, persistentconfml.ConfigurationWriter))
       
   221 
       
   222     def test_get_elemname_from_string(self):
       
   223         self.assertEquals(persistentconfml.get_elemname("{http://www.s60.com/xml/confml/1}configuration")[0],"http://www.s60.com/xml/confml/1")
       
   224         self.assertEquals(persistentconfml.get_elemname("{http://www.s60.com/xml/confml/1}configuration")[1],"configuration")
       
   225 
       
   226     def test_get_elemname_from_element_tree(self):
       
   227         root = ElementTree.fromstring(simplerootxml)
       
   228         for elem in root.getiterator():
       
   229             (namespace,elemname) = persistentconfml.get_elemname(elem.tag)
       
   230         self.assertEquals(elemname,"include")
       
   231 
       
   232     def test_loads(self):
       
   233         config = persistentconfml.loads(simplerootxml)
       
   234         self.assertEquals(config.get_name(),"simple")
       
   235 
       
   236     def test_dumps(self):
       
   237         config = api.Configuration("test.confml")
       
   238         config.include_configuration('path/to/config.confml')
       
   239         dump = persistentconfml.dumps(config)
       
   240         elem = ElementTree.fromstring(dump)
       
   241         self.assertEquals(elem.get('name'),"test_confml")
       
   242 
       
   243 class TestConfigurationParser(unittest.TestCase):    
       
   244     def test_load_simple(self):
       
   245         reader = persistentconfml.get_reader_for_elem("configuration")
       
   246         obj = reader.loads(ElementTree.fromstring(simplerootxml))
       
   247         self.assertEquals(obj.get_ref(),'simple')
       
   248         self.assertEquals(obj._list(),['platform__s60__confml__test_confml'])
       
   249 
       
   250     def test_load_new_include_confml(self):
       
   251         reader = persistentconfml.get_reader_for_elem("configuration")
       
   252         obj = reader.loads(ElementTree.fromstring(newincludexml))
       
   253         self.assertEquals(obj._list(),['platform__s60__confml__test_confml'])
       
   254 
       
   255     def test_load_complexrootxml(self):
       
   256         reader = persistentconfml.get_reader_for_elem("configuration")
       
   257         obj = reader.loads(ElementTree.fromstring(complexrootxml))
       
   258         self.assertEquals(obj._list(),['platform__s60__confml__test_confml',
       
   259                                         'platform__jallaa__confml__root_confml', 
       
   260                                         'configB__confml__configB_confml', 
       
   261                                         'ncp33__prod__confml__root_confml'])
       
   262 
       
   263     def test_load_morestuff(self):
       
   264         reader = persistentconfml.get_reader_for_elem("configuration")
       
   265         obj = reader.loads(ElementTree.fromstring(morestuff))
       
   266         self.assertEquals(obj._list(),['_meta','_desc','platform__s60__confml__root_confml', 'ncp11__confml__jallaa_confml', 'ncp11__prodX__confml__root_confml', 'regional__japan__confml__root_confml'])
       
   267         met = obj.meta
       
   268         self.assertEquals(obj.meta[2].value,'Variant1 creator')
       
   269         self.assertEquals(obj.meta[3].value,'somestorage:somelocation_123/and/path')
       
   270         self.assertEquals(obj.meta[4].value,'proto_b2')        
       
   271         self.assertEquals(obj.meta[0].tag,'configuration-property')
       
   272         self.assertEquals(obj.meta[0].value, None)
       
   273         self.assertEquals(obj.meta[0].ns,'http://www.nokia.com/xml/cpf-id/1')
       
   274         self.assertEquals(obj.meta[0].attrs,{"name": "coreplat_name", "value": "abc_123"})        
       
   275         self.assertEquals(obj.desc,'This is a configuration for Product1 Region1 Variant1 ')
       
   276 
       
   277     def test_load_morestuff_and_remove_included_configuration(self):
       
   278         reader = persistentconfml.get_reader_for_elem("configuration")
       
   279         obj = reader.loads(ElementTree.fromstring(morestuff))
       
   280         self.assertEquals(obj.list_configurations(),['platform/s60/confml/root.confml', 'ncp11/confml/jallaa.confml', 'ncp11/prodX/confml/root.confml', 'regional/japan/confml/root.confml'])
       
   281         obj.remove_configuration('platform/s60/confml/root.confml')
       
   282         self.assertEquals(obj.list_configurations(),['ncp11/confml/jallaa.confml', 'ncp11/prodX/confml/root.confml', 'regional/japan/confml/root.confml'])
       
   283         for configname in obj.list_configurations():
       
   284             obj.remove_configuration(configname)
       
   285         self.assertEquals(obj.list_configurations(),[])
       
   286 
       
   287     def test_load_actualconfml(self):
       
   288         reader = persistentconfml.get_reader_for_elem("configuration")
       
   289         obj = reader.loads(ElementTree.fromstring(actualconfml))
       
   290         self.assertEquals(obj.list_features(),['KCRUidApEngineLV', 'KCRUidApSettingsHandlerUiLV','CVC_OperatorMenu'])
       
   291         self.assertEquals(obj.list_all_features(),['KCRUidApEngineLV', 
       
   292                                                    'KCRUidApEngineLV.KApEngineLVFlags', 
       
   293                                                    'KCRUidApSettingsHandlerUiLV', 
       
   294                                                    'KCRUidApSettingsHandlerUiLV.KApSettingsHandlerUiLVFlags', 
       
   295                                                    'KCRUidApSettingsHandlerUiLV.KAIStatusPaneLayout', 
       
   296                                                    'CVC_OperatorMenu', 
       
   297                                                    'CVC_OperatorMenu.CVC_OperatorMenuIconFile',
       
   298                                                    'CVC_OperatorMenu.CVC_OperatorMenuIconFile.localPath', 
       
   299                                                    'CVC_OperatorMenu.CVC_OperatorMenuIconFile.targetPath'])
       
   300         fea = obj.KCRUidApSettingsHandlerUiLV.KApSettingsHandlerUiLVFlags
       
   301         vset = fea.get_valueset()
       
   302         self.assertTrue(fea.get_value() in vset)
       
   303         self.assertTrue('0' in obj.KCRUidApSettingsHandlerUiLV.KAIStatusPaneLayout.get_valueset())
       
   304         self.assertTrue('1' in obj.KCRUidApSettingsHandlerUiLV.KAIStatusPaneLayout.get_valueset())
       
   305         for fearef in obj.list_all_features():
       
   306             fea = obj.get_feature(fearef)
       
   307             if fea.get_type() == 'int':
       
   308                 #print "Feature %s, %s: %s" % (fea.get_type(),fea.get_name(),fea.get_value()) 
       
   309                 self.assertEquals(fea.get_value(),0)
       
   310         self.assertEquals(obj.get_feature('CVC_OperatorMenu.CVC_OperatorMenuIconFile.targetPath').get_value(),None)
       
   311         self.assertEquals(obj.get_feature('CVC_OperatorMenu.CVC_OperatorMenuIconFile.localPath').get_value(),'UI/Customer Menu/Cache')
       
   312 
       
   313     def test_create_features_with_rfs_data_and_dump_and_load(self):
       
   314         conf = api.Configuration("foo/foo.confml")
       
   315         conf.add_feature(api.Feature('feature1'))
       
   316         conf.add_feature(api.Feature('child1'),'feature1')
       
   317         conf.add_feature(api.Feature('child2'),'feature1')
       
   318         conf.add_feature(api.Feature('child3'),'feature1')
       
   319         
       
   320         conf.add_data(api.Data(fqr='feature1.child1',attr='rfs',value='true'))
       
   321         conf.add_data(api.Data(fqr='feature1.child2',attr='rfs',value='false'))
       
   322         dview = conf.get_default_view()
       
   323         self.assertEquals(dview.get_feature('feature1.child1').get_value(), None)
       
   324         self.assertEquals(dview.get_feature('feature1.child1').get_value('rfs'), 'true')
       
   325         self.assertEquals(dview.get_feature('feature1.child2').get_value('rfs'), 'false')
       
   326         
       
   327         dumped = persistentconfml.dumps(conf)
       
   328         conf2 = persistentconfml.loads(dumped)
       
   329         dview = conf2.get_default_view()
       
   330         self.assertEquals(dview.get_feature('feature1.child1').get_value(), None)
       
   331         self.assertEquals(dview.get_feature('feature1.child1').get_value('rfs'), 'true')
       
   332         self.assertEquals(dview.get_feature('feature1.child2').get_value('rfs'), 'false')
       
   333 
       
   334     def test_load_actualconfml_test_rfs_settings(self):
       
   335         reader = persistentconfml.get_reader_for_elem("configuration")
       
   336         obj = reader.loads(ElementTree.fromstring(actualconfml))
       
   337         self.assertEquals(obj.get_feature('KCRUidApEngineLV.KApEngineLVFlags').rfs,True)
       
   338         self.assertEquals(obj.get_feature('KCRUidApSettingsHandlerUiLV.KApSettingsHandlerUiLVFlags').rfs,False)
       
   339 
       
   340     def test_load_sequence_confml(self):
       
   341         reader = persistentconfml.get_reader_for_elem("configuration")
       
   342         etree = ElementTree.fromstring(sequencesettings)
       
   343         obj = reader.loads(etree)
       
   344         dcont = obj.get_data('BookmarkItems')
       
   345         dview = obj.get_default_view()
       
   346         self.assertEquals(dview.get_feature('BookmarkItems.BookmarkItem').list_features(),['Type', 'Name'])
       
   347         self.assertEquals(dview.get_feature('BookmarkItems.BookmarkItem').list_all_features(),['Type', 'Name'])
       
   348         datatable = dview.get_feature('BookmarkItems.BookmarkItem').get_data()
       
   349         self.assertEquals(len(datatable), 3)
       
   350         self.assertEquals(datatable[0].list_features(), ['Type', 'Name'])
       
   351         self.assertEquals(datatable[0].get_feature('Name').get_value(), 'Download Applications')
       
   352         self.assertEquals(datatable[0][0].get_value(), 'Folder1')
       
   353         self.assertEquals(datatable[0][1].get_value(), 'Download Applications')
       
   354         self.assertEquals(dview.get_feature('BookmarkItems.BookmarkItem').get_value(), 
       
   355                           [
       
   356                           ['Folder1','Download Applications'],
       
   357                           ['Folder2','Download Images'],
       
   358                           ['Folder3',None]])
       
   359 
       
   360     def test_load_commsdat_sequence_confml_from_file(self):
       
   361         conffile = open(os.path.join(ROOT_PATH,"data/commsdatcreator.confml"))
       
   362         reader = persistentconfml.get_reader_for_elem("configuration")
       
   363         etree = ElementTree.fromstring(conffile.read())
       
   364         obj = reader.loads(etree)
       
   365         dview = obj.get_default_view()
       
   366         dnsfea = dview.get_feature('DNs.DN')
       
   367         self.assertEquals(dnsfea.list_features(),['Name', 'DNId', 'Metadata', 'Protection', 'Hidden', 'HiddenAgent', 'Highlighted', 'Icon', 'EmbeddedDN', 'IAP', 'IAP2', 'IAP3', 'IAP4', 'IAP5', 'IAP6', 'IAP7', 'IAP8', 'IAP9', 'IAP10'])
       
   368         self.assertEquals(dnsfea.get_template(),['User Defined', '0', 'No', 'No', 'No', '11', None, None, None, None, None, None, None, None, None, None, None, None, None])
       
   369         self.assertEquals(dnsfea.get_value(),
       
   370         [['Internet', '1', 'Internet', '2', 'No', 'No', 'Yes', '0', None, None, None, None, None, None, None, None, None, None, None],
       
   371          ['MMS', '2', 'MMS', '2', 'No', 'Yes', 'No', '2', None, None, None, None, None, None, None, None, None, None, None], 
       
   372          ['Operator', '3', 'Operator', '2', 'No', 'No', 'No', '4', None, None, None, None, None, None, None, None, None, None, None]
       
   373         ])
       
   374 
       
   375     def test_load_content_sequence_confml_from_file(self):
       
   376         conffile = open(os.path.join(ROOT_PATH,"data/CVC_Content.confml"))
       
   377         reader = persistentconfml.get_reader_for_elem("configuration")
       
   378         etree = ElementTree.fromstring(conffile.read())
       
   379         obj = reader.loads(etree)
       
   380         dview = obj.get_default_view()
       
   381         content = dview.get_feature('ContentFiles.contentfile')
       
   382         self.assertEquals(content.list_all_features(),['fileelem', 'fileelem.localPath', 'fileelem.targetPath'])
       
   383         self.assertEquals(content.value,[[['test/BookmarkImportSample.txt', None]]])
       
   384         self.assertEquals(content.fileelem.localPath.value,['test/BookmarkImportSample.txt'])
       
   385 
       
   386     def test_load_content_multiselection_confml_from_file(self):
       
   387         fs = filestorage.FileStorage(testdata)
       
   388         p = api.Project(fs)
       
   389         config = p.get_configuration('multiselection.confml')
       
   390         dview = config.get_default_view()
       
   391         multisel1 = dview.get_feature('MultiSelections.MultiSel1')
       
   392         self.assertEquals(multisel1.value,["first selection","second selection"])
       
   393         self.assertEquals(multisel1.get_data_cast(multisel1.get_value()),["first selection","second selection"])
       
   394         self.assertEquals(multisel1.get_value(),["first selection","second selection"])
       
   395         self.assertEquals(multisel1.get_data().get_value(),'"first selection" "second selection"')
       
   396         
       
   397         
       
   398     def test_load_content_multiselection_empty_confml_from_file(self):
       
   399         fs = filestorage.FileStorage(testdata)
       
   400         p = api.Project(fs)
       
   401         config = p.get_configuration('multiselection.confml')
       
   402         dview = config.get_default_view()
       
   403         multisel1 = dview.get_feature('uda_selection.selectedfiles')
       
   404         self.assertEquals(multisel1.get_value(),None)
       
   405         self.assertEquals(multisel1.get_data().get_value(),None)
       
   406         
       
   407         
       
   408         
       
   409     def test_add_sequence_data_to_separate_confml(self):
       
   410         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data'),"w"))
       
   411         config = prj.create_configuration('test2.confml')
       
   412         seqconfig = config.create_configuration('sequence.confml')
       
   413         config.create_configuration('testdata.confml')
       
   414         seqconfig.add_feature(api.FeatureSequence('feature1'))
       
   415         seqconfig.add_feature(api.Feature('child1'),'feature1')
       
   416         seqconfig.add_feature(api.Feature('child2'),'feature1')
       
   417         seqconfig.add_feature(api.Feature('child3'),'feature1')
       
   418         dview = config.get_default_view()
       
   419         self.assertEquals(dview.get_feature('feature1').get_type(),'sequence')
       
   420         dview.get_feature('feature1').set_template(['c1','c2','c3'])
       
   421         dview.get_feature('feature1').add_sequence(['row 1','43','56'])
       
   422         dview.get_feature('feature1').add_sequence(['row 2','43','56'])
       
   423         config.create_configuration('testdata2.confml')
       
   424         dview.get_feature('feature1').add_sequence(['row 3','43','56'])
       
   425         dview.get_feature('feature1').add_sequence(['row 4','43','56'])
       
   426         dview.get_feature('feature1').get_data()[1].set_value(['row 2 updated', 'foo', '56'])
       
   427         config.save()
       
   428         prj.close()
       
   429         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data')))
       
   430         config = prj.get_configuration('test2.confml')
       
   431         dview = config.get_default_view()
       
   432         self.assertEquals(dview.get_feature('feature1').get_template(),['c1','c2','c3'])
       
   433         self.assertEquals(dview.get_feature('feature1').get_value(),[['row 3', '43', '56'], 
       
   434                                                                      ['row 4', '43', '56']])
       
   435         self.assertEquals(dview.get_feature('feature1').get_data()[0]._index,0)
       
   436         self.assertEquals(dview.get_feature('feature1').get_data()[0].get_value(),['row 3', '43', '56'])
       
   437         self.assertEquals(dview.get_feature('feature1').get_data()[1].get_value(),['row 4', '43', '56'])
       
   438         self.assertEquals(dview.get_feature('feature1').get_data()[0].get_data().find_parent(type=api.Configuration), config.get_configuration('testdata2.confml')._obj)
       
   439         prj.remove_configuration('test2.confml')
       
   440         
       
   441         
       
   442     def test_add_sequence_data_to_separate_confml_with_append_policy(self):
       
   443         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data'),"w"))
       
   444         config = prj.create_configuration('test1.confml')
       
   445         seqconfig = config.create_configuration('sequence.confml')
       
   446         config.create_configuration('testdata.confml')
       
   447         seqconfig.add_feature(api.FeatureSequence('feature1'))
       
   448         seqconfig.add_feature(api.Feature('child1'),'feature1')
       
   449         seqconfig.add_feature(api.Feature('child2'),'feature1')
       
   450         seqconfig.add_feature(api.Feature('child3'),'feature1')
       
   451         dview = config.get_default_view()
       
   452         self.assertEquals(dview.get_feature('feature1').get_type(),'sequence')
       
   453         dview.get_feature('feature1').set_template(['c1','c2','c3'])
       
   454         dview.get_feature('feature1').add_sequence(['row 1','43','56'])
       
   455         dview.get_feature('feature1').add_sequence(['row 2','43','56'])
       
   456         config.create_configuration('testdata2.confml')
       
   457         dview.get_feature('feature1').add_sequence(['row 3','43','56'])
       
   458         dview.get_feature('feature1').add_sequence(['row 4','43','56'])
       
   459         dview.get_feature('feature1').get_data()[1].set_value(['row 2 updated', 'foo', '56'])
       
   460         config.save()
       
   461         prj.close()
       
   462         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data')))
       
   463         config = prj.get_configuration('test1.confml')
       
   464         dview = config.get_default_view()
       
   465         self.assertEquals(dview.get_feature('feature1').get_template(),['c1','c2','c3'])
       
   466         self.assertEquals(dview.get_feature('feature1').get_value(),[['row 3', '43', '56'], 
       
   467                                                                      ['row 4', '43', '56']])
       
   468         self.assertEquals(dview.get_feature('feature1').get_data()[0]._index,0)
       
   469         self.assertEquals(dview.get_feature('feature1').get_data()[0].get_value(),['row 3', '43', '56'])
       
   470         self.assertEquals(dview.get_feature('feature1').get_data()[1].get_value(),['row 4', '43', '56'])
       
   471         self.assertEquals(dview.get_feature('feature1').get_data()[0].get_data().find_parent(type=api.Configuration), config.get_configuration('testdata2.confml')._obj)
       
   472         prj.remove_configuration('test1.confml')
       
   473         
       
   474     def test_load_view(self):
       
   475         reader = persistentconfml.get_reader_for_elem("configuration")
       
   476         etree = ElementTree.fromstring(simpleview)
       
   477         obj = reader.loads(etree)
       
   478         self.assertEquals(obj.get_name(), 'unknown')
       
   479         self.assertEquals(obj.list_views(), ['Image creation'])
       
   480         self.assertEquals(obj.get_view('Image creation').get_name(),'Image creation')
       
   481         self.assertEquals(obj.get_view('Image creation').desc,'Image creation related settings')
       
   482         self.assertEquals(obj.get_view('Image creation').list_features(),[])
       
   483         self.assertEquals(obj.get_view('Image creation').list_groups(),['Imageproperties'])
       
   484         self.assertEquals(obj.get_view('Image creation').list_all_features(),['Imageproperties.imagetype', 
       
   485                                                                            'Imageproperties.rofs3version', 
       
   486                                                                            'Imageproperties.productname', 
       
   487                                                                            'Imageproperties.outputLocation', 
       
   488                                                                            'Imageproperties.imagetarget'])
       
   489         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.imagetype').get_value(), '0') 
       
   490         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.rofs3version').get_value(), 'V .50.2009.04.0113 RND') 
       
   491         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.productname').get_value(), 'myProduct') 
       
   492         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.outputLocation').get_value(), 'myProduct') 
       
   493         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.imagetarget').get_value(), '2') 
       
   494         
       
   495     def test_load_cvc_view(self):
       
   496         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data')))
       
   497         config = prj.get_configuration('cvc_root.confml')
       
   498         dview = config.get_default_view()
       
   499         self.assertEquals(config.list_views(),['cvc_view_confml.Custom modeled ConfMLs for customization  foo'])
       
   500         view = config.get_view('cvc_view_confml.Custom modeled ConfMLs for customization  foo')
       
   501         self.assertEquals(view.id, 'CVC')
       
   502         self.assertEquals(view.list_groups(),['Applications', 'Connectivity', 'System', 'UI', 'Pre-Installed Content'])
       
   503         self.assertEquals(view.list_features(),[])
       
   504         group = view.get_group('Connectivity')
       
   505         self.assertEquals(group.icon, 'connectivity_48_nav.png')
       
   506         self.assertEquals(len(view.list_all_features()),130)
       
   507 
       
   508 
       
   509     def test_load_booleans_confml_from_file(self):
       
   510         conffile = open(os.path.join(ROOT_PATH,"data/booleans.confml"))
       
   511         reader = persistentconfml.get_reader_for_elem("configuration")
       
   512         etree = ElementTree.fromstring(conffile.read())
       
   513         obj = reader.loads(etree)
       
   514         dview = obj.get_default_view()
       
   515         boolfea = dview.get_feature('Booleans')
       
   516         self.assertEquals(len(boolfea.list_features()),20)
       
   517 
       
   518     def test_load_confml_with_properties(self):
       
   519         conffile = open(os.path.join(ROOT_PATH,"data/CVC_StartupShutdownAnimations.confml"))
       
   520         reader = persistentconfml.get_reader_for_elem("configuration")
       
   521         etree = ElementTree.fromstring(conffile.read())
       
   522         obj = reader.loads(etree)
       
   523         fea = obj.get_feature('CVC_StartupAnimationSequence.CVC_StartupAnimationTone')
       
   524         self.assertEquals(fea.list_properties(),['maxSize'])
       
   525         self.assertEquals(fea.properties['maxSize'].value,'100')
       
   526 
       
   527         conffile = open(os.path.join(ROOT_PATH,"data/CVC_Preinstalled.confml"))
       
   528         reader = persistentconfml.get_reader_for_elem("configuration")
       
   529         etree = ElementTree.fromstring(conffile.read())
       
   530         obj = reader.loads(etree)
       
   531         fea = obj.get_feature('CVC_PreinstalledContent.CVC_PreInstalledMMSs.CVC_PreInstalledMMS')
       
   532         self.assertEquals(fea.list_properties(),['maxFileSize'])
       
   533         self.assertEquals(fea.properties['maxFileSize'].value,'35')
       
   534 
       
   535     def test_load_voicemailbox_confml_from_file(self):
       
   536         conffile = open(os.path.join(ROOT_PATH,"data/voicemailbox.confml"))
       
   537         reader = persistentconfml.get_reader_for_elem("configuration")
       
   538         etree = ElementTree.fromstring(conffile.read())
       
   539         obj = reader.loads(etree)
       
   540         dview = obj.get_default_view()
       
   541         stringfea = dview.get_feature('KCRUidVoiceMailbox.KVmbxNumberLinePrimary')
       
   542         self.assertEquals(stringfea.type,'string')
       
   543         self.assertEquals(stringfea.value,None)
       
   544         
       
   545     def test_load_facets(self):
       
   546         conffile = open(os.path.join(ROOT_PATH,"data/facets.confml"))
       
   547         reader = persistentconfml.get_reader_for_elem("configuration")
       
   548         etree = ElementTree.fromstring(conffile.read())
       
   549         obj = reader.loads(etree)
       
   550         setting = obj.get_feature('Facets.MessageSize')
       
   551         self.assertEquals(setting.minInclusive,'0')
       
   552         self.assertEquals(setting.maxInclusive,'10')
       
   553         setting = obj.get_feature('Facets.MessageSize2')
       
   554         self.assertEquals(setting.minExclusive,'-1')
       
   555         self.assertEquals(setting.maxExclusive,'11')
       
   556         setting = obj.get_feature('Facets.StringPattern')
       
   557         self.assertEquals(setting.pattern,"[a-zA-Z]{5,10}")        
       
   558         setting = obj.get_feature('Facets.TotalDigits')
       
   559         self.assertEquals(setting.totalDigits,'3')
       
   560         dview = obj.get_default_view()
       
   561         intfea = dview.get_feature('Facets.MessageSize')
       
   562         self.assertEquals(intfea.type,'int')
       
   563         self.assertEquals(intfea.value,9)
       
   564              
       
   565 class TestConfigurationWriter(unittest.TestCase):    
       
   566     def test_dump_simple_configuration(self):
       
   567         config = api.Configuration("test.confml")
       
   568         writer = persistentconfml.get_writer_for_class("Configuration")
       
   569         etree = writer.dumps(config)
       
   570         self.assertEquals(etree.get('name'), 'test_confml')
       
   571 
       
   572     def test_dump_configuration_with_include(self):
       
   573         config = api.Configuration("test.confml")
       
   574         config.include_configuration('path/to/config.confml')
       
   575         writer = persistentconfml.get_writer_for_class("Configuration")
       
   576         elem = writer.dumps(config)
       
   577         etree = ElementTree.fromstring(ElementTree.tostring(elem))
       
   578         self.assertEquals(etree.find('{http://www.w3.org/2001/XInclude}include').get('href'), 'path/to/config.confml')
       
   579 
       
   580     def test_dump_configuration_with_feature_sequence(self):
       
   581         config = api.Configuration("test.confml")
       
   582         config.add_feature(api.Feature('test'))
       
   583         config.add_feature(api.FeatureSequence('sequentialfeature'),'test')
       
   584         config.test.sequentialfeature.add_feature(model.ConfmlSetting('setting1'))
       
   585         config.test.sequentialfeature.add_feature(model.ConfmlSetting('setting2'))
       
   586         config.test.sequentialfeature.add_feature(model.ConfmlSetting('setting3'))
       
   587         writer = persistentconfml.get_writer_for_class("Configuration")
       
   588         elem = writer.dumps(config)
       
   589         etree = ElementTree.fromstring(ElementTree.tostring(elem))
       
   590         self.assertEquals([elem for elem in etree.getiterator('{http://www.s60.com/xml/confml/2}setting')][0].get('ref'), 'sequentialfeature')
       
   591 
       
   592     def test_dump_complex_configuration(self):
       
   593         config = api.Configuration("test.confml")
       
   594         config.include_configuration('path/to/config1.confml')
       
   595         config.include_configuration('path/to/config2.confml')
       
   596         config.include_configuration('path/to/config3.confml')
       
   597         config.add( model.ConfmlMeta([model.ConfmlMetaProperty('test', '123'),\
       
   598                                       model.ConfmlMetaProperty('model', 'foo')]))
       
   599         config.add( model.ConfmlDescription( 'Description text' ) )
       
   600         writer = persistentconfml.get_writer_for_class("Configuration")
       
   601         elem = writer.dumps(config)
       
   602         etree = ElementTree.fromstring(ElementTree.tostring(elem))
       
   603         self.assertEquals([elem.get('href') for elem in etree.getiterator('{http://www.w3.org/2001/XInclude}include')], 
       
   604                           ['path/to/config1.confml',
       
   605                            'path/to/config2.confml',
       
   606                            'path/to/config3.confml'
       
   607                            ])
       
   608         meta = etree.find('{http://www.s60.com/xml/confml/2}meta')
       
   609         self.assertEquals(meta.find('{http://www.s60.com/xml/confml/2}test').text,'123')
       
   610         self.assertEquals(meta.find('{http://www.s60.com/xml/confml/2}model').text,'foo')
       
   611         self.assertEquals(etree.find('{http://www.s60.com/xml/confml/2}desc').text,'Description text')
       
   612 
       
   613     def test_dump_load_configuration(self):
       
   614         writer = persistentconfml.get_writer_for_class("Configuration")
       
   615         config = model.ConfmlConfiguration("test.confml")
       
   616         config.include_configuration('path/to/config1.confml')
       
   617         config.include_configuration('path/to/config2.confml')
       
   618         config.include_configuration('path/to/config3.confml')
       
   619         config.meta = model.ConfmlMeta([model.ConfmlMetaProperty('test', '123'),\
       
   620                                       model.ConfmlMetaProperty('model', 'foo'),\
       
   621                                       model.ConfmlMetaProperty('configuration-property', None, \
       
   622                                                                'http://www.nokia.com/xml/cpf-id/1', \
       
   623                                                                attrs ={"name":"123", "value": "234"})])
       
   624         config.desc = 'Description text'
       
   625         etree= writer.dumps(config)
       
   626         xmlstr = ElementTree.tostring(etree)
       
   627         config2 = persistentconfml.get_reader_for_elem("configuration").loads(ElementTree.fromstring(xmlstr))
       
   628         self.assertEquals(config2.get_ref(),config.ref)
       
   629         self.assertEquals(config2._list(),config._list())
       
   630         self.assertEquals(config2.desc,'Description text')
       
   631         elem = config2.meta.get_property_by_tag('test')
       
   632         self.assertEquals(elem.tag, 'test')
       
   633         self.assertEquals(elem.value, '123')
       
   634 
       
   635         self.assertEquals(config2.meta[0].tag, 'test')
       
   636         self.assertEquals(config2.meta[0].value, '123')
       
   637         self.assertEquals(config2.meta[1].tag, 'model')
       
   638         self.assertEquals(config2.meta[1].value, 'foo')
       
   639         self.assertEquals(config2.meta[2].tag, 'configuration-property')
       
   640         self.assertEquals(config2.meta[2].value, None)
       
   641         self.assertEquals(config2.meta[2].ns, 'http://www.nokia.com/xml/cpf-id/1')
       
   642         self.assertEquals(config2.meta[2].attrs, {"name":"123", "value": "234"})
       
   643 
       
   644 
       
   645     def test_configuration_with_features_and_properties(self):
       
   646         config = model.ConfmlConfiguration("test.confml")
       
   647         config.add_feature(model.ConfmlSetting('testfea11'))
       
   648         config.testfea11.add_property(name='smaller',value='10')
       
   649         config.testfea11.add_property(name='bigger',value='1', unit='B')
       
   650         elem = persistentconfml.dumps(config)
       
   651         config2 =  persistentconfml.loads(elem)
       
   652         self.assertEquals(config2.testfea11.properties['smaller'].value,'10')
       
   653         self.assertEquals(config2.testfea11.properties['bigger'].value,'1')
       
   654 
       
   655     def test_configuration_with_features_and_minoccurs(self):
       
   656         config = model.ConfmlConfiguration("test.confml")
       
   657         config.add_feature(model.ConfmlSequenceSetting('testfea11'))
       
   658         config.testfea11.minOccurs = 1
       
   659         config.testfea11.maxOccurs = 10
       
   660         elem = persistentconfml.dumps(config)
       
   661         config2 =  persistentconfml.loads(elem)
       
   662         self.assertEquals(config2.testfea11.minOccurs,1)
       
   663         self.assertEquals(config2.testfea11.maxOccurs,10)
       
   664 
       
   665     def test_configuration_with_features_and_readonly(self):
       
   666         config = model.ConfmlConfiguration("test.confml")
       
   667         config.add_feature(model.ConfmlSequenceSetting('testfea11'))
       
   668         config.add_feature(model.ConfmlSetting('readme',readOnly=True))
       
   669         config.add_feature(model.ConfmlSetting('writeme',readOnly=False))
       
   670         elem = persistentconfml.dumps(config)
       
   671         config2 =  persistentconfml.loads(elem)
       
   672         self.assertEquals(config2.testfea11.readOnly,None)
       
   673         self.assertEquals(config2.readme.readOnly,True)
       
   674         self.assertEquals(config2.writeme.readOnly,False)
       
   675 
       
   676     def test_configuration_with_features_and_constraint(self):
       
   677         config = model.ConfmlConfiguration("test.confml")
       
   678         config.add_feature(model.ConfmlSequenceSetting('testfea11'))
       
   679         config.add_feature(model.ConfmlSetting('const',constraint=". &gt; '1'"))
       
   680         config.add_feature(model.ConfmlSetting('writeme',readOnly=False, constraint='foo bar'))
       
   681         elem = persistentconfml.dumps(config)
       
   682         config2 =  persistentconfml.loads(elem)
       
   683         self.assertEquals(config2.testfea11.constraint,None)
       
   684         self.assertEquals(config2.const.constraint,". &gt; '1'")
       
   685         self.assertEquals(config2.writeme.readOnly,False)
       
   686         self.assertEquals(config2.writeme.constraint,"foo bar")
       
   687 
       
   688     def test_configuration_with_features_and_required_attr(self):
       
   689         config = model.ConfmlConfiguration("test.confml")
       
   690         config.add_feature(model.ConfmlSequenceSetting('testfea11'))
       
   691         config.add_feature(model.ConfmlSetting('requ',required=True))
       
   692         config.add_feature(model.ConfmlSetting('writeme',required=False, readOnly=False))
       
   693         elem = persistentconfml.dumps(config)
       
   694         config2 =  persistentconfml.loads(elem)
       
   695         self.assertEquals(config2.testfea11.required,None)
       
   696         self.assertEquals(config2.requ.required,True)
       
   697         self.assertEquals(config2.writeme.readOnly,False)
       
   698         self.assertEquals(config2.writeme.required,False)
       
   699 
       
   700     def test_configuration_with_features_and_relevant_attr(self):
       
   701         config = model.ConfmlConfiguration("test.confml")
       
   702         config.add_feature(model.ConfmlSequenceSetting('testfea11'))
       
   703         config.add_feature(model.ConfmlSetting('requ',relevant='testfea11'))
       
   704         elem = persistentconfml.dumps(config)
       
   705         config2 =  persistentconfml.loads(elem)
       
   706         self.assertEquals(config2.testfea11.relevant,None)
       
   707         self.assertEquals(config2.requ.relevant,'testfea11')
       
   708 
       
   709     def test_configuration_with_features_and_maxlength(self):
       
   710         config = model.ConfmlConfiguration("test.confml")
       
   711         config.add_feature(model.ConfmlSetting('testfea1', type='int'))
       
   712         config.add_feature(model.ConfmlSetting('testfea2', type='int'))
       
   713         config.add_feature(model.ConfmlSetting('testfea3', type='int',maxLength=100))
       
   714         config.testfea1.maxLength = 10
       
   715 
       
   716         elem = persistentconfml.dumps(config)
       
   717         config2 =  persistentconfml.loads(elem)
       
   718         self.assertEquals(config2.testfea1.maxLength,10)
       
   719         self.assertEquals(config2.testfea2.maxLength,None)
       
   720         self.assertEquals(config2.testfea3.maxLength,100)
       
   721 
       
   722     def test_configuration_with_features_and_maxlength(self):
       
   723         config = model.ConfmlConfiguration("test.confml")
       
   724         config.add_feature(model.ConfmlSetting('testfea1', type='int'))
       
   725         config.add_feature(model.ConfmlSetting('testfea2', type='int'))
       
   726         config.add_feature(model.ConfmlSetting('testfea3', type='int',minLength=100))
       
   727         config.testfea1.minLength = 10
       
   728 
       
   729         elem = persistentconfml.dumps(config)
       
   730         config2 =  persistentconfml.loads(elem)
       
   731         self.assertEquals(config2.testfea1.minLength,'10')
       
   732         self.assertEquals(config2.testfea3.minLength,'100')
       
   733         self.assertEquals(config2.testfea2.minLength,None)
       
   734 
       
   735     def test_configuration_with_features(self):
       
   736         config = model.ConfmlConfiguration("test.confml")
       
   737         config.add_feature(api.Feature('testfea1'))
       
   738         config.testfea1.add_feature(model.ConfmlSetting('testfea11'))
       
   739         config.add_feature(api.Feature('testfea2'))
       
   740         set1 = model.ConfmlSetting('testfea21', type='selection')
       
   741         set1.create_option('pre', '1')
       
   742         set1.create_option('normal', '2')
       
   743         set1.create_option('post', '3')
       
   744         config.add_feature(set1, 'testfea2')
       
   745         config.add_feature(api.Feature('testfea4'))
       
   746         config.add_feature(api.Feature('testfea5'))
       
   747         config.add_feature(api.Feature('testfea6'))
       
   748         set1.set_value('pre')
       
   749         config.testfea1.set_value('foo:bar')
       
   750         config.testfea4.set_value('4')
       
   751         writer = persistentconfml.get_writer_for_class("Configuration")
       
   752         elem = writer.dumps(config)
       
   753         #print ElementTree.tostring(elem)
       
   754         etree = ElementTree.fromstring(ElementTree.tostring(elem))
       
   755         fea1 = etree.find('{http://www.s60.com/xml/confml/2}feature')
       
   756         self.assertEquals(fea1.get('ref'),'testfea1')
       
   757         self.assertEquals(fea1.find('{http://www.s60.com/xml/confml/2}setting').get('ref'),'testfea11')
       
   758         config2 =  persistentconfml.get_reader_for_elem('configuration').loads(etree)
       
   759         self.assertEquals(config2.testfea1.list_features(),['testfea11'])
       
   760         self.assertEquals(config2.testfea2.list_features(),['testfea21'])
       
   761         self.assertEquals(config2.testfea2.testfea21.get_type(),'selection')
       
   762         self.assertTrue('1' in config2.testfea2.testfea21.get_valueset())
       
   763         self.assertTrue('2' in config2.testfea2.testfea21.get_valueset())
       
   764         self.assertEquals(config2.testfea2.testfea21.options['3'].get_name(), 'post')
       
   765         self.assertEquals(config2.testfea2.testfea21.get_value(), 'pre')
       
   766 
       
   767     def test_write_configuration_with_multiselections(self):
       
   768         config = model.ConfmlConfiguration("test.confml")
       
   769         config.add_feature(api.Feature('testfea1'))
       
   770         config.testfea1.add_feature(model.ConfmlSetting('testfea11'))
       
   771         config.add_feature(api.Feature('testfea2'))
       
   772         set1 = model.ConfmlMultiSelectionSetting('testfea21')
       
   773         set1.create_option('pre', '1')
       
   774         set1.create_option('normal', '2')
       
   775         set1.create_option('post', '3')
       
   776         config.add_feature(set1, 'testfea2')
       
   777         config.add_feature(api.Feature('testfea4'))
       
   778         config.add_feature(api.Feature('testfea5'))
       
   779         config.add_feature(api.Feature('testfea6'))
       
   780         set1.value = ["pre","post"]       
       
   781         self.assertEquals(set1.get_data().get_value(), '"pre" "post"')
       
   782         writer = persistentconfml.get_writer_for_class("Configuration")
       
   783         elem = writer.dumps(config)
       
   784         self.assertEquals(ElementTree.tostring(elem), '<configuration name="test_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema"><feature name="testfea1" ref="testfea1"><setting name="testfea11" ref="testfea11" /></feature><feature name="testfea2" ref="testfea2"><setting name="testfea21" ref="testfea21" type="multiSelection"><option name="pre" value="1" /><option name="normal" value="2" /><option name="post" value="3" /></setting></feature><feature name="testfea4" ref="testfea4" /><feature name="testfea5" ref="testfea5" /><feature name="testfea6" ref="testfea6" /><data><testfea2><testfea21>"pre" "post"</testfea21></testfea2></data></configuration>')
       
   785         etree = ElementTree.fromstring(ElementTree.tostring(elem))
       
   786         fea1 = etree.find('{http://www.s60.com/xml/confml/2}feature')
       
   787         self.assertEquals(fea1.get('ref'),'testfea1')
       
   788         self.assertEquals(fea1.find('{http://www.s60.com/xml/confml/2}setting').get('ref'),'testfea11')
       
   789         config2 =  persistentconfml.get_reader_for_elem('configuration').loads(etree)
       
   790         self.assertEquals(config2.testfea2.list_features(),['testfea21'])
       
   791         self.assertEquals(config2.testfea2.testfea21.get_type(),'multiSelection')
       
   792         self.assertEquals(config2.testfea2.testfea21.get_value(), ['pre', 'post'])
       
   793 
       
   794     def test_configuration_with_view(self):
       
   795         config = api.Configuration("view.confml")
       
   796         config.add_view('testing')
       
   797         view = config.get_view('testing')
       
   798         view.add_group('group1')
       
   799         view.add_group('group2')
       
   800         view.add_group('group3')
       
   801         view.group1.add(api.FeatureLink('test.foo'))
       
   802         view.group2.add(api.FeatureLink('foo.*'))
       
   803         writer = persistentconfml.get_writer_for_class("Configuration")
       
   804         elem = writer.dumps(config)
       
   805         etree = ElementTree.fromstring(ElementTree.tostring(elem))
       
   806         view = etree.find('{http://www.s60.com/xml/confml/2}view')
       
   807         groups = etree.getiterator('{http://www.s60.com/xml/confml/2}group')
       
   808         listgroups = [elem for elem in groups]
       
   809         
       
   810         self.assertEquals(listgroups[0].get('name'), 'group1')
       
   811         self.assertEquals(listgroups[1].get('name'), 'group2')
       
   812         self.assertEquals(listgroups[2].get('name'), 'group3')
       
   813         settings = [elem for elem in etree.getiterator('{http://www.s60.com/xml/confml/2}setting')]
       
   814         self.assertEquals(settings[0].get('ref'), 'test/foo')
       
   815         self.assertEquals(settings[1].get('ref'), 'foo/*')
       
   816 
       
   817     def test_load_dump_reload_configuration_with_view(self):
       
   818         reader = persistentconfml.get_reader_for_elem("configuration")
       
   819         etree = ElementTree.fromstring(simpleview)
       
   820         obj = reader.loads(etree)
       
   821         # Getting the view populates it and check that the writing still works
       
   822         self.assertEquals(obj.get_view('Image creation').get_name(),'Image creation')
       
   823         self.assertEquals(obj.get_view('Image creation').id,'imakerimage')
       
   824         self.assertEquals(obj.get_view('Image creation').list_groups(), ['Imageproperties'])
       
   825         writer = persistentconfml.get_writer_for_class("Configuration")
       
   826         elem = writer.dumps(obj)
       
   827         # Reload the configuration with view after dumping it to ensure data stays the same
       
   828         elemstr = ElementTree.tostring(elem)      
       
   829         etree = ElementTree.fromstring(elemstr)
       
   830         obj = reader.loads(etree)
       
   831         self.assertEquals(obj.get_view('Image creation').get_name(),'Image creation')
       
   832         self.failUnlessEqual(obj.get_view('Image creation').id,'imakerimage', 'Known bug (#564)')
       
   833         self.assertEquals(obj.get_view('Image creation').id,'imakerimage')
       
   834         
       
   835     def test_load_configuration_and_create_copy_and_dump(self):
       
   836         conffile = open(os.path.join(ROOT_PATH,"data/commsdatcreator.confml"))
       
   837         #reader = persistentconfml.get_reader_for_elem("configuration")
       
   838         #etree = ElementTree.fromstring(conffile.read())
       
   839         obj = persistentconfml.loads(conffile.read())
       
   840         copyconfig = api.Configuration('data/copy_commsdatcreator.confml')
       
   841         
       
   842         for child in obj._objects():
       
   843             copyconfig._add(child)
       
   844         output = persistentconfml.dumps(copyconfig)
       
   845         ofile = open(os.path.join(ROOT_PATH,'data/copy_commsdatcreator.confml'),"wb")
       
   846         ofile.write(output)
       
   847         ofile.close()
       
   848         newconfig = persistentconfml.loads(output)
       
   849         orgview = obj.get_default_view()
       
   850         newview = newconfig.get_default_view()
       
   851         for fea in orgview.list_all_features():
       
   852             orgval = orgview.get_feature(fea).get_value() 
       
   853             newval = newview.get_feature(fea).get_value()
       
   854             if not orgval == newval:
       
   855                 self.fail("Value of %s does not match. org = %s != new = %s" % (fea,orgval,newval))
       
   856         
       
   857     def test_create_configuration_with_meta_and_dump(self):
       
   858         prj = api.Project(api.Storage.open('dump','w'))
       
   859         testconf = prj.create_configuration('test.confml')
       
   860         testconf.include_configuration('test/foo.confml')
       
   861         testconf.save()
       
   862         prj.close()
       
   863         prj2 = api.Project(api.Storage.open('dump','a'))
       
   864         testconf = prj2.get_configuration('test.confml')
       
   865         testconf.meta = model.ConfmlMeta()
       
   866         testconf.meta.append(model.ConfmlMetaProperty('test', 'foo one two'))
       
   867         testconf.meta.append(model.ConfmlMetaProperty('owner', 'test erik'))
       
   868         testconf.save()
       
   869         prj2.close()
       
   870         prj = api.Project(api.Storage.open('dump','a'))
       
   871         testconf = prj.get_configuration('test.confml')
       
   872         self.assertEquals(testconf.meta[0].tag, 'test')
       
   873         self.assertEquals(testconf.meta[0].value,'foo one two')
       
   874         self.assertEquals(testconf.meta[1].tag, 'owner')
       
   875         self.assertEquals(testconf.meta[1].value,'test erik')
       
   876         del testconf.meta[1]
       
   877         del testconf.meta
       
   878         testconf.save()
       
   879         prj.close()
       
   880         prj = api.Project(api.Storage.open('dump','a'))
       
   881         testconf = prj.get_configuration('test.confml')
       
   882         self.assertEquals(testconf.meta, None)
       
   883         prj.close()
       
   884         shutil.rmtree('dump')
       
   885 
       
   886 class TestMeta(unittest.TestCase):
       
   887     def test_get_reader_for_meta(self):
       
   888         reader = persistentconfml.get_reader_for_elem("meta")
       
   889         self.assertTrue(isinstance(reader, persistentconfml.MetaReader))
       
   890 
       
   891     def test_parse_meta_elem(self):
       
   892         reader = persistentconfml.get_reader_for_elem("meta")
       
   893         elem = ElementTree.Element('meta')
       
   894         owner = ElementTree.Element('owner')
       
   895         owner.text = 'Testing owner'
       
   896         origin = ElementTree.Element('origin')
       
   897         origin.text = 'just origin'
       
   898         target = ElementTree.Element('target')
       
   899         target.text = 'target hw'
       
   900         elem.append(owner)
       
   901         elem.append(origin)
       
   902         elem.append(target)
       
   903         data = reader.loads(elem)
       
   904         self.assertEquals(data[0].tag, 'owner')
       
   905         self.assertEquals(data[0].value, 'Testing owner')
       
   906         self.assertEquals(data[1].tag, 'origin')
       
   907         self.assertEquals(data[1].value, 'just origin')
       
   908         self.assertEquals(data[2].tag, 'target')
       
   909         self.assertEquals(data[2].value, 'target hw')
       
   910 
       
   911     def test_write_meta_elem(self):
       
   912         writer = persistentconfml.get_writer_for_class("ConfmlMeta")
       
   913         celem = model.ConfmlMeta([model.ConfmlMetaProperty('test', 123),\
       
   914                                  model.ConfmlMetaProperty('owner', "some ownername"),\
       
   915                                  model.ConfmlMetaProperty('target', "hw")])
       
   916         etree = writer.dumps(celem)
       
   917         self.assertEquals(etree.find('test').text,123)
       
   918         self.assertEquals(etree.find('owner').text,'some ownername')
       
   919         self.assertEquals(etree.find('target').text,'hw')
       
   920         
       
   921 #    
       
   922 class TestDesc(unittest.TestCase):
       
   923     def test_get_reader_for_desc(self):
       
   924         reader = persistentconfml.get_reader_for_elem("desc")
       
   925         self.assertTrue(isinstance(reader, persistentconfml.DescReader))
       
   926 
       
   927     def test_parse_desc_elem(self):
       
   928         reader = persistentconfml.get_reader_for_elem("meta")
       
   929         elem = ElementTree.Element('desc')
       
   930         elem.text = 'Testing desc'
       
   931         data = reader.loads(elem)
       
   932 
       
   933     def test_write_desc_elem(self):
       
   934         writer = persistentconfml.get_writer_for_class("ConfmlDescription")
       
   935         celem = model.ConfmlDescription('testing')
       
   936         etree = writer.dumps(celem)
       
   937         self.assertEquals(etree.text,'testing')
       
   938 
       
   939 class TestFeature(unittest.TestCase):
       
   940     def test_get_reader_for_feature(self):
       
   941         reader = persistentconfml.get_reader_for_elem("feature")
       
   942         self.assertTrue(isinstance(reader, persistentconfml.FeatureReader))
       
   943 
       
   944     def test_parse_feature_elem(self):
       
   945         reader = persistentconfml.get_reader_for_elem("feature")
       
   946         elem = ElementTree.Element('feature', 
       
   947                                    {'ref' : 'hiifoo',
       
   948                                     'name': 'Some other name'})
       
   949         fea = reader.loads(elem)
       
   950         self.assertEquals(fea.get_ref(),'hiifoo')
       
   951         self.assertEquals(fea.get_name(),'Some other name')
       
   952 
       
   953     def test_write_feature_elem(self):
       
   954         writer = persistentconfml.get_writer_for_class("Feature")
       
   955         celem = api.Feature('testing')
       
   956         etree = writer.dumps(celem)
       
   957         self.assertEquals(etree.get('ref'),'testing')
       
   958         self.assertEquals(etree.get('name'),'testing')
       
   959 
       
   960 
       
   961 class TestSetting(unittest.TestCase):
       
   962     def test_get_reader_for_feature(self):
       
   963         reader = persistentconfml.get_reader_for_elem("setting")
       
   964         self.assertTrue(isinstance(reader, persistentconfml.ConfmlSettingReader))
       
   965 
       
   966     def test_parse_elem(self):
       
   967         reader = persistentconfml.get_reader_for_elem("setting")
       
   968         elem = ElementTree.Element('setting', 
       
   969                                    {'ref' : 'hiifoo',
       
   970                                     'name': 'Some other name',
       
   971                                     'type' :'int',
       
   972                                     'readOnly': 'true'})
       
   973         fea = reader.loads(elem)
       
   974         self.assertEquals(fea.get_ref(),'hiifoo')
       
   975         self.assertEquals(fea.get_name(),'Some other name')
       
   976         self.assertEquals(fea.get_type(),'int')
       
   977 
       
   978     def test_write_setting_elem(self):
       
   979         writer = persistentconfml.get_writer_for_class("ConfmlSetting")
       
   980         celem = model.ConfmlSetting('testing')
       
   981         etree = writer.dumps(celem)
       
   982         self.assertEquals(etree.get('ref'),'testing')
       
   983         self.assertEquals(etree.get('name'),'testing')
       
   984         self.assertEquals(etree.get('type'),None)
       
   985 
       
   986     def test_write_setting_with_options(self):
       
   987         writer = persistentconfml.get_writer_for_class("ConfmlSetting")
       
   988         elem = model.ConfmlSetting('testing', type='selection')
       
   989         elem.create_option('one','1')
       
   990         elem.create_option('two','2')
       
   991         elem.create_option('three','3')
       
   992         elem.create_option('four','bar')
       
   993         etree = writer.dumps(elem)
       
   994 
       
   995         self.assertEquals(etree.get('ref'),'testing')
       
   996         self.assertEquals(etree.get('name'),'testing')
       
   997         self.assertEquals(etree.get('type'),'selection')
       
   998         self.assertEquals(etree.find('option').get('name'),'one')
       
   999         self.assertEquals(etree.find('option').get('value'),'1')
       
  1000 
       
  1001     def test_write_setting_with_facets(self):
       
  1002         writer = persistentconfml.get_writer_for_class("ConfmlSetting")
       
  1003         setting = model.ConfmlIntSetting(name="Int Setting", ref='intSetting')
       
  1004         setting.minInclusive = 0
       
  1005         setting.maxInclusive = 10
       
  1006         setting.minExclusive = 0
       
  1007         setting.maxExclusive = 10
       
  1008         setting.totalDigits = 3
       
  1009         setting.pattern = "\d*{3}"
       
  1010         etree = writer.dumps(setting)
       
  1011         
       
  1012         self.assertEquals(etree.find('xs:minInclusive').get('value'),'0')
       
  1013         self.assertEquals(etree.find('xs:maxInclusive').get('value'),'10')
       
  1014         self.assertEquals(etree.find('xs:minExclusive').get('value'),'0')
       
  1015         self.assertEquals(etree.find('xs:maxExclusive').get('value'),'10')
       
  1016         self.assertEquals(etree.find('xs:totalDigits').get('value'),'3')
       
  1017         self.assertEquals(etree.find('xs:pattern').get('value'),'\d*{3}')
       
  1018         
       
  1019         conffile = open(os.path.join(ROOT_PATH,"data/facets.confml"))
       
  1020         obj = persistentconfml.loads(conffile.read())
       
  1021         
       
  1022         new_path = os.path.join(ROOT_PATH,"temp/facets_dumped.confml")
       
  1023         dir = os.path.dirname(new_path)
       
  1024         if dir and not os.path.exists(dir):
       
  1025             os.makedirs(dir)
       
  1026         f = open(new_path,"wb")
       
  1027         try:        f.write(persistentconfml.dumps(obj))
       
  1028         finally:    f.close()
       
  1029         
       
  1030     def test_read_setting_with_options(self):
       
  1031         reader = persistentconfml.get_reader_for_elem("setting")
       
  1032         elem = ElementTree.Element('setting', {'ref' : 'hii',
       
  1033                                                'name': 'hoo hii',
       
  1034                                                'type': 'selection'})
       
  1035         elem.append(ElementTree.Element('option', {'name': 'test1', 'value': '123'}))
       
  1036         elem.append(ElementTree.Element('option', {'name': 'test2', 'value': '456'}))
       
  1037         elem.append(ElementTree.Element('option', {'name': 'test3', 'value': '789'}))
       
  1038         setobj = reader.loads(elem)
       
  1039         vset = setobj.get_valueset()
       
  1040         self.assertTrue('123' in vset)
       
  1041         self.assertTrue('456' in vset)
       
  1042         self.assertTrue('789' in vset)
       
  1043         self.assertEquals(setobj.options['123'].get_value(),'123')
       
  1044         self.assertEquals(setobj.options['456'].get_value(),'456')
       
  1045         self.assertEquals(setobj.options['789'].get_value(),'789')
       
  1046 
       
  1047     def test_read_sequence_setting(self):
       
  1048         reader = persistentconfml.get_reader_for_elem("setting")
       
  1049         elem = ElementTree.Element('setting', {'ref' : 'hii',
       
  1050                                                'name': 'hoo hii',
       
  1051                                                'type': 'sequence'})
       
  1052         elem.append(ElementTree.Element('setting', {'ref' : 'intsetting',
       
  1053                                                'name': 'intme',
       
  1054                                                'type': 'int'}))
       
  1055         elem.append(ElementTree.Element('setting', {'ref' : 'strsetting',
       
  1056                                                'name': 'strme',
       
  1057                                                'type': 'string'}))
       
  1058         setobj = reader.loads(elem)
       
  1059         self.assertEquals(setobj.list_features(), ['intsetting', 'strsetting'])
       
  1060         self.assertEquals(setobj.intsetting.fqr, 'hii.intsetting')
       
  1061 
       
  1062     def test_read_sequence_setting_with_mapping(self):
       
  1063         reader = persistentconfml.get_reader_for_elem("setting")
       
  1064         elem = ElementTree.Element('setting', {'ref' : 'hii',
       
  1065                                                'name': 'hoo hii',
       
  1066                                                'type': 'sequence',
       
  1067                                                'mapKey': 'intsetting',
       
  1068                                                'mapValue': 'strsetting'})
       
  1069         elem.append(ElementTree.Element('setting', {'ref' : 'intsetting',
       
  1070                                                'name': 'intme',
       
  1071                                                'type': 'int'}))
       
  1072         elem.append(ElementTree.Element('setting', {'ref' : 'strsetting',
       
  1073                                                'name': 'strme',
       
  1074                                                'type': 'string'}))
       
  1075         setobj = reader.loads(elem)
       
  1076         self.assertEqual(setobj.get_map_key().name,"intme")
       
  1077         self.assertEqual(setobj.get_map_value().name,"strme")
       
  1078 
       
  1079 class TestSettingData(unittest.TestCase):
       
  1080     def test_get_reader_for_data(self):
       
  1081         reader = persistentconfml.get_reader_for_elem("data")
       
  1082         self.assertTrue(isinstance(reader, persistentconfml.DataReader))
       
  1083 
       
  1084     def test_get_writer_for_data(self):
       
  1085         writer = persistentconfml.get_writer_for_class("Data")
       
  1086         self.assertTrue(isinstance(writer, persistentconfml.DataWriter))
       
  1087 
       
  1088     def test_dump_data(self):
       
  1089         writer = persistentconfml.get_writer_for_class("Data")
       
  1090         dobj = api.Data(ref='foo', value=1)
       
  1091         elem = writer.dumps(dobj)
       
  1092         self.assertEquals(elem.text, 1)
       
  1093 
       
  1094     def test_dump_data_with_subref(self):
       
  1095         writer = persistentconfml.get_writer_for_class("DataContainer")
       
  1096         base = api.DataContainer('foo')
       
  1097         base._add(api.Data(fqr='foo.bar', value='test'))
       
  1098         elem = writer.dumps(base)
       
  1099         self.assertEquals(elem.find('bar').text, 'test')
       
  1100 
       
  1101     def test_dump_data_with_long_ref(self):
       
  1102         writer = persistentconfml.get_writer_for_class("Data")
       
  1103         base = api.Data(ref='foo')
       
  1104         base._add(api.Data(ref='bar'))
       
  1105         base._add_to_path('bar',api.Data(ref='test',  value='test'))
       
  1106         elem = writer.dumps(base)
       
  1107         self.assertEquals(elem.find('bar').find('test').text, 'test')
       
  1108 
       
  1109     def test_dump_data_with_hierarchy(self):
       
  1110         writer = persistentconfml.get_writer_for_class("Data")
       
  1111         base = api.DataContainer('foo')
       
  1112         base._add(api.Data(fqr='foo.bar', value='test'))
       
  1113         elem = writer.dumps(base)
       
  1114         self.assertEquals(elem.find('bar').text, 'test')
       
  1115 
       
  1116     def test_read_data_with_map(self):
       
  1117         reader = persistentconfml.get_reader_for_elem("data")
       
  1118         data = ElementTree.Element('data')
       
  1119         feature = ElementTree.Element('foo')
       
  1120         data.append(feature)
       
  1121         feature.append(ElementTree.Element('bar', {'map' : "foo/bar[@key='key 1']"}))
       
  1122         
       
  1123         obj = reader.loads(data)
       
  1124         bar = obj._get('foo.bar')
       
  1125         self.assertEqual(bar.get_map(),"foo/bar[@key='key 1']")
       
  1126 
       
  1127     def test_load_confml_with_meta(self):
       
  1128         conffile = open(os.path.join(ROOT_PATH,"data/accessoryserver.confml"))
       
  1129         reader = persistentconfml.get_reader_for_elem("configuration")
       
  1130         etree = ElementTree.fromstring(conffile.read())
       
  1131         obj = reader.loads(etree)
       
  1132         self.assertEquals(obj.meta.get('type'), 'featurelist')
       
  1133 
       
  1134 class TestReadWriteConfml(BaseTestCase):
       
  1135     """
       
  1136     Test case for ensuring that reading in a ConfML file and then writing
       
  1137     it out again results in logically the same data (XML-wise) as the
       
  1138     original data was.
       
  1139     """
       
  1140     
       
  1141     def _normalize_xml_data(self, data):
       
  1142         """
       
  1143         Normalize XML data so that it can be compared using a binary
       
  1144         comparison.
       
  1145         """
       
  1146         etree = ElementTree.fromstring(data)
       
  1147         persistence.indent(etree)
       
  1148         normalized_data = ElementTree.tostring(etree)
       
  1149         return normalized_data
       
  1150     
       
  1151     def _run_read_and_write_test(self, file_name, input_dir, output_dir):
       
  1152         file_path = os.path.join(input_dir, file_name)
       
  1153         
       
  1154         f = open(file_path, "rb")
       
  1155         try:        original_data = f.read()
       
  1156         finally:    f.close()
       
  1157         
       
  1158         original_data_normalized = self._normalize_xml_data(original_data)
       
  1159         
       
  1160         model = persistentconfml.loads(original_data)
       
  1161         model_data = persistentconfml.dumps(model)
       
  1162         
       
  1163         model_data_normalized = self._normalize_xml_data(model_data)
       
  1164         
       
  1165         PATH_ORIGINAL = os.path.join(output_dir, 'original', file_name)
       
  1166         PATH_DUMPED   = os.path.join(output_dir, 'dumped', file_name)
       
  1167         
       
  1168         if original_data_normalized != model_data_normalized:
       
  1169             def write(file_path, data):
       
  1170                 file_dir = os.path.dirname(file_path)
       
  1171                 if not os.path.exists(file_dir):
       
  1172                     os.makedirs(file_dir)
       
  1173                 f = open(file_path, "wb")
       
  1174                 try:        f.write(data)
       
  1175                 finally:    f.close()
       
  1176             
       
  1177             write(PATH_ORIGINAL, original_data_normalized)
       
  1178             write(PATH_DUMPED, model_data_normalized)
       
  1179             self.fail("Known bug (#506)")
       
  1180             self.fail("Read-write output for file '%s' is different, see the files in '%s'" % (file_name, output_dir))
       
  1181         else:
       
  1182             # Test was successful, remove any old files that might have been there,
       
  1183             # so that the output directories only contain files for the tests that
       
  1184             # failed
       
  1185             self.remove_if_exists(PATH_ORIGINAL)
       
  1186             self.remove_if_exists(PATH_DUMPED)
       
  1187     
       
  1188     def _run_test_for_file(self, file_path):
       
  1189         self._run_read_and_write_test(
       
  1190             file_name  = os.path.basename(file_path),
       
  1191             input_dir  = os.path.dirname(file_path),
       
  1192             output_dir = os.path.normpath(os.path.join(ROOT_PATH, 'temp/read_write_results')))
       
  1193 
       
  1194 # Create a separate test method for each ConfML file in the read-write test data
       
  1195 _READ_WRITE_TESTDATA_DIR = os.path.join(ROOT_PATH, 'testdata/read_write')
       
  1196 for filename in filter(lambda fn: fn.endswith('.confml'), os.listdir(_READ_WRITE_TESTDATA_DIR)):
       
  1197     path = os.path.join(_READ_WRITE_TESTDATA_DIR, filename)
       
  1198     test_method_name = 'test_read_write_file__%s' % filename.replace('.', '_')
       
  1199     
       
  1200     # Use a separate function to create and set the lambda function on the
       
  1201     # test class, because otherwise 'path' would be the last one value set to
       
  1202     # it in the for loop
       
  1203     def _register_test_method(path):
       
  1204         method = lambda self: self._run_test_for_file(path)
       
  1205         method.__name__ = test_method_name
       
  1206         setattr(TestReadWriteConfml, test_method_name, method)
       
  1207     _register_test_method(path)
       
  1208 
       
  1209 
       
  1210 if __name__ == '__main__':
       
  1211     unittest.main()