configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_comparator.py
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
equal deleted inserted replaced
-1:000000000000 0:2e8eeb919028
       
     1 #
       
     2 # Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 # All rights reserved.
       
     4 # This component and the accompanying materials are made available
       
     5 # under the terms of "Eclipse Public License v1.0"
       
     6 # which accompanies this distribution, and is available
       
     7 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 #
       
     9 # Initial Contributors:
       
    10 # Nokia Corporation - initial contribution.
       
    11 #
       
    12 # Contributors:
       
    13 #
       
    14 # Description:
       
    15 #
       
    16 
       
    17 import unittest
       
    18 import __init__
       
    19 from cone.public import plugin
       
    20 from CRMLPlugin.crml_model import *
       
    21 from CRMLPlugin.crml_comparator import CrmlComparator
       
    22 from cone.public.plugin import FlatComparisonResultEntry as Entry
       
    23 
       
    24 class TestComparator(unittest.TestCase):
       
    25     def setUp(self):
       
    26         keys = [
       
    27             CrmlSimpleKey(ref='Foo.Bar', int='0x1'),
       
    28             CrmlBitmaskKey(int='0x2', bits=[CrmlBit(ref='Foo.Bit1', index=1),
       
    29                                             CrmlBit(ref='Foo.Bit2', index=2),
       
    30                                             CrmlBit(ref='Foo.Bit4', index=4, invert=True)]),
       
    31             CrmlKeyRange(first_int='0x10000000', last_int='0x1FFFFFFF', ref="Foo.Seq",
       
    32                          subkeys=[CrmlKeyRangeSubKey(ref='Sub1', name='Sub-key 1', type='int', int='0x1'),
       
    33                                   CrmlKeyRangeSubKey(ref='Sub2', name='Sub-key 2', type='real', int='0x2')]),
       
    34         ]
       
    35     
       
    36         self.repo = CrmlRepository(
       
    37             uid_value   = '0x10203040',
       
    38             uid_name    = 'KCrUidTest',
       
    39             owner       = '0x11223344',
       
    40             backup      = True,
       
    41             rfs         = True,
       
    42             access      = CrmlAccess(),
       
    43             keys        = keys)
       
    44         
       
    45         self.comparator = CrmlComparator('test.crml', self.repo)
       
    46     
       
    47     
       
    48     def assert_comparison_result_after_change_equals(self,
       
    49         modification_code, added=[], removed=[], modified=[],
       
    50         check_keys_in_entry_data=True,
       
    51         target_resource_ref='test.crml'):
       
    52         # Make a copy of the test repo and modify it using the given code
       
    53         repo = self.repo.copy()
       
    54         exec(modification_code)
       
    55         
       
    56         expected_result = plugin.FlatComparisonResult(only_in_source = removed,
       
    57                                                       only_in_target = added,
       
    58                                                       modified       = modified)
       
    59         
       
    60         comparator = CrmlComparator('test.crml', self.repo)
       
    61         actual_result = comparator.flat_compare(target_resource_ref, repo)
       
    62         self.assertEquals(expected_result, actual_result)
       
    63         
       
    64         # Assert that all comparison result entries have references to the
       
    65         # repository objects 
       
    66         for entry in actual_result.only_in_source:
       
    67             self.assertTrue(isinstance(entry.data['repo'], CrmlRepository))
       
    68         for entry in actual_result.only_in_target:
       
    69             self.assertTrue(isinstance(entry.data['repo'], CrmlRepository))
       
    70         for entry in actual_result.modified:
       
    71             self.assertTrue(isinstance(entry.data['source_repo'], CrmlRepository))
       
    72             self.assertTrue(isinstance(entry.data['target_repo'], CrmlRepository))
       
    73         
       
    74         # Check also references to CRML key objects if specified
       
    75         if check_keys_in_entry_data:
       
    76             for entry in actual_result.only_in_source:
       
    77                 self.assertTrue(isinstance(entry.data['key'], CrmlKeyBase))
       
    78             for entry in actual_result.only_in_target:
       
    79                 self.assertTrue(isinstance(entry.data['key'], CrmlKeyBase))
       
    80             for entry in actual_result.modified:
       
    81                 self.assertTrue(isinstance(entry.data['source_key'], CrmlKeyBase))
       
    82                 self.assertTrue(isinstance(entry.data['target_key'], CrmlKeyBase))
       
    83     
       
    84     def test_simple_key_changed(self):
       
    85         def check(attrname, value_id, old_value, new_value):
       
    86             self.assert_comparison_result_after_change_equals(
       
    87                 'repo.keys[0].%s = %r' % (attrname, new_value),
       
    88                 modified=[Entry(sub_id       = '0x00000001',
       
    89                                 value_id     = value_id,
       
    90                                 source_value = old_value,
       
    91                                 target_value = new_value)])
       
    92         
       
    93         check('ref',            'ref',          'Foo.Bar',  'Foo.Baz')
       
    94         check('name',           'name',         None,       'Foobar')
       
    95         check('backup',         'backup',       False,      True)
       
    96         check('read_only',      'read_only',    False,      True)
       
    97         check('access.cap_rd',  'cap_rd',       None,       'FooCapability')
       
    98         check('access.cap_wr',  'cap_wr',       None,       'FooCapability')
       
    99         check('access.sid_rd',  'sid_rd',       None,       '0x12345678')
       
   100         check('access.sid_wr',  'sid_wr',       None,       '0x12345678')
       
   101         
       
   102         
       
   103         self.assert_comparison_result_after_change_equals(
       
   104             'repo.keys[0].int = "0x5"',
       
   105             added   = [Entry(sub_id='0x00000005')],
       
   106             removed = [Entry(sub_id='0x00000001')])
       
   107     
       
   108     def test_bitmask_key_changed(self):
       
   109         def check(attrname, value_id, old_value, new_value):
       
   110             self.assert_comparison_result_after_change_equals(
       
   111                 'repo.keys[1].%s = %r' % (attrname, new_value),
       
   112                 modified=[Entry(sub_id       = '0x00000002',
       
   113                                 value_id     = value_id,
       
   114                                 source_value = old_value,
       
   115                                 target_value = new_value)])
       
   116         
       
   117         check('name',           'name',         None,       'Foobar')
       
   118         check('backup',         'backup',       False,      True)
       
   119         check('read_only',      'read_only',    False,      True)
       
   120         check('access.cap_rd',  'cap_rd',       None,       'FooCapability')
       
   121         check('access.cap_wr',  'cap_wr',       None,       'FooCapability')
       
   122         check('access.sid_rd',  'sid_rd',       None,       '0x12345678')
       
   123         check('access.sid_wr',  'sid_wr',       None,       '0x12345678')
       
   124     
       
   125         self.assert_comparison_result_after_change_equals(
       
   126             'repo.keys[1].int = "0x5"',
       
   127             added   = [Entry(sub_id='0x00000005')],
       
   128             removed = [Entry(sub_id='0x00000002')])
       
   129     
       
   130     def test_bitmask_key_bit_changed(self):    
       
   131         def check(attrname, value_id, old_value, new_value):
       
   132             self.assert_comparison_result_after_change_equals(
       
   133                 'repo.keys[1].bits[0].%s = %r' % (attrname, new_value),
       
   134                 modified = [Entry(sub_id       = '0x00000002 (bit 1)',
       
   135                                   value_id     = value_id,
       
   136                                   source_value = old_value,
       
   137                                   target_value = new_value)])
       
   138         
       
   139         check('ref',    'ref',      'Foo.Bit1', 'Foo.Bar.Bit')
       
   140         check('invert', 'invert',   False,      True)
       
   141         
       
   142         self.assert_comparison_result_after_change_equals(
       
   143             'repo.keys[1].bits[0].index = 6',
       
   144             added   = [Entry(sub_id='0x00000002 (bit 6)')],
       
   145             removed = [Entry(sub_id='0x00000002 (bit 1)')])
       
   146         
       
   147     
       
   148     def test_key_range_changed(self):
       
   149         def check(attrname, value_id, old_value, new_value):
       
   150             self.assert_comparison_result_after_change_equals(
       
   151                 'repo.keys[2].%s = %r' % (attrname, new_value),
       
   152                 modified=[Entry(sub_id       = '0x10000000-0x1FFFFFFF',
       
   153                                 value_id     = value_id,
       
   154                                 source_value = old_value,
       
   155                                 target_value = new_value)])
       
   156         
       
   157         check('ref',            'ref',          'Foo.Seq',  'Foo.Bar')
       
   158         check('name',           'name',         None,       'Foobar')
       
   159         check('backup',         'backup',       False,      True)
       
   160         check('read_only',      'read_only',    False,      True)
       
   161         check('access.cap_rd',  'cap_rd',       None,       'FooCapability')
       
   162         check('access.cap_wr',  'cap_wr',       None,       'FooCapability')
       
   163         check('access.sid_rd',  'sid_rd',       None,       '0x12345678')
       
   164         check('access.sid_wr',  'sid_wr',       None,       '0x12345678')
       
   165         
       
   166         def check(attrname, new_value, old_id, new_id):
       
   167             self.assert_comparison_result_after_change_equals(
       
   168                 'repo.keys[2].%s = %r' % (attrname, new_value),
       
   169             added   = [Entry(sub_id=new_id)],
       
   170             removed = [Entry(sub_id=old_id)])
       
   171         
       
   172         check('first_int',  '0x00000000',   '0x10000000-0x1FFFFFFF', '0x00000000-0x1FFFFFFF')
       
   173         check('last_int',   '0x20000000',   '0x10000000-0x1FFFFFFF', '0x10000000-0x20000000')
       
   174     
       
   175     def test_key_range_subkey_changed(self):
       
   176         def check(attrname, old_value, new_value):
       
   177             self.assert_comparison_result_after_change_equals(
       
   178                 'repo.keys[2].subkeys[0].%s = %r' % (attrname, new_value),
       
   179                 modified = [Entry(sub_id       = '0x10000000-0x1FFFFFFF (sub-key 0x00000001)',
       
   180                                   value_id     = attrname,
       
   181                                   source_value = old_value,
       
   182                                   target_value = new_value)])
       
   183         
       
   184         check('ref', 'Sub1', 'FooSub')
       
   185         check('name', 'Sub-key 1', 'Foo')
       
   186         check('type', 'int', 'real')
       
   187         
       
   188         self.assert_comparison_result_after_change_equals(
       
   189             'repo.keys[2].subkeys[0].int = "0xA"',
       
   190             added   = [Entry(sub_id='0x10000000-0x1FFFFFFF (sub-key 0x0000000A)')],
       
   191             removed = [Entry(sub_id='0x10000000-0x1FFFFFFF (sub-key 0x00000001)')])
       
   192     
       
   193     def test_key_type_changed(self):
       
   194         # Change a bitmask key into a simple key
       
   195         self.assert_comparison_result_after_change_equals(
       
   196             "repo.keys[1] = CrmlSimpleKey(ref='Foo.Bar', name='Foo', int='0x2')",
       
   197             modified = [Entry(sub_id       = '0x00000002',
       
   198                               value_id     = 'key_type',
       
   199                               source_value = 'bitmask_key',
       
   200                               target_value = 'simple_key'),
       
   201                         Entry(sub_id       = '0x00000002',
       
   202                               value_id     = 'name',
       
   203                               source_value = None,
       
   204                               target_value = 'Foo')])
       
   205         
       
   206         # Change a simple key into a bitmask key
       
   207         self.assert_comparison_result_after_change_equals(
       
   208             "repo.keys[0] = CrmlBitmaskKey(int='0x1', name='Foo', bits=[CrmlBit(ref='Foo.Bit1', index=1)])",
       
   209             modified = [Entry(sub_id       = '0x00000001',
       
   210                               value_id     = 'key_type',
       
   211                               source_value = 'simple_key',
       
   212                               target_value = 'bitmask_key'),
       
   213                         Entry(sub_id       = '0x00000001',
       
   214                               value_id     = 'name',
       
   215                               source_value = None,
       
   216                               target_value = 'Foo')])
       
   217     
       
   218     def test_repository_attrs_changed(self):
       
   219         def check(attrname, value_id, old_value, new_value):
       
   220             self.assert_comparison_result_after_change_equals(
       
   221                 'repo.%s = %r' % (attrname, new_value),
       
   222                 modified=[Entry(sub_id       = None,
       
   223                                 value_id     = value_id,
       
   224                                 source_value = old_value,
       
   225                                 target_value = new_value)],
       
   226                 check_keys_in_entry_data=False)
       
   227         
       
   228         check('uid_name',       'uid_name',     'KCrUidTest',   'Foobar')
       
   229         check('owner',          'owner',        '0x11223344',   '0xAABBCCDD')
       
   230         check('backup',         'backup',       True,           False)
       
   231         check('rfs',            'rfs',          True,           False)
       
   232         check('access.cap_rd',  'cap_rd',       None,           'FooCapability')
       
   233         check('access.cap_wr',  'cap_wr',       None,           'FooCapability')
       
   234         check('access.sid_rd',  'sid_rd',       None,           '0x12345678')
       
   235         check('access.sid_wr',  'sid_wr',       None,           '0x12345678')
       
   236     
       
   237     def test_repository_file_changed(self):
       
   238         self.assert_comparison_result_after_change_equals(
       
   239             '', # Make no modifications in the repository
       
   240             modified=[Entry(sub_id       = None,
       
   241                             value_id     = 'file',
       
   242                             source_value = 'test.crml',
       
   243                             target_value = 'xyz.crml')],
       
   244             target_resource_ref = 'xyz.crml',
       
   245             check_keys_in_entry_data = False)
       
   246 
       
   247 if __name__ == '__main__':
       
   248     unittest.main()