configurationengine/source/cone/confml/tests/unittest_persistentconfml.py
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
child 4 0951727b8815
equal deleted inserted replaced
2:87cfa131b535 3:e7e0ae78773e
    17 """
    17 """
    18 Test the CPF root file parsing routines
    18 Test the CPF root file parsing routines
    19 """
    19 """
    20 
    20 
    21 import unittest
    21 import unittest
    22 import string
       
    23 import sys
       
    24 import os
    22 import os
    25 import shutil
    23 import shutil
    26 import __init__
    24 
    27 try:
    25 
    28     from cElementTree import ElementTree
    26 from cone.public import api, persistence, utils
    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
    27 from cone.storage import filestorage
    40 from cone.confml import persistentconfml, model
    28 from cone.confml import persistentconfml, model, confmltree
    41 from testautomation.base_testcase import BaseTestCase
    29 from testautomation.base_testcase import BaseTestCase
    42 ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
    30 ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
       
    31 
       
    32 ElementTree = utils.etree
    43 
    33 
    44 testdata  = os.path.join(ROOT_PATH,'data')
    34 testdata  = os.path.join(ROOT_PATH,'data')
    45 
    35 
    46 simplerootxml = \
    36 simplerootxml = \
    47 '''<?xml version="1.0" encoding="UTF-8"?>
    37 '''<?xml version="1.0" encoding="UTF-8"?>
    63   <xi:include href="ncp33/prod/confml/root.confml#/"/>
    53   <xi:include href="ncp33/prod/confml/root.confml#/"/>
    64 </configuration>'''
    54 </configuration>'''
    65 
    55 
    66 
    56 
    67 morestuff='''<?xml version="1.0" encoding="UTF-8"?>
    57 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">
    58 <configuration id="conf_id" 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">
    59   <meta xmlns:cv="http://www.nokia.com/xml/cpf-id/1">
    70     <cv:configuration-property name="coreplat_name" value="abc_123" />
    60     <cv:configuration-property name="coreplat_name" value="abc_123" />
    71     <cv:configuration-property name="product_name" value="qwerty" />
    61     <cv:configuration-property name="product_name" value="qwerty" />
    72     <owner>Variant1 creator</owner>
    62     <owner>Variant1 creator</owner>
    73     <origin>somestorage:somelocation_123/and/path</origin>
    63     <origin>somestorage:somelocation_123/and/path</origin>
   199       <outputLocation>myProduct</outputLocation>
   189       <outputLocation>myProduct</outputLocation>
   200     </imakerapi>
   190     </imakerapi>
   201   </data>
   191   </data>
   202   <confml:view id="imakerimage" name="Image creation">
   192   <confml:view id="imakerimage" name="Image creation">
   203     <confml:desc>Image creation related settings</confml:desc>
   193     <confml:desc>Image creation related settings</confml:desc>
   204     <confml:group name="Imageproperties">
   194     <confml:group name="Imageproperties / test">
   205       <confml:desc>Sample Description</confml:desc>
   195       <confml:desc>Sample Description</confml:desc>
   206       <confml:setting ref="imakerapi/*"/>
   196       <confml:setting ref="imakerapi/imagetype"/>
       
   197       <confml:setting ref="imakerapi/rofs3version"/>
       
   198       <confml:setting ref="imakerapi/productname"/>
       
   199       <confml:setting ref="imakerapi/outputLocation"/>
   207       <confml:setting ref="imaker/*"/>
   200       <confml:setting ref="imaker/*"/>
   208     </confml:group>
   201     </confml:group>
   209   </confml:view>
   202   </confml:view>
   210 </confml:configuration>
   203 </confml:configuration>
       
   204 '''
       
   205 
       
   206 overrideview = \
       
   207 '''<?xml version="1.0" encoding="UTF-8"?>
       
   208 <configuration  xmlns="http://www.s60.com/xml/confml/2" schemaLocation="http://www.s60.com/xml/confml/1 http://www.s60.com/xml/confml/1#//confml2">
       
   209   <feature ref="imakerapi" name="iMaker API">
       
   210     <setting ref="imagetype" name="IMAGE_TYPE" type="selection">
       
   211       <option name="rnd" value="0"/>
       
   212       <option name="subcon" value="1"/>
       
   213       <option name="prd" value="2"/>
       
   214     </setting>
       
   215     <setting ref="productname" name="PRODUCT_NAME" type="string"/>
       
   216     <setting ref="outputLocation" name="OUTPUT_LOCATION" type="string"/>
       
   217   </feature>
       
   218   <data>
       
   219     <imakerapi>
       
   220       <imagetype>0</imagetype>
       
   221       <productname>myProduct</productname>
       
   222       <outputLocation>myProduct</outputLocation>
       
   223     </imakerapi>
       
   224   </data>
       
   225   <view id="imakerimage" name="Image creation">
       
   226     <desc>Image creation related settings</desc>
       
   227     <group name="Imageproperties">
       
   228       <desc>Sample Description</desc>
       
   229       <setting ref="imakerapi/imagetype">
       
   230           <option name="prd_renamed" value="2"/>
       
   231       </setting>
       
   232       <setting ref="imakerapi/productname" name="New Product Name">
       
   233         <desc>test desc override</desc>
       
   234         <minLength value="2" />
       
   235       </setting>
       
   236       <setting ref="imakerapi/outputLocation" minOccurs="2"/>
       
   237     </group>
       
   238   </view>
       
   239 </configuration>
       
   240 '''
       
   241 
       
   242 
       
   243 option_overrideview = \
       
   244 '''<?xml version="1.0" encoding="UTF-8"?>
       
   245 <configuration  xmlns="http://www.s60.com/xml/confml/2" schemaLocation="http://www.s60.com/xml/confml/1 http://www.s60.com/xml/confml/1#//confml2">
       
   246   <feature ref="imakerapi" name="iMaker API">
       
   247     <setting ref="imagetype" name="IMAGE_TYPE" type="selection">
       
   248       <option name="rnd" value="0"/>
       
   249       <option name="subcon" value="1"/>
       
   250       <option name="prd" value="2"/>
       
   251     </setting>
       
   252     <setting ref="productname" name="PRODUCT_NAME" type="string"/>
       
   253     <setting ref="outputLocation" name="OUTPUT_LOCATION" type="string"/>
       
   254   </feature>
       
   255   <data>
       
   256     <imakerapi>
       
   257       <imagetype>0</imagetype>
       
   258       <productname>myProduct</productname>
       
   259       <outputLocation>myProduct</outputLocation>
       
   260     </imakerapi>
       
   261   </data>
       
   262   <view id="imakerimage" name="Image creation">
       
   263     <desc>Image creation related settings</desc>
       
   264     <group name="Imageproperties">
       
   265       <desc>Sample Description</desc>
       
   266       <setting ref="imakerapi/imagetype">
       
   267           <option name="prd2" value="2"/>
       
   268           <option name="newoption" value="5"/>
       
   269       </setting>
       
   270       <setting ref="imakerapi/productname" name="New Product Name">
       
   271         <desc>test desc override</desc>
       
   272         <minLength value="2" />
       
   273       </setting>
       
   274       <setting ref="imakerapi/outputLocation" minOccurs="2"/>
       
   275     </group>
       
   276   </view>
       
   277 </configuration>
       
   278 '''
       
   279 
       
   280 properties_overrideview = \
       
   281 '''<?xml version="1.0" encoding="UTF-8"?>
       
   282 <configuration  xmlns="http://www.s60.com/xml/confml/2" schemaLocation="http://www.s60.com/xml/confml/1 http://www.s60.com/xml/confml/1#//confml2">
       
   283   <feature ref="imakerapi" name="iMaker API">
       
   284     <setting ref="imagetype" name="IMAGE_TYPE" type="selection">
       
   285       <option name="rnd" value="0"/>
       
   286       <option name="subcon" value="1"/>
       
   287       <option name="prd" value="2"/>
       
   288       <property name="mime" value="image/svgt image/bmp"/>
       
   289       
       
   290     </setting>
       
   291     <setting ref="productname" name="PRODUCT_NAME" type="string"/>
       
   292     <setting ref="outputLocation" name="OUTPUT_LOCATION" type="string"/>
       
   293   </feature>
       
   294   <data>
       
   295     <imakerapi>
       
   296       <imagetype>0</imagetype>
       
   297       <productname>myProduct</productname>
       
   298       <outputLocation>myProduct</outputLocation>
       
   299     </imakerapi>
       
   300   </data>
       
   301   <view id="imakerimage" name="Image creation">
       
   302     <desc>Image creation related settings</desc>
       
   303     <group name="Imageproperties">
       
   304       <desc>Sample Description</desc>
       
   305       <setting ref="imakerapi/imagetype">
       
   306       <property name="mime" value="image/svgt image/jpg"/>
       
   307       <property name="mime2" value="image/svgt image/bmp"/>
       
   308       </setting>
       
   309       <setting ref="imakerapi/productname" name="New Product Name">
       
   310         <desc>test desc override</desc>
       
   311         <minLength value="2" />
       
   312       </setting>
       
   313       <setting ref="imakerapi/outputLocation" minOccurs="2"/>
       
   314     </group>
       
   315   </view>
       
   316 </configuration>
       
   317 '''
       
   318 
       
   319 selectionsetting = \
       
   320 '''<?xml version="1.0" encoding="UTF-8"?>
       
   321 <configuration xmlns="http://www.s60.com/xml/confml/2" name="Test features for testing name-ID mappings"><feature ref="CTD_APs" name="GPRS Access Points" ><desc>GPRS connection method (CM) definitions</desc>
       
   322         <setting ref="AP"
       
   323                 name="GPRS"
       
   324                 type="sequence"
       
   325                 minOccurs="0"
       
   326                 maxOccurs="99"
       
   327                 displayName="ConnectionName"
       
   328                 mapValue="DestinationNetwork"
       
   329                 mapKey="GPRS_AP_Name">
       
   330             <setting ref="GPRS_AP_Name" name="GPRS Access Point Name" type="string">
       
   331                 <desc>The access point name for this GPRS connection</desc>
       
   332             </setting>
       
   333             <setting ref="ConnectionName" name="Connection Name" type="string">
       
   334                 <desc>The access point name that is visible to the user.</desc>
       
   335             </setting>
       
   336             <setting ref="DestinationNetwork" name="Destination Network" type="selection">
       
   337                 <desc>Select destination network for access point</desc>
       
   338                 <option name="Internet" value="1"/>
       
   339                 <option name="MMS" value="2"/>
       
   340                 <option name="Wap Services" value="3"/>
       
   341             </setting>
       
   342             <setting ref="NetworkType" name="Network type" type="selection">
       
   343                 <desc>Addressing that the network uses.</desc>
       
   344                 <option name="IPv4" value="IPv4"/>
       
   345                 <option name="IPv6" value="IPv6"/>
       
   346             </setting>
       
   347         </setting>
       
   348     </feature>
       
   349     <feature ref="TestApplication" name="Test internet application">
       
   350         <setting ref="ConfirmFromUser" name="Confirm internet access" type="boolean">
       
   351             <desc>Confirm the internet access from user?</desc>
       
   352         </setting>
       
   353         <setting ref="DefaultAP" name="Default access point" type="selection">
       
   354             <option map="CTD_APs/AP"></option>
       
   355         </setting>
       
   356     </feature>
       
   357     <data>
       
   358         <CTD_APs>
       
   359             <AP template="true">
       
   360                 <DestinationNetwork>Internet</DestinationNetwork>
       
   361                 <NetworkType>IPv4</NetworkType>
       
   362             </AP>
       
   363             <AP>
       
   364                 <GPRS_AP_Name>Operator 1</GPRS_AP_Name>
       
   365                 <ConnectionName>Operator Internet</ConnectionName>
       
   366                 <DestinationNetwork>Internet</DestinationNetwork>
       
   367                 <NetworkType>IPv4</NetworkType>
       
   368             </AP>
       
   369             <AP>
       
   370                 <GPRS_AP_Name>Test</GPRS_AP_Name>
       
   371                 <ConnectionName>Test Connection</ConnectionName>
       
   372                 <DestinationNetwork>Internet</DestinationNetwork>
       
   373                 <NetworkType>IPv4</NetworkType>
       
   374             </AP>
       
   375         </CTD_APs>
       
   376         <TestApplication>
       
   377             <ConfirmFromUser>true</ConfirmFromUser>
       
   378             <DefaultAP map="CTD_APs/AP[@key='Operator 1']"></DefaultAP>
       
   379         </TestApplication>
       
   380     </data>
       
   381 </configuration>
       
   382 '''
       
   383 
       
   384 multiselection = \
       
   385 '''<?xml version="1.0" encoding="UTF-8"?>
       
   386 <configuration xmlns="http://www.s60.com/xml/confml/2" name="Test features for testing name-ID mappings">
       
   387   <feature ref="aFeature">
       
   388     <setting type="sequence" ref="exampleSequence" mapKey="id" mapValue="someName">
       
   389       <setting type="int" ref="id"/>
       
   390       <setting type="string" ref="someName"/>
       
   391       <setting type="string" ref="someData"/>
       
   392     </setting>
       
   393     <setting ref="selectionSetting" name="Selection Setting" type="selection">
       
   394       <option map="aFeature/exampleSequence"/>
       
   395     </setting>
       
   396     <setting ref="multiselectionSetting" name="Multi-selection Setting" type="multiSelection">
       
   397       <option name="default selection" value=""/>
       
   398       <option map="aFeature/exampleSequence"/>
       
   399     </setting>
       
   400     <setting ref="multiselectionSettingOverride" name="Multi-selection Setting with options override" type="multiSelection">
       
   401       <option map="aFeature/exampleSequence" displayName="someName" mapValue="someData"/>
       
   402     </setting>
       
   403   </feature>
       
   404   <data>
       
   405     <aFeature>
       
   406     <exampleSequence>
       
   407       <id>12</id>
       
   408       <someName>foo</someName>
       
   409       <someData>Real data is here!</someData>
       
   410     </exampleSequence>
       
   411     <exampleSequence>
       
   412       <id>34</id>
       
   413       <someName>bar</someName>
       
   414       <someData>I am not FOO!</someData>
       
   415     </exampleSequence>
       
   416     <selectionSetting map="aFeature/exampleSequence[@key='12']"/>
       
   417     <multiselectionSetting>0</multiselectionSetting>
       
   418     <multiselectionSetting map="aFeature/exampleSequence[@key='12']"/>
       
   419     <multiselectionSetting map="aFeature/exampleSequence[@key='34']"/>
       
   420     <multiselectionSettingOverride map="aFeature/exampleSequence[@key='12']"/>
       
   421     <multiselectionSettingOverride map="aFeature/exampleSequence[@key='34']"/>
       
   422     </aFeature>
       
   423   </data>
       
   424 </configuration>
   211 '''
   425 '''
   212 
   426 
   213 class TestModuleGetters(unittest.TestCase):
   427 class TestModuleGetters(unittest.TestCase):
   214     def test_get_reader_for_configuration(self):
   428     def test_get_reader_for_configuration(self):
   215         confread = persistentconfml.get_reader_for_elem("configuration")
   429         confread = persistentconfml.get_reader_for_elem("configuration")
   238         config.include_configuration('path/to/config.confml')
   452         config.include_configuration('path/to/config.confml')
   239         dump = persistentconfml.dumps(config)
   453         dump = persistentconfml.dumps(config)
   240         elem = ElementTree.fromstring(dump)
   454         elem = ElementTree.fromstring(dump)
   241         self.assertEquals(elem.get('name'),"test_confml")
   455         self.assertEquals(elem.get('name'),"test_confml")
   242 
   456 
   243 class TestConfigurationParser(unittest.TestCase):    
   457 class TestConfigurationParser(unittest.TestCase):
       
   458     def tearDown(self):
       
   459         if os.path.exists(os.path.join(ROOT_PATH,'temp')):
       
   460             shutil.rmtree(os.path.join(ROOT_PATH,'temp'))
       
   461     
   244     def test_load_simple(self):
   462     def test_load_simple(self):
   245         reader = persistentconfml.get_reader_for_elem("configuration")
   463         reader = persistentconfml.get_reader_for_elem("configuration")
   246         obj = reader.loads(ElementTree.fromstring(simplerootxml))
   464         obj = reader.loads(ElementTree.fromstring(simplerootxml))
   247         self.assertEquals(obj.get_ref(),'simple')
   465         self.assertEquals(obj.get_ref(),'simple')
       
   466         self.assertEquals(obj.id,None)
   248         self.assertEquals(obj._list(),['platform__s60__confml__test_confml'])
   467         self.assertEquals(obj._list(),['platform__s60__confml__test_confml'])
   249 
   468 
   250     def test_load_new_include_confml(self):
   469     def test_load_new_include_confml(self):
   251         reader = persistentconfml.get_reader_for_elem("configuration")
   470         reader = persistentconfml.get_reader_for_elem("configuration")
   252         obj = reader.loads(ElementTree.fromstring(newincludexml))
   471         obj = reader.loads(ElementTree.fromstring(newincludexml))
   261                                         'ncp33__prod__confml__root_confml'])
   480                                         'ncp33__prod__confml__root_confml'])
   262 
   481 
   263     def test_load_morestuff(self):
   482     def test_load_morestuff(self):
   264         reader = persistentconfml.get_reader_for_elem("configuration")
   483         reader = persistentconfml.get_reader_for_elem("configuration")
   265         obj = reader.loads(ElementTree.fromstring(morestuff))
   484         obj = reader.loads(ElementTree.fromstring(morestuff))
       
   485         self.assertEquals(obj.id, "conf_id")
   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'])
   486         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
   487         met = obj.meta
   268         self.assertEquals(obj.meta[2].value,'Variant1 creator')
   488         self.assertEquals(obj.meta[2].value,'Variant1 creator')
   269         self.assertEquals(obj.meta[3].value,'somestorage:somelocation_123/and/path')
   489         self.assertEquals(obj.meta[3].value,'somestorage:somelocation_123/and/path')
   270         self.assertEquals(obj.meta[4].value,'proto_b2')        
   490         self.assertEquals(obj.meta[4].value,'proto_b2')        
   309                 self.assertEquals(fea.get_value(),0)
   529                 self.assertEquals(fea.get_value(),0)
   310         self.assertEquals(obj.get_feature('CVC_OperatorMenu.CVC_OperatorMenuIconFile.targetPath').get_value(),None)
   530         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')
   531         self.assertEquals(obj.get_feature('CVC_OperatorMenu.CVC_OperatorMenuIconFile.localPath').get_value(),'UI/Customer Menu/Cache')
   312 
   532 
   313     def test_create_features_with_rfs_data_and_dump_and_load(self):
   533     def test_create_features_with_rfs_data_and_dump_and_load(self):
   314         conf = api.Configuration("foo/foo.confml")
   534         conf = api.Configuration("foo/foo.confml", id="foo_conf")
   315         conf.add_feature(api.Feature('feature1'))
   535         conf.add_feature(api.Feature('feature1', id="feature1_id"))
   316         conf.add_feature(api.Feature('child1'),'feature1')
   536         conf.add_feature(api.Feature('child1'),'feature1')
   317         conf.add_feature(api.Feature('child2'),'feature1')
   537         conf.add_feature(api.Feature('child2'),'feature1')
   318         conf.add_feature(api.Feature('child3'),'feature1')
   538         conf.add_feature(api.Feature('child3'),'feature1')
   319         
   539         
   320         conf.add_data(api.Data(fqr='feature1.child1',attr='rfs',value='true'))
   540         conf.add_data(api.Data(fqr='feature1.child1',attr='rfs',value='true'))
   324         self.assertEquals(dview.get_feature('feature1.child1').get_value('rfs'), 'true')
   544         self.assertEquals(dview.get_feature('feature1.child1').get_value('rfs'), 'true')
   325         self.assertEquals(dview.get_feature('feature1.child2').get_value('rfs'), 'false')
   545         self.assertEquals(dview.get_feature('feature1.child2').get_value('rfs'), 'false')
   326         
   546         
   327         dumped = persistentconfml.dumps(conf)
   547         dumped = persistentconfml.dumps(conf)
   328         conf2 = persistentconfml.loads(dumped)
   548         conf2 = persistentconfml.loads(dumped)
       
   549         self.assertEquals(conf2.id, "foo_conf")
   329         dview = conf2.get_default_view()
   550         dview = conf2.get_default_view()
       
   551         self.assertEquals(dview.get_feature('feature1').id, "feature1_id")
       
   552         self.assertEquals(dview.get_feature('feature1.child1').id, None)
   330         self.assertEquals(dview.get_feature('feature1.child1').get_value(), None)
   553         self.assertEquals(dview.get_feature('feature1.child1').get_value(), None)
   331         self.assertEquals(dview.get_feature('feature1.child1').get_value('rfs'), 'true')
   554         self.assertEquals(dview.get_feature('feature1.child1').get_value('rfs'), 'true')
   332         self.assertEquals(dview.get_feature('feature1.child2').get_value('rfs'), 'false')
   555         self.assertEquals(dview.get_feature('feature1.child2').get_value('rfs'), 'false')
       
   556 
       
   557     def test_create_confml_features_and_dump_and_load(self):
       
   558         conf = model.ConfmlConfiguration("foo/foo.confml", id="foo_conf")
       
   559         fea = conf.create_feature('feature1', id="feature1_id")
       
   560         fea.add_feature(model.ConfmlBooleanSetting("boolset", id="bool", name="testname", desc="desriptions"))
       
   561         fea.add_feature(model.ConfmlIntSetting("intset", id="int"))
       
   562         fea.add_feature(model.ConfmlStringSetting("stringset", id="string"))
       
   563         fea.add_feature(model.ConfmlSelectionSetting("selset", id="sel"))
       
   564         fea.add_feature(model.ConfmlSequenceSetting("seqset", id="seq"))
       
   565         fea.add_feature(model.ConfmlFileSetting("fileset", id="file", desc="testdesc"))
       
   566 
       
   567         dumped = persistentconfml.dumps(conf)
       
   568         conf2 = persistentconfml.loads(dumped)
       
   569         self.assertEquals(conf2.id, "foo_conf")
       
   570         dview = conf2.get_default_view()
       
   571         self.assertEquals(dview.get_feature('feature1').id, "feature1_id")
       
   572         self.assertEquals(dview.get_feature('feature1.boolset').id, "bool")
       
   573         self.assertEquals(dview.get_feature('feature1.boolset').desc, "desriptions")
       
   574         self.assertEquals(dview.get_feature('feature1.intset').id, "int")
       
   575         self.assertEquals(dview.get_feature('feature1.stringset').id, "string")
       
   576         self.assertEquals(dview.get_feature('feature1.selset').id, "sel")
       
   577         self.assertEquals(dview.get_feature('feature1.seqset').id, "seq")
       
   578         self.assertEquals(dview.get_feature('feature1.fileset').id, "file")
       
   579         self.assertEquals(dview.get_feature('feature1.fileset').desc, "testdesc")
       
   580 
       
   581     def test_create_confml_view_and_dump_and_load(self):
       
   582         conf = model.ConfmlConfiguration("foo/view.confml", id="view_conf")
       
   583         view = conf.create_view('view1')
       
   584         group1 = view.create_group("group one", id="g1")
       
   585         group2 = view.create_group("group two", id="g2")
       
   586         group2.create_featurelink("test/foo", id="fea1", name="Jee", desc="testdesc", readOnly="true")
       
   587 
       
   588         dumped = persistentconfml.dumps(conf)
       
   589         conf2 = persistentconfml.loads(dumped)
       
   590         self.assertEquals(conf2.id, "view_conf")
       
   591         v1 = conf2.get_view('view1')
       
   592         self.assertEquals(v1.name, "view1")
       
   593         self.assertEquals(v1.id, None)
       
   594         self.assertEquals(v1.list_groups(), ['group one', 'group two'])
       
   595         self.assertEquals(v1.get_group('group one').id, "g1")
       
   596         self.assertEquals(v1.get_group('group two').id, "g2")
       
   597         self.assertEquals(v1.get_group('group two').get_featurelink("test/foo").id, "fea1")
       
   598         self.assertEquals(v1.get_group('group two').get_featurelink("test/foo").name, "Jee")
       
   599         self.assertEquals(v1.get_group('group two').get_featurelink("test/foo").desc, "testdesc")
       
   600         self.assertEquals(v1.get_group('group two').get_featurelink("test/foo").readOnly, True)
   333 
   601 
   334     def test_load_actualconfml_test_rfs_settings(self):
   602     def test_load_actualconfml_test_rfs_settings(self):
   335         reader = persistentconfml.get_reader_for_elem("configuration")
   603         reader = persistentconfml.get_reader_for_elem("configuration")
   336         obj = reader.loads(ElementTree.fromstring(actualconfml))
   604         obj = reader.loads(ElementTree.fromstring(actualconfml))
   337         self.assertEquals(obj.get_feature('KCRUidApEngineLV.KApEngineLVFlags').rfs,True)
   605         self.assertEquals(obj.get_feature('KCRUidApEngineLV.KApEngineLVFlags').rfs,True)
   362         reader = persistentconfml.get_reader_for_elem("configuration")
   630         reader = persistentconfml.get_reader_for_elem("configuration")
   363         etree = ElementTree.fromstring(conffile.read())
   631         etree = ElementTree.fromstring(conffile.read())
   364         obj = reader.loads(etree)
   632         obj = reader.loads(etree)
   365         dview = obj.get_default_view()
   633         dview = obj.get_default_view()
   366         dnsfea = dview.get_feature('DNs.DN')
   634         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'])
   635         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])
   636         self.assertEquals(dnsfea.get_template(), [None,   None,   'User Defined', '0',          'No',     'No',          'No',          '11',   None,         None,  None,  None,    None,   None,   None,   None,    None,   None,   None])
   369         self.assertEquals(dnsfea.get_value(),
   637         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],
   638         [['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], 
   639          ['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]
   640          ['Operator', '3', 'Operator', '2', 'No', 'No', 'No', '4', None, None, None, None, None, None, None, None, None, None, None]
   373         ])
   641         ])
   387         fs = filestorage.FileStorage(testdata)
   655         fs = filestorage.FileStorage(testdata)
   388         p = api.Project(fs)
   656         p = api.Project(fs)
   389         config = p.get_configuration('multiselection.confml')
   657         config = p.get_configuration('multiselection.confml')
   390         dview = config.get_default_view()
   658         dview = config.get_default_view()
   391         multisel1 = dview.get_feature('MultiSelections.MultiSel1')
   659         multisel1 = dview.get_feature('MultiSelections.MultiSel1')
   392         self.assertEquals(multisel1.value,["first selection","second selection"])
   660         self.assertEquals(multisel1.value,("first selection","second selection"))
   393         self.assertEquals(multisel1.get_data_cast(multisel1.get_value()),["first selection","second selection"])
   661         self.assertEquals(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"')
   662         self.assertEquals(multisel1.get_data().get_value(),'"first selection" "second selection"')
   396         
   663         
   397         
   664         
   398     def test_load_content_multiselection_empty_confml_from_file(self):
   665     def test_load_content_multiselection_empty_confml_from_file(self):
   399         fs = filestorage.FileStorage(testdata)
   666         fs = filestorage.FileStorage(testdata)
   400         p = api.Project(fs)
   667         p = api.Project(fs)
   401         config = p.get_configuration('multiselection.confml')
   668         config = p.get_configuration('multiselection.confml')
   402         dview = config.get_default_view()
   669         dview = config.get_default_view()
   403         multisel1 = dview.get_feature('uda_selection.selectedfiles')
   670         multisel1 = dview.get_feature('uda_selection.selectedfiles')
   404         self.assertEquals(multisel1.get_value(),None)
   671         self.assertEquals(multisel1.get_value(), ())
   405         self.assertEquals(multisel1.get_data().get_value(),None)
   672         self.assertEquals(multisel1.get_data().get_value(),None)
   406         
   673         
   407         
   674         
   408         
   675         
   409     def test_add_sequence_data_to_separate_confml(self):
   676     def test_add_sequence_data_to_separate_confml(self):
   410         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data'),"w"))
   677         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'temp'),"w"))
   411         config = prj.create_configuration('test2.confml')
   678         config = prj.create_configuration('test2.confml')
   412         seqconfig = config.create_configuration('sequence.confml')
   679         seqconfig = config.create_configuration('sequence.confml')
   413         config.create_configuration('testdata.confml')
   680         config.create_configuration('testdata.confml')
   414         seqconfig.add_feature(api.FeatureSequence('feature1'))
   681         seqconfig.add_feature(api.FeatureSequence('feature1'))
   415         seqconfig.add_feature(api.Feature('child1'),'feature1')
   682         seqconfig.add_feature(api.Feature('child1', name="child1"),'feature1')
   416         seqconfig.add_feature(api.Feature('child2'),'feature1')
   683         seqconfig.add_feature(api.Feature('child2', name="child2"),'feature1')
   417         seqconfig.add_feature(api.Feature('child3'),'feature1')
   684         seqconfig.add_feature(api.Feature('child3', name="child3"),'feature1')
   418         dview = config.get_default_view()
   685         dview = config.get_default_view()
   419         self.assertEquals(dview.get_feature('feature1').get_type(),'sequence')
   686         self.assertEquals(dview.get_feature('feature1').get_type(),'sequence')
   420         dview.get_feature('feature1').set_template(['c1','c2','c3'])
   687         dview.get_feature('feature1').set_template(['c1','c2','c3'])
   421         dview.get_feature('feature1').add_sequence(['row 1','43','56'])
   688         dview.get_feature('feature1').add_sequence(['row 1','43','56'])
   422         dview.get_feature('feature1').add_sequence(['row 2','43','56'])
   689         dview.get_feature('feature1').add_sequence(['row 2','43','56'])
   424         dview.get_feature('feature1').add_sequence(['row 3','43','56'])
   691         dview.get_feature('feature1').add_sequence(['row 3','43','56'])
   425         dview.get_feature('feature1').add_sequence(['row 4','43','56'])
   692         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'])
   693         dview.get_feature('feature1').get_data()[1].set_value(['row 2 updated', 'foo', '56'])
   427         config.save()
   694         config.save()
   428         prj.close()
   695         prj.close()
   429         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data')))
   696         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'temp')))
   430         config = prj.get_configuration('test2.confml')
   697         config = prj.get_configuration('test2.confml')
   431         dview = config.get_default_view()
   698         dview = config.get_default_view()
   432         self.assertEquals(dview.get_feature('feature1').get_template(),['c1','c2','c3'])
   699         self.assertEquals(dview.get_feature('feature1').get_template(),['c1','c2','c3'])
   433         self.assertEquals(dview.get_feature('feature1').get_value(),[['row 3', '43', '56'], 
   700         self.assertEquals(dview.get_feature('feature1').get_value(),[['row 3', '43', '56'], 
   434                                                                      ['row 4', '43', '56']])
   701                                                                      ['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)
   705         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')
   706         prj.remove_configuration('test2.confml')
   440         
   707         
   441         
   708         
   442     def test_add_sequence_data_to_separate_confml_with_append_policy(self):
   709     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"))
   710         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'temp'),"w"))
   444         config = prj.create_configuration('test1.confml')
   711         config = prj.create_configuration('test1.confml')
   445         seqconfig = config.create_configuration('sequence.confml')
   712         seqconfig = config.create_configuration('sequence.confml')
   446         config.create_configuration('testdata.confml')
   713         config.create_configuration('testdata.confml')
   447         seqconfig.add_feature(api.FeatureSequence('feature1'))
   714         seqconfig.add_feature(api.FeatureSequence('feature1'))
   448         seqconfig.add_feature(api.Feature('child1'),'feature1')
   715         seqconfig.add_feature(api.Feature('child1', name="child1"),'feature1')
   449         seqconfig.add_feature(api.Feature('child2'),'feature1')
   716         seqconfig.add_feature(api.Feature('child2', name="child2"),'feature1')
   450         seqconfig.add_feature(api.Feature('child3'),'feature1')
   717         seqconfig.add_feature(api.Feature('child3', name="child3"),'feature1')
   451         dview = config.get_default_view()
   718         dview = config.get_default_view()
   452         self.assertEquals(dview.get_feature('feature1').get_type(),'sequence')
   719         self.assertEquals(dview.get_feature('feature1').get_type(),'sequence')
   453         dview.get_feature('feature1').set_template(['c1','c2','c3'])
   720         dview.get_feature('feature1').set_template(['c1','c2','c3'])
   454         dview.get_feature('feature1').add_sequence(['row 1','43','56'])
   721         dview.get_feature('feature1').add_sequence(['row 1','43','56'])
   455         dview.get_feature('feature1').add_sequence(['row 2','43','56'])
   722         dview.get_feature('feature1').add_sequence(['row 2','43','56'])
   457         dview.get_feature('feature1').add_sequence(['row 3','43','56'])
   724         dview.get_feature('feature1').add_sequence(['row 3','43','56'])
   458         dview.get_feature('feature1').add_sequence(['row 4','43','56'])
   725         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'])
   726         dview.get_feature('feature1').get_data()[1].set_value(['row 2 updated', 'foo', '56'])
   460         config.save()
   727         config.save()
   461         prj.close()
   728         prj.close()
   462         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data')))
   729         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'temp')))
   463         config = prj.get_configuration('test1.confml')
   730         config = prj.get_configuration('test1.confml')
   464         dview = config.get_default_view()
   731         dview = config.get_default_view()
   465         self.assertEquals(dview.get_feature('feature1').get_template(),['c1','c2','c3'])
   732         self.assertEquals(dview.get_feature('feature1').get_template(),['c1','c2','c3'])
   466         self.assertEquals(dview.get_feature('feature1').get_value(),[['row 3', '43', '56'], 
   733         self.assertEquals(dview.get_feature('feature1').get_value(),[['row 3', '43', '56'], 
   467                                                                      ['row 4', '43', '56']])
   734                                                                      ['row 4', '43', '56']])
   473         
   740         
   474     def test_load_view(self):
   741     def test_load_view(self):
   475         reader = persistentconfml.get_reader_for_elem("configuration")
   742         reader = persistentconfml.get_reader_for_elem("configuration")
   476         etree = ElementTree.fromstring(simpleview)
   743         etree = ElementTree.fromstring(simpleview)
   477         obj = reader.loads(etree)
   744         obj = reader.loads(etree)
   478         self.assertEquals(obj.get_name(), 'unknown')
   745         self.assertEquals(obj.get_name(), None)
   479         self.assertEquals(obj.list_views(), ['Image creation'])
   746         self.assertEquals(obj.list_views(), ['Image creation'])
   480         self.assertEquals(obj.get_view('Image creation').get_name(),'Image creation')
   747         self.assertEquals(obj.get_view('Image creation').get_name(),'Image creation')
   481         self.assertEquals(obj.get_view('Image creation').desc,'Image creation related settings')
   748         self.assertEquals(obj.get_view('Image creation').desc,'Image creation related settings')
   482         self.assertEquals(obj.get_view('Image creation').list_features(),[])
   749         self.assertEquals(obj.get_view('Image creation').list_features(),[])
   483         self.assertEquals(obj.get_view('Image creation').list_groups(),['Imageproperties'])
   750         self.assertEquals(obj.get_view('Image creation').list_groups(),['Imageproperties _ test'])
   484         self.assertEquals(obj.get_view('Image creation').list_all_features(),['Imageproperties.imagetype', 
   751         self.assertEquals(obj.get_view('Image creation').list_all_features(),['Imageproperties _ test.proxy_imakerapi_imagetype', 
   485                                                                            'Imageproperties.rofs3version', 
   752                                                                            'Imageproperties _ test.proxy_imakerapi_rofs3version', 
   486                                                                            'Imageproperties.productname', 
   753                                                                            'Imageproperties _ test.proxy_imakerapi_productname', 
   487                                                                            'Imageproperties.outputLocation', 
   754                                                                            'Imageproperties _ test.proxy_imakerapi_outputLocation', 
   488                                                                            'Imageproperties.imagetarget'])
   755                                                                            'Imageproperties _ test.proxy_imaker_imagetarget'])
   489         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.imagetype').get_value(), '0') 
   756         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties _ test.proxy_imakerapi_imagetype').get_value(), '0') 
   490         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.rofs3version').get_value(), 'V .50.2009.04.0113 RND') 
   757         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties _ test.proxy_imakerapi_rofs3version').get_value(), 'V .50.2009.04.0113 RND') 
   491         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.productname').get_value(), 'myProduct') 
   758         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties _ test.proxy_imakerapi_productname').get_value(), 'myProduct') 
   492         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.outputLocation').get_value(), 'myProduct') 
   759         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties _ test.proxy_imakerapi_outputLocation').get_value(), 'myProduct') 
   493         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.imagetarget').get_value(), '2') 
   760         self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties _ test.proxy_imaker_imagetarget').get_value(), '2') 
   494         
   761         
       
   762     def test_load_view_with_overrides(self):
       
   763         reader = persistentconfml.get_reader_for_elem("configuration")
       
   764         etree = ElementTree.fromstring(overrideview)
       
   765         obj = reader.loads(etree)
       
   766         self.assertEquals(obj.get_name(), None)
       
   767         self.assertEquals(obj.list_views(), ['Image creation'])
       
   768         view = obj.get_view('Image creation')
       
   769         self.assertEquals(view.get_name(),'Image creation')
       
   770         self.assertEquals(view.list_all_features(),['Imageproperties.proxy_imakerapi_imagetype', 
       
   771                                                     'Imageproperties.proxy_imakerapi_productname', 
       
   772                                                     'Imageproperties.proxy_imakerapi_outputLocation'
       
   773                                                     ])
       
   774         
       
   775         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_productname').name, "New Product Name")
       
   776         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_productname').desc, "test desc override")
       
   777         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_outputLocation').minOccurs, 2)
       
   778         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_productname').minLength, 2)
       
   779 
       
   780     def test_load_view_with_option_overrides(self):
       
   781         reader = persistentconfml.get_reader_for_elem("configuration")
       
   782         etree = ElementTree.fromstring(option_overrideview)
       
   783         obj = reader.loads(etree)
       
   784         self.assertEquals(obj.get_name(), None)
       
   785         self.assertEquals(obj.list_views(), ['Image creation'])
       
   786         view = obj.get_view('Image creation')
       
   787         self.assertEquals(view.get_name(),'Image creation')
       
   788         self.assertEquals(view.list_all_features(),['Imageproperties.proxy_imakerapi_imagetype', 
       
   789                                                     'Imageproperties.proxy_imakerapi_productname', 
       
   790                                                     'Imageproperties.proxy_imakerapi_outputLocation'
       
   791                                                     ])
       
   792         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').get_option('value_2').get_name(), 'prd2')
       
   793         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').options['2'].get_name(), 'prd2')
       
   794         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').list_options(), ['value_0', 'value_1', 'value_2', 'value_2', 'value_5'])
       
   795         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').get_option('value_5').get_value(), '5')
       
   796         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_outputLocation').minOccurs, 2)
       
   797         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_productname').minLength, 2)
       
   798 
       
   799     def test_load_view_with_properties_overrides(self):
       
   800         reader = persistentconfml.get_reader_for_elem("configuration")
       
   801         etree = ElementTree.fromstring(properties_overrideview)
       
   802         obj = reader.loads(etree)
       
   803         view = obj.get_view('Image creation')
       
   804         
       
   805         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').get_property('mime').get_name(), 'mime')
       
   806         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').get_property('mime').get_value(), 'image/svgt image/jpg')
       
   807         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').get_property('mime2').name, 'mime2')
       
   808         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').get_property('mime2').value, 'image/svgt image/bmp')
       
   809         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').properties['mime'].get_name(), 'mime')
       
   810         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').properties['mime'].get_value(), 'image/svgt image/jpg')
       
   811         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').properties['mime2'].name, 'mime2')
       
   812         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').properties['mime2'].value, 'image/svgt image/bmp')
       
   813 
   495     def test_load_cvc_view(self):
   814     def test_load_cvc_view(self):
   496         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data')))
   815         prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data')))
   497         config = prj.get_configuration('cvc_root.confml')
   816         config = prj.get_configuration('cvc_root.confml')
   498         dview = config.get_default_view()
   817         dview = config.get_default_view()
   499         self.assertEquals(config.list_views(),['cvc_view_confml.Custom modeled ConfMLs for customization  foo'])
   818         self.assertEquals(config.list_views(),['cvc_view_confml.Custom modeled ConfMLs for customization  foo'])
   520         reader = persistentconfml.get_reader_for_elem("configuration")
   839         reader = persistentconfml.get_reader_for_elem("configuration")
   521         etree = ElementTree.fromstring(conffile.read())
   840         etree = ElementTree.fromstring(conffile.read())
   522         obj = reader.loads(etree)
   841         obj = reader.loads(etree)
   523         fea = obj.get_feature('CVC_StartupAnimationSequence.CVC_StartupAnimationTone')
   842         fea = obj.get_feature('CVC_StartupAnimationSequence.CVC_StartupAnimationTone')
   524         self.assertEquals(fea.list_properties(),['maxSize'])
   843         self.assertEquals(fea.list_properties(),['maxSize'])
   525         self.assertEquals(fea.properties['maxSize'].value,'100')
   844         self.assertEquals(fea.property_maxSize.value,'100')
   526 
   845 
   527         conffile = open(os.path.join(ROOT_PATH,"data/CVC_Preinstalled.confml"))
   846         conffile = open(os.path.join(ROOT_PATH,"data/CVC_Preinstalled.confml"))
   528         reader = persistentconfml.get_reader_for_elem("configuration")
   847         reader = persistentconfml.get_reader_for_elem("configuration")
   529         etree = ElementTree.fromstring(conffile.read())
   848         etree = ElementTree.fromstring(conffile.read())
   530         obj = reader.loads(etree)
   849         obj = reader.loads(etree)
   531         fea = obj.get_feature('CVC_PreinstalledContent.CVC_PreInstalledMMSs.CVC_PreInstalledMMS')
   850         fea = obj.get_feature('CVC_PreinstalledContent.CVC_PreInstalledMMSs.CVC_PreInstalledMMS')
   532         self.assertEquals(fea.list_properties(),['maxFileSize'])
   851         self.assertEquals(fea.list_properties(),['maxFileSize'])
   533         self.assertEquals(fea.properties['maxFileSize'].value,'35')
   852         self.assertEquals(fea.property_maxFileSize.value,'35')
   534 
   853 
   535     def test_load_voicemailbox_confml_from_file(self):
   854     def test_load_voicemailbox_confml_from_file(self):
   536         conffile = open(os.path.join(ROOT_PATH,"data/voicemailbox.confml"))
   855         conffile = open(os.path.join(ROOT_PATH,"data/voicemailbox.confml"))
   537         reader = persistentconfml.get_reader_for_elem("configuration")
   856         reader = persistentconfml.get_reader_for_elem("configuration")
   538         etree = ElementTree.fromstring(conffile.read())
   857         etree = ElementTree.fromstring(conffile.read())
   546         conffile = open(os.path.join(ROOT_PATH,"data/facets.confml"))
   865         conffile = open(os.path.join(ROOT_PATH,"data/facets.confml"))
   547         reader = persistentconfml.get_reader_for_elem("configuration")
   866         reader = persistentconfml.get_reader_for_elem("configuration")
   548         etree = ElementTree.fromstring(conffile.read())
   867         etree = ElementTree.fromstring(conffile.read())
   549         obj = reader.loads(etree)
   868         obj = reader.loads(etree)
   550         setting = obj.get_feature('Facets.MessageSize')
   869         setting = obj.get_feature('Facets.MessageSize')
   551         self.assertEquals(setting.minInclusive,'0')
   870         self.assertEquals(setting.minInclusive,0)
   552         self.assertEquals(setting.maxInclusive,'10')
   871         self.assertEquals(setting.maxInclusive,10)
   553         setting = obj.get_feature('Facets.MessageSize2')
   872         setting = obj.get_feature('Facets.MessageSize2')
   554         self.assertEquals(setting.minExclusive,'-1')
   873         self.assertEquals(setting.minExclusive,-1)
   555         self.assertEquals(setting.maxExclusive,'11')
   874         self.assertEquals(setting.maxExclusive,11)
   556         setting = obj.get_feature('Facets.StringPattern')
   875         setting = obj.get_feature('Facets.StringPattern')
   557         self.assertEquals(setting.pattern,"[a-zA-Z]{5,10}")        
   876         self.assertEquals(setting.pattern,"[a-zA-Z]{5,10}")        
   558         setting = obj.get_feature('Facets.TotalDigits')
   877         setting = obj.get_feature('Facets.TotalDigits')
   559         self.assertEquals(setting.totalDigits,'3')
   878         self.assertEquals(setting.totalDigits,3)
   560         dview = obj.get_default_view()
   879         dview = obj.get_default_view()
   561         intfea = dview.get_feature('Facets.MessageSize')
   880         intfea = dview.get_feature('Facets.MessageSize')
   562         self.assertEquals(intfea.type,'int')
   881         self.assertEquals(intfea.type,'int')
   563         self.assertEquals(intfea.value,9)
   882         self.assertEquals(intfea.value,9)
   564              
   883     
   565 class TestConfigurationWriter(unittest.TestCase):    
   884     def test_load_sequence_setting_test_confml_from_file(self):
       
   885         conffile = open(os.path.join(ROOT_PATH,"testdata/read_write/sequence_setting_test.confml"))
       
   886         reader = persistentconfml.get_reader_for_elem("configuration")
       
   887         etree = ElementTree.fromstring(conffile.read())
       
   888         obj = reader.loads(etree)
       
   889         dview = obj.get_default_view()
       
   890         fea = dview.get_feature('SequenceSettingTest.SequenceSetting')
       
   891         self.assertEquals(fea.get_template(),
       
   892                           [['seq/default_folder', None],
       
   893                            '1.0',
       
   894                            ['seq/default_file.txt', None],
       
   895                            '1',
       
   896                            'template',
       
   897                            'false',
       
   898                            '0',
       
   899                            '"opt 0"',
       
   900                            '2009-02-02',
       
   901                            '07:30:15',
       
   902                            '2009-02-02-07:00:00',
       
   903                            'P5Y4M3DT12H25M15S'])
       
   904 
       
   905     def test_load_selection_with_name_id_mapping(self):
       
   906         reader = persistentconfml.get_reader_for_elem("configuration")
       
   907         obj = reader.loads(ElementTree.fromstring(selectionsetting))
       
   908         self.assertEquals(obj._list(),['CTD_APs',
       
   909                                         'TestApplication', 
       
   910                                         'data'])
       
   911         self.assertEquals(obj.get_data('TestApplication.DefaultAP').get_map(), "CTD_APs/AP[@key='Operator 1']")
       
   912         
       
   913         #
       
   914 class TestConfigurationWriter(unittest.TestCase):
       
   915     def tearDown(self):
       
   916         if os.path.exists(os.path.join(ROOT_PATH,'temp/configwriter')):
       
   917             shutil.rmtree(os.path.join(ROOT_PATH,'temp/configwriter'))
       
   918     
   566     def test_dump_simple_configuration(self):
   919     def test_dump_simple_configuration(self):
   567         config = api.Configuration("test.confml")
   920         config = api.Configuration("test.confml")
   568         writer = persistentconfml.get_writer_for_class("Configuration")
   921         writer = persistentconfml.get_writer_for_class("Configuration")
   569         etree = writer.dumps(config)
   922         etree = writer.dumps(config)
   570         self.assertEquals(etree.get('name'), 'test_confml')
   923         self.assertEquals(etree.get('name'), 'test_confml')
   643 
   996 
   644 
   997 
   645     def test_configuration_with_features_and_properties(self):
   998     def test_configuration_with_features_and_properties(self):
   646         config = model.ConfmlConfiguration("test.confml")
   999         config = model.ConfmlConfiguration("test.confml")
   647         config.add_feature(model.ConfmlSetting('testfea11'))
  1000         config.add_feature(model.ConfmlSetting('testfea11'))
   648         config.testfea11.add_property(name='smaller',value='10')
  1001         config.testfea11.create_property(name='smaller',value='10')
   649         config.testfea11.add_property(name='bigger',value='1', unit='B')
  1002         config.testfea11.create_property(name='bigger',value='1', unit='B')
   650         elem = persistentconfml.dumps(config)
  1003         elem = persistentconfml.dumps(config)
   651         config2 =  persistentconfml.loads(elem)
  1004         config2 =  persistentconfml.loads(elem)
   652         self.assertEquals(config2.testfea11.properties['smaller'].value,'10')
  1005         self.assertEquals(config2.testfea11.property_smaller.value,'10')
   653         self.assertEquals(config2.testfea11.properties['bigger'].value,'1')
  1006         self.assertEquals(config2.testfea11.property_bigger.value,'1')
   654 
  1007 
   655     def test_configuration_with_features_and_minoccurs(self):
  1008     def test_configuration_with_features_and_minoccurs(self):
   656         config = model.ConfmlConfiguration("test.confml")
  1009         config = model.ConfmlConfiguration("test.confml")
   657         config.add_feature(model.ConfmlSequenceSetting('testfea11'))
  1010         config.add_feature(model.ConfmlSequenceSetting('testfea11'))
   658         config.testfea11.minOccurs = 1
  1011         config.testfea11.minOccurs = 1
   716         elem = persistentconfml.dumps(config)
  1069         elem = persistentconfml.dumps(config)
   717         config2 =  persistentconfml.loads(elem)
  1070         config2 =  persistentconfml.loads(elem)
   718         self.assertEquals(config2.testfea1.maxLength,10)
  1071         self.assertEquals(config2.testfea1.maxLength,10)
   719         self.assertEquals(config2.testfea2.maxLength,None)
  1072         self.assertEquals(config2.testfea2.maxLength,None)
   720         self.assertEquals(config2.testfea3.maxLength,100)
  1073         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 
  1074 
   735     def test_configuration_with_features(self):
  1075     def test_configuration_with_features(self):
   736         config = model.ConfmlConfiguration("test.confml")
  1076         config = model.ConfmlConfiguration("test.confml")
   737         config.add_feature(api.Feature('testfea1'))
  1077         config.add_feature(api.Feature('testfea1'))
   738         config.testfea1.add_feature(model.ConfmlSetting('testfea11'))
  1078         config.testfea1.add_feature(model.ConfmlSetting('testfea11'))
   744         config.add_feature(set1, 'testfea2')
  1084         config.add_feature(set1, 'testfea2')
   745         config.add_feature(api.Feature('testfea4'))
  1085         config.add_feature(api.Feature('testfea4'))
   746         config.add_feature(api.Feature('testfea5'))
  1086         config.add_feature(api.Feature('testfea5'))
   747         config.add_feature(api.Feature('testfea6'))
  1087         config.add_feature(api.Feature('testfea6'))
   748         set1.set_value('pre')
  1088         set1.set_value('pre')
   749         config.testfea1.set_value('foo:bar')
  1089         config.testfea1.testfea11.set_value('foo:bar')
   750         config.testfea4.set_value('4')
  1090         config.testfea4.set_value('4')
   751         writer = persistentconfml.get_writer_for_class("Configuration")
  1091         writer = persistentconfml.get_writer_for_class("Configuration")
   752         elem = writer.dumps(config)
  1092         elem = writer.dumps(config)
   753         #print ElementTree.tostring(elem)
  1093         #print ElementTree.tostring(elem)
   754         etree = ElementTree.fromstring(ElementTree.tostring(elem))
  1094         etree = ElementTree.fromstring(ElementTree.tostring(elem))
   775         set1.create_option('post', '3')
  1115         set1.create_option('post', '3')
   776         config.add_feature(set1, 'testfea2')
  1116         config.add_feature(set1, 'testfea2')
   777         config.add_feature(api.Feature('testfea4'))
  1117         config.add_feature(api.Feature('testfea4'))
   778         config.add_feature(api.Feature('testfea5'))
  1118         config.add_feature(api.Feature('testfea5'))
   779         config.add_feature(api.Feature('testfea6'))
  1119         config.add_feature(api.Feature('testfea6'))
   780         set1.value = ["pre","post"]       
  1120         set1.value = ["pre","post"]
   781         self.assertEquals(set1.get_data().get_value(), '"pre" "post"')
  1121         self.assertEquals(set1.get_datas()[0].get_value(), 'pre')
       
  1122         self.assertEquals(set1.get_datas()[1].get_value(), 'post')
   782         writer = persistentconfml.get_writer_for_class("Configuration")
  1123         writer = persistentconfml.get_writer_for_class("Configuration")
   783         elem = writer.dumps(config)
  1124         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>')
  1125         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 ref="testfea1"><setting ref="testfea11" /></feature><feature ref="testfea2"><setting ref="testfea21" type="multiSelection"><option name="pre" value="1" /><option name="normal" value="2" /><option name="post" value="3" /></setting></feature><feature ref="testfea4" /><feature ref="testfea5" /><feature ref="testfea6" /><data><testfea2><testfea21>pre</testfea21><testfea21>post</testfea21></testfea2></data></configuration>')
   785         etree = ElementTree.fromstring(ElementTree.tostring(elem))
  1126         etree = ElementTree.fromstring(ElementTree.tostring(elem))
   786         fea1 = etree.find('{http://www.s60.com/xml/confml/2}feature')
  1127         fea1 = etree.find('{http://www.s60.com/xml/confml/2}feature')
   787         self.assertEquals(fea1.get('ref'),'testfea1')
  1128         self.assertEquals(fea1.get('ref'),'testfea1')
   788         self.assertEquals(fea1.find('{http://www.s60.com/xml/confml/2}setting').get('ref'),'testfea11')
  1129         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)
  1130         config2 =  persistentconfml.get_reader_for_elem('configuration').loads(etree)
   790         self.assertEquals(config2.testfea2.list_features(),['testfea21'])
  1131         self.assertEquals(config2.testfea2.list_features(),['testfea21'])
   791         self.assertEquals(config2.testfea2.testfea21.get_type(),'multiSelection')
  1132         self.assertEquals(config2.testfea2.testfea21.get_type(),'multiSelection')
   792         self.assertEquals(config2.testfea2.testfea21.get_value(), ['pre', 'post'])
  1133         self.assertEquals(config2.testfea2.testfea21.get_value(), ('pre', 'post'))
   793 
  1134 
   794     def test_configuration_with_view(self):
  1135     def test_configuration_with_view(self):
   795         config = api.Configuration("view.confml")
  1136         config = model.ConfmlConfiguration("view.confml")
   796         config.add_view('testing')
  1137         config.create_view('testing')
   797         view = config.get_view('testing')
  1138         view = config.get_view('testing')
   798         view.add_group('group1')
  1139         view.create_group('group1')
   799         view.add_group('group2')
  1140         view.create_group('group2')
   800         view.add_group('group3')
  1141         view.create_group('group3')
   801         view.group1.add(api.FeatureLink('test.foo'))
  1142         fl = model.ConfmlFeatureLink('test.foo')
   802         view.group2.add(api.FeatureLink('foo.*'))
  1143         fl.desc = "test desc"
       
  1144         view.group1.add(fl)
       
  1145         view.group2.create_featurelink('foo.*')
   803         writer = persistentconfml.get_writer_for_class("Configuration")
  1146         writer = persistentconfml.get_writer_for_class("Configuration")
   804         elem = writer.dumps(config)
  1147         elem = writer.dumps(config)
   805         etree = ElementTree.fromstring(ElementTree.tostring(elem))
  1148         etree = ElementTree.fromstring(ElementTree.tostring(elem))
   806         view = etree.find('{http://www.s60.com/xml/confml/2}view')
  1149         view = etree.find('{http://www.s60.com/xml/confml/2}view')
   807         groups = etree.getiterator('{http://www.s60.com/xml/confml/2}group')
  1150         groups = etree.getiterator('{http://www.s60.com/xml/confml/2}group')
   811         self.assertEquals(listgroups[1].get('name'), 'group2')
  1154         self.assertEquals(listgroups[1].get('name'), 'group2')
   812         self.assertEquals(listgroups[2].get('name'), 'group3')
  1155         self.assertEquals(listgroups[2].get('name'), 'group3')
   813         settings = [elem for elem in etree.getiterator('{http://www.s60.com/xml/confml/2}setting')]
  1156         settings = [elem for elem in etree.getiterator('{http://www.s60.com/xml/confml/2}setting')]
   814         self.assertEquals(settings[0].get('ref'), 'test/foo')
  1157         self.assertEquals(settings[0].get('ref'), 'test/foo')
   815         self.assertEquals(settings[1].get('ref'), 'foo/*')
  1158         self.assertEquals(settings[1].get('ref'), 'foo/*')
   816 
  1159         
   817     def test_load_dump_reload_configuration_with_view(self):
  1160     def test_load_dump_reload_configuration_with_view_and_overrides(self):
   818         reader = persistentconfml.get_reader_for_elem("configuration")
  1161         reader = persistentconfml.get_reader_for_elem("configuration")
   819         etree = ElementTree.fromstring(simpleview)
  1162         etree = ElementTree.fromstring(overrideview)
   820         obj = reader.loads(etree)
  1163         obj = reader.loads(etree)
   821         # Getting the view populates it and check that the writing still works
  1164         # Getting the view populates it and check that the writing still works
   822         self.assertEquals(obj.get_view('Image creation').get_name(),'Image creation')
  1165         view = obj.get_view('Image creation')
   823         self.assertEquals(obj.get_view('Image creation').id,'imakerimage')
  1166         self.assertEquals(view.get_name(),'Image creation')
   824         self.assertEquals(obj.get_view('Image creation').list_groups(), ['Imageproperties'])
  1167         self.assertEquals(view.id,'imakerimage')
       
  1168         self.assertEquals(view.list_groups(), ['Imageproperties'])
       
  1169         viewfea = view.get_feature('Imageproperties.proxy_imakerapi_productname')
       
  1170         self.assertEquals(viewfea.name, "New Product Name")
   825         writer = persistentconfml.get_writer_for_class("Configuration")
  1171         writer = persistentconfml.get_writer_for_class("Configuration")
   826         elem = writer.dumps(obj)
  1172         elem = writer.dumps(obj)
   827         # Reload the configuration with view after dumping it to ensure data stays the same
  1173         # Reload the configuration with view after dumping it to ensure data stays the same
   828         elemstr = ElementTree.tostring(elem)      
  1174         elemstr = ElementTree.tostring(elem)      
   829         etree = ElementTree.fromstring(elemstr)
  1175         etree = ElementTree.fromstring(elemstr)
   830         obj = reader.loads(etree)
  1176         obj = reader.loads(etree)
   831         self.assertEquals(obj.get_view('Image creation').get_name(),'Image creation')
  1177         view = obj.get_view('Image creation')
   832         self.failUnlessEqual(obj.get_view('Image creation').id,'imakerimage', 'Known bug (#564)')
  1178         self.assertEquals(view.get_name(),'Image creation')
   833         self.assertEquals(obj.get_view('Image creation').id,'imakerimage')
  1179         self.failUnlessEqual(view.id,'imakerimage')
       
  1180         self.assertEquals(view.id,'imakerimage')
       
  1181         # Check that the override parameters are also saved / loaded
       
  1182         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_productname').name, 'New Product Name')
       
  1183         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_productname').has_attribute('name'), True)
       
  1184         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_productname').desc, "test desc override")
       
  1185         
       
  1186         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').get_option('value_2').get_name(), 'prd_renamed')
       
  1187         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_imagetype').list_options(), ['value_0', 'value_1', 'value_2', 'value_2'])
       
  1188         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_outputLocation').minOccurs, 2)
       
  1189         fea = view.get_feature('Imageproperties.proxy_imakerapi_outputLocation')
       
  1190         self.assertEquals(fea.has_attribute('name'), False)
       
  1191         
       
  1192         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_productname').minLength, 2)
       
  1193         # check that the original attributes are still valid
       
  1194         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_productname')._obj.name, "PRODUCT_NAME")
       
  1195         self.assertEquals(view.get_feature('Imageproperties.proxy_imakerapi_productname')._obj.desc, None)
   834         
  1196         
   835     def test_load_configuration_and_create_copy_and_dump(self):
  1197     def test_load_configuration_and_create_copy_and_dump(self):
   836         conffile = open(os.path.join(ROOT_PATH,"data/commsdatcreator.confml"))
  1198         conffile = open(os.path.join(ROOT_PATH,"data/commsdatcreator.confml"))
   837         #reader = persistentconfml.get_reader_for_elem("configuration")
  1199         #reader = persistentconfml.get_reader_for_elem("configuration")
   838         #etree = ElementTree.fromstring(conffile.read())
  1200         #etree = ElementTree.fromstring(conffile.read())
   839         obj = persistentconfml.loads(conffile.read())
  1201         obj = persistentconfml.loads(conffile.read())
   840         copyconfig = api.Configuration('data/copy_commsdatcreator.confml')
  1202         copyconfig = api.Configuration('temp/copy_commsdatcreator.confml')
   841         
  1203         
   842         for child in obj._objects():
  1204         for child in obj._objects():
   843             copyconfig._add(child)
  1205             copyconfig._add(child)
   844         output = persistentconfml.dumps(copyconfig)
  1206         output = persistentconfml.dumps(copyconfig)
   845         ofile = open(os.path.join(ROOT_PATH,'data/copy_commsdatcreator.confml'),"wb")
  1207         if not os.path.exists(os.path.join(ROOT_PATH,'temp')):
       
  1208             os.mkdir(os.path.join(ROOT_PATH,'temp'))
       
  1209         ofile = open(os.path.join(ROOT_PATH,'temp/copy_commsdatcreator.confml'),"wb")
   846         ofile.write(output)
  1210         ofile.write(output)
   847         ofile.close()
  1211         ofile.close()
   848         newconfig = persistentconfml.loads(output)
  1212         newconfig = persistentconfml.loads(output)
   849         orgview = obj.get_default_view()
  1213         orgview = obj.get_default_view()
   850         newview = newconfig.get_default_view()
  1214         newview = newconfig.get_default_view()
   854             if not orgval == newval:
  1218             if not orgval == newval:
   855                 self.fail("Value of %s does not match. org = %s != new = %s" % (fea,orgval,newval))
  1219                 self.fail("Value of %s does not match. org = %s != new = %s" % (fea,orgval,newval))
   856         
  1220         
   857     def test_create_configuration_with_meta_and_dump(self):
  1221     def test_create_configuration_with_meta_and_dump(self):
   858         prj = api.Project(api.Storage.open('dump','w'))
  1222         prj = api.Project(api.Storage.open('dump','w'))
   859         testconf = prj.create_configuration('test.confml')
  1223         testconf = prj.create_configuration('test.confml', True)
   860         testconf.include_configuration('test/foo.confml')
  1224         testconf.include_configuration('test/foo.confml')
   861         testconf.save()
  1225         testconf.save()
   862         prj.close()
  1226         prj.close()
   863         prj2 = api.Project(api.Storage.open('dump','a'))
  1227         prj2 = api.Project(api.Storage.open('dump','a'))
   864         testconf = prj2.get_configuration('test.confml')
  1228         testconf = prj2.get_configuration('test.confml')
   881         testconf = prj.get_configuration('test.confml')
  1245         testconf = prj.get_configuration('test.confml')
   882         self.assertEquals(testconf.meta, None)
  1246         self.assertEquals(testconf.meta, None)
   883         prj.close()
  1247         prj.close()
   884         shutil.rmtree('dump')
  1248         shutil.rmtree('dump')
   885 
  1249 
       
  1250     def test_write_selection_with_nameid_mapping(self):
       
  1251         reader = persistentconfml.get_reader_for_elem("configuration")
       
  1252         obj = reader.loads(ElementTree.fromstring(selectionsetting))
       
  1253         
       
  1254         self.assertEquals(obj.get_data('TestApplication.DefaultAP').get_map(), "CTD_APs/AP[@key='Operator 1']")
       
  1255         self.assertEquals(obj.get_data('TestApplication.DefaultAP').get_fearef(), "TestApplication.DefaultAP")
       
  1256         
       
  1257         writer = persistentconfml.get_writer_for_class("Configuration")
       
  1258         elem = writer.dumps(obj)
       
  1259         etree = ElementTree.fromstring(ElementTree.tostring(elem))
       
  1260         
       
  1261         self.assertEquals(
       
  1262                           etree.find('{http://www.s60.com/xml/confml/2}data')
       
  1263                           .find('{http://www.s60.com/xml/confml/2}TestApplication')
       
  1264                           .find('{http://www.s60.com/xml/confml/2}DefaultAP')
       
  1265                           .get('map'),
       
  1266                           "CTD_APs/AP[@key='Operator 1']")
       
  1267         
       
  1268     def test_write_multiselection_with_name_id_mapping(self):
       
  1269         reader = persistentconfml.get_reader_for_elem("configuration")
       
  1270         obj = reader.loads(ElementTree.fromstring(multiselection))
       
  1271 
       
  1272         self.assertEquals(obj.get_data('aFeature.selectionSetting').get_map(), "aFeature/exampleSequence[@key='12']")
       
  1273         self.assertEquals(obj.get_data('aFeature.multiselectionSetting')[0].get_value(), '0')
       
  1274         self.assertEquals(obj.get_data('aFeature.multiselectionSetting')[1].get_map(), "aFeature/exampleSequence[@key='12']")
       
  1275         self.assertEquals(obj.get_data('aFeature.multiselectionSetting')[2].get_map(), "aFeature/exampleSequence[@key='34']")
       
  1276         self.assertEquals(obj.get_data('aFeature.multiselectionSettingOverride')[0].get_map(), "aFeature/exampleSequence[@key='12']")
       
  1277         self.assertEquals(obj.get_data('aFeature.multiselectionSettingOverride')[1].get_map(), "aFeature/exampleSequence[@key='34']")
       
  1278         
       
  1279         writer = persistentconfml.get_writer_for_class("Configuration")
       
  1280         elem = writer.dumps(obj)
       
  1281         etree = ElementTree.fromstring(ElementTree.tostring(elem))
       
  1282         
       
  1283         self.assertEquals(
       
  1284                           etree.find('{http://www.s60.com/xml/confml/2}data')
       
  1285                           .find('{http://www.s60.com/xml/confml/2}aFeature')
       
  1286                           .find('{http://www.s60.com/xml/confml/2}selectionSetting')
       
  1287                           .get('map'), "aFeature/exampleSequence[@key='12']")
       
  1288         self.assertEquals(
       
  1289                   etree.find('{http://www.s60.com/xml/confml/2}data')
       
  1290                   .find('{http://www.s60.com/xml/confml/2}aFeature')
       
  1291                   .find('{http://www.s60.com/xml/confml/2}multiselectionSetting')
       
  1292                   .text, "0")
       
  1293 
       
  1294         mss = []
       
  1295         for data_elem in etree.getiterator('{http://www.s60.com/xml/confml/2}data'):
       
  1296             for mss_elem in data_elem.getiterator('{http://www.s60.com/xml/confml/2}multiselectionSetting'):
       
  1297                 mss.append(mss_elem.get('map'))
       
  1298         
       
  1299         self.assertEquals(mss, [None, "aFeature/exampleSequence[@key='12']", "aFeature/exampleSequence[@key='34']"])
       
  1300 
       
  1301         msso = []
       
  1302         for data_elem in etree.getiterator('{http://www.s60.com/xml/confml/2}data'):
       
  1303             for msso_elem in data_elem.getiterator('{http://www.s60.com/xml/confml/2}multiselectionSettingOverride'):
       
  1304                 msso.append(msso_elem.get('map'))
       
  1305         
       
  1306         self.assertEquals(msso, ["aFeature/exampleSequence[@key='12']", "aFeature/exampleSequence[@key='34']"])
       
  1307 
       
  1308         
   886 class TestMeta(unittest.TestCase):
  1309 class TestMeta(unittest.TestCase):
   887     def test_get_reader_for_meta(self):
  1310     def test_get_reader_for_meta(self):
   888         reader = persistentconfml.get_reader_for_elem("meta")
  1311         reader = persistentconfml.get_reader_for_elem("meta")
   889         self.assertTrue(isinstance(reader, persistentconfml.MetaReader))
  1312         self.assertTrue(isinstance(reader, persistentconfml.MetaReader))
   890 
  1313 
   953     def test_write_feature_elem(self):
  1376     def test_write_feature_elem(self):
   954         writer = persistentconfml.get_writer_for_class("Feature")
  1377         writer = persistentconfml.get_writer_for_class("Feature")
   955         celem = api.Feature('testing')
  1378         celem = api.Feature('testing')
   956         etree = writer.dumps(celem)
  1379         etree = writer.dumps(celem)
   957         self.assertEquals(etree.get('ref'),'testing')
  1380         self.assertEquals(etree.get('ref'),'testing')
   958         self.assertEquals(etree.get('name'),'testing')
  1381         self.assertEquals(etree.get('name'), None)
   959 
  1382 
   960 
  1383 
   961 class TestSetting(unittest.TestCase):
  1384 class TestSetting(unittest.TestCase):
   962     def test_get_reader_for_feature(self):
  1385     def test_get_reader_for_feature(self):
   963         reader = persistentconfml.get_reader_for_elem("setting")
  1386         reader = persistentconfml.get_reader_for_elem("setting")
   978     def test_write_setting_elem(self):
  1401     def test_write_setting_elem(self):
   979         writer = persistentconfml.get_writer_for_class("ConfmlSetting")
  1402         writer = persistentconfml.get_writer_for_class("ConfmlSetting")
   980         celem = model.ConfmlSetting('testing')
  1403         celem = model.ConfmlSetting('testing')
   981         etree = writer.dumps(celem)
  1404         etree = writer.dumps(celem)
   982         self.assertEquals(etree.get('ref'),'testing')
  1405         self.assertEquals(etree.get('ref'),'testing')
   983         self.assertEquals(etree.get('name'),'testing')
  1406         self.assertEquals(etree.get('name'), None)
   984         self.assertEquals(etree.get('type'),None)
  1407         self.assertEquals(etree.get('type'),None)
   985 
  1408 
   986     def test_write_setting_with_options(self):
  1409     def test_write_setting_with_options(self):
   987         writer = persistentconfml.get_writer_for_class("ConfmlSetting")
  1410         writer = persistentconfml.get_writer_for_class("ConfmlSetting")
   988         elem = model.ConfmlSetting('testing', type='selection')
  1411         elem = model.ConfmlSetting('testing', type='selection')
   991         elem.create_option('three','3')
  1414         elem.create_option('three','3')
   992         elem.create_option('four','bar')
  1415         elem.create_option('four','bar')
   993         etree = writer.dumps(elem)
  1416         etree = writer.dumps(elem)
   994 
  1417 
   995         self.assertEquals(etree.get('ref'),'testing')
  1418         self.assertEquals(etree.get('ref'),'testing')
   996         self.assertEquals(etree.get('name'),'testing')
  1419         self.assertEquals(etree.get('name'), None)
   997         self.assertEquals(etree.get('type'),'selection')
  1420         self.assertEquals(etree.get('type'),'selection')
   998         self.assertEquals(etree.find('option').get('name'),'one')
  1421         self.assertEquals(etree.find('option').get('name'),'one')
   999         self.assertEquals(etree.find('option').get('value'),'1')
  1422         self.assertEquals(etree.find('option').get('value'),'1')
  1000 
  1423 
  1001     def test_write_setting_with_facets(self):
  1424     def test_write_setting_with_facets(self):
  1006         setting.minExclusive = 0
  1429         setting.minExclusive = 0
  1007         setting.maxExclusive = 10
  1430         setting.maxExclusive = 10
  1008         setting.totalDigits = 3
  1431         setting.totalDigits = 3
  1009         setting.pattern = "\d*{3}"
  1432         setting.pattern = "\d*{3}"
  1010         etree = writer.dumps(setting)
  1433         etree = writer.dumps(setting)
  1011         
  1434         strxml = confmltree.tostring(etree, {'http://xs.com' : 'xs'} )
  1012         self.assertEquals(etree.find('xs:minInclusive').get('value'),'0')
  1435         etree = ElementTree.fromstring(strxml)
  1013         self.assertEquals(etree.find('xs:maxInclusive').get('value'),'10')
  1436         
  1014         self.assertEquals(etree.find('xs:minExclusive').get('value'),'0')
  1437         self.assertEquals(etree.find('{http://xs.com}minInclusive').get('value'),'0')
  1015         self.assertEquals(etree.find('xs:maxExclusive').get('value'),'10')
  1438         self.assertEquals(etree.find('{http://xs.com}maxInclusive').get('value'),'10')
  1016         self.assertEquals(etree.find('xs:totalDigits').get('value'),'3')
  1439         self.assertEquals(etree.find('{http://xs.com}minExclusive').get('value'),'0')
  1017         self.assertEquals(etree.find('xs:pattern').get('value'),'\d*{3}')
  1440         self.assertEquals(etree.find('{http://xs.com}maxExclusive').get('value'),'10')
       
  1441         self.assertEquals(etree.find('{http://xs.com}totalDigits').get('value'),'3')
       
  1442         self.assertEquals(etree.find('{http://xs.com}pattern').get('value'),'\d*{3}')
  1018         
  1443         
  1019         conffile = open(os.path.join(ROOT_PATH,"data/facets.confml"))
  1444         conffile = open(os.path.join(ROOT_PATH,"data/facets.confml"))
  1020         obj = persistentconfml.loads(conffile.read())
  1445         obj = persistentconfml.loads(conffile.read())
  1021         
  1446         
  1022         new_path = os.path.join(ROOT_PATH,"temp/facets_dumped.confml")
  1447         new_path = os.path.join(ROOT_PATH,"temp/facets_dumped.confml")
  1071                                                'type': 'int'}))
  1496                                                'type': 'int'}))
  1072         elem.append(ElementTree.Element('setting', {'ref' : 'strsetting',
  1497         elem.append(ElementTree.Element('setting', {'ref' : 'strsetting',
  1073                                                'name': 'strme',
  1498                                                'name': 'strme',
  1074                                                'type': 'string'}))
  1499                                                'type': 'string'}))
  1075         setobj = reader.loads(elem)
  1500         setobj = reader.loads(elem)
  1076         self.assertEqual(setobj.get_map_key().name,"intme")
  1501         self.assertEqual(setobj.mapKey, "intsetting")
  1077         self.assertEqual(setobj.get_map_value().name,"strme")
  1502         self.assertEqual(setobj.mapValue, "strsetting")
  1078 
  1503 
  1079 class TestSettingData(unittest.TestCase):
  1504 class TestSettingData(unittest.TestCase):
  1080     def test_get_reader_for_data(self):
  1505     def test_get_reader_for_data(self):
  1081         reader = persistentconfml.get_reader_for_elem("data")
  1506         reader = persistentconfml.get_reader_for_elem("data")
  1082         self.assertTrue(isinstance(reader, persistentconfml.DataReader))
  1507         self.assertTrue(isinstance(reader, persistentconfml.DataReader))
  1128         conffile = open(os.path.join(ROOT_PATH,"data/accessoryserver.confml"))
  1553         conffile = open(os.path.join(ROOT_PATH,"data/accessoryserver.confml"))
  1129         reader = persistentconfml.get_reader_for_elem("configuration")
  1554         reader = persistentconfml.get_reader_for_elem("configuration")
  1130         etree = ElementTree.fromstring(conffile.read())
  1555         etree = ElementTree.fromstring(conffile.read())
  1131         obj = reader.loads(etree)
  1556         obj = reader.loads(etree)
  1132         self.assertEquals(obj.meta.get('type'), 'featurelist')
  1557         self.assertEquals(obj.meta.get('type'), 'featurelist')
       
  1558 
       
  1559 class TestWriteSequenceTemplates(BaseTestCase):
       
  1560     EXPECTED_DIR = os.path.join(ROOT_PATH, 'testdata/seq_template/expected')
       
  1561     TEMP_DIR = os.path.join(ROOT_PATH, 'temp/')
       
  1562     
       
  1563     def _add_simple_sequence(self, config):
       
  1564         """
       
  1565         Add a feature with a simple sequence setting into the given
       
  1566         configuration.
       
  1567         @return: The added sequence setting object.
       
  1568         """
       
  1569         fea = api.Feature('TestFeature', name='Test feature')
       
  1570         seq_fea = model.ConfmlSequenceSetting('SequenceSetting', name='Sequence setting')
       
  1571         fea.add_feature(seq_fea)
       
  1572         config.add_feature(fea)
       
  1573     
       
  1574         seq_fea.add_feature(model.ConfmlStringSetting('String1', name="String 1"))
       
  1575         seq_fea.add_feature(model.ConfmlFileSetting('File', name="File setting"))
       
  1576         seq_fea.add_feature(model.ConfmlStringSetting('String2', name="String 2"))
       
  1577         
       
  1578         return seq_fea
       
  1579     
       
  1580     def _add_complex_sequence(self, config):
       
  1581         """
       
  1582         Add a feature with a complex sequence setting into the given
       
  1583         configuration.
       
  1584         @return: The added sequence setting object.
       
  1585         """
       
  1586         fea = api.Feature('TestFeature', name='Test feature')
       
  1587         seq_fea = model.ConfmlSequenceSetting('SequenceSetting', name='Sequence setting')
       
  1588         fea.add_feature(seq_fea)
       
  1589         config.add_feature(fea)
       
  1590     
       
  1591         seq_fea.add_feature(model.ConfmlFileSetting('File', name="File setting"))
       
  1592         seq_fea.add_feature(model.ConfmlFolderSetting('Folder', name="Folder setting"))
       
  1593         seq_fea.add_feature(model.ConfmlStringSetting('String', name="String setting"))
       
  1594         seq_fea.add_feature(model.ConfmlIntSetting('Int', name="Int setting"))
       
  1595         seq_fea.add_feature(model.ConfmlRealSetting('Real', name="Real setting"))
       
  1596         seq_fea.add_feature(model.ConfmlBooleanSetting('Boolean', name="Boolean setting"))
       
  1597         seq_fea.add_feature(model.ConfmlDateSetting('Date', name="Date setting"))
       
  1598         seq_fea.add_feature(model.ConfmlTimeSetting('Time', name="Time setting"))
       
  1599         seq_fea.add_feature(model.ConfmlDateTimeSetting('DateTime', name="Date-time setting"))
       
  1600         seq_fea.add_feature(model.ConfmlDurationSetting('Duration', name="Duration setting"))
       
  1601         
       
  1602         return seq_fea
       
  1603     
       
  1604     def test_write_simple_seq_no_template(self):
       
  1605         FILE_NAME = 'write_simple_seq_no_template.confml'
       
  1606         prj = api.Project(api.Storage.open(self.TEMP_DIR, "w"))
       
  1607         config = prj.create_configuration(FILE_NAME)
       
  1608         
       
  1609         seq = self._add_simple_sequence(config)
       
  1610     
       
  1611         seq.add_sequence(['row 1', ['lp1', 'tp1'], 'x'])
       
  1612         seq.add_sequence(['row 2', ['lp2', 'tp2'], 'y'])
       
  1613     
       
  1614         config.save()
       
  1615         prj.close()
       
  1616         
       
  1617         self.assert_file_contents_equal(
       
  1618             os.path.join(self.TEMP_DIR, FILE_NAME),
       
  1619             os.path.join(self.EXPECTED_DIR, 'simple_seq_no_template.confml'))
       
  1620     
       
  1621     def test_write_simple_seq(self):
       
  1622         FILE_NAME = 'write_simple_seq.confml'
       
  1623         prj = api.Project(api.Storage.open(self.TEMP_DIR, "w"))
       
  1624         config = prj.create_configuration(FILE_NAME)
       
  1625         config.name = 'foo'
       
  1626         
       
  1627         seq = self._add_simple_sequence(config)
       
  1628     
       
  1629         seq.set_template(['c1', ['lp', 'tp'], 'c2'])
       
  1630         seq.add_sequence(['row 1', ['lp1', 'tp1'], 'x'])
       
  1631         seq.add_sequence(['row 2', ['lp2', 'tp2'], 'y'])
       
  1632     
       
  1633         config.save()
       
  1634         prj.close()
       
  1635         
       
  1636         self.assert_file_contents_equal(
       
  1637             os.path.join(self.TEMP_DIR, FILE_NAME),
       
  1638             os.path.join(self.EXPECTED_DIR, 'simple_seq.confml'))
       
  1639     
       
  1640     def test_write_simple_seq_2(self):
       
  1641         FILE_NAME = 'write_simple_seq_2.confml'
       
  1642         prj = api.Project(api.Storage.open(self.TEMP_DIR, "w"))
       
  1643         config = prj.create_configuration(FILE_NAME)
       
  1644         config.name = 'foo'
       
  1645         
       
  1646         seq = self._add_simple_sequence(config)
       
  1647     
       
  1648         # It shouldn't matter if the template is reset in the middle
       
  1649         seq.set_template(['x1', ['lp', 'tp'], 'x2'])
       
  1650         seq.add_sequence(['row 1', ['lp1', 'tp1'], 'x'])
       
  1651         seq.set_template(['c1', ['lp', 'tp'], 'c2'])
       
  1652         seq.add_sequence(['row 2', ['lp2', 'tp2'], 'y'])
       
  1653     
       
  1654         config.save()
       
  1655         prj.close()
       
  1656         
       
  1657         self.assert_file_contents_equal(
       
  1658             os.path.join(self.TEMP_DIR, FILE_NAME),
       
  1659             os.path.join(self.EXPECTED_DIR, 'simple_seq.confml'))
       
  1660     
       
  1661     def test_write_simple_seq_3(self):
       
  1662         FILE_NAME = 'write_simple_seq_3.confml'
       
  1663         prj = api.Project(api.Storage.open(self.TEMP_DIR, "w"))
       
  1664         config = prj.create_configuration(FILE_NAME)
       
  1665         config.name = 'foo'
       
  1666         
       
  1667         seq = self._add_simple_sequence(config)
       
  1668         
       
  1669         # Add multiple templates into the data section to make
       
  1670         # sure that they are all replaced when set_template() is called
       
  1671         def create_template_data():
       
  1672             template_data = api.Data(fqr='TestFeature.SequenceSetting', template=True)
       
  1673             template_data.add(api.Data(ref='String1', value='t1'))
       
  1674             data_a1 = api.Data(ref='File')
       
  1675             data_a1.add(api.Data(ref='localPath', value='lp'))
       
  1676             data_a1.add(api.Data(ref='targetPath', value='tp'))
       
  1677             template_data.add(data_a1)
       
  1678             template_data.add(api.Data(ref='String2', value='t2'))
       
  1679             return template_data
       
  1680         from cone.public import container
       
  1681         config.add_data(create_template_data(), policy=container.APPEND)
       
  1682         config.add_data(create_template_data(), policy=container.APPEND)
       
  1683         config.add_data(create_template_data(), policy=container.APPEND)
       
  1684         seq = config.get_default_view().get_feature('TestFeature.SequenceSetting')
       
  1685         self.assertEquals(seq.get_template(), ['t1', ['lp', 'tp'], 't2'])
       
  1686         
       
  1687         # Add some data and set the template
       
  1688         seq.add_sequence(['row 1', ['lp1', 'tp1'], 'x'])
       
  1689         seq.add_sequence(['row 2', ['lp2', 'tp2'], 'y'])
       
  1690         seq.set_template(['c1', ['lp', 'tp'], 'c2'])
       
  1691     
       
  1692         config.save()
       
  1693         prj.close()
       
  1694         
       
  1695         self.assert_file_contents_equal(
       
  1696             os.path.join(self.TEMP_DIR, FILE_NAME),
       
  1697             os.path.join(self.EXPECTED_DIR, 'simple_seq.confml'))
       
  1698     
       
  1699     def test_write_complex_seq(self):
       
  1700         FILE_NAME = 'write_complex_seq.confml'
       
  1701         prj = api.Project(api.Storage.open(self.TEMP_DIR, "w"))
       
  1702         config = prj.create_configuration(FILE_NAME)
       
  1703         
       
  1704         seq = self._add_complex_sequence(config)
       
  1705         
       
  1706         seq.set_template([['file lp', 'file tp'], ['folder lp', 'folder tp'],
       
  1707                           'string', '0', '0.1', 'false',
       
  1708                           '2010-02-10', '00:00:00', '2010-02-10-00:00:00', 'P5Y4M3DT12H25M15S'])
       
  1709         
       
  1710         seq.add_sequence([['file lp1', 'file tp1'], ['folder lp1', 'folder tp1'],
       
  1711                           'string1', '1', '1.1', 'true',
       
  1712                           '2009-02-01', '01:30:15', '2009-02-01-01:00:00', 'PT1S'])
       
  1713         seq.add_sequence([['file lp2', 'file tp2'], ['folder lp2', 'folder tp2'],
       
  1714                           'string2', '2', '1.2', 'false',
       
  1715                           '2009-02-02', '02:30:15', '2009-02-02-02:00:00', 'PT2S'])
       
  1716         
       
  1717         config.save()
       
  1718         prj.close()
       
  1719         
       
  1720         self.assert_file_contents_equal(
       
  1721             os.path.join(self.TEMP_DIR, FILE_NAME),
       
  1722             os.path.join(self.EXPECTED_DIR, 'complex_seq.confml'))
       
  1723     
       
  1724     def test_write_complex_seq_with_nones(self):
       
  1725         FILE_NAME = 'write_complex_seq_with_nones.confml'
       
  1726         prj = api.Project(api.Storage.open(self.TEMP_DIR, "w"))
       
  1727         config = prj.create_configuration(FILE_NAME)
       
  1728         
       
  1729         seq = self._add_complex_sequence(config)
       
  1730         
       
  1731         seq.set_template([['file lp', None], [None, 'folder tp'],
       
  1732                           'string', None, 0.1, None,
       
  1733                           '2010-02-10', None, '2010-02-10-00:00:00', None])
       
  1734         
       
  1735         seq.add_sequence([['file lp1', None], [None, 'folder tp1'],
       
  1736                           'string1', None, 1.1, None,
       
  1737                           '2009-02-01', None, '2009-02-01-01:00:00', None])
       
  1738         
       
  1739         config.save()
       
  1740         prj.close()
       
  1741         
       
  1742         self.assert_file_contents_equal(
       
  1743             os.path.join(self.TEMP_DIR, FILE_NAME),
       
  1744             os.path.join(self.EXPECTED_DIR, 'complex_seq_with_nones.confml'))
  1133 
  1745 
  1134 class TestReadWriteConfml(BaseTestCase):
  1746 class TestReadWriteConfml(BaseTestCase):
  1135     """
  1747     """
  1136     Test case for ensuring that reading in a ConfML file and then writing
  1748     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
  1749     it out again results in logically the same data (XML-wise) as the
  1174                 try:        f.write(data)
  1786                 try:        f.write(data)
  1175                 finally:    f.close()
  1787                 finally:    f.close()
  1176             
  1788             
  1177             write(PATH_ORIGINAL, original_data_normalized)
  1789             write(PATH_ORIGINAL, original_data_normalized)
  1178             write(PATH_DUMPED, model_data_normalized)
  1790             write(PATH_DUMPED, model_data_normalized)
  1179             self.fail("Known bug (#506)")
  1791             #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))
  1792             self.fail("Read-write output for file '%s' is different, see the files in '%s'" % (file_name, output_dir))
  1181         else:
  1793         else:
  1182             # Test was successful, remove any old files that might have been there,
  1794             # 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
  1795             # so that the output directories only contain files for the tests that
  1184             # failed
  1796             # failed
  1188     def _run_test_for_file(self, file_path):
  1800     def _run_test_for_file(self, file_path):
  1189         self._run_read_and_write_test(
  1801         self._run_read_and_write_test(
  1190             file_name  = os.path.basename(file_path),
  1802             file_name  = os.path.basename(file_path),
  1191             input_dir  = os.path.dirname(file_path),
  1803             input_dir  = os.path.dirname(file_path),
  1192             output_dir = os.path.normpath(os.path.join(ROOT_PATH, 'temp/read_write_results')))
  1804             output_dir = os.path.normpath(os.path.join(ROOT_PATH, 'temp/read_write_results')))
       
  1805     
       
  1806     def test_create_configuration_with_view_includes_to_storage(self):
       
  1807         prj = api.Project(api.Storage.open("temp/testprojectviews", "w"))
       
  1808         test = prj.create_configuration("testview.confml")
       
  1809         fea1 = test.create_feature("fea1")
       
  1810         set1 =  fea1.create_feature('set1', type="int")
       
  1811         view = test.create_view("Testing")
       
  1812         test1 = prj.create_configuration("testview1.confml")
       
  1813         view1 = test1.create_view("subview1")
       
  1814         test2 = prj.create_configuration("testview2.confml")
       
  1815         view2 = test2.create_view("subview2")
       
  1816         group = view.create_group("group1")
       
  1817         group.create_featurelink("fea1/set1")
       
  1818         group2 = view2.create_group("group2")
       
  1819         group2.create_featurelink("fea1/set1")
       
  1820         view.add(api.ConfigurationProxy("testview1.confml"))
       
  1821         group.add(api.ConfigurationProxy("testview2.confml"))
       
  1822         prj.save()
       
  1823         prj.close()
       
  1824         
       
  1825         prj = api.Project(api.Storage.open("temp/testprojectviews", "w"))
       
  1826         test = prj.get_configuration("testview.confml")
       
  1827         self.assertEquals(test.list_views(), ['Testing', 
       
  1828                                               'Testing.group1.testview2_confml.subview2',
       
  1829                                               'Testing.testview1_confml.subview1'])
       
  1830         
       
  1831         view = test.get_view('Testing')
       
  1832         
       
  1833         self.assertEquals(view.list_all_features(), ['group1.proxy_fea1_set1']) 
       
  1834         
       
  1835         self.assertTrue(os.path.exists("temp/testprojectviews"))
       
  1836         shutil.rmtree("temp")
  1193 
  1837 
  1194 # Create a separate test method for each ConfML file in the read-write test data
  1838 # 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')
  1839 _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)):
  1840 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)
  1841     path = os.path.join(_READ_WRITE_TESTDATA_DIR, filename)
  1203     def _register_test_method(path):
  1847     def _register_test_method(path):
  1204         method = lambda self: self._run_test_for_file(path)
  1848         method = lambda self: self._run_test_for_file(path)
  1205         method.__name__ = test_method_name
  1849         method.__name__ = test_method_name
  1206         setattr(TestReadWriteConfml, test_method_name, method)
  1850         setattr(TestReadWriteConfml, test_method_name, method)
  1207     _register_test_method(path)
  1851     _register_test_method(path)
  1208 
  1852     
  1209 
  1853 
  1210 if __name__ == '__main__':
  1854 if __name__ == '__main__':
  1211     unittest.main()
  1855     unittest.main()