diff options
Diffstat (limited to 'tests/test_upload.py')
-rwxr-xr-x | tests/test_upload.py | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/tests/test_upload.py b/tests/test_upload.py new file mode 100755 index 0000000..5d7cd3e --- /dev/null +++ b/tests/test_upload.py @@ -0,0 +1,253 @@ +#!/usr/bin/python + +# Copyright 2013 Don Bright <hugh.m.bright@gmail.com> +# released under Zlib-style license: +# +# This software is provided 'as-is', without any express or implied +# warranty. In no event will the authors be held liable for any damages +# arising from the use of this software. +# +# Permission is granted to anyone to use this software for any purpose, +# including commercial applications, and to alter it and redistribute it +# freely, subject to the following restrictions: +# +# 1. The origin of this software must not be misrepresented; you must +# not claim that you wrote the original software. If you use this +# software in a product, an acknowledgment in the product documentation +# would be appreciated but is not required. +# 2. Altered source versions must be plainly marked as such, and must +# not be misrepresented as being the original software. 3. This notice +# may not be removed or altered from any source distribution. +# +# This license is based on zlib license by Jean-loup Gailly and Mark Adler + + +# +# this program takes html output by test_pretty_print.py and uploads +# it to a web server. +# + +# +# design +# +# On the remote web server there is a directory called 'openscad_tests' +# Inside of it is a file, 'index.html', that lists all the test reports +# stored in that directory. +# +# Each test report is a single .html file, with all of the .png images +# encoded directly into the file using the Data URI and base64 encoding. +# The name of the report file is something like OS_cpu_GLinfo_hash, like +# linux_x86_radeon_abcd. This is read using test_pretty_print.py +# +# This script uploads the last report created by test_pretty_print.py +# Then it modifies the remote index.html file (if necessary) to display +# a link to the new test report. +# +# Requirements for remote web server and local system: +# +# 1. Local system must have sftp access to remote server +# This can be tested by runnig this: sftp user@remotehost +# +# 2. Remote web server only needs static html. There is no requirement +# for php/cgi/etc. +# +# 3. Local system must have the python Paramiko library installed, +# which in turn requires pycript to also be installed. (to PYTHONPATH) +# +# This script returns '1' on failure, '0' on success (shell-style) +# + +import sys,os,platform,string + +try: + import paramiko +except: + x=''' +please install the paramiko python library in your +PYTHONPATH If that is not feasible, you can upload the main html report +file by hand to any site that accepts html code. +''' + +from test_pretty_print import ezsearch, read_sysinfo +from test_cmdline_tool import execute_and_redirect + +debug_test_upload = False +dryrun = False + +def help(): + text=''' +test_upload.py + +usage: + + test_upload.py --username=uname --host=host --remotepath=/some/path \ + [--dryrun] [--debug] + +example: + + test_upload.py andreis web.sourceforge.net /home/project-web/openscad/htdocs/ +''' + print text + + +def debug(x): + if debug_test_upload: + print 'test_upload.py:', x + sys.stdout.flush() + + +blankchunk='''<!-- __entry__ -->''' + +index_template=''' +<html> +<head> +OpenSCAD regression test results +</head> +<body> + <h3> + OpenSCAD regression test results + </h3> + <ul> +''' + blankchunk + ''' + </ul> +</body> +</html> +''' + +entry_template=''' + <li><a href="__href__">__rept_name__</a></li> +''' + + +def paramiko_upload( newrept_fname, username, host, remotepath ): + debug("running paramiko upload") + + basepath = 'openscad_tests' + basefilename = os.path.basename( newrept_fname ) + newrept_name = string.split(basefilename,'.html')[0] + debug("input filename: "+ newrept_fname ) + debug("new report name: "+ newrept_name ) + + debug("connect to " + username + "@" + host) + client = paramiko.SSHClient() + client.set_missing_host_key_policy(paramiko.AutoAddPolicy) + client.load_system_host_keys() + if dryrun: + debug("dryrun: no client.connect()") + return 0 + try: + client.connect(host,username=username) + except paramiko.PasswordRequiredException, e: + passw = getpass.getpass('enter passphrase for private key: ') + client.connect(host,username=username,password=passw) + + #stdin,stdout,stderr=client.exec_command('ls -l') + + debug("find " + basepath + "/index.html (or create blank) ") + ftp = client.open_sftp() + if not basepath in ftp.listdir(): + ftp.mkdir( basepath ) + ftp.chdir( basepath ) + + if not 'index.html' in ftp.listdir(): + f = ftp.file( 'index.html', 'w+') + f.write(index_template) + f.close() + + debug("upload new report") + # pass + + debug("add new reprt link to index.html") + f = ftp.file( 'index.html', 'r' ) + text = f.read() + f.close() + + text2 = entry_template + text2 = text2.replace( '__href__', newrept_fname ) + text2 = text2.replace( '__rept_name__', newrept_name ) + + if newrept_fname in text: + debug( newrept_fname + " already linked from index.html") + else: + text = text.replace( blankchunk, blankchunk+'\n'+text2 ) + + f = ftp.file( 'index.html', 'w+' ) + f.write(text) + f.close() + + debug("close connections") + ftp.close() + client.close() + + +def upload_unix( reptfile, username, host, remotepath): + debug("detected unix-like system.") + paramiko_upload( reptfile, username, host, remotepath ) + +def upload_darwin( reptfile, username, host, remotepath ): + debug("detected osx/darwin") + upload_unix( reptfile, username, host, remotepath ) + +def upload_windows( reptfile, username, host, remotepath ): + debug("detected windows") + print 'sorry, not implemented on windows' + return 1 + # use pycript and paramiko + # the problem is downloading them and installing them + +def upload( reptfile, username, host, remotepath ): + sysname = platform.system().lower() + result = 1 + if 'linux' in sysname or 'bsd' in sysname: + result = upload_unix( reptfile, username, host, remotepath ) + elif 'darwin' in sysname: + result = upload_darwin( reptfile, username, host, remotepath ) + elif 'windows' in platform.system(): + result = upload_windows( reptfile, username, host, remotepath ) + else: + print "unknown system type. cant upload, sorry" + return result + +def main(): + if '--debug' in string.join(sys.argv): + global debug_test_upload + debug_test_upload = True + if '--dryrun' in string.join(sys.argv): + global dryrun + dryrun = True + + debug('running test_upload') + debug('args: '+str(sys.argv[1:])) + + builddir = ezsearch('--builddir=(.*?) ',string.join(sys.argv)+' ') + if builddir=='': builddir=os.getcwd() + sysinfo, sysid = read_sysinfo(os.path.join(builddir,'sysinfo.txt')) + debug("sysinfo: " + sysinfo[0:60].replace('\n','') + ". . . ") + debug("sysid: " + sysid ) + if len(sysid)<6: + print "unable to find valid system id" + sys.exit(1) + + sysidpath = sysid + '_report' + '.html' + testdir = os.path.join(builddir, 'Testing', 'Temporary', sysidpath ) + debug("testdir:\n" + testdir ) + + username = ezsearch('--username=(.*?) ',string.join(sys.argv)+' ') + host = ezsearch('--host=(.*?) ',string.join(sys.argv)+' ') + remotepath = ezsearch('--remotepath=(.*?) ',string.join(sys.argv)+' ') + + if testdir=='' or username=='' or host=='' or remotepath=='': + help() + sys.exit(1) + + res = upload( testdir, username, host, remotepath ) + if res==1: + print "upload failed" + return 1 + else: + return 0 + + +if __name__ == '__main__': + sys.exit(main()) + |