summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/core/utils/concurrencytest.py
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/oeqa/core/utils/concurrencytest.py')
-rw-r--r--meta/lib/oeqa/core/utils/concurrencytest.py33
1 files changed, 17 insertions, 16 deletions
diff --git a/meta/lib/oeqa/core/utils/concurrencytest.py b/meta/lib/oeqa/core/utils/concurrencytest.py
index 347dc89602..161a2f6e90 100644
--- a/meta/lib/oeqa/core/utils/concurrencytest.py
+++ b/meta/lib/oeqa/core/utils/concurrencytest.py
@@ -48,11 +48,15 @@ _all__ = [
48# 48#
49class BBThreadsafeForwardingResult(ThreadsafeForwardingResult): 49class BBThreadsafeForwardingResult(ThreadsafeForwardingResult):
50 50
51 def __init__(self, target, semaphore, threadnum, totalinprocess, totaltests): 51 def __init__(self, target, semaphore, threadnum, totalinprocess, totaltests, output, finalresult):
52 super(BBThreadsafeForwardingResult, self).__init__(target, semaphore) 52 super(BBThreadsafeForwardingResult, self).__init__(target, semaphore)
53 self.threadnum = threadnum 53 self.threadnum = threadnum
54 self.totalinprocess = totalinprocess 54 self.totalinprocess = totalinprocess
55 self.totaltests = totaltests 55 self.totaltests = totaltests
56 self.buffer = True
57 self.outputbuf = output
58 self.finalresult = finalresult
59 self.finalresult.buffer = True
56 60
57 def _add_result_with_semaphore(self, method, test, *args, **kwargs): 61 def _add_result_with_semaphore(self, method, test, *args, **kwargs):
58 self.semaphore.acquire() 62 self.semaphore.acquire()
@@ -71,6 +75,8 @@ class BBThreadsafeForwardingResult(ThreadsafeForwardingResult):
71 test.id()) 75 test.id())
72 finally: 76 finally:
73 self.semaphore.release() 77 self.semaphore.release()
78 self.finalresult._stderr_buffer = io.StringIO(initial_value=self.outputbuf.getvalue().decode("utf-8"))
79 self.finalresult._stdout_buffer = io.StringIO()
74 super(BBThreadsafeForwardingResult, self)._add_result_with_semaphore(method, test, *args, **kwargs) 80 super(BBThreadsafeForwardingResult, self)._add_result_with_semaphore(method, test, *args, **kwargs)
75 81
76class ProxyTestResult: 82class ProxyTestResult:
@@ -196,19 +202,11 @@ class ConcurrentTestSuite(unittest.TestSuite):
196 queue = Queue() 202 queue = Queue()
197 semaphore = threading.Semaphore(1) 203 semaphore = threading.Semaphore(1)
198 result.threadprogress = {} 204 result.threadprogress = {}
199 for i, (testserver, testnum) in enumerate(testservers): 205 for i, (testserver, testnum, output) in enumerate(testservers):
200 result.threadprogress[i] = [] 206 result.threadprogress[i] = []
201 process_result = BBThreadsafeForwardingResult( 207 process_result = BBThreadsafeForwardingResult(
202 ExtraResultsDecoderTestResult(result), 208 ExtraResultsDecoderTestResult(result),
203 semaphore, i, testnum, totaltests) 209 semaphore, i, testnum, totaltests, output, result)
204 # Force buffering of stdout/stderr so the console doesn't get corrupted by test output
205 # as per default in parent code
206 process_result.buffer = True
207 # We have to add a buffer object to stdout to keep subunit happy
208 process_result._stderr_buffer = io.StringIO()
209 process_result._stderr_buffer.buffer = dummybuf(process_result._stderr_buffer)
210 process_result._stdout_buffer = io.StringIO()
211 process_result._stdout_buffer.buffer = dummybuf(process_result._stdout_buffer)
212 reader_thread = threading.Thread( 210 reader_thread = threading.Thread(
213 target=self._run_test, args=(testserver, process_result, queue)) 211 target=self._run_test, args=(testserver, process_result, queue))
214 threads[testserver] = reader_thread, process_result 212 threads[testserver] = reader_thread, process_result
@@ -273,10 +271,11 @@ def fork_for_tests(concurrency_num, suite):
273 newsi = os.open(os.devnull, os.O_RDWR) 271 newsi = os.open(os.devnull, os.O_RDWR)
274 os.dup2(newsi, sys.stdin.fileno()) 272 os.dup2(newsi, sys.stdin.fileno())
275 273
274 # Send stdout/stderr over the stream
275 os.dup2(c2pwrite, sys.stdout.fileno())
276 os.dup2(c2pwrite, sys.stderr.fileno())
277
276 subunit_client = TestProtocolClient(stream) 278 subunit_client = TestProtocolClient(stream)
277 # Force buffering of stdout/stderr so the console doesn't get corrupted by test output
278 # as per default in parent code
279 subunit_client.buffer = True
280 subunit_result = AutoTimingTestResultDecorator(subunit_client) 279 subunit_result = AutoTimingTestResultDecorator(subunit_client)
281 unittest_result = process_suite.run(ExtraResultsEncoderTestResult(subunit_result)) 280 unittest_result = process_suite.run(ExtraResultsEncoderTestResult(subunit_result))
282 if ourpid != os.getpid(): 281 if ourpid != os.getpid():
@@ -306,8 +305,10 @@ def fork_for_tests(concurrency_num, suite):
306 else: 305 else:
307 os.close(c2pwrite) 306 os.close(c2pwrite)
308 stream = os.fdopen(c2pread, 'rb', 1) 307 stream = os.fdopen(c2pread, 'rb', 1)
309 testserver = ProtocolTestCase(stream) 308 # Collect stdout/stderr into an io buffer
310 testservers.append((testserver, numtests)) 309 output = io.BytesIO()
310 testserver = ProtocolTestCase(stream, passthrough=output)
311 testservers.append((testserver, numtests, output))
311 return testservers, totaltests 312 return testservers, totaltests
312 313
313def partition_tests(suite, count): 314def partition_tests(suite, count):