bpo-43651: PEP 597: Fix EncodingWarning in some tests (GH-25189)

* Fix _sitebuiltins
* Fix test_inspect
* Fix test_interpreters
* Fix test_io
* Fix test_iter
* Fix test_json
* Fix test_linecache
* Fix test_lltrace
* Fix test_logging
* Fix logging
This commit is contained in:
Inada Naoki 2021-04-06 11:18:41 +09:00 committed by GitHub
parent f84d5a1136
commit fb78692f2a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 73 additions and 63 deletions

View file

@ -47,7 +47,7 @@ class _Printer(object):
data = None data = None
for filename in self.__filenames: for filename in self.__filenames:
try: try:
with open(filename, "r") as fp: with open(filename, encoding='utf-8') as fp:
data = fp.read() data = fp.read()
break break
except OSError: except OSError:

View file

@ -1150,6 +1150,8 @@ class FileHandler(StreamHandler):
self.baseFilename = os.path.abspath(filename) self.baseFilename = os.path.abspath(filename)
self.mode = mode self.mode = mode
self.encoding = encoding self.encoding = encoding
if "b" not in mode:
self.encoding = io.text_encoding(encoding)
self.errors = errors self.errors = errors
self.delay = delay self.delay = delay
# bpo-26789: FileHandler keeps a reference to the builtin open() # bpo-26789: FileHandler keeps a reference to the builtin open()
@ -2022,8 +2024,10 @@ def basicConfig(**kwargs):
filename = kwargs.pop("filename", None) filename = kwargs.pop("filename", None)
mode = kwargs.pop("filemode", 'a') mode = kwargs.pop("filemode", 'a')
if filename: if filename:
if 'b'in mode: if 'b' in mode:
errors = None errors = None
else:
encoding = io.text_encoding(encoding)
h = FileHandler(filename, mode, h = FileHandler(filename, mode,
encoding=encoding, errors=errors) encoding=encoding, errors=errors)
else: else:

View file

@ -23,7 +23,7 @@ Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved.
To use, simply 'import logging.handlers' and log away! To use, simply 'import logging.handlers' and log away!
""" """
import logging, socket, os, pickle, struct, time, re import io, logging, socket, os, pickle, struct, time, re
from stat import ST_DEV, ST_INO, ST_MTIME from stat import ST_DEV, ST_INO, ST_MTIME
import queue import queue
import threading import threading
@ -150,6 +150,8 @@ class RotatingFileHandler(BaseRotatingHandler):
# on each run. # on each run.
if maxBytes > 0: if maxBytes > 0:
mode = 'a' mode = 'a'
if "b" not in mode:
encoding = io.text_encoding(encoding)
BaseRotatingHandler.__init__(self, filename, mode, encoding=encoding, BaseRotatingHandler.__init__(self, filename, mode, encoding=encoding,
delay=delay, errors=errors) delay=delay, errors=errors)
self.maxBytes = maxBytes self.maxBytes = maxBytes
@ -205,6 +207,7 @@ class TimedRotatingFileHandler(BaseRotatingHandler):
def __init__(self, filename, when='h', interval=1, backupCount=0, def __init__(self, filename, when='h', interval=1, backupCount=0,
encoding=None, delay=False, utc=False, atTime=None, encoding=None, delay=False, utc=False, atTime=None,
errors=None): errors=None):
encoding = io.text_encoding(encoding)
BaseRotatingHandler.__init__(self, filename, 'a', encoding=encoding, BaseRotatingHandler.__init__(self, filename, 'a', encoding=encoding,
delay=delay, errors=errors) delay=delay, errors=errors)
self.when = when.upper() self.when = when.upper()
@ -442,6 +445,8 @@ class WatchedFileHandler(logging.FileHandler):
""" """
def __init__(self, filename, mode='a', encoding=None, delay=False, def __init__(self, filename, mode='a', encoding=None, delay=False,
errors=None): errors=None):
if "b" not in mode:
encoding = io.text_encoding(encoding)
logging.FileHandler.__init__(self, filename, mode=mode, logging.FileHandler.__init__(self, filename, mode=mode,
encoding=encoding, delay=delay, encoding=encoding, delay=delay,
errors=errors) errors=errors)

View file

@ -363,7 +363,7 @@ class GetSourceBase(unittest.TestCase):
fodderModule = None fodderModule = None
def setUp(self): def setUp(self):
with open(inspect.getsourcefile(self.fodderModule)) as fp: with open(inspect.getsourcefile(self.fodderModule), encoding="utf-8") as fp:
self.source = fp.read() self.source = fp.read()
def sourcerange(self, top, bottom): def sourcerange(self, top, bottom):
@ -773,8 +773,8 @@ class TestNoEOL(GetSourceBase):
def setUp(self): def setUp(self):
self.tempdir = TESTFN + '_dir' self.tempdir = TESTFN + '_dir'
os.mkdir(self.tempdir) os.mkdir(self.tempdir)
with open(os.path.join(self.tempdir, with open(os.path.join(self.tempdir, 'inspect_fodder3%spy' % os.extsep),
'inspect_fodder3%spy' % os.extsep), 'w') as f: 'w', encoding='utf-8') as f:
f.write("class X:\n pass # No EOL") f.write("class X:\n pass # No EOL")
with DirsOnSysPath(self.tempdir): with DirsOnSysPath(self.tempdir):
import inspect_fodder3 as mod3 import inspect_fodder3 as mod3
@ -1805,7 +1805,7 @@ class TestGetattrStatic(unittest.TestCase):
def test_no_dict_no_slots_instance_member(self): def test_no_dict_no_slots_instance_member(self):
# returns descriptor # returns descriptor
with open(__file__) as handle: with open(__file__, encoding='utf-8') as handle:
self.assertEqual(inspect.getattr_static(handle, 'name'), type(handle).name) self.assertEqual(inspect.getattr_static(handle, 'name'), type(handle).name)
def test_inherited_slots(self): def test_inherited_slots(self):
@ -4045,7 +4045,7 @@ def foo():
def assertInspectEqual(self, path, source): def assertInspectEqual(self, path, source):
inspected_src = inspect.getsource(source) inspected_src = inspect.getsource(source)
with open(path) as src: with open(path, encoding='utf-8') as src:
self.assertEqual( self.assertEqual(
src.read().splitlines(True), src.read().splitlines(True),
inspected_src.splitlines(True) inspected_src.splitlines(True)
@ -4056,7 +4056,7 @@ def foo():
with _ready_to_import('reload_bug', self.src_before) as (name, path): with _ready_to_import('reload_bug', self.src_before) as (name, path):
module = importlib.import_module(name) module = importlib.import_module(name)
self.assertInspectEqual(path, module) self.assertInspectEqual(path, module)
with open(path, 'w') as src: with open(path, 'w', encoding='utf-8') as src:
src.write(self.src_after) src.write(self.src_after)
self.assertInspectEqual(path, module) self.assertInspectEqual(path, module)

View file

@ -14,11 +14,11 @@ def _captured_script(script):
indented = script.replace('\n', '\n ') indented = script.replace('\n', '\n ')
wrapped = dedent(f""" wrapped = dedent(f"""
import contextlib import contextlib
with open({w}, 'w') as spipe: with open({w}, 'w', encoding='utf-8') as spipe:
with contextlib.redirect_stdout(spipe): with contextlib.redirect_stdout(spipe):
{indented} {indented}
""") """)
return wrapped, open(r) return wrapped, open(r, encoding='utf-8')
def clean_up_interpreters(): def clean_up_interpreters():
@ -411,7 +411,7 @@ class TestInterpreterRun(TestBase):
def test_fork(self): def test_fork(self):
interp = interpreters.create() interp = interpreters.create()
import tempfile import tempfile
with tempfile.NamedTemporaryFile('w+') as file: with tempfile.NamedTemporaryFile('w+', encoding='utf-8') as file:
file.write('') file.write('')
file.flush() file.flush()
@ -421,7 +421,7 @@ class TestInterpreterRun(TestBase):
try: try:
os.fork() os.fork()
except RuntimeError: except RuntimeError:
with open('{file.name}', 'w') as out: with open('{file.name}', 'w', encoding='utf-8') as out:
out.write('{expected}') out.write('{expected}')
""") """)
interp.run(script) interp.run(script)

View file

@ -2601,8 +2601,8 @@ class TextIOWrapperTest(unittest.TestCase):
self.assertEqual(t.encoding, "utf-8") self.assertEqual(t.encoding, "utf-8")
self.assertEqual(t.line_buffering, True) self.assertEqual(t.line_buffering, True)
self.assertEqual("\xe9\n", t.readline()) self.assertEqual("\xe9\n", t.readline())
self.assertRaises(TypeError, t.__init__, b, newline=42) self.assertRaises(TypeError, t.__init__, b, encoding="utf-8", newline=42)
self.assertRaises(ValueError, t.__init__, b, newline='xyzzy') self.assertRaises(ValueError, t.__init__, b, encoding="utf-8", newline='xyzzy')
def test_uninitialized(self): def test_uninitialized(self):
t = self.TextIOWrapper.__new__(self.TextIOWrapper) t = self.TextIOWrapper.__new__(self.TextIOWrapper)
@ -3732,7 +3732,7 @@ class CTextIOWrapperTest(TextIOWrapperTest):
r = self.BytesIO(b"\xc3\xa9\n\n") r = self.BytesIO(b"\xc3\xa9\n\n")
b = self.BufferedReader(r, 1000) b = self.BufferedReader(r, 1000)
t = self.TextIOWrapper(b, encoding="utf-8") t = self.TextIOWrapper(b, encoding="utf-8")
self.assertRaises(ValueError, t.__init__, b, newline='xyzzy') self.assertRaises(ValueError, t.__init__, b, encoding="utf-8", newline='xyzzy')
self.assertRaises(ValueError, t.read) self.assertRaises(ValueError, t.read)
t = self.TextIOWrapper.__new__(self.TextIOWrapper) t = self.TextIOWrapper.__new__(self.TextIOWrapper)

View file

@ -337,13 +337,13 @@ class TestCase(unittest.TestCase):
# Test a file # Test a file
def test_iter_file(self): def test_iter_file(self):
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
try: try:
for i in range(5): for i in range(5):
f.write("%d\n" % i) f.write("%d\n" % i)
finally: finally:
f.close() f.close()
f = open(TESTFN, "r") f = open(TESTFN, "r", encoding="utf-8")
try: try:
self.check_for_loop(f, ["0\n", "1\n", "2\n", "3\n", "4\n"], pickle=False) self.check_for_loop(f, ["0\n", "1\n", "2\n", "3\n", "4\n"], pickle=False)
self.check_for_loop(f, [], pickle=False) self.check_for_loop(f, [], pickle=False)
@ -366,13 +366,13 @@ class TestCase(unittest.TestCase):
self.assertRaises(TypeError, list, list) self.assertRaises(TypeError, list, list)
self.assertRaises(TypeError, list, 42) self.assertRaises(TypeError, list, 42)
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
try: try:
for i in range(5): for i in range(5):
f.write("%d\n" % i) f.write("%d\n" % i)
finally: finally:
f.close() f.close()
f = open(TESTFN, "r") f = open(TESTFN, "r", encoding="utf-8")
try: try:
self.assertEqual(list(f), ["0\n", "1\n", "2\n", "3\n", "4\n"]) self.assertEqual(list(f), ["0\n", "1\n", "2\n", "3\n", "4\n"])
f.seek(0, 0) f.seek(0, 0)
@ -399,13 +399,13 @@ class TestCase(unittest.TestCase):
self.assertRaises(TypeError, tuple, list) self.assertRaises(TypeError, tuple, list)
self.assertRaises(TypeError, tuple, 42) self.assertRaises(TypeError, tuple, 42)
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
try: try:
for i in range(5): for i in range(5):
f.write("%d\n" % i) f.write("%d\n" % i)
finally: finally:
f.close() f.close()
f = open(TESTFN, "r") f = open(TESTFN, "r", encoding="utf-8")
try: try:
self.assertEqual(tuple(f), ("0\n", "1\n", "2\n", "3\n", "4\n")) self.assertEqual(tuple(f), ("0\n", "1\n", "2\n", "3\n", "4\n"))
f.seek(0, 0) f.seek(0, 0)
@ -476,14 +476,14 @@ class TestCase(unittest.TestCase):
self.assertEqual(max(d.values()), 3) self.assertEqual(max(d.values()), 3)
self.assertEqual(min(iter(d.values())), 1) self.assertEqual(min(iter(d.values())), 1)
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
try: try:
f.write("medium line\n") f.write("medium line\n")
f.write("xtra large line\n") f.write("xtra large line\n")
f.write("itty-bitty line\n") f.write("itty-bitty line\n")
finally: finally:
f.close() f.close()
f = open(TESTFN, "r") f = open(TESTFN, "r", encoding="utf-8")
try: try:
self.assertEqual(min(f), "itty-bitty line\n") self.assertEqual(min(f), "itty-bitty line\n")
f.seek(0, 0) f.seek(0, 0)
@ -509,13 +509,13 @@ class TestCase(unittest.TestCase):
i < len(d) and dkeys[i] or None) i < len(d) and dkeys[i] or None)
for i in range(3)] for i in range(3)]
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
try: try:
for i in range(10): for i in range(10):
f.write("xy" * i + "\n") # line i has len 2*i+1 f.write("xy" * i + "\n") # line i has len 2*i+1
finally: finally:
f.close() f.close()
f = open(TESTFN, "r") f = open(TESTFN, "r", encoding="utf-8")
try: try:
self.assertEqual(list(map(len, f)), list(range(1, 21, 2))) self.assertEqual(list(map(len, f)), list(range(1, 21, 2)))
finally: finally:
@ -556,12 +556,12 @@ class TestCase(unittest.TestCase):
self.i = i+1 self.i = i+1
return i return i
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
try: try:
f.write("a\n" "bbb\n" "cc\n") f.write("a\n" "bbb\n" "cc\n")
finally: finally:
f.close() f.close()
f = open(TESTFN, "r") f = open(TESTFN, "r", encoding="utf-8")
try: try:
self.assertEqual(list(zip(IntsFrom(0), f, IntsFrom(-100))), self.assertEqual(list(zip(IntsFrom(0), f, IntsFrom(-100))),
[(0, "a\n", -100), [(0, "a\n", -100),
@ -624,13 +624,13 @@ class TestCase(unittest.TestCase):
return "fooled you!" return "fooled you!"
return next(self.it) return next(self.it)
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
try: try:
f.write("a\n" + "b\n" + "c\n") f.write("a\n" + "b\n" + "c\n")
finally: finally:
f.close() f.close()
f = open(TESTFN, "r") f = open(TESTFN, "r", encoding="utf-8")
# Nasty: string.join(s) can't know whether unicode.join() is needed # Nasty: string.join(s) can't know whether unicode.join() is needed
# until it's seen all of s's elements. But in this case, f's # until it's seen all of s's elements. But in this case, f's
# iterator cannot be restarted. So what we're testing here is # iterator cannot be restarted. So what we're testing here is
@ -676,12 +676,12 @@ class TestCase(unittest.TestCase):
self.assertIn((k, v), d.items()) self.assertIn((k, v), d.items())
self.assertNotIn((v, k), d.items()) self.assertNotIn((v, k), d.items())
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
try: try:
f.write("a\n" "b\n" "c\n") f.write("a\n" "b\n" "c\n")
finally: finally:
f.close() f.close()
f = open(TESTFN, "r") f = open(TESTFN, "r", encoding="utf-8")
try: try:
for chunk in "abc": for chunk in "abc":
f.seek(0, 0) f.seek(0, 0)
@ -713,12 +713,12 @@ class TestCase(unittest.TestCase):
self.assertEqual(countOf(d.values(), 2j), 1) self.assertEqual(countOf(d.values(), 2j), 1)
self.assertEqual(countOf(d.values(), 1j), 0) self.assertEqual(countOf(d.values(), 1j), 0)
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
try: try:
f.write("a\n" "b\n" "c\n" "b\n") f.write("a\n" "b\n" "c\n" "b\n")
finally: finally:
f.close() f.close()
f = open(TESTFN, "r") f = open(TESTFN, "r", encoding="utf-8")
try: try:
for letter, count in ("a", 1), ("b", 2), ("c", 1), ("d", 0): for letter, count in ("a", 1), ("b", 2), ("c", 1), ("d", 0):
f.seek(0, 0) f.seek(0, 0)
@ -748,12 +748,12 @@ class TestCase(unittest.TestCase):
self.assertRaises(TypeError, indexOf, indexOf, indexOf) self.assertRaises(TypeError, indexOf, indexOf, indexOf)
self.assertRaises(ZeroDivisionError, indexOf, BadIterableClass(), 1) self.assertRaises(ZeroDivisionError, indexOf, BadIterableClass(), 1)
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
try: try:
f.write("a\n" "b\n" "c\n" "d\n" "e\n") f.write("a\n" "b\n" "c\n" "d\n" "e\n")
finally: finally:
f.close() f.close()
f = open(TESTFN, "r") f = open(TESTFN, "r", encoding="utf-8")
try: try:
fiter = iter(f) fiter = iter(f)
self.assertEqual(indexOf(fiter, "b\n"), 1) self.assertEqual(indexOf(fiter, "b\n"), 1)
@ -774,7 +774,7 @@ class TestCase(unittest.TestCase):
# Test iterators with file.writelines(). # Test iterators with file.writelines().
def test_writelines(self): def test_writelines(self):
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
try: try:
self.assertRaises(TypeError, f.writelines, None) self.assertRaises(TypeError, f.writelines, None)
@ -813,7 +813,7 @@ class TestCase(unittest.TestCase):
f.writelines(Whatever(6, 6+2000)) f.writelines(Whatever(6, 6+2000))
f.close() f.close()
f = open(TESTFN) f = open(TESTFN, encoding="utf-8")
expected = [str(i) + "\n" for i in range(1, 2006)] expected = [str(i) + "\n" for i in range(1, 2006)]
self.assertEqual(list(f), expected) self.assertEqual(list(f), expected)
@ -857,14 +857,14 @@ class TestCase(unittest.TestCase):
a, b, c = {1: 42, 2: 42, 3: 42}.values() a, b, c = {1: 42, 2: 42, 3: 42}.values()
self.assertEqual((a, b, c), (42, 42, 42)) self.assertEqual((a, b, c), (42, 42, 42))
f = open(TESTFN, "w") f = open(TESTFN, "w", encoding="utf-8")
lines = ("a\n", "bb\n", "ccc\n") lines = ("a\n", "bb\n", "ccc\n")
try: try:
for line in lines: for line in lines:
f.write(line) f.write(line)
finally: finally:
f.close() f.close()
f = open(TESTFN, "r") f = open(TESTFN, "r", encoding="utf-8")
try: try:
a, b, c = f a, b, c = f
self.assertEqual((a, b, c), lines) self.assertEqual((a, b, c), lines)

View file

@ -125,7 +125,7 @@ class TestTool(unittest.TestCase):
outfile = os_helper.TESTFN + '.out' outfile = os_helper.TESTFN + '.out'
rc, out, err = assert_python_ok('-m', 'json.tool', infile, outfile) rc, out, err = assert_python_ok('-m', 'json.tool', infile, outfile)
self.addCleanup(os.remove, outfile) self.addCleanup(os.remove, outfile)
with open(outfile, "r") as fp: with open(outfile, "r", encoding="utf-8") as fp:
self.assertEqual(fp.read(), self.expect) self.assertEqual(fp.read(), self.expect)
self.assertEqual(rc, 0) self.assertEqual(rc, 0)
self.assertEqual(out, b'') self.assertEqual(out, b'')

View file

@ -116,7 +116,7 @@ class LineCacheTests(unittest.TestCase):
# Check module loading # Check module loading
for entry in MODULES: for entry in MODULES:
filename = os.path.join(MODULE_PATH, entry) + '.py' filename = os.path.join(MODULE_PATH, entry) + '.py'
with open(filename) as file: with open(filename, encoding='utf-8') as file:
for index, line in enumerate(file): for index, line in enumerate(file):
self.assertEqual(line, getline(filename, index + 1)) self.assertEqual(line, getline(filename, index + 1))
@ -126,7 +126,7 @@ class LineCacheTests(unittest.TestCase):
def test_no_ending_newline(self): def test_no_ending_newline(self):
self.addCleanup(os_helper.unlink, os_helper.TESTFN) self.addCleanup(os_helper.unlink, os_helper.TESTFN)
with open(os_helper.TESTFN, "w") as fp: with open(os_helper.TESTFN, "w", encoding='utf-8') as fp:
fp.write(SOURCE_3) fp.write(SOURCE_3)
lines = linecache.getlines(os_helper.TESTFN) lines = linecache.getlines(os_helper.TESTFN)
self.assertEqual(lines, ["\n", "def f():\n", " return 3\n"]) self.assertEqual(lines, ["\n", "def f():\n", " return 3\n"])
@ -153,18 +153,18 @@ class LineCacheTests(unittest.TestCase):
# Create a source file and cache its contents # Create a source file and cache its contents
source_name = os_helper.TESTFN + '.py' source_name = os_helper.TESTFN + '.py'
self.addCleanup(os_helper.unlink, source_name) self.addCleanup(os_helper.unlink, source_name)
with open(source_name, 'w') as source: with open(source_name, 'w', encoding='utf-8') as source:
source.write(SOURCE_1) source.write(SOURCE_1)
getline(source_name, 1) getline(source_name, 1)
# Keep a copy of the old contents # Keep a copy of the old contents
source_list = [] source_list = []
with open(source_name) as source: with open(source_name, encoding='utf-8') as source:
for index, line in enumerate(source): for index, line in enumerate(source):
self.assertEqual(line, getline(source_name, index + 1)) self.assertEqual(line, getline(source_name, index + 1))
source_list.append(line) source_list.append(line)
with open(source_name, 'w') as source: with open(source_name, 'w', encoding='utf-8') as source:
source.write(SOURCE_2) source.write(SOURCE_2)
# Try to update a bogus cache entry # Try to update a bogus cache entry
@ -176,7 +176,7 @@ class LineCacheTests(unittest.TestCase):
# Update the cache and check whether it matches the new source file # Update the cache and check whether it matches the new source file
linecache.checkcache(source_name) linecache.checkcache(source_name)
with open(source_name) as source: with open(source_name, encoding='utf-8') as source:
for index, line in enumerate(source): for index, line in enumerate(source):
self.assertEqual(line, getline(source_name, index + 1)) self.assertEqual(line, getline(source_name, index + 1))
source_list.append(line) source_list.append(line)

View file

@ -13,7 +13,7 @@ class TestLLTrace(unittest.TestCase):
# bpo-34113. The crash happened at the command line console of # bpo-34113. The crash happened at the command line console of
# debug Python builds with __ltrace__ enabled (only possible in console), # debug Python builds with __ltrace__ enabled (only possible in console),
# when the interal Python stack was negatively adjusted # when the interal Python stack was negatively adjusted
with open(os_helper.TESTFN, 'w') as fd: with open(os_helper.TESTFN, 'w', encoding='utf-8') as fd:
self.addCleanup(os_helper.unlink, os_helper.TESTFN) self.addCleanup(os_helper.unlink, os_helper.TESTFN)
fd.write(textwrap.dedent("""\ fd.write(textwrap.dedent("""\
import code import code

View file

@ -553,7 +553,7 @@ class HandlerTest(BaseTest):
os.close(fd) os.close(fd)
if not existing: if not existing:
os.unlink(fn) os.unlink(fn)
h = logging.handlers.WatchedFileHandler(fn, delay=True) h = logging.handlers.WatchedFileHandler(fn, encoding='utf-8', delay=True)
if existing: if existing:
dev, ino = h.dev, h.ino dev, ino = h.dev, h.ino
self.assertEqual(dev, -1) self.assertEqual(dev, -1)
@ -616,7 +616,7 @@ class HandlerTest(BaseTest):
if sys.platform in ('linux', 'darwin'): if sys.platform in ('linux', 'darwin'):
cases += ((logging.handlers.WatchedFileHandler, (pfn, 'w')),) cases += ((logging.handlers.WatchedFileHandler, (pfn, 'w')),)
for cls, args in cases: for cls, args in cases:
h = cls(*args) h = cls(*args, encoding="utf-8")
self.assertTrue(os.path.exists(fn)) self.assertTrue(os.path.exists(fn))
h.close() h.close()
os.unlink(fn) os.unlink(fn)
@ -645,7 +645,7 @@ class HandlerTest(BaseTest):
remover = threading.Thread(target=remove_loop, args=(fn, del_count)) remover = threading.Thread(target=remove_loop, args=(fn, del_count))
remover.daemon = True remover.daemon = True
remover.start() remover.start()
h = logging.handlers.WatchedFileHandler(fn, delay=delay) h = logging.handlers.WatchedFileHandler(fn, encoding='utf-8', delay=delay)
f = logging.Formatter('%(asctime)s: %(levelname)s: %(message)s') f = logging.Formatter('%(asctime)s: %(levelname)s: %(message)s')
h.setFormatter(f) h.setFormatter(f)
try: try:
@ -677,7 +677,7 @@ class HandlerTest(BaseTest):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.sub_handler = logging.StreamHandler( self.sub_handler = logging.StreamHandler(
stream=open('/dev/null', 'wt')) stream=open('/dev/null', 'wt', encoding='utf-8'))
def emit(self, record): def emit(self, record):
self.sub_handler.acquire() self.sub_handler.acquire()
@ -4355,7 +4355,7 @@ class ModuleLevelMiscTest(BaseTest):
# basicConfig() opens the file, but logging.shutdown() closes # basicConfig() opens the file, but logging.shutdown() closes
# it at Python exit. When A.__del__() is called, # it at Python exit. When A.__del__() is called,
# FileHandler._open() must be called again to re-open the file. # FileHandler._open() must be called again to re-open the file.
logging.basicConfig(filename={filename!r}) logging.basicConfig(filename={filename!r}, encoding="utf-8")
a = A() a = A()
@ -4365,7 +4365,7 @@ class ModuleLevelMiscTest(BaseTest):
""") """)
assert_python_ok("-c", code) assert_python_ok("-c", code)
with open(filename) as fp: with open(filename, encoding="utf-8") as fp:
self.assertEqual(fp.read().rstrip(), "ERROR:root:log in __del__") self.assertEqual(fp.read().rstrip(), "ERROR:root:log in __del__")
def test_recursion_error(self): def test_recursion_error(self):
@ -4557,13 +4557,13 @@ class BasicConfigTest(unittest.TestCase):
h2.close() h2.close()
os.remove(fn) os.remove(fn)
logging.basicConfig(filename='test.log') logging.basicConfig(filename='test.log', encoding='utf-8')
self.assertEqual(len(logging.root.handlers), 1) self.assertEqual(len(logging.root.handlers), 1)
handler = logging.root.handlers[0] handler = logging.root.handlers[0]
self.assertIsInstance(handler, logging.FileHandler) self.assertIsInstance(handler, logging.FileHandler)
expected = logging.FileHandler('test.log', 'a') expected = logging.FileHandler('test.log', 'a', encoding='utf-8')
self.assertEqual(handler.stream.mode, expected.stream.mode) self.assertEqual(handler.stream.mode, expected.stream.mode)
self.assertEqual(handler.stream.name, expected.stream.name) self.assertEqual(handler.stream.name, expected.stream.name)
self.addCleanup(cleanup, handler, expected, 'test.log') self.addCleanup(cleanup, handler, expected, 'test.log')
@ -5161,7 +5161,7 @@ class BaseFileTest(BaseTest):
class FileHandlerTest(BaseFileTest): class FileHandlerTest(BaseFileTest):
def test_delay(self): def test_delay(self):
os.unlink(self.fn) os.unlink(self.fn)
fh = logging.FileHandler(self.fn, delay=True) fh = logging.FileHandler(self.fn, encoding='utf-8', delay=True)
self.assertIsNone(fh.stream) self.assertIsNone(fh.stream)
self.assertFalse(os.path.exists(self.fn)) self.assertFalse(os.path.exists(self.fn))
fh.handle(logging.makeLogRecord({})) fh.handle(logging.makeLogRecord({}))
@ -5176,19 +5176,20 @@ class RotatingFileHandlerTest(BaseFileTest):
def test_should_not_rollover(self): def test_should_not_rollover(self):
# If maxbytes is zero rollover never occurs # If maxbytes is zero rollover never occurs
rh = logging.handlers.RotatingFileHandler(self.fn, maxBytes=0) rh = logging.handlers.RotatingFileHandler(
self.fn, encoding="utf-8", maxBytes=0)
self.assertFalse(rh.shouldRollover(None)) self.assertFalse(rh.shouldRollover(None))
rh.close() rh.close()
def test_should_rollover(self): def test_should_rollover(self):
rh = logging.handlers.RotatingFileHandler(self.fn, maxBytes=1) rh = logging.handlers.RotatingFileHandler(self.fn, encoding="utf-8", maxBytes=1)
self.assertTrue(rh.shouldRollover(self.next_rec())) self.assertTrue(rh.shouldRollover(self.next_rec()))
rh.close() rh.close()
def test_file_created(self): def test_file_created(self):
# checks that the file is created and assumes it was created # checks that the file is created and assumes it was created
# by us # by us
rh = logging.handlers.RotatingFileHandler(self.fn) rh = logging.handlers.RotatingFileHandler(self.fn, encoding="utf-8")
rh.emit(self.next_rec()) rh.emit(self.next_rec())
self.assertLogFile(self.fn) self.assertLogFile(self.fn)
rh.close() rh.close()
@ -5197,7 +5198,7 @@ class RotatingFileHandlerTest(BaseFileTest):
def namer(name): def namer(name):
return name + ".test" return name + ".test"
rh = logging.handlers.RotatingFileHandler( rh = logging.handlers.RotatingFileHandler(
self.fn, backupCount=2, maxBytes=1) self.fn, encoding="utf-8", backupCount=2, maxBytes=1)
rh.namer = namer rh.namer = namer
rh.emit(self.next_rec()) rh.emit(self.next_rec())
self.assertLogFile(self.fn) self.assertLogFile(self.fn)
@ -5218,7 +5219,7 @@ class RotatingFileHandlerTest(BaseFileTest):
os.rename(source, dest + ".rotated") os.rename(source, dest + ".rotated")
rh = HandlerWithNamerAndRotator( rh = HandlerWithNamerAndRotator(
self.fn, backupCount=2, maxBytes=1) self.fn, encoding="utf-8", backupCount=2, maxBytes=1)
self.assertEqual(rh.namer(self.fn), self.fn + ".test") self.assertEqual(rh.namer(self.fn), self.fn + ".test")
rh.emit(self.next_rec()) rh.emit(self.next_rec())
self.assertLogFile(self.fn) self.assertLogFile(self.fn)
@ -5241,7 +5242,7 @@ class RotatingFileHandlerTest(BaseFileTest):
os.remove(source) os.remove(source)
rh = logging.handlers.RotatingFileHandler( rh = logging.handlers.RotatingFileHandler(
self.fn, backupCount=2, maxBytes=1) self.fn, encoding="utf-8", backupCount=2, maxBytes=1)
rh.rotator = rotator rh.rotator = rotator
rh.namer = namer rh.namer = namer
m1 = self.next_rec() m1 = self.next_rec()