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 |