buildframework/helium/sf/python/pythoncore/lib/ats3/testconfigurator.py
changeset 587 85df38eb4012
child 588 c7c26511138f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/testconfigurator.py	Tue Apr 27 08:33:08 2010 +0300
@@ -0,0 +1,341 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : testconfigurator.py 
+#Part of     : Helium 
+
+#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 the License "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:
+#===============================================================================
+
+"""Parse Symbian SW component for ATS3 testing related information"""
+
+# pylint: disable-msg=R0902,R0912,R0901,R0915,R0201
+#R* remove during refactoring
+
+from path import path # pylint: disable-msg=F0401
+import ats3.parsers as parser
+import logging
+import os
+import subprocess
+import fileutils
+
+_logger = logging.getLogger('ats')
+
+class Ats3ComponentParser(object):
+    """
+    Parse Symbian SW component for ATS3 testing related information.
+    
+    Parses a component's source directories for testing related settings and
+    files, and generates a TestPlan out of the findings.
+    
+    """
+
+    def __init__(self, config):
+        
+        self.target_platform = config.target_platform
+        self.pkg_parser = parser.PkgFileParser(self.target_platform.replace(" ", "_")+".pkg", config.specific_pkg)
+        
+        self.bld_parser = parser.BldFileParser()
+        self.mmp_parser = parser.MmpFileParser()
+        
+        self.data_dirs = config.data_dir
+        self.flash_images = [path(p) for p in config.flash_images]
+        self.tsrc_dir = None
+        self.build_drive = config.build_drive
+        self.target_platform = config.target_platform
+        self.sis_files = config.sis_files
+        self.cfg_harness = config.harness
+        self.test_timeout = config.test_timeout
+        self.trace_enabled = config.trace_enabled
+        self.excludable_dlls = []
+        self.custom_dir = None
+
+    def insert_testset_stif(self, src_dst, pkg_paths):
+        """Inserts test set data to test plan for stif"""
+        if not pkg_paths:    
+            try:
+                
+                tsrc_testdata_files = self.tsrc_data_files()
+                for data_file in tsrc_testdata_files:
+                    if "\\mmc\\" in data_file.lower():
+                        src_dst.append((data_file, path(r"e:\testing\data").joinpath(data_file.name), "data"))
+                    elif "\\c\\" in data_file.lower():
+                        src_dst.append((data_file, path(r"c:\testing\data").joinpath(data_file.name), "data"))
+                    else:
+                        src_dst.append((data_file, path(r"c:\testing\data").joinpath(data_file.name), "data"))
+            except OSError:
+                _logger.warning("No testdata folder" )
+                tsrc_testdata_files = None
+
+        else:
+            try:
+                src_dst = pkg_paths
+            except OSError:
+                _logger.warning("No pkg file found in the directory ( %s )" % self.tsrc_pkg_dir)
+                src_dst = []
+            except IndexError:
+                _logger.warning("No pkg file found in the directory ( %s )" % self.tsrc_pkg_dir)
+                src_dst = []
+        
+        return src_dst
+                
+    def insert_test_set(self, test_plan, tsrc_dir, _paths_dict_):
+        """Parse tsrc directory, storing data into the test plan."""
+        self.tsrc_dir = path(tsrc_dir)  # Store current test source dir.
+        tsrc_testdata_files = []
+        tsrc_config_files = []
+        self.custom_dir = None
+        engine_ini_file = None
+        test_harness = self.cfg_harness
+        src_dst = []
+        pmd_files = []
+        trace_activation_files = []
+        
+        if not os.path.exists( self.tsrc_dir ):
+            _logger.error("Missing test source directory: %s", self.tsrc_dir)
+        else:
+            self.custom_dir = self.tsrc_dir.joinpath("custom")
+            _logger.debug("using customized testing from %s" % self.custom_dir)
+            if os.path.exists(self.tsrc_bld_dir.joinpath("group","bld.inf")):
+                mmp_files = self.bld_parser.get_test_mmp_files(self.tsrc_bld_dir.joinpath("group","bld.inf"))                
+            else:
+                mmp_files = self.bld_parser.get_test_mmp_files(self.tsrc_bld_dir.joinpath("bld.inf"))
+                
+            test_harness = self.mmp_parser.get_harness(mmp_files)
+            
+            pkg_paths = self.pkg_parser.get_data_files(self.tsrc_pkg_files(_paths_dict_), self.build_drive)
+            if self.trace_enabled == "True":
+                try:
+                    pmd_files = self.tsrc_pmd_files()
+                except OSError:
+                    _logger.warning("No pmd file in output-folder.")
+                try:
+                    trace_activation_files = self.tsrc_trace_activation_files()
+                except OSError:
+                    _logger.warning("No trace activation files in trace init folder")
+                if trace_activation_files and not pmd_files:
+                    _logger.warning("Trace activation files available but NOT pmd file.")
+                elif pmd_files and not trace_activation_files:
+                    _logger.warning("Pmd file available but NO trace activation files.")
+            
+            if test_harness == "STIF" or test_harness == "STIFUNIT" or test_harness == "GENERIC":
+                src_dst = self.insert_testset_stif(src_dst, pkg_paths)
+                        
+            elif test_harness == "EUNIT":
+                try:
+                    src_dst  = self.pkg_parser.get_data_files(self.tsrc_pkg_files(_paths_dict_), self.build_drive)
+
+                except OSError:
+                    _logger.warning("No pkg file found in the directory ( %s )" % self.tsrc_pkg_dir)
+                    src_dst = []
+                except IndexError:
+                    _logger.warning("No pkg file found in the directory ( %s )" % self.tsrc_pkg_dir)
+                    src_dst = []
+            try:
+                testmodule_files = self.tsrc_dll_files()
+
+                for dll_file in testmodule_files:
+                    if not self.check_dll_duplication(dll_file.name, src_dst):
+                        _dll_type_ = self.mmp_parser.get_dll_type(self.tsrc_bld_dir)
+
+                        if dll_file.name in self.excludable_dlls:
+                            src_dst.append((dll_file, path(r"c:\sys\bin").joinpath(dll_file.name), "data:%s" % _dll_type_))
+                        else:
+                            src_dst.append((dll_file, path(r"c:\sys\bin").joinpath(dll_file.name), "testmodule"))
+
+            except OSError:
+                _logger.warning("No dll files in dll folders" )
+                tsrc_testdata_files = None
+
+            if test_plan['multiset_enabled'] == 'True':
+                backup = []
+                temp_src_dst = {}
+                for x_temp in src_dst:
+                    if len(x_temp) < 4:
+                        backup.append(x_temp)
+                for x_temp in src_dst:
+                    if len(x_temp) > 3:
+                        if temp_src_dst.has_key(x_temp[3]):
+                            temp_src_dst[x_temp[3]].append(x_temp)
+                        else:
+                            temp_src_dst[x_temp[3]] = [x_temp] + backup
+                
+                for pkg in temp_src_dst.keys():
+                    src_dst = temp_src_dst[pkg]
+                    
+                    if self.trace_enabled == "True":
+                        test_plan.insert_set(data_files=tsrc_testdata_files,
+                                             config_files=tsrc_config_files,
+                                             engine_ini_file=engine_ini_file,
+                                             image_files=self.flash_images,
+                                             sis_files=self.sis_files,
+                                             #testmodule_files=self.tsrc_dll_files(),
+                                             test_timeout=list(self.test_timeout),
+                                             test_harness=test_harness,
+                                             src_dst=src_dst,
+                                             pmd_files=pmd_files,
+                                             trace_activation_files=trace_activation_files,
+                                             custom_dir=self.custom_dir,
+                                             component_path=tsrc_dir)
+                    else:
+                        test_plan.insert_set(image_files=self.flash_images,
+                                             sis_files=self.sis_files,
+                                             test_timeout=list(self.test_timeout),
+                                             test_harness=test_harness,
+                                             src_dst=src_dst,
+                                             custom_dir=self.custom_dir,
+                                             component_path=tsrc_dir)
+            else:
+                if self.trace_enabled == "True":
+                    test_plan.insert_set(data_files=tsrc_testdata_files,
+                                         config_files=tsrc_config_files,
+                                         engine_ini_file=engine_ini_file,
+                                         image_files=self.flash_images,
+                                         sis_files=self.sis_files,
+                                         #testmodule_files=self.tsrc_dll_files(),
+                                         test_timeout=list(self.test_timeout),
+                                         test_harness=test_harness,
+                                         src_dst=src_dst,
+                                         pmd_files=pmd_files,
+                                         trace_activation_files=trace_activation_files,
+                                         custom_dir=self.custom_dir,
+                                         component_path=tsrc_dir)
+                else:
+                    test_plan.insert_set(image_files=self.flash_images,
+                                         sis_files=self.sis_files,
+                                         test_timeout=list(self.test_timeout),
+                                         test_harness=test_harness,
+                                         src_dst=src_dst,
+                                         custom_dir=self.custom_dir,
+                                         component_path=tsrc_dir)
+
+    def check_dll_duplication(self, _dll_file_, _src_dst_ ):
+        """Checks if the dll is already in the dictionary, created by pkg file"""
+        for item in _src_dst_:
+            first = item[0]
+            return _dll_file_.lower() in first.lower()
+            
+    @property
+    def tsrc_bld_dir(self):
+        """Component's build directory."""
+        return self.tsrc_dir
+
+    @property
+    def tsrc_conf_dir(self):
+        """Component's configuration file directory."""
+        return self.tsrc_dir.joinpath("conf")
+
+    @property
+    def tsrc_custom_dir(self):
+        """Component's test customization directory."""
+        return self.tsrc_dir.joinpath("custom")
+
+
+    @property
+    def tsrc_data_dirs(self):
+        """Component's data directories."""
+        return [self.tsrc_dir.joinpath(d) for d in self.data_dirs]
+
+    @property
+    def tsrc_init_dir(self):
+        """Component's initialization file directory."""
+        return self.tsrc_dir.joinpath("init")
+    
+    @property
+    def tsrc_pkg_dir(self):
+        """Component's .pkg -file directory"""
+        return self.tsrc_dir
+    
+    @property
+    def tsrc_trace_activation_dir(self):
+        """Component's trace activation file directory"""
+        return self.tsrc_dir.joinpath("trace_init")
+
+    @property
+    def tsrc_pmd_dir(self):
+        """Component's pmd file directory"""
+        pmd_dir = self.build_drive + os.sep
+        return pmd_dir.joinpath("output", "pmd")
+
+    def tsrc_pmd_files(self):
+        """Component's trace pmd files from the {build_drive}\output directory"""
+        return list(self.tsrc_pmd_dir.walkfiles("*.pmd"))
+
+    def tsrc_trace_activation_files(self):
+        """Component's trace activation files, from the rtace_init directory."""
+        return list(self.tsrc_trace_activation_dir.walkfiles("*.xml"))
+    
+    def tsrc_config_files(self):
+        """Component's configuration files, from the conf directory."""
+        return list(self.tsrc_conf_dir.walkfiles("*.cfg"))
+
+    def tsrc_ini_files(self):
+        """Component's initialiation files, from the ini directory."""
+        return list(self.tsrc_init_dir.walkfiles("*.ini"))
+
+    def tsrc_data_files(self):
+        """Component's data files, from data directories."""
+        files = []
+        files2 = []
+        for data_dir in self.tsrc_data_dirs:            
+            if data_dir.exists():
+                files.extend(list(data_dir.walkfiles()))        
+        
+        #Remove dist policy files
+        for data_file in files:
+            if data_file.name.lower() != "distribution.policy.s60":
+                files2.append(data_file)
+        return files2
+
+    def tsrc_dll_files(self):
+        """Component's DLL files, reported by ABLD BUILD."""
+
+        dlls = []
+        orig_dir = os.getcwd()
+        try:
+            os.chdir(self.tsrc_bld_dir)
+            #os.system("abld test build %s" % self.target_platform)
+
+            if os.sep == '\\': 
+                raptor_cmd = fileutils.which("sbs.bat")
+            else:
+                raptor_cmd = fileutils.which("sbs")
+            if raptor_cmd:
+                process = subprocess.Popen("sbs --what -c %s.test" % self.target_platform.replace(' ', '_'), shell=True, stdout=subprocess.PIPE)
+            else:
+                os.system("bldmake bldfiles")
+                process = subprocess.Popen("abld -w test build %s" % self.target_platform, shell=True, stdout=subprocess.PIPE)
+            pipe = process.communicate()[0]
+            
+            for line in pipe.split('\n'):
+                _logger.debug(line.strip())
+                target = path(line.strip())
+                if target.ext == ".dll":
+                    
+                    build_target = self.build_drive.joinpath(target).normpath()
+                    if not build_target.exists():
+                        _logger.warning("not found: %s" % build_target)
+                    else:
+                        dlls.append(build_target)
+        finally:
+            os.chdir(orig_dir)
+        return dlls
+
+    def tsrc_pkg_files(self, _dict_):
+        """Component's package files, from the group directory"""
+        pkg_dirs = []
+        for sub_component in _dict_[self.tsrc_pkg_dir]['content'].keys():
+            pkg_dirs.append(sub_component)
+        return pkg_dirs