diff options
Diffstat (limited to 'tools/regression/src/smoke.py')
-rwxr-xr-x | tools/regression/src/smoke.py | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/tools/regression/src/smoke.py b/tools/regression/src/smoke.py new file mode 100755 index 0000000000..1b17cfaaee --- /dev/null +++ b/tools/regression/src/smoke.py @@ -0,0 +1,197 @@ +# smoke test - every so many minutes, check svn revision, and if changed: +# update working copy, run tests, upload results + +# Copyright Beman Dawes 2007 + +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +# ---------------------------------------------------------------------------- # + +import os +import sys +import platform +import time +import ftplib + +# invoke the system command line processor +def cmd(command): + print "command:", command + os.system(command) + +# update SVN working copy +def update_working_copy(boost_path): + os.chdir(boost_path) + cmd("svn update") + +# get repository url +def repository_url(path, results_path): + url = "" + svn_info_file = results_path + "/svn_info.xml" + command = "svn info --xml " + path + " >" + svn_info_file + cmd(command) + f = open( svn_info_file, 'r' ) + svn_info = f.read() + f.close() + i = svn_info.find('//svn.boost.org') + if i >= 0: + url = svn_info[i:svn_info.find("</url>")] + return url + +# get revision number of a path, which may be a filesystem path or URL +def revision(path, results_path, test_name): + rev = 0 + svn_info_file = results_path + "/" + test_name + "-svn_info.xml" + command = "svn info --xml " + path + " >" + svn_info_file + cmd(command) + f = open( svn_info_file, 'r' ) + svn_info = f.read() + f.close() + i = svn_info.find( 'revision=' ) + if i >= 0: + i += 10 + while svn_info[i] >= '0' and svn_info[i] <= '9': + rev = rev*10 + int(svn_info[i]) + i += 1 + return rev + +# run bjam in current directory +def bjam(boost_path, args, output_path, test_name): + + # bjam seems to need BOOST_BUILD_PATH + #os.environ["BOOST_BUILD_PATH"]=boost_path + "/tools/build/v2" + + print "Begin bjam..." + command = "bjam --v2 --dump-tests -l180" + if args != "": command += " " + args + command += " >" + output_path + "/" + test_name +"-bjam.log 2>&1" + cmd(command) + +# run process_jam_log in current directory +def process_jam_log(boost_path, output_path, test_name): + print "Begin log processing..." + command = "process_jam_log " + boost_path + " <" +\ + output_path + "/" + test_name +"-bjam.log" + cmd(command) + +# run compiler_status in current directory +def compiler_status(boost_path, output_path, test_name): + print "Begin compiler status html creation... " + command = "compiler_status --v2 --ignore-pass --no-warn --locate-root " + boost_path + " " +\ + boost_path + " " + output_path + "/" + test_name + "-results.html " +\ + output_path + "/" + test_name + "-details.html " + cmd(command) + +# upload results via ftp +def upload_to_ftp(results_path, test_name, ftp_url, user, psw, debug_level): + + # to minimize the time web pages are not available, upload with temporary + # names and then rename to the permanent names + + i = 0 # dummy variable + os.chdir(results_path) + + tmp_results = "temp-" + test_name + "-results.html" + results = test_name + "-results.html" + tmp_details = "temp-" + test_name + "-details.html" + details = test_name + "-details.html" + + print "Uploading results via ftp..." + ftp = ftplib.FTP( ftp_url, user, psw ) + ftp.set_debuglevel( debug_level ) + + # ftp.cwd( site_path ) + + try: ftp.delete(tmp_results) + except: ++i + + f = open( results, 'rb' ) + ftp.storbinary( 'STOR %s' % tmp_results, f ) + f.close() + + try: ftp.delete(tmp_details) + except: ++i + + f = open( details, 'rb' ) + ftp.storbinary( 'STOR %s' % tmp_details, f ) + f.close() + + try: ftp.delete(results) + except: ++i + + try: ftp.delete(details) + except: ++i + + ftp.rename(tmp_results, results) + ftp.rename(tmp_details, details) + + ftp.dir() + ftp.quit() + +def commit_results(results_path, test_name, rev): + print "Commit results..." + cwd = os.getcwd() + os.chdir(results_path) + command = "svn commit --non-interactive -m "+'"'+str(rev)+'" '+test_name+"-results.html" + cmd(command) + os.chdir(cwd) + + +# ---------------------------------------------------------------------------- # + +if len(sys.argv) < 7: + print "Invoke with: minutes boost-path test-name results-path ftp-url user psw [bjam-args]" + print " boost-path must be path for a boost svn working directory." + print " results-path must be path for a svn working directory where an" + print " svn commit test-name+'-results.html' is valid." + print "Warning: This program hangs or crashes on network failures." + exit() + +minutes = int(sys.argv[1]) +boost_path = sys.argv[2] +test_name = sys.argv[3] +results_path = sys.argv[4] +ftp_url = sys.argv[5] +user = sys.argv[6] +psw = sys.argv[7] +if len(sys.argv) > 8: bjam_args = sys.argv[8] +else: bjam_args = "" + +os.chdir(boost_path) # convert possible relative path +boost_path = os.getcwd() # to absolute path + +print "minutes is ", minutes +print "boost_path is ", boost_path +print "test_name is ", test_name +print "results_path is ", results_path +print "ftp_url is ", ftp_url +print "user is ", user +print "psw is ", psw +print 'bjam args are "' + bjam_args + '"' + +url = repository_url(boost_path, results_path) +print "respository url is ", url + +first = 1 +while 1: + working_rev = revision(boost_path, results_path, test_name) + repos_rev = revision("http:" + url, results_path, test_name) + print "Working copy revision: ", working_rev, " repository revision: ", repos_rev + if first or working_rev != repos_rev: + first = 0 + start_time = time.time() + print + print "start at", time.strftime("%H:%M:%S", time.localtime()) + update_working_copy(boost_path) + os.chdir(boost_path+"/status") + bjam(boost_path, bjam_args, results_path, test_name) + process_jam_log(boost_path, results_path, test_name) + compiler_status(boost_path, results_path, test_name) + upload_to_ftp(results_path, test_name, ftp_url, user, psw, 0) + commit_results(results_path, test_name,revision(boost_path, results_path, test_name)) + elapsed_time = time.time() - start_time + print elapsed_time/60.0, "minutes elapsed time" + print + + print "sleep ", minutes, "minutes..." + time.sleep(60 * minutes) |