configurationengine/source/cone/public/tests/unittest_plugin_api.py
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
child 4 0951727b8815
equal deleted inserted replaced
2:87cfa131b535 3:e7e0ae78773e
    14 # Description:
    14 # Description:
    15 #
    15 #
    16 
    16 
    17 import unittest
    17 import unittest
    18 import os
    18 import os
    19 import logging
    19 
    20 import __init__
       
    21 from cone.public import *
    20 from cone.public import *
    22 from cone.public import _plugin_reader
    21 from cone.public import _plugin_reader
    23 ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
    22 ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
    24 
    23 
    25 Tfd = _plugin_reader.TempVariableDefinition
    24 Tfd = _plugin_reader.TempVariableDefinition
   126     <elem z="3"/>
   125     <elem z="3"/>
   127 </impl>
   126 </impl>
   128 """.encode('utf-8')
   127 """.encode('utf-8')
   129 
   128 
   130 SINGLE_IMPL_2 = """<?xml version="1.0" encoding="UTF-8"?>
   129 SINGLE_IMPL_2 = """<?xml version="1.0" encoding="UTF-8"?>
   131 <joujou xmlns="http://www.test.com/xml/2"/>
   130 <impl xmlns="http://www.test.com/xml/2"/>
   132 """.encode('utf-8')
   131 """.encode('utf-8')
   133 
   132 
   134 SINGLE_IMPL_3 = """<?xml version="1.0" encoding="UTF-8"?>
   133 SINGLE_IMPL_3 = """<?xml version="1.0" encoding="UTF-8"?>
   135 <impl xmlns="http://www.test.com/xml/3">
   134 <impl xmlns="http://www.test.com/xml/3">
   136     <elem x="1"/>
   135     <elem x="1"/>
   137 </impl>
   136 </impl>
   138 """.encode('utf-8')
   137 """.encode('utf-8')
   139 
   138 
   140 IGNORED_NAMESPACE_IMPL_1 = """<?xml version="1.0" encoding="UTF-8"?>
       
   141 <common:container xmlns:common="http://www.symbianfoundation.org/xml/implml/1">
       
   142     <impl xmlns="http://www.test.com/xml/3">
       
   143         <elem x="1"/>
       
   144     </impl>
       
   145     
       
   146     <ignored xmlns:ignored="http://www.test.com/xml/ignored/3">
       
   147         <elem test="foo"/>
       
   148     </ignored>
       
   149 </common:container>
       
   150 """.encode('utf-8')
       
   151 
       
   152 IGNORED_NAMESPACE_IMPL_2 = """<?xml version="1.0" encoding="UTF-8"?>
       
   153 <impl xmlns="http://www.test.com/xml/3" xmlns:ignored="http://www.test.com/xml/ignored/3">
       
   154     <elem x="1"/>
       
   155     <ignored:some_elem/>
       
   156 </impl>
       
   157 """.encode('utf-8')
       
   158 
       
   159 NO_IMPL = """<?xml version="1.0" encoding="UTF-8"?>
   139 NO_IMPL = """<?xml version="1.0" encoding="UTF-8"?>
   160 <impl>
   140 <impl>
   161 </impl>
   141 </impl>
   162 """.encode('utf-8')
   142 """.encode('utf-8')
   163 
   143 
   193     def get_doc(self, ref):
   173     def get_doc(self, ref):
   194         return utils.etree.fromstring(self.get_resource(ref).read())
   174         return utils.etree.fromstring(self.get_resource(ref).read())
   195     
   175     
   196     def get_default_view(self):
   176     def get_default_view(self):
   197         return MockView(self.features)
   177         return MockView(self.features)
       
   178     
       
   179     def layered_implml(self):
       
   180         result = container.DataContainer()
       
   181         for res in self.resources.iterkeys():
       
   182             result.add_value(res, res)
       
   183         return result
       
   184 
       
   185 class SimpleImpl(plugin.ImplBase):
       
   186     def __init__(self, ref, configuration):
       
   187         super(SimpleImpl, self).__init__(ref, configuration)
       
   188         self.generate_invoked = False
       
   189         self.outputfile = ''
       
   190     
       
   191     def generate(self, context=None):
       
   192         if context:
       
   193             if self.outputfile:
       
   194                 f = context.create_file(self.outputfile, implementation=self)
       
   195                 f.close()
       
   196                 
       
   197         self.generate_invoked = True
   198 
   198 
   199 class MockImpl(plugin.ImplBase):
   199 class MockImpl(plugin.ImplBase):
       
   200     IMPL_TYPE_ID = 'mock'
       
   201     
   200     def __init__(self, data):
   202     def __init__(self, data):
   201         self.data = data
   203         self.data = data
   202         self.generate_invoked = False
   204         self.generate_invoked = False
   203     
   205         self.outputfile = ''
       
   206         self.refs = None
       
   207         self.ref = ''
       
   208         
   204     @classmethod
   209     @classmethod
   205     def create(cls, resource_ref, configuration, data):
   210     def create(cls, resource_ref, configuration, data):
   206         impl = cls(data)
   211         impl = cls(data)
   207         plugin.ImplBase.__init__(impl, resource_ref, configuration)
   212         plugin.ImplBase.__init__(impl, resource_ref, configuration)
   208         return impl
   213         return impl
   227     def __lt__(self, other):
   232     def __lt__(self, other):
   228         if type(self) == type(other):
   233         if type(self) == type(other):
   229             return self.data < other.data
   234             return self.data < other.data
   230         else:
   235         else:
   231             return False
   236             return False
       
   237 
       
   238     def get_refs(self):
       
   239         """
       
   240         Return a list of all ConfML setting references that affect this
       
   241         implementation. May also return None if references are not relevant
       
   242         for the implementation.
       
   243         """
       
   244         return self.refs
   232 
   245 
   233 class MockReaderBase(plugin.ReaderBase):
   246 class MockReaderBase(plugin.ReaderBase):
   234     @classmethod
   247     @classmethod
   235     def read_impl(cls, resource_ref, configuration, root_elem):
   248     def read_impl(cls, resource_ref, configuration, root_elem):
   236         data = [cls.__name__, resource_ref]
   249         data = [cls.__name__, resource_ref]
   238             data.append(elem.attrib)
   251             data.append(elem.attrib)
   239         return MockImpl.create(resource_ref, configuration, data)
   252         return MockImpl.create(resource_ref, configuration, data)
   240 
   253 
   241 class MockReader1(MockReaderBase):
   254 class MockReader1(MockReaderBase):
   242     NAMESPACE = "http://www.test.com/xml/1"
   255     NAMESPACE = "http://www.test.com/xml/1"
       
   256     NAMESPACE_ID = "mock1"
       
   257     ROOT_ELEMENT_NAME = "impl"
   243     FILE_EXTENSIONS = ['mock1ml']
   258     FILE_EXTENSIONS = ['mock1ml']
   244 class MockReader2(MockReaderBase):
   259 class MockReader2(MockReaderBase):
   245     NAMESPACE = "http://www.test.com/xml/2"
   260     NAMESPACE = "http://www.test.com/xml/2"
       
   261     NAMESPACE_ID = "mock2"
       
   262     ROOT_ELEMENT_NAME = "impl"
   246     FILE_EXTENSIONS = ['mock2ml']
   263     FILE_EXTENSIONS = ['mock2ml']
   247 class MockReader3(MockReaderBase):
   264 class MockReader3(MockReaderBase):
   248     NAMESPACE = "http://www.test.com/xml/3"
   265     NAMESPACE = "http://www.test.com/xml/3"
       
   266     NAMESPACE_ID = "mock3"
       
   267     ROOT_ELEMENT_NAME = "impl"
   249     IGNORED_NAMESPACES = ["http://www.test.com/xml/ignored/3"]
   268     IGNORED_NAMESPACES = ["http://www.test.com/xml/ignored/3"]
   250     FILE_EXTENSIONS = ['mock3ml', 'test3ml']
   269     FILE_EXTENSIONS = ['mock3ml', 'test3ml']
   251 
   270 
   252 MOCK_READER_CLASSES = [MockReader1, MockReader2, MockReader3]
   271 MOCK_READER_CLASSES = [MockReader1, MockReader2, MockReader3]
   253 
   272 
   264     'layer1/implml/broken.implml'           : 'Some invalid XML data...',
   283     'layer1/implml/broken.implml'           : 'Some invalid XML data...',
   265     'layer1/implml/single1.mock1ml'         : SINGLE_IMPL_1,
   284     'layer1/implml/single1.mock1ml'         : SINGLE_IMPL_1,
   266     'layer1/implml/single2.mock2ml'         : SINGLE_IMPL_2,
   285     'layer1/implml/single2.mock2ml'         : SINGLE_IMPL_2,
   267     'layer1/implml/single3.mock3ml'         : SINGLE_IMPL_3,
   286     'layer1/implml/single3.mock3ml'         : SINGLE_IMPL_3,
   268     'layer1/implml/single3.test3ml'         : SINGLE_IMPL_3,
   287     'layer1/implml/single3.test3ml'         : SINGLE_IMPL_3,
   269     'layer1/implml/ignored_ns_1.mock3ml'    : IGNORED_NAMESPACE_IMPL_1,
       
   270     'layer1/implml/ignored_ns_2.mock3ml'    : IGNORED_NAMESPACE_IMPL_2,
       
   271     'layer1/implml/multi1.dummyml'          : MULTI_IMPL_1,
   288     'layer1/implml/multi1.dummyml'          : MULTI_IMPL_1,
   272     'layer1/implml/dummy'                   : MULTI_IMPL_1,
   289     'layer1/implml/dummy'                   : MULTI_IMPL_1,
   273 })
   290 })
       
   291 
       
   292 
       
   293 class TestPluginGenerationContext(unittest.TestCase):
       
   294     def test_generation_context_handle_terminal(self):
       
   295         config = api.Configuration()
       
   296         context = plugin.GenerationContext(configuration=config)
       
   297         self.assertRaises(exceptions.NotFound, context.handle_terminal, 'feature')
       
   298         config.create_feature('feature')
       
   299         # rebuild default view
       
   300         config._remove('?default_view')
       
   301         self.assertEquals(context.handle_terminal('feature'), None)
       
   302             
       
   303 
       
   304     def test_generation_create_file(self):
       
   305         config = api.Configuration()
       
   306         context = plugin.GenerationContext(configuration=config, 
       
   307                                            output=os.path.join(ROOT_PATH, 'temp'),
       
   308                                            phase="normal")
       
   309         mi = MockImpl({})
       
   310         outfile = context.create_file('foobar/test.txt', implementation=mi)
       
   311         outfile.write("Test output file creation")
       
   312         outfile.close()
       
   313         expected = utils.resourceref.norm(os.path.join(context.output, 'foobar/test.txt'))
       
   314         self.assertEquals(len(context.generation_output), 1)
       
   315         self.assertEquals(context.generation_output[0].name, expected)
       
   316         self.assertEquals(context.generation_output[0].implementation, mi)
       
   317         self.assertEquals(context.generation_output[0].phase, "normal")
       
   318         self.assertTrue(os.path.exists(expected))
       
   319         os.unlink(expected)
       
   320 
       
   321         absfile = utils.resourceref.norm(os.path.join(ROOT_PATH, 'temp/foobar/abspath.txt'))
       
   322         outfile = context.create_file(absfile, implementation=mi)
       
   323         outfile.write("Test output file creation")
       
   324         outfile.close()
       
   325         self.assertEquals(len(context.generation_output), 2)
       
   326         self.assertEquals(context.generation_output[1].name, absfile)
       
   327         self.assertEquals(context.generation_output[1].implementation, mi)
       
   328         self.assertEquals(context.generation_output[1].phase, "normal")
       
   329         self.assertTrue(os.path.exists(absfile))
       
   330         os.unlink(absfile)
       
   331         
       
   332     def test_generation_add_output(self):
       
   333         config = api.Configuration()
       
   334         context = plugin.GenerationContext(configuration=config, 
       
   335                                            output=os.path.join(ROOT_PATH, 'temp'),
       
   336                                            phase="normal")
       
   337         mi = MockImpl({})
       
   338         context.add_file('add.txt', implementation=mi)
       
   339 
       
   340         self.assertEquals(len(context.generation_output), 1)
       
   341         self.assertEquals(context.generation_output[0].name, utils.resourceref.norm(os.path.join(context.output, 'add.txt')))
       
   342         self.assertEquals(context.generation_output[0].implementation, mi)
       
   343         self.assertEquals(context.generation_output[0].phase, "normal")
       
   344         
       
   345         external_output = utils.resourceref.norm(os.path.join(ROOT_PATH, 'temp', 'external/foobar.txt'))
       
   346         context.add_file(external_output, implementation=mi)
       
   347         self.assertEquals(len(context.generation_output), 2)
       
   348         self.assertEquals(context.generation_output[1].name, external_output)
       
   349         self.assertEquals(context.generation_output[1].implementation, mi)
       
   350         self.assertEquals(context.generation_output[1].phase, "normal")
       
   351 
       
   352     def test_generation_get_output(self):
       
   353         config = api.Configuration()
       
   354         context = plugin.GenerationContext(configuration=config, 
       
   355                                            output=os.path.join(ROOT_PATH, 'temp'),
       
   356                                            phase="normal")
       
   357         mi = MockImpl({})
       
   358         context.add_file('add1.txt', implementation=mi)
       
   359         context.add_file('foo/add2.txt', implementation=None)
       
   360 
       
   361         self.assertEquals(len(context.get_output()), 2)
       
   362         self.assertEquals(context.get_output()[1].filename, 'add2.txt')
       
   363         self.assertEquals(context.get_output()[1].abspath, os.path.normpath(os.path.join(context.output,'foo/add2.txt')))
       
   364         self.assertEquals(context.get_output()[1].relpath, os.path.normpath('foo/add2.txt'))
       
   365         self.assertEquals(len(context.get_output(implml_type='mock')), 1)
       
   366         self.assertEquals(context.get_output(implml_type='mock')[0].filename, 'add1.txt')
       
   367 
       
   368     def test_generation_get_refs_no_output(self):
       
   369         config = api.Configuration()
       
   370         context = plugin.GenerationContext(configuration=config, 
       
   371                                            output=os.path.join(ROOT_PATH, 'temp'),
       
   372                                            phase="normal")
       
   373         self.assertEquals(context.get_refs_with_no_output(),[]) 
       
   374         self.assertEquals(context.get_refs_with_no_output(['']),['']) 
       
   375 
       
   376         context.changed_refs = ['foo.bar', 
       
   377                                 'foo.two',
       
   378                                 'foo.three']
       
   379         
       
   380         self.assertEquals(context.get_refs_with_no_output(),['foo.bar', 
       
   381                                                              'foo.three',
       
   382                                                              'foo.two']) 
       
   383         mi = MockImpl({})
       
   384         mi.refs = ['foo.bar','nonno.noo','foo.three']
       
   385         context.add_file('add1.txt', implementation=mi)
       
   386         context.add_file('foo/add2.txt', implementation=None)
       
   387         
       
   388         self.assertEquals(context.get_refs_with_no_output(),['foo.two']) 
       
   389         context.changed_refs = ['foo.bar', 
       
   390                                 'foo.three']
       
   391         self.assertEquals(context.get_refs_with_no_output(),[]) 
       
   392         mi.refs = []
       
   393         self.assertEquals(context.get_refs_with_no_output(),['foo.bar', 
       
   394                                                              'foo.three']) 
       
   395         mi.refs = None
       
   396         self.assertEquals(context.get_refs_with_no_output(),['foo.bar', 
       
   397                                                              'foo.three']) 
       
   398 
       
   399     def test_merged_context_get_changed_refs_intersect(self):
       
   400         config = api.Configuration()
       
   401         context1 = plugin.GenerationContext(configuration=config, 
       
   402                                            output=os.path.join(ROOT_PATH, 'temp'),
       
   403                                            phase="normal")
       
   404         context2 = plugin.GenerationContext(configuration=config, 
       
   405                                            output=os.path.join(ROOT_PATH, 'temp'),
       
   406                                            phase="normal")
       
   407 
       
   408         context1.changed_refs = ['foo.bar', 
       
   409                                 'foo.two',
       
   410                                 'foo.three']
       
   411         context2.changed_refs = ['foo.bar', 
       
   412                                 'foo.two1']
       
   413         outs = plugin.MergedContext([context1,context2])
       
   414         self.assertEquals(sorted(outs.get_changed_refs(operation='union')), 
       
   415                           sorted(['foo.two1',
       
   416                                   'foo.bar',
       
   417                                   'foo.two',
       
   418                                   'foo.three']))
       
   419         self.assertEquals(outs.get_changed_refs(operation='intersection'), ['foo.bar'])
       
   420         self.assertEquals(sorted(outs.get_changed_refs(operation='difference')), sorted(['foo.three',
       
   421                                                                                          'foo.two']))
       
   422         self.assertEquals(sorted(outs.get_changed_refs(operation='symmetric_difference')), sorted(['foo.two1', 
       
   423                                                                                           'foo.three', 
       
   424                                                                                           'foo.two']))
       
   425 
       
   426     def test_generation_get_refs_no_output_with_two_contexts(self):
       
   427         config = api.Configuration()
       
   428         context1 = plugin.GenerationContext(configuration=config, 
       
   429                                            output=os.path.join(ROOT_PATH, 'temp'),
       
   430                                            phase="normal")
       
   431         context2 = plugin.GenerationContext(configuration=config, 
       
   432                                            output=os.path.join(ROOT_PATH, 'temp'),
       
   433                                            phase="normal")
       
   434 
       
   435         context1.changed_refs = ['foo.bar', 
       
   436                                 'foo.two',
       
   437                                 'foo.three']
       
   438         context2.changed_refs = ['foo.bar1', 
       
   439                                 'foo.two1']
       
   440         
       
   441         
       
   442         mi1 = MockImpl({})
       
   443         mi1.refs = ['foo.bar','nonno.noo','foo.three']
       
   444         mi2 = MockImpl({})
       
   445         mi2.refs = ['foo.bar1']
       
   446         context1.add_file('add1.txt', implementation=mi1)
       
   447         context1.add_file('foo/add2.txt', implementation=None)
       
   448         context2.add_file('add2.txt', implementation=mi2)
       
   449         outs = plugin.MergedContext([context1,context2])
       
   450         self.assertEquals(outs.get_refs_with_no_output(), ['foo.two', 'foo.two1'])
       
   451         self.assertEquals(outs.get_refs_with_no_output(['foo.two']), ['foo.two'])
       
   452         self.assertEquals(outs.get_refs_with_no_output(['foo.bar']), [])
       
   453 
       
   454     def test_generation_get_refs_with_no_implementation(self):
       
   455         config = api.Configuration()
       
   456         context1 = plugin.GenerationContext(configuration=config, 
       
   457                                            output=os.path.join(ROOT_PATH, 'temp'),
       
   458                                            phase="normal")
       
   459         context2 = plugin.GenerationContext(configuration=config, 
       
   460                                            output=os.path.join(ROOT_PATH, 'temp'),
       
   461                                            phase="normal")
       
   462 
       
   463         context1.changed_refs = ['foo.bar', 
       
   464                                 'foo.two',
       
   465                                 'foo.three']
       
   466         context2.changed_refs = ['foo.bar1', 
       
   467                                 'foo.two1']
       
   468         
       
   469         
       
   470         mi1 = MockImpl({})
       
   471         mi1.ref = 'mi1'
       
   472         mi1.refs = ['foo.bar','nonno.noo','foo.three']
       
   473         mi2 = MockImpl({})
       
   474         mi2.ref = 'mi2'
       
   475         mi2.refs = ['foo.bar1']
       
   476         context1.impl_set.add(mi1)
       
   477         context2.impl_set.add(mi2)
       
   478         outs = plugin.MergedContext([context1,context2])
       
   479         self.assertEquals(outs.get_refs_with_no_implementation(), ['foo.two', 'foo.two1'])
       
   480         self.assertEquals(outs.get_refs_with_no_implementation(['foo.bar']), [])
       
   481         self.assertEquals(outs.get_refs_with_no_implementation(['foo.two', 'foo.bar1']), ['foo.two'])
       
   482 
       
   483 
       
   484     def test_context_data_grep_log(self):
       
   485         context = plugin.GenerationContext()
       
   486         context.log = ['foo bar',
       
   487                      'foo faa',
       
   488                      'jee jee jehu']
       
   489         self.assertEquals(context.grep_log('jee'), [(2,'jee jee jehu')])
   274 
   490 
   275 class TestPluginImplBase(unittest.TestCase):
   491 class TestPluginImplBase(unittest.TestCase):
   276     def setUp(self):
   492     def setUp(self):
   277         pass
   493         pass
   278 
   494 
   291         self.assertEquals(impl.has_tag({'target': ['test2','foo']}, policy='AND'), False)
   507         self.assertEquals(impl.has_tag({'target': ['test2','foo']}, policy='AND'), False)
   292         self.assertEquals(impl.has_tag({'foo': ['foo']}, policy='OR'), False)
   508         self.assertEquals(impl.has_tag({'foo': ['foo']}, policy='OR'), False)
   293         self.assertEquals(impl.has_tag({'foo': ['foo']}, policy='AND'), False)
   509         self.assertEquals(impl.has_tag({'foo': ['foo']}, policy='AND'), False)
   294         self.assertEquals(impl.has_tag({'target': ['foo'], 'foo':['bar']}, policy='AND'), False)
   510         self.assertEquals(impl.has_tag({'target': ['foo'], 'foo':['bar']}, policy='AND'), False)
   295         self.assertEquals(impl.has_tag({'target': ['foo'], 'foo':['bar']}, policy='OR'), True)
   511         self.assertEquals(impl.has_tag({'target': ['foo'], 'foo':['bar']}, policy='OR'), True)
   296     
   512 
       
   513     def test_implbase_output(self):
       
   514         str = api.Storage(utils.relpath(ROOT_PATH))
       
   515         config = api.Configuration('foo')
       
   516         config.storage = str
       
   517         impl = plugin.ImplBase('foo.implml', config)
       
   518         self.assertEquals(impl.output, '')
       
   519         impl.plugin_output = 'test'
       
   520         self.assertEquals(impl.output, 'test')
       
   521         impl.set_output_root('foobar')
       
   522         self.assertEquals(impl.output, 'foobar/test')
       
   523         impl.set_output_root('/foobar')
       
   524         self.assertEquals(impl.output, '/foobar/test')
       
   525 
       
   526         self.assertEquals(impl.path, 'foo.implml')
       
   527         self.assertEquals(impl.abspath, os.path.abspath(os.path.join(ROOT_PATH,'foo.implml')))
       
   528 
       
   529 
   297     def test_implbase_tags_with_refs(self):
   530     def test_implbase_tags_with_refs(self):
   298         config = MockConfiguration({}, features = {
   531         config = MockConfiguration({}, features = {
   299             'Foo.Bar'           : 'foobar',
   532             'Foo.Bar'           : 'foobar',
   300             'Foo.Baz'           : 'foobaz',
   533             'Foo.Baz'           : 'foobaz',
   301             'Feature.TagName'   : 'tagname',
   534             'Feature.TagName'   : 'tagname',
   351         # One of the refs in the given list matches
   584         # One of the refs in the given list matches
   352         self.assertTrue(impl.has_ref(['Yay', 'Fhtagn', 'Foo.Bar']))
   585         self.assertTrue(impl.has_ref(['Yay', 'Fhtagn', 'Foo.Bar']))
   353         self.assertTrue(impl.has_ref(['Yay', 'Foo.Bar.Baz', 'Fhtagn']))
   586         self.assertTrue(impl.has_ref(['Yay', 'Foo.Bar.Baz', 'Fhtagn']))
   354         self.assertTrue(impl.has_ref(['Yay', 'Xyz', 'Fhtagn']))
   587         self.assertTrue(impl.has_ref(['Yay', 'Xyz', 'Fhtagn']))
   355         
   588         
   356     def test_impl_container_eval_context_with_tags(self):
   589 
   357         container = plugin.ImplBase("norm", None)
   590 class TestPlugin(plugin.ImplBase):
   358         context = plugin.GenerationContext()
   591     def __init__(self, ref):
   359         self.assertTrue(container._eval_context(context))
   592         super(TestPlugin, self).__init__(ref, None)
   360         container.set_tags({'target':['rofs2','core']})
   593         self.refs = None
   361         context.tags = {'target': ['rofs2'], 'foobar': ['test']}
   594     
   362         self.assertTrue(container._eval_context(context))
   595     def get_refs(self):
   363         context.tags_policy = "AND"
   596         return self.refs
   364         self.assertFalse(container._eval_context(context))
   597 
   365         container.set_tags({})
   598 class TestPluginImplSet(unittest.TestCase):    
   366         self.assertFalse(container._eval_context(context))
       
   367         context.tags = {'target': ['rofs2']}
       
   368         self.assertFalse(container._eval_context(context))
       
   369         context.tags = {}
       
   370         self.assertTrue(container._eval_context(context))
       
   371 
       
   372 class TestPluginImplSet(unittest.TestCase):
       
   373     
       
   374     def test_add_implementation_and_list(self):
   599     def test_add_implementation_and_list(self):
   375         container = plugin.ImplSet()
   600         iset= plugin.ImplSet()
   376         imp1  = plugin.ImplBase("implml/test.content",None)
   601         imp1  = plugin.ImplBase("implml/test.content",None)
   377         imp2a = plugin.ImplBase("implml/copy.content",None)
   602         imp2a = plugin.ImplBase("implml/copy.content",None)
   378         imp2b = plugin.ImplBase("implml/copy.content",None)
   603         imp2b = plugin.ImplBase("implml/copy.content",None)
   379         container.add_implementation(imp1)
   604         iset.add_implementation(imp1)
   380         container.add_implementation(imp2a)
   605         iset.add_implementation(imp2a)
   381         container.add_implementation(imp2b)
   606         iset.add_implementation(imp2b)
   382         self.assertEquals(sorted(container.list_implementation()),
   607         self.assertEquals(sorted(iset.list_implementation()),
   383                           sorted(['implml/test.content',
   608                           sorted(['implml/test.content',
   384                                   'implml/copy.content']))
   609                                   'implml/copy.content']))
   385 
   610 
       
   611     def test_add_implementation_and_generate(self):
       
   612         iset = plugin.ImplSet()
       
   613         imp1  = SimpleImpl("implml/test1.content", None)
       
   614         imp1.outputfile = 'test/foo.txt'
       
   615         imp2a = SimpleImpl("implml/test2.content", None)
       
   616         imp2b = SimpleImpl("implml/test3.content", None)
       
   617         iset.add_implementation(imp1)
       
   618         iset.add_implementation(imp2a)
       
   619         iset.add_implementation(imp2b)
       
   620         context = plugin.GenerationContext(output="temp")
       
   621         iset.generate(context)
       
   622         self.assertEquals(sorted(context.executed_impls), sorted([imp1, imp2a, imp2b])) 
       
   623         self.assertEquals(context.generation_output[0].name, 'temp/test/foo.txt')
       
   624         self.assertTrue(os.path.exists(context.generation_output[0].name))
       
   625         self.assertEquals(context.generation_output[0].implementation,imp1)
       
   626 
       
   627 
       
   628     def test__generate_with_exception(self):
       
   629         def generate_exception(*args):
       
   630             raise Exception("test exception %s" % args)
       
   631             
       
   632         iset = plugin.ImplSet()
       
   633         imp1  = SimpleImpl("implml/test1.content", None)
       
   634         imp1.outputfile = 'test/foo.txt'
       
   635         imp2a = SimpleImpl("implml/test2.content", None)
       
   636         imp2a.generate = generate_exception
       
   637         iset.add_implementation(imp1)
       
   638         iset.add_implementation(imp2a)
       
   639         context = plugin.GenerationContext(output="temp")
       
   640         iset.generate(context)
       
   641         self.assertEquals(sorted(context.executed_impls), sorted([imp1, imp2a])) 
       
   642         self.assertEquals(context.generation_output[1].type, 'exception')
       
   643         self.assertEquals(context.generation_output[1].name, 'exception from implml/test2.content')
       
   644         self.assertEquals(context.generation_output[1].implementation, imp2a)
       
   645 
   386     def test_add_implementation_and_get_implementations_by_file(self):
   646     def test_add_implementation_and_get_implementations_by_file(self):
   387         container = plugin.ImplSet()
   647         iset = plugin.ImplSet()
   388         imp1  = plugin.ImplBase("implml/test.content",None)
   648         imp1  = plugin.ImplBase("implml/test.content",None)
   389         imp2a = plugin.ImplBase("implml/copy.content",None)
   649         imp2a = plugin.ImplBase("implml/copy.content",None)
   390         imp2b = plugin.ImplBase("implml/copy.content",None)
   650         imp2b = plugin.ImplBase("implml/copy.content",None)
   391         container.add_implementation(imp1)
   651         iset.add_implementation(imp1)
   392         container.add_implementation(imp2a)
   652         iset.add_implementation(imp2a)
   393         container.add_implementation(imp2b)
   653         iset.add_implementation(imp2b)
   394         self.assertEquals(container.get_implementations_by_file("implml/test.content"), [imp1])
   654         self.assertEquals(iset.get_implementations_by_file("implml/test.content"), [imp1])
   395         self.assertEquals(sorted(container.get_implementations_by_file("implml/copy.content")),
   655         self.assertEquals(sorted(iset.get_implementations_by_file("implml/copy.content")),
   396                           sorted([imp2a, imp2b]))
   656                           sorted([imp2a, imp2b]))
   397 
   657 
   398     def test_add_implementation_and_remove_implementation(self):
   658     def test_add_implementation_and_remove_implementation(self):
   399         container = plugin.ImplSet()
   659         iset = plugin.ImplSet()
   400         imp1  = plugin.ImplBase("implml/test.content",None)
   660         imp1  = plugin.ImplBase("implml/test.content",None)
   401         imp2a = plugin.ImplBase("implml/copy.content",None)
   661         imp2a = plugin.ImplBase("implml/copy.content",None)
   402         imp2b = plugin.ImplBase("implml/copy.content",None)
   662         imp2b = plugin.ImplBase("implml/copy.content",None)
   403         container.add_implementation(imp1)
   663         iset.add_implementation(imp1)
   404         container.add_implementation(imp2a)
   664         iset.add_implementation(imp2a)
   405         container.add_implementation(imp2b)
   665         iset.add_implementation(imp2b)
   406         container.remove_implementation("implml/test.content")
   666         iset.remove_implementation("implml/test.content")
   407         self.assertEquals(len(container.list_implementation()),1)
   667         self.assertEquals(len(iset.list_implementation()),1)
   408         self.assertEquals(container.list_implementation()[0],"implml/copy.content")
   668         self.assertEquals(iset.list_implementation()[0],"implml/copy.content")
   409 
   669 
   410     def test_add_implementation_and_remove_all(self):
   670     def test_add_implementation_and_remove_all(self):
   411         container = plugin.ImplSet()
   671         iset = plugin.ImplSet()
   412         imp1  = plugin.ImplBase("implml/test.content",None)
   672         imp1  = plugin.ImplBase("implml/test.content",None)
   413         imp2a = plugin.ImplBase("implml/copy.content",None)
   673         imp2a = plugin.ImplBase("implml/copy.content",None)
   414         imp2b = plugin.ImplBase("implml/copy.content",None)
   674         imp2b = plugin.ImplBase("implml/copy.content",None)
   415         imp3  = plugin.ImplBase("implml/foo.content",None)
   675         imp3  = plugin.ImplBase("implml/foo.content",None)
   416         container.add_implementation(imp1)
   676         iset.add_implementation(imp1)
   417         container.add_implementation(imp2a)
   677         iset.add_implementation(imp2a)
   418         container.add_implementation(imp2b)
   678         iset.add_implementation(imp2b)
   419         container.add_implementation(imp3)
   679         iset.add_implementation(imp3)
   420         for implref in container.list_implementation():
   680         for implref in iset.list_implementation():
   421             container.remove_implementation(implref)
   681             iset.remove_implementation(implref)
   422         self.assertEquals(len(container.list_implementation()),0)
   682         self.assertEquals(len(iset.list_implementation()),0)
   423 
   683 
   424     def test_create_impl_set(self):
   684     def test_create_impl_set(self):
   425         plugin.create_impl_set('',None);
   685         plugin.create_impl_set('',None);
   426         pass
   686         pass
   427 
   687 
   428     def test_add_implementation_find_with_tags(self):
   688     def test_add_implementation_find_with_tags(self):
   429         class TestPlugin(plugin.ImplBase):
   689         def impl_list(impl_iterable):
   430             pass
   690             return sorted(list(impl_iterable), key=lambda impl: impl.ref)
   431         container = plugin.ImplSet()
   691         
   432         imp1 = TestPlugin("implml/test.content",None)
   692         iset = plugin.ImplSet()
   433         imp2 = TestPlugin("implml/copy.content",None)
   693         imp1 = TestPlugin("implml/test.content")
   434         imp3 = TestPlugin("implml/foo.content",None)
   694         imp2 = TestPlugin("implml/copy.content")
       
   695         imp3 = TestPlugin("implml/foo.content")
   435         imp1.set_tags({'target': ['core','rofs2','rofs3']})
   696         imp1.set_tags({'target': ['core','rofs2','rofs3']})
   436         imp2.set_tags({'target': ['rofs3','uda']})
   697         imp2.set_tags({'target': ['rofs3','uda']})
   437         imp3.set_tags({'target': ['mmc','uda']})
   698         imp3.set_tags({'target': ['mmc','uda']})
   438         container.add_implementation(imp1)
   699         iset.add_implementation(imp1)
   439         container.add_implementation(imp2)
   700         iset.add_implementation(imp2)
   440         container.add_implementation(imp3)
   701         iset.add_implementation(imp3)
   441         self.assertEquals(list(container.filter_implementations(tags={'target' : ['rofs3']})),
   702         self.assertEquals(impl_list(iset.filter_implementations(tags={'target' : ['rofs3']})),
   442                           [imp1,imp2])
   703                           impl_list([imp1,imp2]))
   443         self.assertEquals(list(container.filter_implementations(tags={'target' : ['uda']})),
   704         self.assertEquals(impl_list(iset.filter_implementations(tags={'target' : ['uda']})),
   444                           [imp2,imp3])
   705                           impl_list([imp2,imp3]))
   445         self.assertEquals(list(container.filter_implementations(tags={'target' : ['mmc','uda']}, policy='AND')),
   706         self.assertEquals(impl_list(iset.filter_implementations(tags={'target' : ['mmc','uda']}, policy='AND')),
   446                           [imp3])
   707                           impl_list([imp3]))
   447         self.assertEquals(list(container.filter_implementations(tags={'target' : ['mmc','uda']}, policy='OR')),
   708         self.assertEquals(impl_list(iset.filter_implementations(tags={'target' : ['mmc','uda']}, policy='OR')),
   448                           [imp2, imp3])
   709                           impl_list([imp2, imp3]))
   449         cont = container.filter_implementations(tags={'target' : ['core']}) | container.filter_implementations(tags={'target' : ['mmc']}) 
   710         cont = iset.filter_implementations(tags={'target' : ['core']}) | iset.filter_implementations(tags={'target' : ['mmc']}) 
   450         self.assertEquals(len(cont),2)
   711         self.assertEquals(len(cont),2)
   451         self.assertEquals(list(cont), [imp1,imp3])
   712         self.assertEquals(impl_list(cont), impl_list([imp1,imp3]))
   452 
   713 
   453         cont = container.filter_implementations(tags={'target' : ['rofs3']}) & container.filter_implementations(tags={'target' : ['uda']}) 
   714         cont = iset.filter_implementations(tags={'target' : ['rofs3']}) & iset.filter_implementations(tags={'target' : ['uda']}) 
   454         self.assertEquals(len(cont),1)
   715         self.assertEquals(len(cont),1)
   455         self.assertEquals(list(cont), [imp2])
   716         self.assertEquals(impl_list(cont), impl_list([imp2]))
   456     
   717     
   457     def test_pre_impl_filter(self):
   718     def test_pre_impl_filter(self):
   458         resources = [
   719         resources = [
   459             "foo.txt",
   720             "foo.txt",
   460             ".hidden_file",
   721             ".hidden_file",
   481         # Test with backslashes
   742         # Test with backslashes
   482         resources = map(lambda path: path.replace('/', '\\'), resources)
   743         resources = map(lambda path: path.replace('/', '\\'), resources)
   483         expected = map(lambda path: path.replace('/', '\\'), expected)
   744         expected = map(lambda path: path.replace('/', '\\'), expected)
   484         self.assertEquals(expected, plugin.pre_filter_impls(resources))
   745         self.assertEquals(expected, plugin.pre_filter_impls(resources))
   485 
   746 
       
   747     def test_get_implemented_refs(self):
       
   748             
       
   749         iset = plugin.ImplSet()
       
   750         imp1 = TestPlugin('imp1')
       
   751         imp2 = TestPlugin('imp2')
       
   752         imp3 = TestPlugin('imp3')
       
   753         iset.add_implementation(imp1)
       
   754         iset.add_implementation(imp2)
       
   755         iset.add_implementation(imp3)
       
   756         imp1.refs = ['fea.child1', 'fea.child2']
       
   757         imp2.refs = ['fea.setting1']
       
   758         imp3.refs = ['foo.bar']
       
   759         self.assertEquals(sorted(iset.get_implemented_refs()), sorted(['fea.child1', 
       
   760                                                                        'fea.child2',
       
   761                                                                        'fea.setting1',
       
   762                                                                        'foo.bar']))
       
   763 
       
   764     def test_get_implementations_with_ref(self):
       
   765             
       
   766         iset = plugin.ImplSet()
       
   767         imp1 = TestPlugin('implml1')
       
   768         imp2 = TestPlugin('implml2')
       
   769         imp3 = TestPlugin('implml3')
       
   770         imp4 = TestPlugin('implml3')
       
   771         iset.add_implementation(imp1)
       
   772         iset.add_implementation(imp2)
       
   773         iset.add_implementation(imp3)
       
   774         iset.add_implementation(imp4)
       
   775         imp1.refs = ['fea.child1', 'fea.child2']
       
   776         imp2.refs = ['foo.bar', 'fea.setting1']
       
   777         imp3.refs = ['foo.bar']
       
   778         self.assertEquals(iset.get_implementations_with_ref('fea.child1'), [imp1])
       
   779         self.assertEquals(iset.get_implementations_with_ref('fea.setting1'), [imp2])
       
   780         self.assertEquals(iset.get_implementations_with_ref('foo.bar'), [imp2, imp3])
   486 
   781 
   487 class TestPluginImplSetCopy(unittest.TestCase):
   782 class TestPluginImplSetCopy(unittest.TestCase):
   488     class TestImpl(plugin.ImplBase):
   783     class TestImpl(plugin.ImplBase):
   489         pass # No default invocation phase specified, should be 'normal'
   784         pass # No default invocation phase specified, should be 'normal'
   490     class PreImpl(plugin.ImplBase):
   785     class PreImpl(plugin.ImplBase):
   507                       'layer1/implml/multi1.implml',
   802                       'layer1/implml/multi1.implml',
   508                       'layer1/implml/multi2.implml']
   803                       'layer1/implml/multi2.implml']
   509         return plugin.create_impl_set(impl_files, mock_config)
   804         return plugin.create_impl_set(impl_files, mock_config)
   510     
   805     
   511 
   806 
   512     def test_get_test_impl_container(self):
   807     def test_get_test_impl_iset(self):
   513         container = self._get_impl_container()
   808         iset = self._get_impl_container()
   514         # There are 5 ImplML files
   809         # There are 5 ImplML files
   515         self.assertEquals(len(container.list_implementation()), 5)
   810         self.assertEquals(len(iset.list_implementation()), 5)
   516         # ...but two of them contain 3 implementations each
   811         # ...but two of them contain 3 implementations each
   517         self.assertEquals(len(container), 5)
   812         self.assertEquals(len(iset), 5)
   518     
   813     
   519     def _get_phase_test_impl_container(self):
   814     def _get_phase_test_impl_container(self):
   520         return plugin.ImplSet([
   815         return plugin.ImplSet([
   521             self.TestImpl('foo.test', None),
   816             self.TestImpl('foo.test', None),
   522             self.NormalImpl('foo.norm', None),
   817             self.NormalImpl('foo.norm', None),
   523             self.PreImpl('foo.pre', None),
   818             self.PreImpl('foo.pre', None),
   524             self.PostImpl('test.post', None),
   819             self.PostImpl('test.post', None),
   525             self.PostImpl('foo.post', None),
   820             self.PostImpl('foo.post', None),
   526         ])
   821         ])
   527     
   822     
   528     def test_get_phase_test_impl_container(self):
   823     def test_get_phase_test_impl_iset(self):
   529         container = self._get_phase_test_impl_container()
   824         iset = self._get_phase_test_impl_container()
   530         self.assertEquals(5, len(container))
   825         self.assertEquals(5, len(iset))
   531         self.assertEquals(len(container.list_implementation()), 5)
   826         self.assertEquals(len(iset.list_implementation()), 5)
   532         
   827         
   533         def check(filename, phase):
   828         def check(filename, phase):
   534             impls = container.get_implementations_by_file(filename)
   829             impls = iset.get_implementations_by_file(filename)
   535             self.assertEquals(1, len(impls))
   830             self.assertEquals(1, len(impls))
   536             impl = impls[0]
   831             impl = impls[0]
   537             self.assertEquals(impl.ref, filename)
   832             self.assertEquals(impl.ref, filename)
   538             self.assertEquals(impl.invocation_phase(), phase)
   833             self.assertEquals(impl.invocation_phase(), phase)
   539         check('foo.test', 'normal')
   834         check('foo.test', 'normal')
   540         check('foo.norm', 'normal')
   835         check('foo.norm', 'normal')
   541         check('foo.pre', 'pre')
   836         check('foo.pre', 'pre')
   542         check('test.post', 'post')
   837         check('test.post', 'post')
   543         check('foo.post', 'post')
   838         check('foo.post', 'post')
   544         
   839         
   545         return container
   840         return iset
   546     
   841     
   547     def test_create_impl_set(self):
   842     def test_create_impl_set(self):
   548         container = self._get_impl_container()
   843         iset = self._get_impl_container()
   549         # There are 5 ImplML files
   844         # There are 5 ImplML files
   550         self.assertEquals(len(container.list_implementation()), 5)
   845         self.assertEquals(len(iset.list_implementation()), 5)
   551         # ...but two of them contain 3 implementations each
   846         # ...but two of them contain 3 implementations each
   552         self.assertEquals(len(container), 5)
   847         self.assertEquals(len(iset), 5)
   553     
   848     
   554     def test_invocation_phases(self):
   849     def test_invocation_phases(self):
   555         container = self._get_phase_test_impl_container()
   850         iset = self._get_phase_test_impl_container()
   556         phases = container.invocation_phases()
   851         phases = iset.invocation_phases()
   557         self.assertEquals(phases,['pre','normal','post'])
   852         self.assertEquals(phases,['pre','normal','post'])
   558  
   853  
   559     def test_copy(self):
   854     def test_copy(self):
   560         container = self._get_impl_container()
   855         iset = self._get_impl_container()
   561         newcontainer = container.copy()
   856         newcontainer = iset.copy()
   562         self.assertTrue(newcontainer is not container)
   857         self.assertTrue(newcontainer is not iset)
   563         self.assertEquals(len(newcontainer), 5)
   858         self.assertEquals(len(newcontainer), 5)
   564 
   859 
   565     def test_execute_generate(self):
   860     def test_execute_generate(self):
   566         container = self._get_impl_container()
   861         iset = self._get_impl_container()
   567         container.execute(container, 'generate')
   862         iset.execute(iset, 'generate')
   568         actual_impls = []
   863         actual_impls = []
   569         for impl in container:
   864         for impl in iset:
   570             if isinstance(impl, plugin.ImplContainer):
   865             if isinstance(impl, plugin.ImplContainer):
   571                 actual_impls += impl.get_all_implementations()
   866                 actual_impls += impl.get_all_implementations()
   572             else:
   867             else:
   573                 actual_impls.append(impl)
   868                 actual_impls.append(impl)
   574         for impl in actual_impls:
   869         for impl in actual_impls:
   575             self.assertTrue(impl.generate_invoked)
   870             self.assertTrue(impl.generate_invoked)
   576 
   871 
   577     def test_impl_container_generate(self):
   872     def test_impl_container_generate(self):
   578         container = self._get_impl_container()
   873         iset = self._get_impl_container()
   579         context = plugin.GenerationContext()
   874         context = plugin.GenerationContext()
   580         context.history = ""
   875         context.history = ""
   581         context.objects = []
   876         context.objects = []
   582         container.generate(context)
   877         iset.generate(context)
   583         self.assertEquals(len(context.objects), 9)
   878         self.assertEquals(len(context.objects), 9)
   584         actual_impls = []
   879         actual_impls = []
   585         for impl in container:
   880         for impl in iset:
   586             if isinstance(impl, plugin.ImplContainer):
   881             if isinstance(impl, plugin.ImplContainer):
   587                 actual_impls += impl.get_all_implementations()
   882                 actual_impls += impl.get_all_implementations()
   588             else:
   883             else:
   589                 actual_impls.append(impl)
   884                 actual_impls.append(impl)
   590         for impl in actual_impls:
   885         for impl in actual_impls:
   591             self.assertTrue(impl.generate_invoked)
   886             self.assertTrue(impl.generate_invoked)
   592 
   887 
   593     def test_filter_all(self):
   888     def test_filter_all(self):
   594         container = self._get_impl_container()
   889         iset = self._get_impl_container()
   595         impl_list = container.filter_implementations()
   890         impl_list = iset.filter_implementations()
   596         self.assertEquals(len(impl_list), 5)
   891         self.assertEquals(len(impl_list), 5)
   597 
   892 
   598     def test_filter_for_pre_phase(self):
   893     def test_filter_for_pre_phase(self):
   599         container = self._get_phase_test_impl_container()
   894         iset = self._get_phase_test_impl_container()
   600         impl_list = list(container.filter_implementations(phase='pre'))
   895         impl_list = list(iset.filter_implementations(phase='pre'))
   601         self.assertEquals(len(impl_list), 1)
   896         self.assertEquals(len(impl_list), 1)
   602         self.assertEquals(impl_list[0].invocation_phase(), 'pre')
   897         self.assertEquals(impl_list[0].invocation_phase(), 'pre')
   603         self.assertEquals(impl_list[0].ref, 'foo.pre')
   898         self.assertEquals(impl_list[0].ref, 'foo.pre')
   604 
   899 
   605     def test_filter_for_normal_phase(self):
   900     def test_filter_for_normal_phase(self):
   606         container = self._get_phase_test_impl_container()
   901         iset = self._get_phase_test_impl_container()
   607         impl_list = list(container.filter_implementations(phase='normal'))
   902         impl_list = list(iset.filter_implementations(phase='normal'))
   608         self.assertEquals(len(impl_list), 2)
   903         self.assertEquals(len(impl_list), 2)
   609         self.assertEquals(impl_list[0].invocation_phase(), 'normal')
   904         self.assertEquals(impl_list[0].invocation_phase(), 'normal')
   610         self.assertEquals(impl_list[1].invocation_phase(), 'normal')
   905         self.assertEquals(impl_list[1].invocation_phase(), 'normal')
   611 
   906 
   612     def test_filter_for_post_phase(self):
   907     def test_filter_for_post_phase(self):
   613         container = self._get_phase_test_impl_container()
   908         iset = self._get_phase_test_impl_container()
   614         impl_list = list(container.filter_implementations(phase='post'))
   909         impl_list = list(iset.filter_implementations(phase='post'))
   615         self.assertEquals(len(impl_list), 2)
   910         self.assertEquals(len(impl_list), 2)
   616         self.assertEquals(impl_list[0].invocation_phase(), 'post')
   911         self.assertEquals(impl_list[0].invocation_phase(), 'post')
   617         self.assertEquals(impl_list[1].invocation_phase(), 'post')
   912         self.assertEquals(impl_list[1].invocation_phase(), 'post')
   618 
   913 
   619 
   914 
   626         IMPL_TYPE_ID = "test3"
   921         IMPL_TYPE_ID = "test3"
   627 
   922 
   628     def test_plugin_settings(self):
   923     def test_plugin_settings(self):
   629         settings.SettingsFactory.cone_parser().read([os.path.join(ROOT_PATH,'test_defaults.cfg')])
   924         settings.SettingsFactory.cone_parser().read([os.path.join(ROOT_PATH,'test_defaults.cfg')])
   630         impl = TestPluginImplSettings.Test1Impl("",None)
   925         impl = TestPluginImplSettings.Test1Impl("",None)
   631         self.assertEquals(impl.output_root, 'output')
   926         self.assertEquals(impl.output_root, '')
   632         self.assertEquals(impl.output_subdir, '')
   927         self.assertEquals(impl.output_subdir, '')
   633         impl.output_subdir = 'foobar'
   928         impl.output_subdir = 'foobar'
   634         self.assertEquals(impl.get_tags(), {})
   929         self.assertEquals(impl.get_tags(), {})
   635         self.assertEquals(impl.output, 'output/foobar')
   930         self.assertEquals(impl.output, 'foobar')
   636 
   931 
   637         impl = TestPluginImplSettings.Test2Impl("",None)
   932         impl = TestPluginImplSettings.Test2Impl("",None)
   638         self.assertEquals(impl.output_subdir, '')
   933         self.assertEquals(impl.output_subdir, '')
   639 
   934 
   640 
   935 
   737             [MockImpl(['MockReader1', file, {'x': '1', 'y': '2'}]),
  1032             [MockImpl(['MockReader1', file, {'x': '1', 'y': '2'}]),
   738              MockImpl(['MockReader2', file, {'x': '1', 'y': '2'}]),
  1033              MockImpl(['MockReader2', file, {'x': '1', 'y': '2'}]),
   739              MockImpl(['MockReader1', file, {'a': '1', 'b': '2'}]),
  1034              MockImpl(['MockReader1', file, {'a': '1', 'b': '2'}]),
   740              MockImpl(['MockReader2', file, {'a': '1', 'b': '2'}]),],
  1035              MockImpl(['MockReader2', file, {'a': '1', 'b': '2'}]),],
   741             file)
  1036             file)
   742         
       
   743         file = 'layer1/implml/ignored_ns_1.mock3ml'
       
   744         self.assert_read_impls_equal([MockImpl(['MockReader3', file, {'x': '1'}])], file)
       
   745         
       
   746         file = 'layer1/implml/ignored_ns_2.mock3ml'
       
   747         self.assert_read_impls_equal([MockImpl(['MockReader3', file, {'x': '1'}])], file)
       
   748         
  1037         
   749         
  1038         
   750         self.assert_read_impls_equal([], 'layer1/implml/unsupported1.implml')
  1039         self.assert_read_impls_equal([], 'layer1/implml/unsupported1.implml')
   751         self.assert_read_impls_equal([], 'layer1/implml/unsupported2.implml')
  1040         self.assert_read_impls_equal([], 'layer1/implml/unsupported2.implml')
   752         
  1041         
   786             MockImpl(['MockReader2', 'layer1/implml/single2.mock2ml']),
  1075             MockImpl(['MockReader2', 'layer1/implml/single2.mock2ml']),
   787             MockImpl(['MockReader3', 'layer1/implml/single3.mock3ml', {'x': '1'}]),
  1076             MockImpl(['MockReader3', 'layer1/implml/single3.mock3ml', {'x': '1'}]),
   788             
  1077             
   789             MockImpl(['MockReader3', 'layer1/implml/single3.test3ml', {'x': '1'}]),
  1078             MockImpl(['MockReader3', 'layer1/implml/single3.test3ml', {'x': '1'}]),
   790             
  1079             
   791             MockImpl(['MockReader3', 'layer1/implml/ignored_ns_1.mock3ml', {'x': '1'}]),
       
   792             MockImpl(['MockReader3', 'layer1/implml/ignored_ns_2.mock3ml', {'x': '1'}]),
       
   793             
       
   794             MockImpl(['MockReader1','layer1/implml/multi1.implml', {'y': '2', 'x': '1'}]),  
  1080             MockImpl(['MockReader1','layer1/implml/multi1.implml', {'y': '2', 'x': '1'}]),  
   795             MockImpl(['MockReader2', 'layer1/implml/multi1.implml', {'y': '20', 'x': '10'}]),
  1081             MockImpl(['MockReader2', 'layer1/implml/multi1.implml', {'y': '20', 'x': '10'}]),
   796             MockImpl(['MockReader3', 'layer1/implml/multi1.implml', {'y': '200', 'x': '100'}, {'z': '300'}]),
  1082             MockImpl(['MockReader3', 'layer1/implml/multi1.implml', {'y': '200', 'x': '100'}, {'z': '300'}]),
   797             
  1083             
   798             MockImpl(['MockReader1', 'layer1/implml/multi2.implml', {'x': '1', 'y': '2'}]),
  1084             MockImpl(['MockReader1', 'layer1/implml/multi2.implml', {'x': '1', 'y': '2'}]),
   876         self.assert_contains_feature(config, 'TempFeature.Seq.Real', 'real', [])
  1162         self.assert_contains_feature(config, 'TempFeature.Seq.Real', 'real', [])
   877         self.assert_contains_feature(config, 'TempFeature.Seq.Boolean', 'boolean', [])
  1163         self.assert_contains_feature(config, 'TempFeature.Seq.Boolean', 'boolean', [])
   878         self.assert_contains_feature(config, 'TempFeature.Seq.DefaultType', 'string', [])
  1164         self.assert_contains_feature(config, 'TempFeature.Seq.DefaultType', 'string', [])
   879         
  1165         
   880         fea = config.get_default_view().get_feature('TempFeature.Seq')
  1166         fea = config.get_default_view().get_feature('TempFeature.Seq')
   881         fea.set_value([['test', '1', '2.0', 'true', 'foo']])
  1167         fea.set_value([['test', 1, 2.0, True, 'foo']])
   882         self.assertEquals(fea.get_value(), [['test', '1', '2.0', 'true', 'foo']])
  1168         self.assertEquals(fea.get_value(), [['test', 1, 2.0, True, 'foo']])
   883     
  1169     
   884     def _create_mock_impl(self, temp_var_defs):
  1170     def _create_mock_impl(self, temp_var_defs):
   885         impl = Mock()
  1171         impl = Mock()
   886         impl.ref = "test.implml"
  1172         impl.ref = "test.implml"
   887         impl.get_temp_variable_definitions = lambda: temp_var_defs
  1173         impl.get_temp_variable_definitions = lambda: temp_var_defs
   948                    Tfd('TempFeature.Boolean',   'boolean',  'true')]
  1234                    Tfd('TempFeature.Boolean',   'boolean',  'true')]
   949         impls.add_implementation(self._create_mock_impl(feadefs))
  1235         impls.add_implementation(self._create_mock_impl(feadefs))
   950         
  1236         
   951         config = api.Configuration("test.confml")
  1237         config = api.Configuration("test.confml")
   952         config.add_feature(api.Feature("Int"), "TempFeature")
  1238         config.add_feature(api.Feature("Int"), "TempFeature")
   953         self.assertRaises(exceptions.AlreadyExists, impls.create_temp_features, config)
  1239         #self.assertRaises(exceptions.AlreadyExists, impls.create_temp_features, config)
       
  1240         temp_feature_refs = impls.create_temp_features(config)
       
  1241         self.assertEquals(temp_feature_refs, ['TempFeature.String', 'TempFeature.Real', 'TempFeature.Boolean'])
       
  1242         
   954 
  1243 
   955 class TestCommonImplmlDataReader(unittest.TestCase):
  1244 class TestCommonImplmlDataReader(unittest.TestCase):
   956     
  1245     
   957     def _read_data(self, xml_data):
  1246     def _read_data(self, xml_data):
   958         etree = utils.etree.fromstring(xml_data)
  1247         etree = utils.etree.fromstring(xml_data)