Changeset: 767a1e47b37c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=767a1e47b37c Modified Files: common/stream/Tests/read_iconv.py common/stream/Tests/urlstream.py common/stream/Tests/write_iconv.py Branch: mtest Log Message:
merged diffs (truncated from 1887 to 300 lines): diff --git a/clients/odbc/driver/CMakeLists.txt b/clients/odbc/driver/CMakeLists.txt --- a/clients/odbc/driver/CMakeLists.txt +++ b/clients/odbc/driver/CMakeLists.txt @@ -6,6 +6,10 @@ # Copyright 1997 - July 2008 CWI, August 2008 - 2020 MonetDB B.V. #]] +if (${HAVE_ODBCINST}) + add_compile_definitions(HAVE_SQLGETPRIVATEPROFILESTRING) +endif() + add_library(MonetODBC MODULE) @@ -109,6 +113,7 @@ target_include_directories(MonetODBC PRIVATE $<TARGET_PROPERTY:mapi,INTERFACE_INCLUDE_DIRECTORIES> $<$<BOOL:${ODBC_FOUND}>:${ODBC_INCLUDE_DIRS}> + $<$<BOOL:${ODBCinst_FOUND}>:${ODBCINST_INCLUDE_DIRS}> PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb>) @@ -121,7 +126,8 @@ target_link_libraries(MonetODBC PRIVATE monetdb_config_header mutils - mapi) + mapi + ${ODBCINST_LIBRARIES}) install(TARGETS MonetODBC diff --git a/cmake/Modules/FindODBCinst.cmake b/cmake/Modules/FindODBCinst.cmake new file mode 100644 --- /dev/null +++ b/cmake/Modules/FindODBCinst.cmake @@ -0,0 +1,38 @@ +#[[ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# Copyright 1997 - July 2008 CWI, August 2008 - 2020 MonetDB B.V. +#]] + +include(FindPackageHandleStandardArgs) + +if(WIN32) + set(ODBCINST_INCLUDE_DIR "") + set(ODBCINST_LIBRARIES odbccp32.lib legacy_stdio_definitions.lib) + + # ODBCINST_INCLUDE_DIR is empty, so don't require it + find_package_handle_standard_args(ODBCinst DEFAULT_MSG + ODBCINST_LIBRARIES) +else() + find_package(PkgConfig QUIET) + pkg_check_modules(PC_ODBCINST QUIET odbcinst) + + find_path(ODBCINST_INCLUDE_DIR NAMES odbcinst.h + HINTS + ${PC_ODBCINST_INCLUDEDIR} + ${PC_ODBCINST_INCLUDE_DIRS} + ) + + find_library(ODBCINST_LIBRARIES NAMES odbcinst + HINTS + ${PC_ODBCINST_LIBDIR} + ${PC_ODBCINST_LIBRARY_DIRS} + ) + + find_package_handle_standard_args(ODBCinst DEFAULT_MSG + ODBCINST_LIBRARIES ODBCINST_INCLUDE_DIR) +endif() + +mark_as_advanced(ODBCINST_INCLUDE_DIR ODBCINST_LIBRARIES) diff --git a/cmake/monetdb-defines.cmake b/cmake/monetdb-defines.cmake --- a/cmake/monetdb-defines.cmake +++ b/cmake/monetdb-defines.cmake @@ -146,6 +146,7 @@ macro(monetdb_macro_variables) set(HAVE_VALGRIND ${VALGRIND_FOUND}) set(HAVE_NETCDF ${NETCDF_FOUND}) set(HAVE_READLINE ${READLINE_FOUND}) + set(HAVE_ODBCINST ${ODBCinst_FOUND}) set(HAVE_LIBR ${LIBR_FOUND}) set(RHOME "${LIBR_HOME}") set(HAVE_GEOM ${GEOS_FOUND}) diff --git a/cmake/monetdb-findpackages.cmake b/cmake/monetdb-findpackages.cmake --- a/cmake/monetdb-findpackages.cmake +++ b/cmake/monetdb-findpackages.cmake @@ -102,6 +102,7 @@ endif() if(ODBC) find_package(ODBC) + find_package(ODBCinst) endif() if(RINTEGRATION) diff --git a/common/stream/Tests/read_iconv.py b/common/stream/Tests/read_iconv.py old mode 100644 new mode 100755 --- a/common/stream/Tests/read_iconv.py +++ b/common/stream/Tests/read_iconv.py @@ -9,41 +9,38 @@ import subprocess def run_streamcat(text, enc, expected_error = None): if isinstance(text, bytes): - content = text + enc_text = text + expected = None else: - content = bytes(text, enc) + enc_text = bytes(text, enc) + expected = bytes(text, 'utf-8') + name = f'read_iconv_{enc}.txt' - tf = TestFile(name, None) - filename = tf.write(content) + filename = tf.write(enc_text) cmd = ['streamcat', 'read', filename, 'rstream', f'iconv:{enc}'] - print(f"Input is {repr(content)}") + descr = f"command {cmd} with input {enc_text!r}" proc = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - if proc.stdout: - proc.stdout = proc.stdout.replace(b'\r', b'') - if proc.stderr: - proc.stderr = proc.stderr.replace(b'\r', b'') - sys.stderr.buffer.write(proc.stderr) - sys.stderr.flush() - if expected_error == None: - if proc.returncode != 0: - print(f"{cmd} exited with status {proc.returncode}", file=sys.stderr) + output = proc.stdout + os.remove(filename) + + if expected_error: + if proc.returncode == 0: + print(f"{descr} exited without expected error", file=sys.stderr) + sys.exit(1) + elif expected_error not in proc.stderr: + print(f"{descr} failed as expected but stderr does not contain {expected_error!r}", file=sys.stderr) sys.exit(1) else: - print(f"Output after decoding as '{enc}' is {repr(proc.stdout)}") - else: - if proc.returncode == 0: - print(f"{cmd} exited without expected error", file=sys.stderr) - sys.exit(1) - elif expected_error not in proc.stderr: - print(f"{cmd} failed as expected but stderr does not contain {repr(expected_error)}", file=sys.stderr) - sys.exit(1) - else: - print(f"Decoding failed as expected: {repr(proc.stderr)}") - os.remove(filename) - print() - return proc.stdout + return + + if proc.returncode != 0: + print(f"{descr} exited with status {proc.returncode}", file=sys.stderr) + sys.exit(1) + if output != expected: + print(f"{descr} yielded {output!r}, expected {expected!r}") + sys.exit(1) text = "MøNëTDB" diff --git a/common/stream/Tests/read_tests.py b/common/stream/Tests/read_tests.py --- a/common/stream/Tests/read_tests.py +++ b/common/stream/Tests/read_tests.py @@ -32,25 +32,20 @@ class TestCase: if not isinstance(openers, list): openers = [openers] - print() - print(f"Test: {test}") - cmd = ['streamcat', 'read', filename, *openers] results = subprocess.run( cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if results.returncode != 0 or results.stderr: - print( - f"\tFAIL: streamcat returned with exit code {results.returncode}:\n{results.stderr or ''}") + print(f"TEST {test} FAILED: streamcat {cmd} returned with exit code {results.returncode}:\n{results.stderr or ''}") return False output = results.stdout or b"" complaint = self.expected.verify(output) if complaint: - print(f"\tFAIL: {complaint}") + print(f"TEST {test} FAILED: {complaint}") return False else: - print(f"\tOK") os.remove(filename) return True @@ -111,7 +106,8 @@ def all_tests(filename_filter): for t in gen_tests(): if not filename_filter(t.name): continue - failures += t.run() + good = t.run() + failures += not good return failures diff --git a/common/stream/Tests/urlstream.py b/common/stream/Tests/urlstream.py old mode 100644 new mode 100755 --- a/common/stream/Tests/urlstream.py +++ b/common/stream/Tests/urlstream.py @@ -1,12 +1,15 @@ #!/usr/bin/env python3 import http.server +import io import socket import subprocess import sys import threading import time +OUTPUT = io.StringIO() + def pickport(): # pick a free port number s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -18,7 +21,7 @@ def pickport(): class Handler(http.server.BaseHTTPRequestHandler): def log_message(self, format, *args): # add a # at the beginning of the line to not mess up Mtest diffs - sys.stderr.write("#%s - - [%s] %s\n" % + OUTPUT.write("#%s - - [%s] %s\n" % (self.address_string(), self.log_date_time_string(), format%args)) @@ -55,7 +58,7 @@ class Handler(http.server.BaseHTTPReques def runserver(port): addr = ('', port) - print(f"#Listening on {port}") + print(f"Listening on {port}", file=OUTPUT) srv = http.server.HTTPServer(addr, Handler) srv.serve_forever() @@ -69,26 +72,34 @@ url = f'http://localhost:{port}' def streamcat(suffix): u = url + suffix cmd = ['streamcat', 'read', u, 'urlstream'] - print(f'FETCHING {suffix}', end="") + print(f'FETCHING {suffix}', end="", file=OUTPUT) PIPE = subprocess.PIPE p = subprocess.run(cmd, check=False, stdout=PIPE, stderr=PIPE, timeout=10) - print(f' yielded return code {p.returncode}') + print(f' yielded return code {p.returncode}', file=OUTPUT) return (p.returncode, p.stdout, p.stderr) +def run_tests(): + (code, out, err) = streamcat('/42a') + assert code == 0 + assert out == 42 * b'a' + assert err == b'' -(code, out, err) = streamcat('/42a') -assert code == 0 -assert out == 42 * b'a' -assert err == b'' + (code, out, err) = streamcat('/40Ka') + assert code == 0 + assert out == 40 * 1024 * b'a' + assert err == b'' -(code, out, err) = streamcat('/40Ka') -assert code == 0 -assert out == 40 * 1024 * b'a' -assert err == b'' + # Are we able to time out? + # (code, out, err) = streamcat('/sleep') + + (code, out, err) = streamcat('/xyzzy') + assert code != 0 + assert b'hollow voice' in err -# Are we able to time out? -# (code, out, err) = streamcat('/sleep') - -(code, out, err) = streamcat('/xyzzy') -assert code != 0 -assert b'hollow voice' in err +try: + run_tests() +except Exception as e: + output = OUTPUT.getvalue() + if output: + print(output) + raise e diff --git a/common/stream/Tests/write_iconv.py b/common/stream/Tests/write_iconv.py _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list