summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorArkadiy Illarionov <qarkai@gmail.com>2017-10-21 16:48:49 +0300
committerSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>2017-11-22 15:19:43 +0100
commit0c358f71e2b72251dd47ae5782d44c5c6a13727c (patch)
treea902bd5bf08270763fcf91bbcc9b9aab60af03b6 /bin
parent7329b4423c0d348d0af0ab5b5b7bfcdc25bc7618 (diff)
Modernize benchmark-document-loading script
- use argparse instead of getopt - use with statement for opening files - refactor writeReport function to reduce copypaste - various fixes to make code more pythonic Change-Id: I6569dfc856040e1e75b550135f4092cc27bef7f5 Reviewed-on: https://gerrit.libreoffice.org/43644 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
Diffstat (limited to 'bin')
-rw-r--r--bin/benchmark-document-loading190
1 files changed, 83 insertions, 107 deletions
diff --git a/bin/benchmark-document-loading b/bin/benchmark-document-loading
index 6d06580929c8..11611a2b29da 100644
--- a/bin/benchmark-document-loading
+++ b/bin/benchmark-document-loading
@@ -32,21 +32,19 @@
# ~/lo/master-suse/instdir/program/python ~/lo/master-suse/bin/benchmark-document-loading --soffice=path:/home/tml/lo/master-suse/instdir/program/soffice --outdir=file://$PWD/out --userdir=file:///tmp/test $PWD/docs
#
+import argparse
import datetime
-import getopt
import os
import subprocess
import sys
+import threading
import time
import urllib
-import uuid
-
-import signal
-import threading
try:
from urllib.parse import quote
except ImportError:
from urllib import quote
+import uuid
try:
import pyuno
@@ -72,11 +70,15 @@ validWriterFileExtensions = [ ".docx" , ".rtf", ".odt", ".fodt", ".doc" ]
validImpressFileExtensions = [ ".ppt", ".pptx", ".odp", ".fodp" ]
validDrawFileExtensions = [ ".odg", ".fodg" ]
validRevereseFileExtensions = [ ".vsd", ".vdx", ".cdr", ".pub", ".wpd" ]
-validFileExtensions = dict([("calc", validCalcFileExtensions), ("writer", validWriterFileExtensions), ("impress", validImpressFileExtensions), ("draw", validDrawFileExtensions), ("reverse", validRevereseFileExtensions) ])
-flatODFTypes = dict([("calc", (".fods", "OpenDocument Spreadsheet Flat XML")),
- ("writer", (".fodt", "OpenDocument Text Flat XML")),
- ("impress", (".fodp", "OpenDocument Presentation Flat XML")),
- ("draw", (".fodg", "OpenDocument Drawing Flat XML"))])
+validFileExtensions = {"calc": validCalcFileExtensions,
+ "writer": validWriterFileExtensions,
+ "impress": validImpressFileExtensions,
+ "draw": validDrawFileExtensions,
+ "reverse": validRevereseFileExtensions}
+flatODFTypes = {"calc": (".fods", "OpenDocument Spreadsheet Flat XML"),
+ "writer": (".fodt", "OpenDocument Text Flat XML"),
+ "impress": (".fodp", "OpenDocument Presentation Flat XML"),
+ "draw": (".fodg", "OpenDocument Drawing Flat XML")}
outdir = ""
@@ -90,12 +92,12 @@ def partition(list, pred):
right.append(e)
return (left, right)
-def filelist(dir, suffix):
- if len(dir) == 0:
+def filelist(directory, suffix):
+ if not directory:
raise Exception("filelist: empty directory")
- if not(dir[-1] == "/"):
- dir += "/"
- files = [dir + f for f in os.listdir(dir)]
+ if directory[-1] != "/":
+ directory += "/"
+ files = [directory + f for f in os.listdir(directory)]
# print(files)
return [f for f in files
if os.path.isfile(f) and os.path.splitext(f)[1] == suffix]
@@ -103,8 +105,8 @@ def filelist(dir, suffix):
def getFiles(dirs, suffix):
# print( dirs )
files = []
- for dir in dirs:
- files += filelist(dir, suffix)
+ for d in dirs:
+ files += filelist(d, suffix)
return files
### UNO utilities ###
@@ -130,20 +132,19 @@ class OfficeConnection:
self.xContext = None
self.pro = None
def setUp(self):
- (method, sep, rest) = self.args["--soffice"].partition(":")
+ (method, sep, rest) = self.args.soffice.partition(":")
if sep != ":":
raise Exception("soffice parameter does not specify method")
if method == "path":
- socket = "pipe,name=pytest" + str(uuid.uuid1())
- try:
- userdir = self.args["--userdir"]
- except KeyError:
- raise Exception("'path' method requires --userdir")
- if not(userdir.startswith("file://")):
- raise Exception("--userdir must be file URL")
- self.soffice = self.bootstrap(rest, userdir, socket)
+ socket = "pipe,name=pytest" + str(uuid.uuid1())
+ userdir = self.args.userdir
+ if not userdir:
+ raise Exception("'path' method requires --userdir")
+ if not userdir.startswith("file://"):
+ raise Exception("--userdir must be file URL")
+ self.soffice = self.bootstrap(rest, userdir, socket)
elif method == "connect":
- socket = rest
+ socket = rest
else:
raise Exception("unsupported connection method: " + method)
self.xContext = self.connect(socket)
@@ -153,7 +154,7 @@ class OfficeConnection:
"-env:UserInstallation=" + userdir,
"--quickstart=no",
"--norestore", "--nologo", "--headless" ]
- if "--valgrind" in self.args:
+ if self.args.valgrind:
argv.append("--valgrind")
os.putenv("SAL_LOG", "-INFO-WARN")
os.putenv("LIBO_ONEWAY_STABLE_ODF_EXPORT", "YES")
@@ -201,9 +202,8 @@ class OfficeConnection:
# return ret
def kill(self):
command = "kill " + str(self.pro.pid)
- killFile = open("killFile.log", "a")
- killFile.write(command + "\n")
- killFile.close()
+ with open("killFile.log", "a") as killFile:
+ killFile.write(command + "\n")
# print("kill")
# print(command)
os.system(command)
@@ -303,11 +303,10 @@ def loadFromURL(xContext, url, t, component):
time.sleep(1)
else:
t.cancel()
- logTimeSpent(uri, startTime)
+ logTimeSpent(url, startTime)
return xDoc
- file = open("file.log", "a")
- file.write("layout did not finish\n")
- file.close()
+ with open("file.log", "a") as fh:
+ fh.write("layout did not finish\n")
return xDoc
except pyuno.getClass("com.sun.star.beans.UnknownPropertyException"):
xListener = None
@@ -336,11 +335,10 @@ def exportToODF(xContext, xDoc, baseName, t, component):
def handleCrash(file, disposed):
# print("File: " + file + " crashed")
- crashLog = open("crashlog.txt", "a")
- crashLog.write('Crash:' + file + ' ')
- if disposed == 1:
- crashLog.write('through disposed\n')
- crashLog.close()
+ with open("crashlog.txt", "a") as crashLog:
+ crashLog.write('Crash:' + file + ' ')
+ if disposed == 1:
+ crashLog.write('through disposed\n')
# crashed_files.append(file)
# add here the remaining handling code for crashed files
@@ -358,13 +356,12 @@ class HandleFileTest:
args = None
try:
url = "file://" + quote(self.file)
- file = open("file.log", "a")
- file.write(url + "\n")
- file.close()
+ with open("file.log", "a") as fh:
+ fh.write(url + "\n")
xDoc = None
args = [connection]
t = threading.Timer(60, alarm_handler, args)
- t.start()
+ t.start()
xDoc = loadFromURL(xContext, url, t, self.component)
self.state.goodFiles.append(self.file)
exportToODF(xContext, xDoc, os.path.basename(urllib.parse.urlparse(url).path), t, self.component)
@@ -421,42 +418,30 @@ class State:
self.badPropertyFiles = []
self.timeoutFiles = []
-
+
+def write_state_report(files_list, start_time, report_filename, description):
+ with open(report_filename, "w") as fh:
+ fh.write("%s:\n" % description)
+ fh.write("Starttime: %s\n" % start_time.isoformat())
+ for f in files_list:
+ fh.write("%s\n" % f)
+
+
def writeReport(state, startTime):
- goodFiles = open("goodFiles.log", "w")
- goodFiles.write("Files which loaded perfectly:\n")
- goodFiles.write("Starttime: " + startTime.isoformat() +"\n")
- for file in state.goodFiles:
- goodFiles.write(file)
- goodFiles.write("\n")
- goodFiles.close()
- badDisposedFiles = open("badDisposedFiles.log", "w")
- badDisposedFiles.write("Files which crashed with DisposedException:\n")
- badDisposedFiles.write("Starttime: " + startTime.isoformat() + "\n")
- for file in state.badDisposedFiles:
- badDisposedFiles.write(file)
- badDisposedFiles.write("\n")
- badDisposedFiles.close()
- badPropertyFiles = open("badPropertyFiles.log", "w")
- badPropertyFiles.write("Files which crashed with UnknownPropertyException:\n")
- badPropertyFiles.write("Starttime: " + startTime.isoformat() + "\n")
- for file in state.badPropertyFiles:
- badPropertyFiles.write(file)
- badPropertyFiles.write("\n")
- badPropertyFiles.close()
- timeoutFiles = open("timeoutFiles.log", "w")
- timeoutFiles.write("Files which timed out:\n")
- timeoutFiles.write("Starttime: " + startTime.isoformat() + "\n")
- for file in state.timeoutFiles:
- timeoutFiles.write(file)
- timeoutFiles.write("\n")
- timeoutFiles.close()
-
-def runHandleFileTests(opts, dirs):
+ write_state_report(state.goodFiles, startTime, "goodFiles.log",
+ "Files which loaded perfectly")
+ write_state_report(state.badDisposedFiles, startTime, "badDisposedFiles.log",
+ "Files which crashed with DisposedException")
+ write_state_report(state.badPropertyFiles, startTime, "badPropertyFiles.log",
+ "Files which crashed with UnknownPropertyException")
+ write_state_report(state.timeoutFiles, startTime, "timeoutFiles.log",
+ "Files which timed out")
+
+def runHandleFileTests(opts):
startTime = datetime.datetime.now()
connection = PersistentConnection(opts)
global outdir
- outdir = opts["--outdir"] + "/" + startTime.strftime('%Y%m%d.%H%M%S')
+ outdir = os.path.join(opts.outdir, startTime.strftime('%Y%m%d.%H%M%S'))
try:
tests = []
state = State()
@@ -464,7 +449,7 @@ def runHandleFileTests(opts, dirs):
for component, validExtension in validFileExtensions.items():
files = []
for suffix in validExtension:
- files.extend(getFiles(dirs, suffix))
+ files.extend(getFiles(opts.dirs, suffix))
files.sort()
tests.extend( (HandleFileTest(file, state, component) for file in files) )
runConnectionTests(connection, simpleInvoke, tests)
@@ -473,38 +458,29 @@ def runHandleFileTests(opts, dirs):
writeReport(state, startTime)
def parseArgs(argv):
- (optlist,args) = getopt.getopt(argv[1:], "hr",
- ["help", "soffice=", "userdir=", "outdir=", "valgrind"])
-# print(optlist)
- return (dict(optlist), args)
-
-def usage():
- message = """usage: {program} [option]... [directory]..."
- -h | --help: print usage information
- --soffice=method:location
- specify soffice instance to connect to
- supported methods: 'path', 'connect'
- --outdir=URL specify the output directory for flat ODF exports
- --userdir=URL specify user installation directory for 'path' method
- --valgrind pass --valgrind to soffice for 'path' method
-
- 'location' is a pathname, not a URL. 'outdir' and 'userdir' are URLs.
- The 'directory' parameters should be full absolute pathnames, not URLs."""
- print(message.format(program = os.path.basename(sys.argv[0])))
+ epilog = "'location' is a pathname, not a URL. 'outdir' and 'userdir' are URLs.\n" \
+ "The 'directory' parameters should be full absolute pathnames, not URLs."
+
+ parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter,
+ epilog=epilog)
+ parser.add_argument('--soffice', metavar='method:location', required=True,
+ help="specify soffice instance to connect to\n"
+ "supported methods: 'path', 'connect'")
+ parser.add_argument('--outdir', metavar='URL', required=True,
+ help="specify the output directory for flat ODF exports")
+ parser.add_argument('--userdir', metavar='URL',
+ help="specify user installation directory for 'path' method")
+ parser.add_argument('--valgrind', action='store_true',
+ help="pass --valgrind to soffice for 'path' method")
+ parser.add_argument('dirs', metavar='directory', nargs='+')
+
+ args = parser.parse_args(argv[1:])
+
+ return args
if __name__ == "__main__":
- (opts,args) = parseArgs(sys.argv)
- if len(args) == 0:
- usage()
- sys.exit(1)
- if "-h" in opts or "--help" in opts:
- usage()
- sys.exit()
- elif "--soffice" in opts and "--outdir" in opts:
- runHandleFileTests(opts, args)
- else:
- usage()
- sys.exit(1)
+ opts = parseArgs(sys.argv)
+ runHandleFileTests(opts)
# vim:set shiftwidth=4 softtabstop=4 expandtab: