configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_comparator.py
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
--- /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