Re-enable coverage for debugpy.common.log and use comments to exclude specific lines instead.

This commit is contained in:
Pavel Minaev 2023-08-31 15:02:54 -07:00 committed by Pavel Minaev
parent 8e91dfb085
commit 9df16cec07
4 changed files with 24 additions and 28 deletions

View file

@ -8,14 +8,10 @@ omit =
src/debugpy/_version.py src/debugpy/_version.py
src/debugpy/_vendored/* src/debugpy/_vendored/*
src/debugpy/server/* src/debugpy/server/*
src/debugpy/common/log.py
data_file = coverage/.coverage data_file = coverage/.coverage
[report] [report]
exclude_lines = exclude_also =
# Have to re-enable the standard pragma.
pragma: no cover
# __repr__ is mostly used for error messages. # __repr__ is mostly used for error messages.
def __repr__ def __repr__

View file

@ -58,7 +58,7 @@ class LogFile(object):
platform.machine(), platform.machine(),
platform.python_implementation(), platform.python_implementation(),
platform.python_version(), platform.python_version(),
64 if sys.maxsize > 2 ** 32 else 32, 64 if sys.maxsize > 2**32 else 32,
debugpy.__version__, debugpy.__version__,
_to_files=[self], _to_files=[self],
) )
@ -78,7 +78,7 @@ class LogFile(object):
try: try:
self.file.write(output) self.file.write(output)
self.file.flush() self.file.flush()
except Exception: except Exception: # pragma: no cover
pass pass
def close(self): def close(self):
@ -90,7 +90,7 @@ class LogFile(object):
if self.close_file: if self.close_file:
try: try:
self.file.close() self.file.close()
except Exception: except Exception: # pragma: no cover
pass pass
def __enter__(self): def __enter__(self):
@ -151,7 +151,7 @@ def write_format(level, format_string, *args, **kwargs):
try: try:
text = format_string.format(*args, **kwargs) text = format_string.format(*args, **kwargs)
except Exception: except Exception: # pragma: no cover
reraise_exception() reraise_exception()
return write(level, text, kwargs.pop("_to_files", all)) return write(level, text, kwargs.pop("_to_files", all))
@ -253,7 +253,7 @@ def to_file(filename=None, prefix=None, levels=LEVELS):
return NoLog() return NoLog()
try: try:
os.makedirs(log_dir) os.makedirs(log_dir)
except OSError: except OSError: # pragma: no cover
pass pass
filename = f"{log_dir}/{prefix}-{os.getpid()}.log" filename = f"{log_dir}/{prefix}-{os.getpid()}.log"
@ -347,7 +347,7 @@ def get_environment_description(header):
importlib_metadata = None importlib_metadata = None
try: try:
import importlib_metadata import importlib_metadata
except ImportError: except ImportError: # pragma: no cover
try: try:
from importlib import metadata as importlib_metadata from importlib import metadata as importlib_metadata
except ImportError: except ImportError:

View file

@ -102,7 +102,7 @@ class JsonIOStream(object):
def cleanup(): def cleanup():
try: try:
sock.shutdown(socket.SHUT_RDWR) sock.shutdown(socket.SHUT_RDWR)
except Exception: except Exception: # pragma: no cover
pass pass
sock.close() sock.close()
@ -155,7 +155,7 @@ class JsonIOStream(object):
self._reader.close() self._reader.close()
finally: finally:
self._cleanup() self._cleanup()
except Exception: except Exception: # pragma: no cover
log.reraise_exception("Error while closing {0} message stream", self.name) log.reraise_exception("Error while closing {0} message stream", self.name)
def _log_message(self, dir, data, logger=log.debug): def _log_message(self, dir, data, logger=log.debug):
@ -206,7 +206,7 @@ class JsonIOStream(object):
while True: while True:
try: try:
line = read_line() line = read_line()
except Exception: except Exception: # pragma: no cover
# Only log it if we have already read some headers, and are looking # Only log it if we have already read some headers, and are looking
# for a blank line terminating them. If this is the very first read, # for a blank line terminating them. If this is the very first read,
# there's no message data to log in any case, and the caller might # there's no message data to log in any case, and the caller might
@ -229,7 +229,7 @@ class JsonIOStream(object):
length = int(headers[b"Content-Length"]) length = int(headers[b"Content-Length"])
if not (0 <= length <= self.MAX_BODY_SIZE): if not (0 <= length <= self.MAX_BODY_SIZE):
raise ValueError raise ValueError
except (KeyError, ValueError): except (KeyError, ValueError): # pragma: no cover
try: try:
raise IOError("Content-Length is missing or invalid:") raise IOError("Content-Length is missing or invalid:")
except Exception: except Exception:
@ -253,12 +253,12 @@ class JsonIOStream(object):
body = b"".join(raw_chunks[body_start:]) body = b"".join(raw_chunks[body_start:])
try: try:
body = body.decode("utf-8") body = body.decode("utf-8")
except Exception: except Exception: # pragma: no cover
log_message_and_reraise_exception() log_message_and_reraise_exception()
try: try:
body = decoder.decode(body) body = decoder.decode(body)
except Exception: except Exception: # pragma: no cover
log_message_and_reraise_exception() log_message_and_reraise_exception()
# If parsed successfully, log as JSON for readability. # If parsed successfully, log as JSON for readability.
@ -285,7 +285,7 @@ class JsonIOStream(object):
try: try:
body = encoder.encode(value) body = encoder.encode(value)
except Exception: except Exception: # pragma: no cover
self._log_message("<--", repr(value), logger=log.reraise_exception) self._log_message("<--", repr(value), logger=log.reraise_exception)
body = body.encode("utf-8") body = body.encode("utf-8")
@ -297,7 +297,7 @@ class JsonIOStream(object):
written = writer.write(data[data_written:]) written = writer.write(data[data_written:])
data_written += written data_written += written
writer.flush() writer.flush()
except Exception as exc: except Exception as exc: # pragma: no cover
self._log_message("<--", value, logger=log.swallow_exception) self._log_message("<--", value, logger=log.swallow_exception)
raise JsonIOError(stream=self, cause=exc) raise JsonIOError(stream=self, cause=exc)
@ -344,7 +344,7 @@ class MessageDict(collections.OrderedDict):
def __repr__(self): def __repr__(self):
try: try:
return format(json.repr(self)) return format(json.repr(self))
except Exception: except Exception: # pragma: no cover
return super().__repr__() return super().__repr__()
def __call__(self, key, validate, optional=False): def __call__(self, key, validate, optional=False):

View file

@ -30,13 +30,13 @@ def create_server(host, port=0, backlog=socket.SOMAXCONN, timeout=None):
else: else:
try: try:
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
except (AttributeError, OSError): except (AttributeError, OSError): # pragma: no cover
pass # Not available everywhere pass # Not available everywhere
server.bind((host, port)) server.bind((host, port))
if timeout is not None: if timeout is not None:
server.settimeout(timeout) server.settimeout(timeout)
server.listen(backlog) server.listen(backlog)
except Exception: except Exception: # pragma: no cover
server.close() server.close()
raise raise
return server return server
@ -56,19 +56,19 @@ def _new_sock():
# and closes the connection after 5 failed ping (TCP_KEEPCNT), or 15 seconds # and closes the connection after 5 failed ping (TCP_KEEPCNT), or 15 seconds
try: try:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
except (AttributeError, OSError): except (AttributeError, OSError): # pragma: no cover
pass # May not be available everywhere. pass # May not be available everywhere.
try: try:
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 1) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 1)
except (AttributeError, OSError): except (AttributeError, OSError): # pragma: no cover
pass # May not be available everywhere. pass # May not be available everywhere.
try: try:
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 3) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 3)
except (AttributeError, OSError): except (AttributeError, OSError): # pragma: no cover
pass # May not be available everywhere. pass # May not be available everywhere.
try: try:
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5)
except (AttributeError, OSError): except (AttributeError, OSError): # pragma: no cover
pass # May not be available everywhere. pass # May not be available everywhere.
return sock return sock
@ -82,7 +82,7 @@ def close_socket(sock):
"""Shutdown and close the socket.""" """Shutdown and close the socket."""
try: try:
shut_down(sock) shut_down(sock)
except Exception: except Exception: # pragma: no cover
pass pass
sock.close() sock.close()
@ -98,7 +98,7 @@ def serve(name, handler, host, port=0, backlog=socket.SOMAXCONN, timeout=None):
try: try:
listener = create_server(host, port, backlog, timeout) listener = create_server(host, port, backlog, timeout)
except Exception: except Exception: # pragma: no cover
log.reraise_exception( log.reraise_exception(
"Error listening for incoming {0} connections on {1}:{2}:", name, host, port "Error listening for incoming {0} connections on {1}:{2}:", name, host, port
) )