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