From 24f909cebd8b79abf7b7368b649f5dace1a2449f Mon Sep 17 00:00:00 2001 From: Marc Hoersken Date: Sat, 14 Nov 2020 21:32:33 +0100 Subject: tests/*server.py: close log file after each log line Make sure the log file is not locked once a test has finished and align with the behavior of our logmsg. Rename curl_test_data.py to be a general util.py. Format and sort Python imports with isort/VSCode. Bug: #6058 Closes #6206 --- tests/Makefile.am | 2 +- tests/curl_test_data.py | 61 --------------------------------------- tests/dictserver.py | 9 ++++-- tests/negtelnetserver.py | 8 ++++-- tests/smbserver.py | 22 +++++++------- tests/util.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 100 insertions(+), 77 deletions(-) delete mode 100755 tests/curl_test_data.py create mode 100755 tests/util.py diff --git a/tests/Makefile.am b/tests/Makefile.am index 76ddded5c..8f47bb017 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -30,7 +30,7 @@ EXTRA_DIST = ftpserver.pl httpserver.pl secureserver.pl runtests.pl \ serverhelp.pm tftpserver.pl rtspserver.pl directories.pm symbol-scan.pl \ CMakeLists.txt mem-include-scan.pl valgrind.supp extern-scan.pl \ manpage-scan.pl nroff-scan.pl http2-server.pl dictserver.py \ - negtelnetserver.py smbserver.py curl_test_data.py \ + negtelnetserver.py smbserver.py util.py \ disable-scan.pl manpage-syntax.pl error-codes.pl badsymbols.pl \ azure.pm appveyor.pm version-scan.pl options-scan.pl diff --git a/tests/curl_test_data.py b/tests/curl_test_data.py deleted file mode 100755 index d9d748f34..000000000 --- a/tests/curl_test_data.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Project ___| | | | _ \| | -# / __| | | | |_) | | -# | (__| |_| | _ <| |___ -# \___|\___/|_| \_\_____| -# -# Copyright (C) 2017 - 2020, Daniel Stenberg, , et al. -# -# This software is licensed as described in the file COPYING, which -# you should have received as part of this distribution. The terms -# are also available at https://curl.se/docs/copyright.html. -# -# You may opt to use, copy, modify, merge, publish, distribute and/or sell -# copies of the Software, and permit persons to whom the Software is -# furnished to do so, under the terms of the COPYING file. -# -# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY -# KIND, either express or implied. -# -"""Module for extracting test data from the test data folder""" - -from __future__ import (absolute_import, division, print_function, - unicode_literals) -import os -import re -import logging - -log = logging.getLogger(__name__) - - -REPLY_DATA = re.compile("[ \t\n\r]*(.*?)", re.MULTILINE | re.DOTALL) - - -class TestData(object): - def __init__(self, data_folder): - self.data_folder = data_folder - - def get_test_data(self, test_number): - # Create the test file name - filename = os.path.join(self.data_folder, - "test{0}".format(test_number)) - - log.debug("Parsing file %s", filename) - - with open(filename, "rb") as f: - contents = f.read().decode("utf-8") - - m = REPLY_DATA.search(contents) - if not m: - raise Exception("Couldn't find a section") - - # Left-strip the data so we don't get a newline before our data. - return m.group(1).lstrip() - - -if __name__ == '__main__': - td = TestData("./data") - data = td.get_test_data(1) - print(data) diff --git a/tests/dictserver.py b/tests/dictserver.py index 91cfb1c64..187432849 100755 --- a/tests/dictserver.py +++ b/tests/dictserver.py @@ -26,16 +26,19 @@ from __future__ import (absolute_import, division, print_function, unicode_literals) + import argparse +import logging import os import sys -import logging + +from util import ClosingFileHandler + try: # Python 2 import SocketServer as socketserver except ImportError: # Python 3 import socketserver - log = logging.getLogger(__name__) HOST = "localhost" @@ -138,7 +141,7 @@ def setup_logging(options): # Write out to a logfile if options.logfile: - handler = logging.FileHandler(options.logfile, mode="w") + handler = ClosingFileHandler(options.logfile) handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) root_logger.addHandler(handler) diff --git a/tests/negtelnetserver.py b/tests/negtelnetserver.py index 203e84eb1..207a6413a 100755 --- a/tests/negtelnetserver.py +++ b/tests/negtelnetserver.py @@ -23,10 +23,14 @@ from __future__ import (absolute_import, division, print_function, unicode_literals) + import argparse +import logging import os import sys -import logging + +from util import ClosingFileHandler + if sys.version_info.major >= 3: import socketserver else: @@ -313,7 +317,7 @@ def setup_logging(options): # Write out to a logfile if options.logfile: - handler = logging.FileHandler(options.logfile, mode="w") + handler = ClosingFileHandler(options.logfile) handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) root_logger.addHandler(handler) diff --git a/tests/smbserver.py b/tests/smbserver.py index cdcfc1551..a49023b0f 100755 --- a/tests/smbserver.py +++ b/tests/smbserver.py @@ -21,21 +21,23 @@ # """Server for testing SMB""" -from __future__ import (absolute_import, division, print_function) +from __future__ import absolute_import, division, print_function # NOTE: the impacket configuration is not unicode_literals compatible! + import argparse +import logging import os import sys -import logging import tempfile + +# Import our curl test data helper +from util import ClosingFileHandler, TestData + if sys.version_info.major >= 3: import configparser else: import ConfigParser as configparser -# Import our curl test data helper -import curl_test_data - # impacket needs to be installed in the Python environment try: import impacket @@ -43,10 +45,10 @@ except ImportError: sys.stderr.write('Python package impacket needs to be installed!\n') sys.stderr.write('Use pip or your package manager to install it.\n') sys.exit(1) -from impacket import smbserver as imp_smbserver from impacket import smb as imp_smb -from impacket.nt_errors import (STATUS_ACCESS_DENIED, STATUS_SUCCESS, - STATUS_NO_SUCH_FILE) +from impacket import smbserver as imp_smbserver +from impacket.nt_errors import (STATUS_ACCESS_DENIED, STATUS_NO_SUCH_FILE, + STATUS_SUCCESS) log = logging.getLogger(__name__) SERVER_MAGIC = "SERVER_MAGIC" @@ -120,7 +122,7 @@ class TestSmbServer(imp_smbserver.SMBSERVER): config_parser=config_parser) # Set up a test data object so we can get test data later. - self.ctd = curl_test_data.TestData(test_data_directory) + self.ctd = TestData(test_data_directory) # Override smbComNtCreateAndX so we can pretend to have files which # don't exist. @@ -353,7 +355,7 @@ def setup_logging(options): # Write out to a logfile if options.logfile: - handler = logging.FileHandler(options.logfile, mode="w") + handler = ClosingFileHandler(options.logfile) handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) root_logger.addHandler(handler) diff --git a/tests/util.py b/tests/util.py new file mode 100755 index 000000000..2ac6ff132 --- /dev/null +++ b/tests/util.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 2017 - 2020, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://curl.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +"""Module for extracting test data from the test data folder and other utils""" + +from __future__ import (absolute_import, division, print_function, + unicode_literals) + +import logging +import os +import re + +log = logging.getLogger(__name__) + + +REPLY_DATA = re.compile("[ \t\n\r]*(.*?)", re.MULTILINE | re.DOTALL) + + +class ClosingFileHandler(logging.StreamHandler): + def __init__(self, filename): + super(ClosingFileHandler, self).__init__() + self.filename = os.path.abspath(filename) + self.setStream(None) + + def emit(self, record): + with open(self.filename, "a") as fp: + self.setStream(fp) + super(ClosingFileHandler, self).emit(record) + self.setStream(None) + + +class TestData(object): + def __init__(self, data_folder): + self.data_folder = data_folder + + def get_test_data(self, test_number): + # Create the test file name + filename = os.path.join(self.data_folder, + "test{0}".format(test_number)) + + log.debug("Parsing file %s", filename) + + with open(filename, "rb") as f: + contents = f.read().decode("utf-8") + + m = REPLY_DATA.search(contents) + if not m: + raise Exception("Couldn't find a section") + + # Left-strip the data so we don't get a newline before our data. + return m.group(1).lstrip() + + +if __name__ == '__main__': + td = TestData("./data") + data = td.get_test_data(1) + print(data) -- cgit v1.2.1