buildframework/helium/sf/python/pythoncore/lib/ats3/matti/MattiDrops.py
changeset 587 85df38eb4012
child 628 7c4a911dc066
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/matti/MattiDrops.py	Tue Apr 27 08:33:08 2010 +0300
@@ -0,0 +1,254 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================
+#Name        : MattiDrops.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: Script for test drop generation and sending to execution to 
+#ATS3-system
+#===============================================================================
+
+""" create the MATTI test drop file for use on the test server """
+# pylint: disable-msg=R0902, R0903, R0912
+
+import os
+import re
+import sys
+import string
+import zipfile
+import logging 
+from optparse import OptionParser
+from xml.etree import ElementTree as et
+from jinja2 import Environment, PackageLoader # pylint: disable-msg=F0401
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+
+_logger = logging.getLogger('matti')
+
+class Configuration(object):
+    """
+    ATS3 drop generation configuration.
+    """
+    
+    def __init__(self, opts):
+        """
+        Initialize from optparse configuration options.
+        """
+        self._opts = opts
+        
+        # Customize some attributes from how optparse leaves them.
+        self.build_drive = os.path.normpath(self._opts.build_drive)
+        self.file_store = os.path.normpath(self._opts.file_store)
+        self.matti_scripts = os.path.normpath(self._opts.matti_scripts)
+        self.template_location = os.path.normpath(self._opts.template_loc)
+        if self._opts.flash_images:
+            self.flash_images = self._opts.flash_images.split(',')
+        else:
+            self.flash_images = []
+        if not re.search(r'\A\s*?\Z', self._opts.sis_files):
+            self.sis_files = self._opts.sis_files.split(',')
+        else:
+            self.sis_files = None
+        self.step_list = []
+        self.filelist = []
+        self.image_list = []
+        self.sis_list = []
+        self.device_type = self._opts.device_type
+        self.device_hwid = self._opts.device_hwid
+        self.drop_file = self._opts.drop_file
+        self.minimum_flash_images = self._opts.minimum_flash_images
+        self.plan_name = self._opts.plan_name
+        self.test_timeout = self._opts.test_timeout 
+        self.diamonds_build_url = self._opts.diamonds_build_url
+        self.testrun_name = self._opts.testrun_name    
+        self.report_email = self._opts.report_email
+        self.harness = self._opts.harness
+        self.sis_enabled = False
+        if self.sis_files:
+            if len(self.sis_files) >= 1:
+                self.sis_enabled = True
+        
+    
+    def __getattr__(self, attr):
+        return getattr(self._opts, attr)
+    
+    def __str__(self):
+        dump = "Configuration:\n"
+        seen = set()
+        for key, value in vars(self).items():
+            if not key.startswith("_"):
+                dump += "\t%s = %s\n" % (key, value)
+                seen.add(key)
+        for key, value in vars(self._opts).items():
+            if key not in seen:
+                dump += "\t%s = %s\n" % (key, value)
+                seen.add(key)                
+        return dump
+            
+class MattiDrop(object):
+    """
+    ATS3 testdrop generation for MATTI tool
+    """
+    
+    def __init__(self, config=None):
+        self.configuration = config
+        self.matti_cases = {}
+        self.tmp_path = os.getcwd()
+        self.files = []
+        self.test_files = []
+    
+    def fetch_testfiles(self):
+        """Needed flash files, sis-files and testscripts from given matti scripts -folder are added to file list."""
+        tmp_case_list = []
+#        tmp_image_list = []
+        os.chdir(os.path.normpath(self.configuration.matti_scripts))
+        try:
+            for path, _, names in os.walk(os.getcwd()):
+                for name in names:
+                    if re.search(r'.*?[.]rb\Z', name):
+                        tmp_case_list.append((os.path.normpath(os.path.join(path, name)), os.path.join("ats3", "matti", "script", name)))
+            if tmp_case_list:
+                for tmp_case in tmp_case_list:
+                    self.configuration.step_list.append(dict(path=os.path.join("§TEST_RUN_ROOT§", str(tmp_case[1])), name="Test case"))
+            if self.configuration.flash_images:
+                for image in self.configuration.flash_images:
+                    tmp = string.rsplit(image, os.sep)
+                    image_name = tmp[len(tmp)-1] 
+                    self.configuration.image_list.append(os.path.join("ATS3Drop", "images", image_name))
+            if self.configuration.sis_files:
+                for sis in self.configuration.sis_files:
+                    tmp = string.rsplit(sis, os.sep)
+                    sis_name = tmp[len(tmp)-1] 
+                    self.configuration.sis_list.append(dict(path=os.path.join("ATS3Drop", "sis", sis_name), dest=sis_name))
+        except KeyError, error:
+            _logger.error("Error in file reading / fetching!")
+            sys.stderr.write(error)
+        if tmp_case_list:
+            for tmp_case in tmp_case_list:
+                self.configuration.filelist.append(tmp_case[1])
+            return tmp_case_list
+        else:
+            _logger.error("No test cases/files available!")
+            return None
+    
+    
+    def create_testxml(self):
+        """This method will use Jinja2 template engine for test.xml creation"""
+        os.chdir(self.tmp_path)
+        env = Environment(loader=PackageLoader('ats3.matti', 'template'))
+        if os.path.isfile(self.configuration.template_location):
+            template = env.from_string(open(self.configuration.template_location).read())
+            xml_file = open("test.xml", 'w')
+            xml_file.write(template.render(configuration=self.configuration))
+            xml_file.close()
+        else:
+            _logger.error("No template file found")
+                
+    def create_testdrop(self, output_file=None, file_list=None):
+        """Creates testdrop zip-file to given location."""
+        #env = Environment(loader=PackageLoader('MattiDrops', 'template'))
+        os.chdir(self.tmp_path)
+        if output_file and file_list:
+            zfile = zipfile.ZipFile(output_file, "w", zipfile.ZIP_DEFLATED)
+            try:
+                _logger.info("Adding files to testdrop:")
+                for src_file, drop_file in file_list:
+                    _logger.info("   + Adding: %s" % src_file.strip())
+                    if os.path.isfile(src_file):
+                        zfile.write(str(src_file.strip()), str(drop_file))
+                    else:
+                        _logger.error("invalid test file name supplied %s " % drop_file)
+                if self.configuration.flash_images:
+                    for image in self.configuration.flash_images:
+                        tmp = string.rsplit(image, os.sep)
+                        image_name = tmp[len(tmp)-1] 
+                        _logger.info("   + Adding: %s" % image_name)
+                        if  os.path.isfile(image):
+                            zfile.write(image, os.path.join("ATS3Drop", "images", image_name))
+                        else:
+                            _logger.error("invalid flash file name supplied %s " % image_name)
+                if self.configuration.sis_enabled:
+                    if self.configuration.sis_files:
+                        for sis in self.configuration.sis_files:
+                            tmp = string.rsplit(sis, os.sep)
+                            sis_name = tmp[len(tmp)-1] 
+                            _logger.info("   + Adding: %s" % sis_name)
+                            if os.path.isfile(sis):
+                                zfile.write(sis, os.path.join("ATS3Drop", "sis", sis_name))
+                            else:
+                                _logger.error("invalid sis file name supplied %s " % sis_name)
+                zfile.write(os.path.normpath(os.path.join(os.getcwd(),"test.xml")), "test.xml")
+            finally:
+                _logger.info("Testdrop created! %s" % output_file)            	   
+                zfile.close()
+            return zfile
+    
+def create_drop(configuration):
+    """Testdrop creation"""
+    if configuration:
+        m_drop = MattiDrop(configuration)
+        m_drop.fetch_testfiles()
+        m_drop.create_testxml()
+        return m_drop.create_testdrop(configuration.drop_file, m_drop.fetch_testfiles())
+    else:
+        _logger.error("No configuration available for test drop creation")        
+        
+def main():
+    """Main entry point."""    
+    cli = OptionParser(usage="%prog [options] TSRC1 [TSRC2 [TSRC3 ...]]")
+    cli.add_option("--build-drive", help="Build area root drive", default='X:')
+    cli.add_option("--matti-scripts", help="Path to the directory where the MATTI test scripts are saved.", default="")
+    cli.add_option("--flash-images", help="Flash image files as a list",
+                   default="")
+    cli.add_option("--report-email", help="Email notification receivers", 
+                   default="")
+    cli.add_option("--harness", help="Test harness (default: %default)",
+                   default="unknown")
+    cli.add_option("--file-store", help="Destination path for reports.",
+                   default="")
+    cli.add_option("--testrun-name", help="Name of the test run", 
+                   default="run")
+    cli.add_option("--device-type", help="Device type (e.g. 'PRODUCT')", 
+                   default="unknown")
+    cli.add_option("--device-hwid", help="Device hwid", 
+                   default="")
+    cli.add_option("--diamonds-build-url", help="Diamonds build url")
+    cli.add_option("--drop-file", help="Name for the final drop zip file",
+                   default="")
+    cli.add_option("--minimum-flash-images", help="Minimum amount of flash images",
+                   default=2)    
+    cli.add_option("--plan-name", help="Name of the test plan", 
+                   default="plan")
+    cli.add_option("--sis-files", help="Sis files as a list",
+                   default="")
+    cli.add_option("--template-loc", help="location of template file",
+                   default="..\template")
+    cli.add_option("--test-timeout", help="Test execution timeout value (default: %default)",
+                   default="60")
+    cli.add_option("--verbose", help="Increase output verbosity", 
+                   action="store_true", default=True)
+    opts, _ = cli.parse_args()
+
+    if opts.verbose:
+        _logger.setLevel(logging.DEBUG)
+        logging.basicConfig(level=logging.DEBUG)
+    config = Configuration(opts)
+    create_drop(config)
+    
+
+if __name__ == "__main__":
+    main()