You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2018/11/02 20:47:05 UTC

[45/50] qpid-proton git commit: PROTON-1974: [cpp] modify to work with older jsoncpp (1.7.4)

PROTON-1974: [cpp] modify to work with older jsoncpp (1.7.4)

- add jsoncpp to travis packages for CI testing
- fix string conversions - rules changed between 1.7.4 and 1.8
- better error handling/reporting


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/aa85a1fe
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/aa85a1fe
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/aa85a1fe

Branch: refs/heads/go1
Commit: aa85a1fe86827656501fe01f5695cd7ff4a842f3
Parents: ab82a8b
Author: Alan Conway <ac...@redhat.com>
Authored: Tue Oct 2 11:40:16 2018 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Tue Oct 2 13:53:11 2018 -0400

----------------------------------------------------------------------
 .travis.yml                     |  1 +
 cpp/CMakeLists.txt              | 23 ++++++++++++++-------
 cpp/src/connect_config.cpp      | 39 ++++++++++++++++++++++++------------
 cpp/src/connect_config_test.cpp | 12 ++++++-----
 4 files changed, 50 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/aa85a1fe/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index d3fd7c9..6a8aa2e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -72,6 +72,7 @@ addons:
     - python3-dev
     - golang
     - lcov
+    - libjsoncpp-dev
 
 install:
 - python -m pip install --user --upgrade pip

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/aa85a1fe/cpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
index f3c93fb..794fcbe 100644
--- a/cpp/CMakeLists.txt
+++ b/cpp/CMakeLists.txt
@@ -247,7 +247,22 @@ install (FILES
   DESTINATION ${LIB_INSTALL_DIR}/cmake/ProtonCpp)
 
 set(testdata "${CMAKE_CURRENT_BINARY_DIR}/testdata")
-set(test_env "PN_SASL_CONFIG_PATH=${testdata}/sasl-conf")
+
+# SASL configuration for tests
+if(CyrusSASL_Saslpasswd_EXECUTABLE)
+  configure_file("${CMAKE_CURRENT_SOURCE_DIR}/testdata/sasl-conf/proton-server.conf.in"
+    "${testdata}/sasl-conf/proton-server.conf")
+  execute_process(
+    COMMAND echo password
+    COMMAND ${CyrusSASL_Saslpasswd_EXECUTABLE} -c -p -f "${testdata}/sasl-conf/proton.sasldb" -u proton user
+    RESULT_VARIABLE ret)
+  if(ret)
+    message(WARNING "${CyrusSASL_Saslpasswd_EXECUTABLE}: error ${ret} - some SASL tests will be skipped")
+  else()
+    set(test_env ${test_env} "PN_SASL_CONFIG_PATH=${testdata}/sasl-conf")
+  endif()
+endif()
+
 if (CMAKE_SYSTEM_NAME STREQUAL Windows)
   set(test_env ${test_env} "PATH=$<TARGET_FILE_DIR:qpid-proton>")
 endif()
@@ -276,10 +291,4 @@ if (ENABLE_JSONCPP)
   set_tests_properties(cpp-connect_config_test PROPERTIES WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
   # Test data and output directories for connect_config_test
   file(COPY  "${CMAKE_CURRENT_SOURCE_DIR}/testdata" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
-  if(CyrusSASL_Saslpasswd_EXECUTABLE)
-    configure_file("${CMAKE_CURRENT_SOURCE_DIR}/testdata/sasl-conf/proton-server.conf.in"
-      "${testdata}/sasl-conf/proton-server.conf")
-    execute_process(COMMAND echo password
-      COMMAND ${CyrusSASL_Saslpasswd_EXECUTABLE} -c -p -f "${testdata}/sasl-conf/proton.sasldb" -u proton user)
-  endif()
 endif()

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/aa85a1fe/cpp/src/connect_config.cpp
----------------------------------------------------------------------
diff --git a/cpp/src/connect_config.cpp b/cpp/src/connect_config.cpp
index 2bcbfc2..d157d67 100644
--- a/cpp/src/connect_config.cpp
+++ b/cpp/src/connect_config.cpp
@@ -27,9 +27,11 @@
 
 #include <json/value.h>
 #include <json/reader.h>
+#include <json/writer.h>
 
 #include <cstdlib>
 #include <fstream>
+#include <sstream>
 
 using namespace Json;
 using std::string;
@@ -71,7 +73,7 @@ Value validate(ValueType t, const Value& v, const string& name) {
 
 Value get(ValueType t, const Value& obj, const char *key, const Value& dflt=Value()) {
     Value v = obj.get(key, dflt);
-    return v.type() == nullValue ? dflt : validate(t, v, key);
+    return v.isNull() ? dflt : validate(t, v, key);
 }
 
 bool get_bool(const Value& obj, const char *key, bool dflt) {
@@ -94,7 +96,7 @@ void parse_sasl(Value root, connection_options& opts) {
     Value sasl = get(objectValue, root, "sasl");
     opts.sasl_enabled(get_bool(sasl, "enable", true));
     opts.sasl_allow_insecure_mechs(get_bool(sasl, "allow_insecure", false));
-    if (sasl.type() != nullValue) {
+    if (!sasl.isNull()) {
         Value mechs = sasl.get("mechanisms", Value());
         switch (mechs.type()) {
           case nullValue:
@@ -106,9 +108,7 @@ void parse_sasl(Value root, connection_options& opts) {
               std::ostringstream s;
               for (ArrayIndex i= 0; i < mechs.size(); ++i) {
                   Value v = mechs.get(i, Value());
-                  if (v.type() != stringValue) {
-                      throw err(msg() << "'sasl/mechanisms' expect string elements, found " << v.type());
-                  }
+                  validate(stringValue, v, "sasl/mechanisms");
                   if (i > 0) s << " ";
                   s << v.asString();
               }
@@ -137,7 +137,7 @@ void parse_tls(const string& scheme, Value root, connection_options& opts) {
             ssl_opts = ssl_client_options(ca, mode);
         }
         opts.ssl_client_options(ssl_opts);
-    } else if (tls.type() != nullValue) {
+    } else if (!tls.isNull()) {
         throw err(msg() << "'tls' object not allowed unless scheme is \"amqps\"");
     }
 }
@@ -146,8 +146,11 @@ void parse_tls(const string& scheme, Value root, connection_options& opts) {
 
 std::string parse(std::istream& is, connection_options& opts) {
     try {
+        std::ostringstream addr;
+
         Value root;
         is >> root;
+        validate(objectValue, root, "configuration");
 
         string scheme = get_string(root, "scheme", "amqps");
         if (scheme != "amqp" && scheme != "amqps") {
@@ -156,20 +159,28 @@ std::string parse(std::istream& is, connection_options& opts) {
 
         string host = get_string(root, "host", "localhost");
         opts.virtual_host(host.c_str());
+        addr << host << ":";
 
         Value port = root.get("port", scheme);
-        if (!port.isIntegral() && !port.isString()) {
-            throw err(msg() << "'port' expected string or integer, found " << port.type());
+        switch (port.type()) {
+          case stringValue:
+            addr << port.asString(); break;
+          case intValue:
+          case uintValue:
+            addr << port.asUInt(); break;
+          default:
+            throw err(msg() << "'port' expected string or uint, found " << port.type());
         }
 
         Value user = get(stringValue, root, "user");
-        if (user.type() != nullValue) opts.user(user.asString());
+        if (!user.isNull()) opts.user(user.asString());
         Value password = get(stringValue, root, "password");
-        if (password.type() != nullValue) opts.password(password.asString());
+        if (!password.isNull()) opts.password(password.asString());
 
         parse_sasl(root, opts);
         parse_tls(scheme, root, opts);
-        return host + ":" + port.asString();
+
+        return addr.str();
     } catch (const std::exception& e) {
         throw err(e.what());
     } catch (...) {
@@ -203,17 +214,19 @@ string parse_default(connection_options& opts) {
     string name = default_file();
     std::ifstream f;
     try {
-        f.exceptions(~std::ifstream::goodbit);
+        f.exceptions(std::ifstream::badbit|std::ifstream::failbit);
         f.open(name.c_str());
     } catch (const std::exception& e) {
         throw err(msg() << "error opening '" << name << "': " << e.what());
     }
     try {
         return parse(f, opts);
+    } catch (const std::ifstream::failure& e) {
+        throw err(msg() << "io error parsing '" << name << "': " << e.what());
     } catch (const std::exception& e) {
         throw err(msg() << "error parsing '" << name << "': " << e.what());
     } catch (...) {
-        throw err(msg() << "error parsing '" << name);
+        throw err(msg() << "error parsing '" << name << "'");
     }
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/aa85a1fe/cpp/src/connect_config_test.cpp
----------------------------------------------------------------------
diff --git a/cpp/src/connect_config_test.cpp b/cpp/src/connect_config_test.cpp
index 0573f8f..8a17bba 100644
--- a/cpp/src/connect_config_test.cpp
+++ b/cpp/src/connect_config_test.cpp
@@ -38,8 +38,6 @@
 #include <fstream>
 #include <cstdio>
 
-#include <stdlib.h>
-
 namespace {
 
 using namespace std;
@@ -80,7 +78,7 @@ void test_addr() {
 
     ASSERT_THROWS_MSG(error, "'scheme' must be", configure(opts, "{\"scheme\":\"bad\"}"));
     ASSERT_THROWS_MSG(error, "'scheme' expected string, found boolean", configure(opts, "{\"scheme\":true}"));
-    ASSERT_THROWS_MSG(error, "'port' expected string or integer, found boolean", configure(opts, "{\"port\":true}"));
+    ASSERT_THROWS_MSG(error, "'port' expected string or uint, found boolean", configure(opts, "{\"port\":true}"));
     ASSERT_THROWS_MSG(error, "'host' expected string, found boolean", configure(opts, "{\"host\":true}"));
 }
 
@@ -270,14 +268,18 @@ int main(int argc, char** argv) {
     RUN_ARGV_TEST(failed, test_addr());
     RUN_ARGV_TEST(failed, test_invalid());
     RUN_ARGV_TEST(failed, test_default_connect().run());
-    RUN_ARGV_TEST(failed, test_host_user_pass().run());
 
+    bool have_sasl = pn_sasl_extended() && getenv("PN_SASL_CONFIG_PATH");
     pn_ssl_domain_t *have_ssl = pn_ssl_domain(PN_SSL_MODE_SERVER);
+
+    if (have_sasl) {
+        RUN_ARGV_TEST(failed, test_host_user_pass().run());
+    }
     if (have_ssl) {
         pn_ssl_domain_free(have_ssl);
         RUN_ARGV_TEST(failed, test_tls().run());
         RUN_ARGV_TEST(failed, test_tls_external().run());
-        if (pn_sasl_extended()) {
+        if (have_sasl) {
             RUN_ARGV_TEST(failed, test_tls_plain().run());
         }
     } else {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org