diff -r 000000000000 -r 2e8eeb919028 configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_comparator.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_comparator.py Thu Mar 11 17:04:37 2010 +0200 @@ -0,0 +1,248 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +import unittest +import __init__ +from cone.public import plugin +from CRMLPlugin.crml_model import * +from CRMLPlugin.crml_comparator import CrmlComparator +from cone.public.plugin import FlatComparisonResultEntry as Entry + +class TestComparator(unittest.TestCase): + def setUp(self): + keys = [ + CrmlSimpleKey(ref='Foo.Bar', int='0x1'), + CrmlBitmaskKey(int='0x2', bits=[CrmlBit(ref='Foo.Bit1', index=1), + CrmlBit(ref='Foo.Bit2', index=2), + CrmlBit(ref='Foo.Bit4', index=4, invert=True)]), + CrmlKeyRange(first_int='0x10000000', last_int='0x1FFFFFFF', ref="Foo.Seq", + subkeys=[CrmlKeyRangeSubKey(ref='Sub1', name='Sub-key 1', type='int', int='0x1'), + CrmlKeyRangeSubKey(ref='Sub2', name='Sub-key 2', type='real', int='0x2')]), + ] + + self.repo = CrmlRepository( + uid_value = '0x10203040', + uid_name = 'KCrUidTest', + owner = '0x11223344', + backup = True, + rfs = True, + access = CrmlAccess(), + keys = keys) + + self.comparator = CrmlComparator('test.crml', self.repo) + + + def assert_comparison_result_after_change_equals(self, + modification_code, added=[], removed=[], modified=[], + check_keys_in_entry_data=True, + target_resource_ref='test.crml'): + # Make a copy of the test repo and modify it using the given code + repo = self.repo.copy() + exec(modification_code) + + expected_result = plugin.FlatComparisonResult(only_in_source = removed, + only_in_target = added, + modified = modified) + + comparator = CrmlComparator('test.crml', self.repo) + actual_result = comparator.flat_compare(target_resource_ref, repo) + self.assertEquals(expected_result, actual_result) + + # Assert that all comparison result entries have references to the + # repository objects + for entry in actual_result.only_in_source: + self.assertTrue(isinstance(entry.data['repo'], CrmlRepository)) + for entry in actual_result.only_in_target: + self.assertTrue(isinstance(entry.data['repo'], CrmlRepository)) + for entry in actual_result.modified: + self.assertTrue(isinstance(entry.data['source_repo'], CrmlRepository)) + self.assertTrue(isinstance(entry.data['target_repo'], CrmlRepository)) + + # Check also references to CRML key objects if specified + if check_keys_in_entry_data: + for entry in actual_result.only_in_source: + self.assertTrue(isinstance(entry.data['key'], CrmlKeyBase)) + for entry in actual_result.only_in_target: + self.assertTrue(isinstance(entry.data['key'], CrmlKeyBase)) + for entry in actual_result.modified: + self.assertTrue(isinstance(entry.data['source_key'], CrmlKeyBase)) + self.assertTrue(isinstance(entry.data['target_key'], CrmlKeyBase)) + + def test_simple_key_changed(self): + def check(attrname, value_id, old_value, new_value): + self.assert_comparison_result_after_change_equals( + 'repo.keys[0].%s = %r' % (attrname, new_value), + modified=[Entry(sub_id = '0x00000001', + value_id = value_id, + source_value = old_value, + target_value = new_value)]) + + check('ref', 'ref', 'Foo.Bar', 'Foo.Baz') + check('name', 'name', None, 'Foobar') + check('backup', 'backup', False, True) + check('read_only', 'read_only', False, True) + check('access.cap_rd', 'cap_rd', None, 'FooCapability') + check('access.cap_wr', 'cap_wr', None, 'FooCapability') + check('access.sid_rd', 'sid_rd', None, '0x12345678') + check('access.sid_wr', 'sid_wr', None, '0x12345678') + + + self.assert_comparison_result_after_change_equals( + 'repo.keys[0].int = "0x5"', + added = [Entry(sub_id='0x00000005')], + removed = [Entry(sub_id='0x00000001')]) + + def test_bitmask_key_changed(self): + def check(attrname, value_id, old_value, new_value): + self.assert_comparison_result_after_change_equals( + 'repo.keys[1].%s = %r' % (attrname, new_value), + modified=[Entry(sub_id = '0x00000002', + value_id = value_id, + source_value = old_value, + target_value = new_value)]) + + check('name', 'name', None, 'Foobar') + check('backup', 'backup', False, True) + check('read_only', 'read_only', False, True) + check('access.cap_rd', 'cap_rd', None, 'FooCapability') + check('access.cap_wr', 'cap_wr', None, 'FooCapability') + check('access.sid_rd', 'sid_rd', None, '0x12345678') + check('access.sid_wr', 'sid_wr', None, '0x12345678') + + self.assert_comparison_result_after_change_equals( + 'repo.keys[1].int = "0x5"', + added = [Entry(sub_id='0x00000005')], + removed = [Entry(sub_id='0x00000002')]) + + def test_bitmask_key_bit_changed(self): + def check(attrname, value_id, old_value, new_value): + self.assert_comparison_result_after_change_equals( + 'repo.keys[1].bits[0].%s = %r' % (attrname, new_value), + modified = [Entry(sub_id = '0x00000002 (bit 1)', + value_id = value_id, + source_value = old_value, + target_value = new_value)]) + + check('ref', 'ref', 'Foo.Bit1', 'Foo.Bar.Bit') + check('invert', 'invert', False, True) + + self.assert_comparison_result_after_change_equals( + 'repo.keys[1].bits[0].index = 6', + added = [Entry(sub_id='0x00000002 (bit 6)')], + removed = [Entry(sub_id='0x00000002 (bit 1)')]) + + + def test_key_range_changed(self): + def check(attrname, value_id, old_value, new_value): + self.assert_comparison_result_after_change_equals( + 'repo.keys[2].%s = %r' % (attrname, new_value), + modified=[Entry(sub_id = '0x10000000-0x1FFFFFFF', + value_id = value_id, + source_value = old_value, + target_value = new_value)]) + + check('ref', 'ref', 'Foo.Seq', 'Foo.Bar') + check('name', 'name', None, 'Foobar') + check('backup', 'backup', False, True) + check('read_only', 'read_only', False, True) + check('access.cap_rd', 'cap_rd', None, 'FooCapability') + check('access.cap_wr', 'cap_wr', None, 'FooCapability') + check('access.sid_rd', 'sid_rd', None, '0x12345678') + check('access.sid_wr', 'sid_wr', None, '0x12345678') + + def check(attrname, new_value, old_id, new_id): + self.assert_comparison_result_after_change_equals( + 'repo.keys[2].%s = %r' % (attrname, new_value), + added = [Entry(sub_id=new_id)], + removed = [Entry(sub_id=old_id)]) + + check('first_int', '0x00000000', '0x10000000-0x1FFFFFFF', '0x00000000-0x1FFFFFFF') + check('last_int', '0x20000000', '0x10000000-0x1FFFFFFF', '0x10000000-0x20000000') + + def test_key_range_subkey_changed(self): + def check(attrname, old_value, new_value): + self.assert_comparison_result_after_change_equals( + 'repo.keys[2].subkeys[0].%s = %r' % (attrname, new_value), + modified = [Entry(sub_id = '0x10000000-0x1FFFFFFF (sub-key 0x00000001)', + value_id = attrname, + source_value = old_value, + target_value = new_value)]) + + check('ref', 'Sub1', 'FooSub') + check('name', 'Sub-key 1', 'Foo') + check('type', 'int', 'real') + + self.assert_comparison_result_after_change_equals( + 'repo.keys[2].subkeys[0].int = "0xA"', + added = [Entry(sub_id='0x10000000-0x1FFFFFFF (sub-key 0x0000000A)')], + removed = [Entry(sub_id='0x10000000-0x1FFFFFFF (sub-key 0x00000001)')]) + + def test_key_type_changed(self): + # Change a bitmask key into a simple key + self.assert_comparison_result_after_change_equals( + "repo.keys[1] = CrmlSimpleKey(ref='Foo.Bar', name='Foo', int='0x2')", + modified = [Entry(sub_id = '0x00000002', + value_id = 'key_type', + source_value = 'bitmask_key', + target_value = 'simple_key'), + Entry(sub_id = '0x00000002', + value_id = 'name', + source_value = None, + target_value = 'Foo')]) + + # Change a simple key into a bitmask key + self.assert_comparison_result_after_change_equals( + "repo.keys[0] = CrmlBitmaskKey(int='0x1', name='Foo', bits=[CrmlBit(ref='Foo.Bit1', index=1)])", + modified = [Entry(sub_id = '0x00000001', + value_id = 'key_type', + source_value = 'simple_key', + target_value = 'bitmask_key'), + Entry(sub_id = '0x00000001', + value_id = 'name', + source_value = None, + target_value = 'Foo')]) + + def test_repository_attrs_changed(self): + def check(attrname, value_id, old_value, new_value): + self.assert_comparison_result_after_change_equals( + 'repo.%s = %r' % (attrname, new_value), + modified=[Entry(sub_id = None, + value_id = value_id, + source_value = old_value, + target_value = new_value)], + check_keys_in_entry_data=False) + + check('uid_name', 'uid_name', 'KCrUidTest', 'Foobar') + check('owner', 'owner', '0x11223344', '0xAABBCCDD') + check('backup', 'backup', True, False) + check('rfs', 'rfs', True, False) + check('access.cap_rd', 'cap_rd', None, 'FooCapability') + check('access.cap_wr', 'cap_wr', None, 'FooCapability') + check('access.sid_rd', 'sid_rd', None, '0x12345678') + check('access.sid_wr', 'sid_wr', None, '0x12345678') + + def test_repository_file_changed(self): + self.assert_comparison_result_after_change_equals( + '', # Make no modifications in the repository + modified=[Entry(sub_id = None, + value_id = 'file', + source_value = 'test.crml', + target_value = 'xyz.crml')], + target_resource_ref = 'xyz.crml', + check_keys_in_entry_data = False) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file