User:Hanya/Python Test Executor

From Apache OpenOffice Wiki
Jump to: navigation, search

If new version of Python is introduced as shipped Python, bundled test cases should be executed to check standard libraries work well. There are a few problems to execute these test cases from Python macro. Here is Python script having some settings that avoids errors.

Store the following content into $(user)/Scripts/python/test.py and execute test_all or test_ function.

import uno
import sys
import os.path
import platform
import locale
import builtins

STORE_IN_LOGFILE = False
LOG_PATH = None
LOGGER = None

# some tests have problem with the uno importer function, 
# so use default import function in regression test
_default_importer = uno._g_delegatee
_uno_importer = uno._uno_import


def _set_default_importer():
    builtins.__dict__["__import__"] = _default_importer

def _set_uno_importer():
    builtins.__dict__["__import__"] = _uno_importer


class LogWriter:
    def write(self, s):
        if LOG_PATH:
            with open(LOG_PATH, "a") as f:
                f.seek(0, whence=2)
                f.write(s)


def create(script_context, name):
    ctx = script_context.getComponentContext()
    return ctx.getServiceManager().createInstanceWithContext(name, ctx)


def _set_io():
    if STORE_IN_LOGFILE:
        global LOG_PATH
        if LOG_PATH is None:
            LOG_PATH = uno.fileUrlToSystemPath(
                create(XSCRIPTCONTEXT, "com.sun.star.util.PathSubstitution").substituteVariables(
                                        "$(user)/Scripts/python/test.log"))
            global LOGGER = LogWriter()
    sys.stdout = LOGGER
    sys.stderr = LOGGER


def _reset_io():
    sys.stdout = sys.__stdout__
    sys.stderr = sys.__stderr__


def _set_vars():
    python_name = "python.exe" if platform.system() == "Windows" else "python"
    
    office_dir = create(XSCRIPTCONTEXT, "com.sun.star.util.OfficeInstallationDirectories").getOfficeInstallationDirectoryURL()
    python_path = os.path.join(uno.fileUrlToSystemPath(office_dir), "program", python_name)
    
    # set parameters for test through command line arguments
    sys.argv = ["-r", "-w", "-n", "-u" "all"]#"all,-largefile,-audio,-gui"]
    # set executable path because not executable path has been set
    sys.executable = python_path
    
    # for some modules such as datetime
    locale.setlocale(locale.LC_ALL, "C")


def test_all():
    """ Execute all regression test. """
    if STORE_IN_LOGFILE:
        _set_io()
    _set_vars()
    _set_default_importer()
    try:
        import test.__main__
    except:
        pass
    finally:
        _set_uno_importer()
        if STORE_IN_LOGFILE:
            _reset_io()


class TestEnv:
    def __init__(self, module):
        self.module = module
    
    def __enter__(self):
        _set_vars()
        _set_default_importer()
        return self
    
    def __exit__(self, *args):
        _set_uno_importer()
        return False
    
    def start(self):
        _exec_test(self.module)


def _exec_test(module):
    module.test_main()


def test_():
    """ Execute selected test. """
    import test.test_ssl as module
    with TestEnv(module) as t:
        t.start()


g_exportedScripts = test_all, test_,
Personal tools