Skip to content

Commit d12f55d

Browse files
Ramiro Pollatsaunier
authored andcommitted
validate: launcher: Move logfile handling out of Reporter and into Test
This makes each Test handle its own logfile, allowing the Reporter to work on multiple tests at the same time. Patch 5/5 to move logfile handling out of Reporter and into Test.
1 parent 500206d commit d12f55d

2 files changed

Lines changed: 43 additions & 36 deletions

File tree

validate/launcher/baseclasses.py

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ def clean(self):
7373
self._starting_time = None
7474
self.result = Result.NOT_RUN
7575
self.logfile = None
76+
self.out = None
7677
self.extra_logfiles = []
7778
self._env_variable = ''
7879

@@ -102,16 +103,41 @@ def add_env_variable(self, variable, value):
102103
self._env_variable += " "
103104
self._env_variable += "%s=%s" % (variable, value)
104105

105-
def get_extra_log_content(self, extralog):
106-
if extralog not in self.extra_logfiles:
107-
return ""
106+
def open_logfile(self):
107+
path = os.path.join(self.options.logsdir,
108+
self.classname.replace(".", os.sep))
109+
mkdir(os.path.dirname(path))
110+
self.logfile = path
111+
112+
if self.options.redirect_logs == 'stdout':
113+
self.out = sys.stdout
114+
elif self.options.redirect_logs == 'stderr':
115+
self.out = sys.stderr
116+
else:
117+
self.out = open(path, 'w+')
118+
119+
def close_logfile(self):
120+
if not self.options.redirect_logs:
121+
self.out.close()
122+
123+
self.out = None
108124

109-
f = open(extralog, 'r+')
125+
def _get_file_content(self, file_name):
126+
f = open(file_name, 'r+')
110127
value = f.read()
111128
f.close()
112129

113130
return value
114131

132+
def get_log_content(self):
133+
return self._get_file_content(self.logfile)
134+
135+
def get_extra_log_content(self, extralog):
136+
if extralog not in self.extra_logfiles:
137+
return ""
138+
139+
return self._get_file_content(extralog)
140+
115141
def get_classname(self):
116142
name = self.classname.split('.')[-1]
117143
classname = self.classname.replace('.%s' % name, '')
@@ -235,13 +261,15 @@ def _kill_subprocess(self):
235261

236262
def thread_wrapper(self):
237263
self.process = subprocess.Popen("exec " + self.command,
238-
stderr=self.reporter.out,
239-
stdout=self.reporter.out,
264+
stderr=self.out,
265+
stdout=self.out,
240266
shell=True,
241267
env=self.proc_env)
242268
self.process.wait()
243269

244270
def run(self):
271+
self.open_logfile()
272+
245273
self.command = "%s " % (self.application)
246274
self._starting_time = time.time()
247275
self.build_arguments()
@@ -256,12 +284,12 @@ def run(self):
256284
for log in self.extra_logfiles:
257285
message += "\n - %s" % log
258286

259-
self.reporter.out.write("=================\n"
260-
"Test name: %s\n"
261-
"Command: '%s'\n"
262-
"=================\n\n"
263-
% (self.classname, self.command))
264-
self.reporter.out.flush()
287+
self.out.write("=================\n"
288+
"Test name: %s\n"
289+
"Command: '%s'\n"
290+
"=================\n\n"
291+
% (self.classname, self.command))
292+
self.out.flush()
265293

266294
printc(message, Colors.OKBLUE)
267295

@@ -282,6 +310,8 @@ def run(self):
282310
" (" + self.message + ")" if self.message else ""),
283311
color=utils.get_color_for_result(self.result))
284312

313+
self.close_logfile()
314+
285315
return self.result
286316

287317

@@ -748,11 +778,9 @@ def run_tests(self, cur_test_num, total_num_tests):
748778
i = cur_test_num
749779
for test in self.tests:
750780
sys.stdout.write("[%d / %d] " % (i + 1, total_num_tests))
751-
self.reporter.open_logfile(test)
752781
res = test.run()
753782
i += 1
754783
self.reporter.after_test(test)
755-
self.reporter.close_logfile()
756784
if res != Result.PASSED and (self.options.forever or
757785
self.options.fatal_error):
758786
return test.result

validate/launcher/reporters.py

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ class Reporter(Loggable):
5555
def __init__(self, options):
5656
Loggable.__init__(self)
5757

58-
self.out = None
5958
self.options = options
6059
self._start_time = 0
6160
self.stats = {'timeout': 0,
@@ -69,19 +68,6 @@ def init_timer(self):
6968
"""Initialize a timer before starting tests."""
7069
self._start_time = time.time()
7170

72-
def open_logfile(self, test):
73-
path = os.path.join(self.options.logsdir,
74-
test.classname.replace(".", os.sep))
75-
mkdir(os.path.dirname(path))
76-
test.logfile = path
77-
78-
if self.options.redirect_logs == 'stdout':
79-
self.out = sys.stdout
80-
elif self.options.redirect_logs == 'stderr':
81-
self.out = sys.stderr
82-
else:
83-
self.out = open(path, 'w+')
84-
8571
def set_failed(self, test):
8672
self.stats["failure"] += 1
8773

@@ -104,12 +90,6 @@ def after_test(self, test):
10490

10591
self.add_results(test)
10692

107-
def close_logfile(self):
108-
if not self.options.redirect_logs:
109-
self.out.close()
110-
111-
self.out = None
112-
11393
def final_report(self):
11494
print "\n"
11595
printc("Final Report:", title=True)
@@ -160,8 +140,7 @@ def final_report(self):
160140
def _get_captured(self, test):
161141
captured = ""
162142
if not self.options.redirect_logs:
163-
self.out.seek(0)
164-
value = self.out.read()
143+
value = test.get_log_content()
165144
if value:
166145
captured += '<system-out><![CDATA[%s' % \
167146
escape_cdata(value)

0 commit comments

Comments
 (0)