[Libreoffice-commits] .: smoketestoo_native/losmoketest.py smoketestoo_native/losmoketest.readme

Yi Fan yifan at kemper.freedesktop.org
Wed Aug 10 19:19:16 PDT 2011


 smoketestoo_native/losmoketest.py     |  571 ++++++++++++++++++++++++++++++++++
 smoketestoo_native/losmoketest.readme |  186 +++++++++++
 2 files changed, 757 insertions(+)

New commits:
commit c7a66783de22b5a5c8b576d448038365c51b1fba
Author: Yifan J <yfjiang at novell.com>
Date:   Thu Aug 11 09:58:30 2011 +0800

    initial upload losmoketest

diff --git a/smoketestoo_native/losmoketest.py b/smoketestoo_native/losmoketest.py
new file mode 100644
index 0000000..7cd88d6
--- /dev/null
+++ b/smoketestoo_native/losmoketest.py
@@ -0,0 +1,571 @@
+# Version: MPL 1.1 / GPLv3+ / LGPLv3+
+
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License or as specified alternatively below. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Initial Developer of the Original Code is
+#       Yifan Jiang, SUSE <yfjiang at suse.com>
+# Portions created by the Initial Developer are Copyright (C) 2011 the
+# Initial Developer. All Rights Reserved.
+#
+# Major Contributor(s):
+#
+# Portions created by the Ted are Copyright (C) 2010 Ted. All Rights Reserved.
+#
+# For minor contributions see the git repository.
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+# the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+# in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+# instead of those above.
+##
+# The tool is designed to enable test machine fully automatically run smoketest
+# with both daily and pre release build located in dev-build.libreoffice.org.
+#
+# The tool is named as losmoketest for its purpose, meanwhile it help you to
+# check, download and install the latest build. By the fact the installation is
+# designed not to be different from manually doing these repeated work, the
+# installed libreoffice build can also be good for manual test.
+
+import sys, os, platform
+import datetime, time
+import subprocess, shutil
+import glob, re
+import urllib, urllib2
+import logging, getopt
+try:
+    import ConfigParser as configparser # Python 3.0 change
+except ImportError:
+    import configparser
+
+build_version = "3.4"
+tag_version = "3-4"
+
+build_check_interval = 5  #seconds
+
+# Distro list
+RPM_DISTRO_LIST = ['SuSE', 'fedora', 'redhat', 'centos', 'mandrake', 'mandriva', 'yellowdog', 'turbolinux']
+DEB_DISTRO_LIST = ['debian', 'ubuntu', 'Ubuntu']
+
+# Server urls
+SERVER_URL = "http://dev-builds.libreoffice.org"
+
+# Local dirs
+root_dir = os.getcwd()
+DOWNLOAD_DIR = os.path.join(root_dir, "_download")
+USR_DIR = os.path.join(root_dir, "_libo_smoke_user")
+LOCAL_BUILD_INFO_FILE = "build.cfg"
+
+ROOT_DIR_LIB = os.path.join(root_dir, 'lib')
+ROOT_DIR_LIB32 = os.path.join(root_dir, 'lib32')
+ROOT_DIR_LIB64 = os.path.join(root_dir, 'lib64')
+ROOT_DIR_BIN32 = os.path.join(root_dir, 'bin32')
+ROOT_DIR_BIN64 = os.path.join(root_dir, 'bin64')
+
+CPPUNITTESTER = os.path.join(root_dir, 'cppunittester')
+
+# INSTALL_DIR = os.path.join(root_dir, "_libo_smoke_installation")
+INSTALL_DIR = "" # Installation dir
+
+# SOFFICE_BIN bin
+if platform.system() == "Linux":
+    SOFFICE_BIN= INSTALL_DIR + os.sep + "opt" + os.sep + "libreoffice" + build_version + os.sep + "program" + os.sep + "soffice"
+
+# Relative build url
+## pre-releases
+PR_RPM_X86_PATH = "pre-releases/rpm/x86/"
+PR_RPM_X86_64_PATH = "pre-releases/rpm/x86_64/"
+
+PR_DEB_X86_PATH = "pre-releases/deb/x86/"
+PR_DEB_X86_64_PATH = "pre-releases/deb/x86_64/"
+
+PR_MAC_X86_PATH = "pre-releases/mac/x86/"
+PR_MAC_PPC_PATH = "pre-releases/mac/ppc/"
+
+PR_WIN_X86_PATH = "pre-releases/win/x86/"
+
+## daily_master
+DAILY_MASTER_RPM_X86_PATH =    "daily/Linux_x86_Release_Configuration/master/current"
+DAILY_MASTER_RPM_X86_64_PATH = "daily/Linux_x86_64_Release_Configuration/master/current"
+
+DAILY_MASTER_DEB_X86_PATH =    "daily/Linux_x86_Release_Configuration/master/current"
+DAILY_MASTER_DEB_X86_64_PATH = "daily/Linux_x86_64_Release_Configuration/master/current" # No build yet
+
+DAILY_MASTER_MAC_X86_PATH =    "daily/MacOSX_10.6.7_Intel_no-moz/master/current"
+DAILY_MASTER_MAC_PPC_PATH =    "^$" # No build yet
+
+DAILY_MASTER_WIN_X86_PATH =    "daily/Windows_Release_Configuration/master/current"
+
+## daily_branch
+DAILY_BRANCH_RPM_X86_PATH =    "daily/Linux_x86_Release_Configuration/libreoffice-" + tag_version + "/current"
+DAILY_BRANCH_RPM_X86_64_PATH = "daily/Linux_x86_64_Release_Configuration/libreoffice-" + tag_version + "/current"
+
+DAILY_BRANCH_DEB_X86_PATH =    "daily/Linux_x86_Release_Configuration/libreoffice-" + tag_version + "/current"
+DAILY_BRANCH_DEB_X86_64_PATH = "daily/Linux_x86_64_Release_Configuration/libreoffice-" + tag_version + "/current"
+
+DAILY_BRANCH_MAC_X86_PATH =    "daily/MacOSX_10.6.7_Intel_no-moz/libreoffice-" + tag_version + "/current"
+DAILY_BRANCH_MAC_PPC_PATH =    "^$" # No build yet
+
+DAILY_BRANCH_WIN_X86_PATH =    "daily/Windows_Release_Configuration/libreoffice-" + tag_version + "/current"
+
+
+
+def platform_info():
+
+    s = platform.system()
+    arch_name = platform.machine()
+
+    if arch_name in ['x86', 'i386', 'i586', 'i686']:
+        arch_name = 'x86'
+
+    if s == "Linux":
+        if platform.dist()[0] in RPM_DISTRO_LIST:
+            distro_name = platform.dist()[0]
+            pck_name = 'rpm'
+        elif platform.dist()[0] in DEB_DISTRO_LIST:
+            distro_name = platform.dist()[0]
+            pck_name = 'deb'
+    elif s == "Windows":
+        distro_name = platform.dist()[0]
+        pck_name = 'exe'
+    else:
+        distro_name = platform.dist()[0]
+        pck_name = 'dmg'
+
+    return distro_name, pck_name, arch_name
+
+def local_build_info(t):
+
+    config = configparser.RawConfigParser()
+    config.read(LOCAL_BUILD_INFO_FILE)
+
+    try:
+        build_name = config.get(t, 'build_name').strip('\n')
+        build_time = datetime.datetime.strptime(config.get(t, 'build_time').strip('\n'), '%d-%b-%Y %H:%M')
+    except ValueError:
+        build_name = ''
+        build_time = datetime.datetime.min
+
+    return build_name, build_time
+
+def get_url_regexp(t, package, arch):
+    '''
+    return a url containing download links, i.e:
+
+        http://dev-builds.libreoffice.org/pre-releases/rpm/x86_64/
+        http://dev-builds.libreoffice.org/daily/Windows_Release_Configuration/libreoffice-3-4/current/
+        http://dev-builds.libreoffice.org/daily/Linux_x86_Release_Configuration/libreoffice-3-4/current/
+
+    meanwhile return a regexp object that matching corresponding downloadable
+    package and its timestamp '''
+
+    url = ""
+    reg = re.compile('^$')
+    pck = package
+    arc = arch
+
+    if t == 'pre-releases':
+        if pck == "rpm" and arc == "x86":
+            url = SERVER_URL + "/" + PR_RPM_X86_PATH
+            reg = re.compile('\<a\ href=\"(LibO_\d.*x86_install-rpm.*en-US.*\.gz)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "rpm" and arc == "x86_64":
+            url = SERVER_URL + "/" + PR_RPM_X86_64_PATH
+            reg = re.compile('\<a\ href=\"(LibO_\d.*x86-64_install-rpm.*en-US.*\.gz)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "deb" and arc == "x86":
+            url = SERVER_URL + "/" + PR_DEB_X86_PATH
+            reg = re.compile('\<a\ href=\"(LibO_\d.*x86_install-deb.*en-US.*\.gz)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "deb" and arc == "x86_64":
+            url = SERVER_URL + "/" + PR_DEB_X86_64_PATH
+            reg = re.compile('\<a\ href=\"(LibO_\d.*x86-64_install-deb.*en-US.*\.gz)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "exe" and arc == "x86":
+            url = SERVER_URL + "/" + PR_WIN_X86_PATH
+            reg = re.compile('\<a\ href=\"(LibO_\d.*Win_x86_install_multi.exe)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "dmg" and arc == "x86":
+            url = SERVER_URL + "/" + PR_MAC_X86_PATH
+            reg = re.compile('\<a\ href=\"(LibO_\d.*MacOS_x86_install_en-US.dmg)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "dmg" and arc == "ppc":
+            url = SERVER_URL + "/" + PR_MAC_PPC_PATH
+            reg = re.compile('\<a\ href=\"(LibO_\d.*MacOS_PPC_install_en-US.dmg)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        else:
+            logger.error("Unable to handle the system or arch!")
+    elif t == 'daily_master':
+        if pck == "rpm" and arc == "x86":
+            url = SERVER_URL + "/" + DAILY_MASTER_RPM_X86_PATH
+            reg = re.compile('\<a\ href=\"(master\~\d.*LibO-Dev_.*x86_install-rpm_en-US.tar.gz)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "rpm" and arc == "x86_64":
+            url = SERVER_URL + "/" + DAILY_MASTER_RPM_X86_64_PATH
+            reg = re.compile('^$') # No build yet
+        elif pck == "deb" and arc == "x86":
+            url = SERVER_URL + "/" + DAILY_MASTER_DEB_X86_PATH
+            reg = re.compile('\<a\ href=\"(master\~\d.*LibO-Dev_.*x86_install-deb_en-US.tar.gz)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "deb" and arc == "x86_64":
+            url = SERVER_URL + "/" + DAILY_MASTER_DEB_X86_64_PATH
+            reg = re.compile('^$') # No build yet
+        elif pck == "exe" and arc == "x86":
+            url = SERVER_URL + "/" + DAILY_MASTER_WIN_X86_PATH
+            reg = re.compile('^$') # No build yet
+        elif pck == "dmg" and arc == "x86":
+            url = SERVER_URL + "/" + DAILY_MASTER_MAC_X86_PATH
+            reg = re.compile('\<a\ href=\"(master\~\d.*LibO-Dev_.*x86_install_en-US.dmg)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "dmg" and arc == "ppc":
+            url = SERVER_URL + "/" + DAILY_MASTER_MAC_PPC_PATH
+            reg = re.compile('^$') # No build yet
+        else:
+            logger.error("Unable to handle the system or arch!")
+    elif t == 'daily_branch':
+        if pck == "rpm" and arc == "x86":
+            url = SERVER_URL + "/" + DAILY_BRANCH_RPM_X86_PATH
+            reg = re.compile('\<a\ href=\"(.*LibO_.*x86_install-rpm_en-US\.tar\.gz)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "rpm" and arc == "x86_64":
+            url = SERVER_URL + "/" + DAILY_BRANCH_RPM_X86_64_PATH
+            reg = re.compile('\<a\ href=\"(.*LibO_.*x86-64_install-rpm_en-US\.tar\.gz)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "deb" and arc == "x86":
+            url = SERVER_URL + "/" + DAILY_BRANCH_DEB_X86_PATH
+            reg = re.compile('\<a\ href=\"(.*LibO_.*x86_install-deb_en-US\.tar\.gz)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "deb" and arc == "x86_64":
+            url = SERVER_URL + "/" + DAILY_BRANCH_DEB_X86_64_PATH
+            reg = re.compile('\<a\ href=\"(.*LibO_.*x86-64_install-deb_en-US\.tar\.gz)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "exe" and arc == "x86":
+            url = SERVER_URL + "/" + DAILY_BRANCH_WIN_X86_PATH
+            reg = re.compile('\<a\ href=\"(.*LibO_.*install_.*\.exe)\".*(\d{2}\-[a-zA-Z]{3}\-\d{4}).*(\d{2}:\d{2}).*')
+        elif pck == "dmg" and arc == "x86":
+            url = SERVER_URL + "/" + DAILY_BRANCH_MAC_X86_PATH
+            reg = re.compile('^$') # No build yet
+        elif pck == "dmg" and arc == "ppc":
+            url = SERVER_URL + "/" + DAILY_BRANCH_MAC_PPC_PATH
+            reg = re.compile('^$') # No build yet
+        else:
+            logger.error("Unable to handle the system or arch!")
+    else:
+        logger.error("Error build type! The build type has to be:\n pre-releases, daily_master, daily_branch")
+
+    return url, reg
+
+def remote_build_info(url_reg):
+    ''' Get the latest proper build info (build_name, build_time) from
+    url. '''
+
+    p = platform_info()
+    pck = p[1]
+    arc = p[2]
+    r = url_reg[1]
+
+    f = urllib2.urlopen(url_reg[0])
+    c = ''.join(f.readlines())
+    f.close()
+
+    build_list = r.findall(c)
+
+    build_name = ''
+    build_time = datetime.datetime.min
+
+    for b in build_list:
+        if datetime.datetime.strptime(b[1] + ' ' + b[2], '%d-%b-%Y %H:%M') > build_time:
+            build_name = b[0]
+            build_time = datetime.datetime.strptime(b[1] + ' ' + b[2], '%d-%b-%Y %H:%M')
+
+    return build_name, build_time
+
+
+def fetch_build(url, filename):
+    ''' Download a build from address url/filename '''
+
+    logger.info("Downloading ... " + filename)
+
+    u = urllib2.urlopen(url + '/' + filename)
+
+    try:
+        f = open(DOWNLOAD_DIR + '/' + filename, 'wb')
+        f.write(u.read())
+    finally:
+        f.close()
+
+    return True
+
+def set_build_config(section, option, value):
+
+    config = configparser.RawConfigParser()
+    config.readfp(open(LOCAL_BUILD_INFO_FILE))
+    config.set(section, option, value)
+    with open(LOCAL_BUILD_INFO_FILE, 'wb') as cfgfile:
+        config.write(cfgfile)
+
+def uninstall():
+    ''' Kill libreoffice processes and uninstall all previously installed
+    libreoffice packages '''
+
+    logger.info("Uninstalling ...")
+
+    pck = platform_info()[1]
+
+    if pck == 'rpm':
+        cmd_query  = ["rpm", "-qa"]
+        cmd_filter = ["grep", "-e", "libreoffice"+build_version, "-e", "libobasis"+build_version]
+
+        P_query  = subprocess.Popen(cmd_query, stdout = subprocess.PIPE)
+        P_filter = subprocess.Popen(cmd_filter, stdin = P_query.stdout, stdout = subprocess.PIPE)
+        P_query.stdout.close() # protection when P_filter exit before P_query
+        str_filter = P_filter.communicate()[0]
+
+        if str_filter == "":
+            logger.warning("Nothing to uninstall")
+            return
+        else:
+            cmd = ["sudo", "rpm", "-e"] + str_filter.split()
+    elif pck == 'deb':
+        cmd_query = ["dpkg", "--get-selections", "libreoffice"+build_version+"*", "libobasis"+build_version+"*"]
+        cmd_filter = ["cut", "-f", "1"]
+
+        P_query = subprocess.Popen(cmd_query, stdout = subprocess.PIPE)
+        P_filter = subprocess.Popen(cmd_filter, stdin = P_query.stdout, stdout = subprocess.PIPE)
+        P_query.stdout.close()
+        str_filter = P_filter.communicate()[0]
+
+        if str_filter == "":
+            logger.warning("Nothing to uninstall")
+            return
+        else:
+            cmd = ["sudo", "dpkg ", "-P"] + str_filter.split()
+    elif pck == 'exe':
+        pass
+    elif pck == 'dmg':
+        pass
+    else:
+        logger.warning("Non supported package system")
+
+    subprocess.check_call(cmd)
+
+def init_testing():
+    logger.info("Initializing ...")
+
+    if not os.path.exists(DOWNLOAD_DIR):
+        os.mkdir(DOWNLOAD_DIR)
+
+    if not os.path.exists(USR_DIR):
+        os.mkdir(USR_DIR)
+
+    # set up links
+    try:
+        if platform.system() == "Linux" and platform_info()[2] == "x86":
+            os.symlink(ROOT_DIR_LIB32, ROOT_DIR_LIB)
+            os.symlink(os.path.join(ROOT_DIR_BIN32, 'cppunittester'), CPPUNITTESTER)
+        elif platform.system() == "Linux" and platform_info()[2] == "x86_64":
+            os.symlink(ROOT_DIR_LIB64, ROOT_DIR_LIB)
+            os.symlink(os.path.join(ROOT_DIR_BIN64, 'cppunittester'), CPPUNITTESTER)
+        elif platform.system() == "Windows" and platform_info()[2] == "x86":
+            pass
+        else:
+            pass
+    except OSError:
+        pass
+
+def post_testing():
+    logger.info("Cleaning up ...")
+
+    # clean up the extracted installer dir
+    for r in os.walk(DOWNLOAD_DIR):
+        if r[0] == DOWNLOAD_DIR:
+            for d in r[1]:
+                shutil.rmtree(os.path.join(r[0], d))
+
+def install(filename):
+    ''' filename: local file path of tar.gz, dmg or exe. The script will
+    extract the package and then install it '''
+
+    logger.info("Installing ... " + filename)
+
+    def _is_not_filtered(s):
+        ''' True if the package s is not intended to installed.  '''
+        filter_pattern_list = ['.*kde.*', '.*gnome.*', '.*desktop.*', '!.*\.rpm$', '!.*\.deb$']
+        for p in filter_pattern_list:
+            r = re.compile(p)
+            if r.match(s):
+                return False
+        return True
+
+    fn, ext = os.path.splitext(filename)
+    pcklist = []
+
+    if ext == '.exe':
+        # extract
+        installer_dir = os.path.join(DOWNLOAD_DIR, filename.strip(ext))
+        subprocess.check_call([filename, '/EXTRACTONLY=ON', '/S', '/D='+installer_dir])
+        # install
+        installer = glob.glob(os.path.join(installer_dir, 'libreoffice*msi'))[0]
+        subprocess.check_call(['msiexec', '-i', installer, '-passive', 'ADDLOCAL=all'])
+    elif ext == '.dmg':
+        return
+    elif ext == '.gz':
+        # extract
+        subprocess.check_call(['tar', 'xzf', filename, '-C', DOWNLOAD_DIR])
+
+        # get a filtered install list
+        for root, dirs, files in os.walk(DOWNLOAD_DIR):
+            if 'RPMS' in root or 'DEBS' in root:
+                pcklist = pcklist + [os.path.join(root_dir, root, f) for f in files]
+        pcklist = filter(_is_not_filtered, pcklist)
+
+        # install
+        if platform_info()[1] == 'rpm':
+            install_cmd = ["sudo", "rpm", "-iv"] + pcklist
+        elif platform_info()[1] == 'deb':
+            install_cmd = ["sudo", "dpkg", "-i"] + pcklist
+        else:
+            logger.error('Cannot generate install command')
+            return
+
+        subprocess.check_call(install_cmd)
+
+    else:
+        logger.info("Unrecognized file extension")
+
+def verify_smoketest():
+    logger.info("Testing ...")
+
+    s = platform.system()
+    p = platform_info()
+    pck = p[1]
+    arc = p[2]
+
+    if s == "Linux":
+        os.environ['SAL_USE_VCLPLUGIN'] = "svp"
+        os.environ['LD_LIBRARY_PATH'] = ""
+        os.environ['LD_LIBRARY_PATH'] = ':'.join([os.path.join(root_dir, 'lib'), INSTALL_DIR + '/opt/libreoffice' + build_version + '/ure/lib', os.environ['LD_LIBRARY_PATH']])
+        cmd_cppu = [
+                    CPPUNITTESTER,
+                    "-env:UNO_SERVICES=file://"+ INSTALL_DIR +"/opt/libreoffice" + build_version + "/ure/share/misc/services.rdb",
+                    "-env:UNO_TYPES=" + os.path.join(os.path.join(root_dir, 'lib'), "types.rdb"),
+                    "-env:arg-soffice=path:" + SOFFICE_BIN,
+                    "-env:arg-user=" + USR_DIR,
+                    "-env:arg-env=" + os.environ['LD_LIBRARY_PATH'],
+                    "-env:arg-testarg.smoketest.doc=" + os.path.join(root_dir, "doc/smoketestdoc.sxw"),
+                    "--protector",
+                    os.path.join(root_dir, "lib/unoexceptionprotector.so"), "unoexceptionprotector",
+                    os.path.join(root_dir, "lib/libsmoketest.so")
+                   ]
+    else:
+        logger.warning('The smoketest does not support this platform yet!')
+
+    subprocess.check_call(cmd_cppu)
+
+def usage():
+
+    print "\n[Usage]\n\n  -f Force testing without asking \n\
+  -t Testing type pre-release/daily \n\
+  -v Run smoketest verification directly \n\
+  -i Install the latest build in the DOWNLOAD directory \n\
+  -u Uninstall any existed libreoffice build \n\
+"
+
+def main():
+
+    interactive = True
+    build_type = "pre-releases"
+
+    package_type = platform_info()[1]
+    arch_type = platform_info()[2]
+
+    interactive = True
+    build_type = "pre-releases"
+
+    # Handling options and arguments
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], "uihfvt:", ["uninstall", "install", "help", "force", "verify", "type="])
+    except getopt.GetoptError, err:
+        logger.error(str(err))
+        usage()
+        sys.exit(2)
+
+    for o, a in opts:
+        if ("-t" in o) or ("--type" in o):
+            build_type = a
+
+    for o, a in opts:
+        if o in ("-f", "--force"):
+            interactive = False
+        elif o in ("-t", "--type"):
+            pass
+        elif o in ("-h", "--help"):
+            usage()
+            sys.exit()
+        elif o in ("-v", "--verify"):
+            init_testing()
+            verify_smoketest()
+            sys.exit()
+        elif o in ("-i", "--install"):
+            init_testing()
+            install(DOWNLOAD_DIR + os.sep + local_build_info(build_type)[0])
+            sys.exit()
+        elif o in ("-u", "--uninstall"):
+            uninstall()
+            sys.exit()
+        else:
+            assert False, "Unhandled option"
+
+    if interactive == True:
+        key = raw_input("The testing will OVERRIDE existed libreoffice, continue(y/N)? ")
+        if not (key == "y" or key == "Y" or key == "yes"):
+            sys.exit()
+
+    url_reg = get_url_regexp(build_type, package_type, arch_type)
+
+    init_testing()
+    while True:
+        logger.info('Checking new build ...')
+        try:
+            remote_build = remote_build_info(url_reg)
+            local_build = local_build_info(build_type)
+
+            if remote_build[1] > local_build[1]:
+                logger.info('Found New build: ' + remote_build[0])
+                if fetch_build(url_reg[0], remote_build[0]):
+                    set_build_config(build_type, 'build_name', remote_build[0])
+                    set_build_config(build_type, 'build_time', datetime.datetime.strftime(remote_build[1], '%d-%b-%Y %H:%M'))
+                else:
+                    logger.error('Download build failed!')
+                    continue
+                uninstall()
+                install(DOWNLOAD_DIR + os.sep + local_build_info(build_type)[0])
+                verify_smoketest()
+            else:
+                time.sleep(build_check_interval)
+                continue
+        except urllib2.URLError, HTTPError:
+            logger.error('Error fetch remote build info.')
+            time.sleep(build_check_interval)
+            continue
+        except KeyboardInterrupt:
+            sys.exit()
+        except:
+            time.sleep(build_check_interval)
+            continue
+
+def ut():
+    verify_smoketest()
+
+if __name__ == '__main__':
+
+    # logging
+    logger = logging.getLogger('')
+    logger.setLevel(logging.DEBUG)
+
+    fh = logging.FileHandler('losmoketest.log')
+    ch = logging.StreamHandler()
+
+    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
+    ch.setFormatter(formatter)
+    fh.setFormatter(formatter)
+
+    logger.addHandler(ch)
+    logger.addHandler(fh)
+
+    main()
+    # ut()
diff --git a/smoketestoo_native/losmoketest.readme b/smoketestoo_native/losmoketest.readme
new file mode 100644
index 0000000..8809133
--- /dev/null
+++ b/smoketestoo_native/losmoketest.readme
@@ -0,0 +1,186 @@
+losmoketest.py
+--------------
+Yifan Jiang <yfjiang at suse.com>
+http://dev-builds.libreoffice.org/
+
+The tool is designed to enable test machine fully automatically run smoketest
+with both daily and pre release build located in dev-build.libreoffice.org.
+
+The purpose of daily build testing is obvious, we want to catch bugs as early
+as possible:) some ideas canbe found here:
+
+    http://wiki.documentfoundation.org/Testing_Daily_Builds#Is_parallel_installation_possible_.2F_planned.3F
+
+For the purpose of smoketest for pre release testing, currently there is an
+about 24 hrs lag syncing RC build from dev-build to official site. We need to
+guarantee at least the very basic function working before more people download
+the RC build from official site and play with it, in as short as 24 hrs.
+
+The tool is named as losmoketest for its purpose, meanwhile it help you to
+check, download and install the latest build. By the fact the installation is
+designed not to be different from manually doing these repeated work, the
+installed libreoffice build can also be good for manual test.
+
+Quick Start
+-----------
+
+This chapter describe step by step tutorials for a typical quick use of the
+tool. More functions can be discovered in section "The Tool -> Usage".
+
+[Linux]
+
+    0. If you do not have a python environment, firstly download python here:
+
+        http://www.python.org/download/
+
+    1. Download binary:
+
+        http://dev-builds.libreoffice.org/daily/losmoketest-0.2.tar.bz2
+
+    2. Unpack it to, for example, your home directory:
+
+        tar xvjf losmoketest-0.2.tar.bz2 -C $HOME
+
+    3. Open a terminal
+
+    4. In the terminal, input (there's an Enter between each lines):
+
+        su -
+        (enter your root password when it prompts)
+        cp /etc/sudoers /etc/sudoers.ori
+        echo "$USER ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
+        exit
+
+    5. In the terminal, input (there's an Enter between each lines):
+
+        cd $HOME/losmoketest-0.2
+        python ./losmoketest.py
+
+    A msg OK(1) would be shown When the result successfully
+    finished. Otherwise, please send the 'log' file to the author or mailing
+    list libreoffice-qa at lists.freedesktop.org for more investigation.
+
+    6. After finish testing, recover the sudoers file by (there's an Enter
+    between each lines),
+
+        su -
+        (enter your root password)
+        cp /etc/sudoers.ori /etc/sudoers
+        exit
+
+[Windows]
+
+    0. If you do not have a python environment, firstly download python here:
+
+        http://www.python.org/download/
+
+    1. Download binary:
+
+        http://dev-builds.libreoffice.org/daily/losmoketest-0.2.tar.bz2
+
+    2. Unpack it to, for example, C:\
+
+    3. Open a console by clicking Start menu -> Run ...
+
+    4. Input 'cmd' and press Enter
+
+    5. In the terminal, input (there's an Enter between each lines):
+
+        cd C:\losmoketest-0.2
+        .\losmoketest.py
+
+    A msg OK(1) would be shown When the result successfully
+    finished. Otherwise, please send the 'log' file to the author or mailing
+    list libreoffice-qa at lists.freedesktop.org for more investigation.
+
+
+The tool
+--------
+
+[Prerequisite]
+
+    - Python > 2.6
+        http://www.python.org/download/
+
+    - A machine free to play (The test may *override* your existed
+    libreoffice3.4 installation).
+
+    - On Linux, add the following line in /etc/sudoer:
+
+        $USER	ALL=(ALL) NOPASSWD: ALL
+
+      where $USER is your real user name. With this line, every command
+      initialed with `sudo` will not be asked to input a password. Please
+      consider the security risk brought by it.
+
+[Features Availability]
+
+    Full features are implemented on Linux x86 and x86_64, rpm and deb:
+
+        - Checking and dowloading the latest build
+        - Install the latest build
+        - Run smoke test on the build (not stable)
+
+    Partial features are implemented on Windows:
+
+        - Checking and dowloading the latest build
+        - Install the latest build (Thanks *blip* help find out the command for silent install)
+
+    Partial features are implemented on Mac:
+
+        - Checking and dowloading the latest build
+
+[Usages]
+
+    1. Test the latest pre releases build:
+
+           $ cd /path/to/losmoketest
+           $ ./losmoketest.py                 # Test the latest pre releases build:
+           $ ./losmoketest.py -t daily_master # Test the latest daily master build
+           $ ./losmoketest.py -t daily_branch # Test the latest daily branch build (now 3.4)
+
+    2. Just Install the latest LOCAL build:
+
+           $ cd /path/to/losmoketest
+           $ ./losmoketest.py -i                  # Install the latest pre releases build in losmoketest/_download
+           $ ./losmoketest.py -i -t daily_master  # Install the latest daily master build in losmoketest/_download
+           $ ./losmoketest.py -i -t daily_branch  # Install the latest daily branch build (now 3.4) in losmoketest/_download
+
+    3. Just Verify the installed build:
+
+           $ cd /path/to/losmoketest
+           $ ./losmoketest.py -v
+
+    4. More tips in:
+
+           $ cd /path/to/losmoketest
+           $ ./losmoketest.py -h
+
+[Tested on]
+
+    - SLED 11 sp1 x86
+    - SLED 11 sp1 x86_64
+    - OpenSuSE 11.4 x86
+    - Ubuntu 10.10 x86
+
+[TODO]
+
+    1. verify_smoketest() improvement (replace it with more simple script
+      rather than complicated cppunittester)
+
+    2. 'git' it when we have a stable code base
+
+    3. handling mac and windows build
+
+[Known issue]
+
+    1. The cppunittest performs not quite stable in different libreoffice
+       build, some times it just hangs there without noticing :(
+
+    2. The version tag is desired to get dynamically. The current hard coded
+       3.4 is not reliable, especially not reliable when verify_smoketest()
+       tries to set LD_LIBRARY_PATH.
+
+    3. Parallel installation with official build has a dependancy on Tinderbox
+       improvement (the dev-build is ideally to be installed on something like
+       /opt/lo-dev).


More information about the Libreoffice-commits mailing list