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

Reply via email to