summaryrefslogtreecommitdiff
path: root/tests/test_upload.py
diff options
context:
space:
mode:
authorDon Bright <hugh.m.bright@gmail.com>2013-02-19 01:45:37 (GMT)
committerDon Bright <hugh.m.bright@gmail.com>2013-02-19 01:45:37 (GMT)
commit3fc620c9659c61dc074393da7a5ff0f731eef0ed (patch)
tree805197154702fa3a7f424478801fc766c5074d1f /tests/test_upload.py
parentc5eb57eb197c8d846174ddc00aa6c97056d6c2d0 (diff)
new upload design using python paramiko. also fix glew bugs.
Diffstat (limited to 'tests/test_upload.py')
-rwxr-xr-xtests/test_upload.py253
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())
+
contact: Jan Huwald // Impressum