--- /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()