Skip to content

Commit 55b0b9d

Browse files
ikedamdnozay
authored andcommitted
Improve coverages for _DuplicateWriter
1 parent 6ebfcdd commit 55b0b9d

File tree

2 files changed

+62
-5
lines changed

2 files changed

+62
-5
lines changed

tests/testsuite.py

+48
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,18 @@
99

1010
from xmlrunner.unittest import unittest
1111
import xmlrunner
12+
from xmlrunner.result import _DuplicateWriter
1213
from xmlrunner.result import _XMLTestResult
1314
import doctest
1415
import tests.doctest_example
1516
from six import StringIO, BytesIO
1617
from tempfile import mkdtemp
18+
from tempfile import mkstemp
1719
from shutil import rmtree
1820
from glob import glob
1921
from xml.dom import minidom
2022
from lxml import etree
23+
import os
2124
import os.path
2225

2326

@@ -573,3 +576,48 @@ def test_xmlrunner_hold_traceback(self):
573576
runner = self._test_xmlrunner(suite)
574577
countAfterTest = sys.getrefcount(self.DummyRefCountTest.dummy)
575578
self.assertEqual(countBeforeTest, countAfterTest)
579+
580+
581+
class DuplicateWriterTestCase(unittest.TestCase):
582+
def setUp(self):
583+
fd, self.file = mkstemp()
584+
self.fh = os.fdopen(fd, 'w')
585+
self.buffer = StringIO()
586+
self.writer = _DuplicateWriter(self.fh, self.buffer)
587+
588+
def tearDown(self):
589+
self.buffer.close()
590+
self.fh.close()
591+
os.unlink(self.file)
592+
593+
def getFirstContent(self):
594+
with open(self.file, 'r') as f:
595+
return f.read()
596+
597+
def getSecondContent(self):
598+
return self.buffer.getvalue()
599+
600+
def test_flush(self):
601+
self.writer.write('foobarbaz')
602+
self.writer.flush()
603+
self.assertEqual(self.getFirstContent(), self.getSecondContent())
604+
605+
def test_writable(self):
606+
self.assertTrue(self.writer.writable())
607+
608+
def test_writelines(self):
609+
self.writer.writelines([
610+
'foo\n',
611+
'bar\n',
612+
'baz\n',
613+
])
614+
self.writer.flush()
615+
self.assertEqual(self.getFirstContent(), self.getSecondContent())
616+
617+
def test_write(self):
618+
# try long buffer (1M)
619+
buffer = 'x' * (1024 * 1024)
620+
wrote = self.writer.write(buffer)
621+
self.writer.flush()
622+
self.assertEqual(self.getFirstContent(), self.getSecondContent())
623+
self.assertEqual(wrote, len(self.getSecondContent()))

xmlrunner/result.py

+14-5
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def testcase_name(test_method):
8383
return result
8484

8585

86-
class _DuplicateWriter(io.RawIOBase):
86+
class _DuplicateWriter(io.TextIOBase):
8787
"""
8888
Duplicate output from the first handle to the second handle
8989
@@ -107,11 +107,20 @@ def writelines(self, lines):
107107
self._second.writelines(lines)
108108

109109
def write(self, b):
110-
len = self._first.write(b)
110+
if isinstance(self._first, io.TextIOBase):
111+
wrote = self._first.write(b)
111112

112-
# expected to always succeed to write
113-
self._second.write(b[:len])
114-
return len
113+
if wrote is not None:
114+
# expected to always succeed to write
115+
self._second.write(b[:wrote])
116+
117+
return wrote
118+
else:
119+
# file-like object in Python2
120+
# It doesn't return wrote bytes.
121+
self._first.write(b)
122+
self._second.write(b)
123+
return len(b)
115124

116125

117126
class _TestInfo(object):

0 commit comments

Comments
 (0)