| #!/usr/bin/python | 
 | """This script keeps running until one of the two following conditions occur: | 
 | 1) A line in the file specified by argv[1] contains argv[2] => This will exit | 
 |    with a result code of 0 and print SUCCESSS. | 
 | 2) argv[3] seconds or more occur since invoking the script => This will exit | 
 |    with a result code of 0 (because Jenkins would autokill the build if we | 
 |    returned an error code) and print TIMEOUT. | 
 |  | 
 | Please note: | 
 |     The timeout specified by argv[3] may be checked with a precision of up to 5 | 
 |     seconds, so it may be possible that the script runs for argv[3] + 5 secs (or | 
 |     even a little bit more). | 
 | """ | 
 | import sys | 
 | import time | 
 | import re | 
 |  | 
 |  | 
 | OUTPUT_FILE = sys.argv[1] | 
 | REGEX_END_LINE = r'^.*' + sys.argv[2] + '.*$' | 
 | MAX_TIME_TO_RUN = int(sys.argv[3]) | 
 |  | 
 | def is_end_line(line) : | 
 | 	"""Returns true if a given file contains the 'End line' string. | 
 | 	""" | 
 |  | 
 | 	if re.match(REGEX_END_LINE, line) : | 
 | 		return True | 
 | 	else : | 
 | 		return False | 
 |  | 
 | def main() : | 
 | 	"""Opens the OUTPUT_FILE and continuously reads lines from it until either | 
 | 	there are no more lines or the end line is reached. In the former case, it | 
 | 	waits an exponentially increasing time interval for more lines to be printed | 
 | 	onto the file. | 
 |  | 
 | 	If MAX_TIME_TO_RUN seconds are elapsed, then the script also terminates,  | 
 | 	with an error condition. | 
 | 	""" | 
 | 	timeout_time = time.time() + MAX_TIME_TO_RUN | 
 |  | 
 | 	output_file = open(OUTPUT_FILE, 'r') | 
 |  | 
 | 	# Min and max waiting times (sec.) between reading two lines of the file. | 
 | 	MIN_READ_DELAY = 0.1 | 
 | 	MAX_READ_DELAY = 5 | 
 | 	READ_DELAY_INCREM_FACTOR = 1.5 # Times what the read delay is increased. | 
 |  | 
 | 	secs_before_read = 2 | 
 | 	end_not_reached = True | 
 |  | 
 | 	while end_not_reached : | 
 | 		line = output_file.readline() | 
 | 		 | 
 | 		if (len(line) == 0) : | 
 | 			time.sleep(secs_before_read) | 
 | 			# Sleep with exponential backoff. | 
 | 			secs_before_read = MAX_READ_DELAY \ | 
 | 			                   if (secs_before_read > MAX_READ_DELAY) \ | 
 | 			                   else secs_before_read * READ_DELAY_INCREM_FACTOR | 
 | 		else : | 
 | 			secs_before_read = MIN_READ_DELAY | 
 | 			end_not_reached = not is_end_line(line) | 
 |  | 
 |  | 
 | 		if (time.time() >= timeout_time) : | 
 | 			print "TIMEOUT" | 
 | 			exit(0) | 
 |  | 
 | 	print "SUCCESS" | 
 | 	exit(0) | 
 |  | 
 | main() |