configurationengine/source/plugins/symbian/integration-test/unittest_crml_dc.py
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/unittest_crml_dc.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,189 @@
+# *-* coding: utf-8 *-*
+#
+# 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:
+#
+## 
+# @author Teemu Rytkonen
+
+import sys, os, shutil, unittest
+import __init__
+from testautomation.base_testcase import BaseTestCase
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+TEMP_DIR        = os.path.normpath(os.path.join(ROOT_PATH, 'temp/crml_dc'))
+
+if sys.platform == "win32":
+    CONE_SCRIPT = "cone.cmd"
+else:
+    CONE_SCRIPT = "cone.sh"
+
+def get_cmd(action='compare'):
+    """Return the command used to run the ConE sub-action"""
+    if 'CONE_PATH' in os.environ:
+        CONE_CMD = os.path.join(os.environ['CONE_PATH'], CONE_SCRIPT)
+        if not os.path.exists(CONE_CMD):
+            raise RuntimeError("'%s' does not exist!" % CONE_CMD)
+        return '"%s" %s' % (CONE_CMD, action)
+    else:
+        SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../..'))
+        assert os.path.split(SOURCE_ROOT)[1] == 'source'
+        cmd = 'python "%s" %s' % (os.path.normpath(os.path.join(SOURCE_ROOT, 'scripts/cone_tool.py')), action)
+        return cmd
+
+def get_crml_dc_testdata_dir():
+    # If running from the working copy
+    dir1 = os.path.normpath(os.path.join(ROOT_PATH, '../ConeCRMLPlugin/CRMLPlugin/tests'))
+    if os.path.isdir(dir1): return dir1
+    
+    # If running from standalone
+    dir2 = os.path.normpath(os.path.join(ROOT_PATH, 'testdata/compare/crml_dc'))
+    if os.path.isdir(dir2): return dir2
+    
+    raise RuntimeError("CRML DC test data found neither in '%s' nor '%s'!" % (dir1, dir2))
+
+
+class TestCompareAction(BaseTestCase):
+    
+    def setUp(self):
+        if not os.path.exists(TEMP_DIR):
+            os.makedirs(TEMP_DIR)
+    
+    def _run_crml_dc_test(self, crml_file_name_without_extension, do_filtering=True):
+        testdata_dir = get_crml_dc_testdata_dir()
+        report_file = 'crml_dc_%s.csv' % crml_file_name_without_extension
+        if do_filtering:
+            impl_filter = '%s' % crml_file_name_without_extension
+        else:
+            impl_filter = '.*'
+        self._run_comparison_test(
+            source_project  = os.path.join(testdata_dir, 'comp_project_1'),
+            source_conf     = 'root.confml',
+            target_project  = os.path.join(testdata_dir, 'comp_project_2'),
+            target_conf     = 'root.confml',
+            report_type     = 'crml_dc_csv',
+            report_file     = report_file,
+            impl_filter     = impl_filter,
+            check_against_expected_output = True)
+    
+    def test_crml_dc_00000001_simple_keys(self):        self._run_crml_dc_test('00000001_simple_keys')
+    def test_crml_dc_00000002_bitmask_keys(self):       self._run_crml_dc_test('00000002_bitmask_keys')
+    def test_crml_dc_00000003_key_ranges(self):         self._run_crml_dc_test('00000003_key_ranges')
+    def test_crml_dc_00000004_key_type_changed(self):   self._run_crml_dc_test('00000004_key_type_changed')
+    def test_crml_dc_00000005_repo_attrs_changed(self): self._run_crml_dc_test('00000005_repo_attrs_changed')
+    def test_crml_dc_10000001_removed_repo(self):       self._run_crml_dc_test('10000001_removed_repo')
+    def test_crml_dc_20000001_added_repo(self):         self._run_crml_dc_test('20000001_added_repo')
+    def test_crml_dc_00000006_renamed_repo(self):       self._run_crml_dc_test('00000006_renamed_repo')
+    def test_crml_dc_30000000_duplicate_repo(self):     self._run_crml_dc_test('30000000_duplicate_repo')
+    def test_crml_dc_all(self):                         self._run_crml_dc_test('all', do_filtering=False)
+    
+    def test_crml_dc_html_report(self):
+        testdata_dir = get_crml_dc_testdata_dir()
+        
+        # Ignore the portion of the data where the path to the target is shown
+        ignore_patterns = [r'<tr>\s*<td>Target:</td>\s*<td>.*[\\,/]comp_project_2;root.confml</td>']
+        
+        self._run_comparison_test(
+            source_project  = os.path.join(testdata_dir, 'comp_project_1'),
+            source_conf     = 'root.confml',
+            target_project  = os.path.join(testdata_dir, 'comp_project_2'),
+            target_conf     = 'root.confml',
+            report_type     = 'crml_dc',
+            report_file     = 'crml_dc.html',
+            check_against_expected_output = True,
+            data_ignore_patterns = ignore_patterns)
+    
+    def _run_comparison_test(self, **kwargs):
+        """
+        Run comparison test.
+        
+        @param source_project: The source project, relative to the test data directory or an
+            absolute path.
+        @param source_conf: The source configuration.
+        @param target_project: The target project, relative to the test data directory
+            If not given or None, the source project will be used also for this.
+        @param target_conf: The target configuration.
+        @param template: The template file used for the report, relative to the test data directory.
+        @param report_type: The report type. Should not be used with the 'template' parameter.
+        @param report_file: The location where the report is written. This will also be used as
+            the name of the expected report file against which the actual report is checked.
+        @param impl_filter: Implementation filter to use.
+        @param check_against_expected_output: If True, the actual report is checked against an
+            expected file with the same name. Otherwise it is just checked that the output
+            file has been created and it contains something.
+        @param data_ignore_patterns: List of regular expression patterns for ignoring some portions
+            of the data when checking against expected output. The patterns are used to remove
+            data portions before doing the actual comparison.
+        """
+        # Get parameters
+        # ---------------
+        def get_project_absdir(project_dir):
+            if os.path.isabs(project_dir):
+                return project_dir
+            else:
+                return os.path.normpath(os.path.join(TESTDATA_DIR, project_dir))
+        
+        source_conf = kwargs['source_conf']
+        target_conf = kwargs['target_conf']
+        source_project = get_project_absdir(kwargs['source_project'])
+        target_project = kwargs.get('target_project', None)
+        
+        if target_project != None:
+            target_project = get_project_absdir(target_project)
+            target_conf = target_project + ';' + target_conf
+        
+        template = kwargs.get('template', None)
+        report_type = kwargs.get('report_type', None)
+        if template and report_type:
+            raise ValueError("Both 'template' and 'report_type' parameters given")
+        elif not template and not report_type:
+            raise ValueError("Neither 'template' not 'report_type' parameter given")
+        elif template:
+            template = os.path.normpath(os.path.join(TESTDATA_DIR, template))
+        
+        report_file = kwargs['report_file']
+        check_against_expected_output = kwargs['check_against_expected_output']
+        actual_report = os.path.normpath(os.path.join(TEMP_DIR, report_file))
+        
+        impl_filter = kwargs.get('impl_filter', None)
+        
+        
+        # Generate output
+        # ----------------
+        if report_type:
+            command = '%s -p "%s" -s "%s" -t "%s" --report-type "%s" --report "%s"' \
+                % (get_cmd(), source_project, source_conf, target_conf, report_type, actual_report)
+        else:
+            command = '%s -p "%s" -s "%s" -t "%s" --template "%s" --report "%s"' \
+                % (get_cmd(), source_project, source_conf, target_conf, template, actual_report)
+        
+        if impl_filter:
+            command += ' --impl-filter "%s"' % impl_filter
+        
+        self.remove_if_exists(actual_report)
+        self.run_command(command)
+        
+        
+        # Check output
+        # -------------
+        if check_against_expected_output:
+            expected_report = os.path.normpath(os.path.join(ROOT_PATH, 'testdata/crml_dc_expected', report_file))
+            ignore_patterns = kwargs.get('data_ignore_patterns', [])
+            self.assert_file_contents_equal(expected_report, actual_report, ignore_patterns)
+        else:
+            self.assert_exists_and_contains_something(actual_report)
+        
+        
+if __name__ == '__main__':
+      unittest.main()