You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kg...@apache.org on 2018/06/01 15:00:12 UTC
[02/11] qpid-dispatch git commit: DISPATCH-965: port python code to
Python 3. Stay compatible with 2.6-7
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/error.c
----------------------------------------------------------------------
diff --git a/src/error.c b/src/error.c
index b837a65..e3009cb 100644
--- a/src/error.c
+++ b/src/error.c
@@ -19,11 +19,10 @@
/* Make sure we get the XSI compliant strerror_r from string.h not the GNU one. */
-#define _POSIX_C_SOURCE 200112L
-#undef _GNU_SOURCE
+/*#define _POSIX_C_SOURCE 200112L
+ #undef _GNU_SOURCE*/
#include <string.h>
-#include <Python.h>
#include <qpid/dispatch/error.h>
#include <qpid/dispatch/enum.h>
#include <qpid/dispatch/log.h>
@@ -33,6 +32,7 @@
#include <errno.h>
#include "log_private.h"
#include "aprintf.h"
+#include "python_private.h"
static const char *qd_error_names[] = {
"No Error",
@@ -108,7 +108,7 @@ qd_error_t qd_error_code() {
}
static void py_set_item(PyObject *dict, const char* name, PyObject *value) {
- PyObject *py_name = PyString_FromString(name);
+ PyObject *py_name = PyUnicode_FromString(name);
PyDict_SetItem(dict, py_name, value);
Py_DECREF(py_name);
}
@@ -138,17 +138,21 @@ static void log_trace_py(PyObject *type, PyObject *value, PyObject* trace, qd_lo
if (result) {
- const char* trace = PyString_AsString(result);
- if (strlen(trace) < QD_LOG_TEXT_MAX) {
- qd_log_impl(log_source, level, file, line, "%s", trace);
- } else {
- // Keep as much of the the tail of the trace as we can.
- const char *tail = trace;
- while (tail && strlen(tail) > QD_LOG_TEXT_MAX) {
- tail = strchr(tail, '\n');
- if (tail) ++tail;
+ char *trace = py_string_2_c(result);
+ if (trace) {
+ if (strlen(trace) < QD_LOG_TEXT_MAX) {
+ qd_log_impl(log_source, level, file, line, "%s", trace);
+ } else {
+ // Keep as much of the the tail of the trace as we can.
+ const char *tail = trace;
+ while (tail && strlen(tail) > QD_LOG_TEXT_MAX) {
+ tail = strchr(tail, '\n');
+ if (tail) ++tail;
+ }
+ qd_log_impl(log_source, level, file, line,
+ "Traceback truncated:\n%s", tail ? tail : "");
}
- qd_log_impl(log_source, level, file, line, "Traceback truncated:\n%s", tail ? tail : "");
+ free(trace);
}
Py_DECREF(result);
}
@@ -161,19 +165,21 @@ qd_error_t qd_error_py_impl(const char *file, int line) {
PyErr_Fetch(&type, &value, &trace); /* Note clears the python error indicator */
PyObject *py_type_name = type ? PyObject_GetAttrString(type, "__name__") : NULL;
- const char *type_name = py_type_name ? PyString_AsString(py_type_name) : NULL;
-
+ char *type_name = py_type_name ? py_string_2_c(py_type_name) : NULL;
PyObject *py_value_str = value ? PyObject_Str(value) : NULL;
- const char *value_str = py_value_str ? PyString_AsString(py_value_str) : NULL;
- if (!value_str) value_str = "Unknown";
+ char *value_str = py_string_2_c(py_value_str);
PyErr_Clear(); /* Ignore errors while we're trying to build the values. */
if (type_name)
- qd_error_impl(QD_ERROR_PYTHON, file, line, "%s: %s", type_name, value_str);
+ qd_error_impl(QD_ERROR_PYTHON, file, line, "%s: %s", type_name,
+ (value_str) ? value_str : "Unknown");
else
- qd_error_impl(QD_ERROR_PYTHON, file, line, "%s", value_str);
+ qd_error_impl(QD_ERROR_PYTHON, file, line, "%s",
+ (value_str) ? value_str : "Unknown");
Py_XDECREF(py_value_str);
+ free(value_str);
Py_XDECREF(py_type_name);
+ free(type_name);
log_trace_py(type, value, trace, QD_LOG_ERROR, file, line);
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/log.c
----------------------------------------------------------------------
diff --git a/src/log.c b/src/log.c
index e8b4b74..fbb757a 100644
--- a/src/log.c
+++ b/src/log.c
@@ -17,8 +17,6 @@
* under the License.
*/
-#include <Python.h>
-
#include "log_private.h"
#include "entity.h"
#include "entity_cache.h"
@@ -34,6 +32,7 @@
#include <string.h>
#include <time.h>
#include <syslog.h>
+#include "python_private.h"
#define TEXT_MAX QD_LOG_TEXT_MAX
#define LOG_MAX (QD_LOG_TEXT_MAX+128)
@@ -444,11 +443,11 @@ PyObject *qd_log_recent_py(long limit) {
if (!py_entry) goto error;
int i = 0;
// NOTE: PyList_SetItem steals a reference so no leak here.
- PyList_SetItem(py_entry, i++, PyString_FromString(entry->module));
+ PyList_SetItem(py_entry, i++, PyUnicode_FromString(entry->module));
const char* level = level_name(entry->level);
- PyList_SetItem(py_entry, i++, level ? PyString_FromString(level) : inc_none());
- PyList_SetItem(py_entry, i++, PyString_FromString(entry->text));
- PyList_SetItem(py_entry, i++, entry->file ? PyString_FromString(entry->file) : inc_none());
+ PyList_SetItem(py_entry, i++, level ? PyUnicode_FromString(level) : inc_none());
+ PyList_SetItem(py_entry, i++, PyUnicode_FromString(entry->text));
+ PyList_SetItem(py_entry, i++, entry->file ? PyUnicode_FromString(entry->file) : inc_none());
PyList_SetItem(py_entry, i++, entry->file ? PyLong_FromLong(entry->line) : inc_none());
PyList_SetItem(py_entry, i++, PyLong_FromLongLong((PY_LONG_LONG)entry->time.tv_sec));
assert(i == ENTRY_SIZE);
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/parse.c
----------------------------------------------------------------------
diff --git a/src/parse.c b/src/parse.c
index 4aed853..1dc726b 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -22,6 +22,10 @@
#include <qpid/dispatch/parse.h>
#include <qpid/dispatch/amqp.h>
+#include <stdio.h>
+#include <limits.h>
+#include <assert.h>
+
DEQ_DECLARE(qd_parsed_field_t, qd_parsed_field_list_t);
struct qd_parsed_field_t {
@@ -357,29 +361,9 @@ qd_iterator_t *qd_parse_typed(qd_parsed_field_t *field)
uint32_t qd_parse_as_uint(qd_parsed_field_t *field)
{
uint32_t result = 0;
-
- qd_iterator_reset(field->raw_iter);
-
- switch (field->tag) {
- case QD_AMQP_UINT:
- result |= ((uint32_t) qd_iterator_octet(field->raw_iter)) << 24;
- result |= ((uint32_t) qd_iterator_octet(field->raw_iter)) << 16;
- // fallthrough
-
- case QD_AMQP_USHORT:
- result |= ((uint32_t) qd_iterator_octet(field->raw_iter)) << 8;
- // Fall Through...
-
- case QD_AMQP_UBYTE:
- case QD_AMQP_SMALLUINT:
- case QD_AMQP_BOOLEAN:
- result |= (uint32_t) qd_iterator_octet(field->raw_iter);
- break;
-
- case QD_AMQP_TRUE:
- result = 1;
- break;
- }
+ uint64_t tmp = qd_parse_as_ulong(field);
+ if (tmp <= UINT_MAX)
+ result = tmp;
return result;
}
@@ -398,17 +382,50 @@ uint64_t qd_parse_as_ulong(qd_parsed_field_t *field)
result |= ((uint64_t) qd_iterator_octet(field->raw_iter)) << 48;
result |= ((uint64_t) qd_iterator_octet(field->raw_iter)) << 40;
result |= ((uint64_t) qd_iterator_octet(field->raw_iter)) << 32;
+ // Fall Through...
+
+ case QD_AMQP_UINT:
result |= ((uint64_t) qd_iterator_octet(field->raw_iter)) << 24;
result |= ((uint64_t) qd_iterator_octet(field->raw_iter)) << 16;
+ // Fall Through...
+
+ case QD_AMQP_USHORT:
result |= ((uint64_t) qd_iterator_octet(field->raw_iter)) << 8;
// Fall Through...
+ case QD_AMQP_BOOLEAN:
+ case QD_AMQP_UBYTE:
+ case QD_AMQP_SMALLUINT:
case QD_AMQP_SMALLULONG:
result |= (uint64_t) qd_iterator_octet(field->raw_iter);
- // Fall Through...
+ break;
+
+ case QD_AMQP_TRUE:
+ result = 1;
+ break;
+ case QD_AMQP_FALSE:
+ case QD_AMQP_UINT0:
case QD_AMQP_ULONG0:
+ // already zeroed
+ break;
+
+ case QD_AMQP_STR8_UTF8:
+ case QD_AMQP_STR32_UTF8:
+ case QD_AMQP_SYM8:
+ case QD_AMQP_SYM32:
+ {
+ char buf[72];
+ unsigned long tmp;
+ qd_iterator_strncpy(field->raw_iter, buf, sizeof(buf));
+ if (sscanf(buf, "%lu", &tmp) == 1)
+ result = tmp;
+ }
break;
+
+ default:
+ // catch any missing types during development
+ assert(false);
}
return result;
@@ -418,32 +435,9 @@ uint64_t qd_parse_as_ulong(qd_parsed_field_t *field)
int32_t qd_parse_as_int(qd_parsed_field_t *field)
{
int32_t result = 0;
-
- qd_iterator_reset(field->raw_iter);
-
- switch (field->tag) {
- case QD_AMQP_INT:
- result |= ((int32_t) qd_iterator_octet(field->raw_iter)) << 24;
- result |= ((int32_t) qd_iterator_octet(field->raw_iter)) << 16;
- // Fall Through...
-
- case QD_AMQP_SHORT:
- result |= ((int32_t) qd_iterator_octet(field->raw_iter)) << 8;
- // Fall Through...
-
- case QD_AMQP_BYTE:
- case QD_AMQP_BOOLEAN:
- result |= (int32_t) qd_iterator_octet(field->raw_iter);
- break;
-
- case QD_AMQP_SMALLINT:
- result = (int8_t) qd_iterator_octet(field->raw_iter);
- break;
-
- case QD_AMQP_TRUE:
- result = 1;
- break;
- }
+ int64_t tmp = qd_parse_as_long(field);
+ if (INT_MIN <= tmp && tmp <= INT_MAX)
+ result = tmp;
return result;
}
@@ -467,9 +461,56 @@ int64_t qd_parse_as_long(qd_parsed_field_t *field)
result |= (uint64_t) qd_iterator_octet(field->raw_iter);
break;
+ case QD_AMQP_INT:
+ {
+ int32_t i32 = ((int32_t) qd_iterator_octet(field->raw_iter)) << 24;
+ i32 |= ((int32_t) qd_iterator_octet(field->raw_iter)) << 16;
+ i32 |= ((int32_t) qd_iterator_octet(field->raw_iter)) << 8;
+ i32 |= ((int32_t) qd_iterator_octet(field->raw_iter));
+ result = i32;
+ }
+ break;
+
+ case QD_AMQP_SHORT:
+ {
+ int16_t i16 = ((int16_t) qd_iterator_octet(field->raw_iter)) << 8;
+ i16 |= ((int16_t) qd_iterator_octet(field->raw_iter));
+ result = i16;
+ } break;
+
+ case QD_AMQP_BYTE:
+ case QD_AMQP_BOOLEAN:
case QD_AMQP_SMALLLONG:
+ case QD_AMQP_SMALLINT:
result = (int8_t) qd_iterator_octet(field->raw_iter);
break;
+
+ case QD_AMQP_TRUE:
+ result = 1;
+ break;
+
+ case QD_AMQP_FALSE:
+ case QD_AMQP_UINT0:
+ case QD_AMQP_ULONG0:
+ // already zeroed
+ break;
+
+ case QD_AMQP_STR8_UTF8:
+ case QD_AMQP_STR32_UTF8:
+ case QD_AMQP_SYM8:
+ case QD_AMQP_SYM32:
+ {
+ char buf[64];
+ long int tmp;
+ qd_iterator_strncpy(field->raw_iter, buf, sizeof(buf));
+ if (sscanf(buf, "%li", &tmp) == 1)
+ result = tmp;
+ }
+ break;
+
+ default:
+ // catch any missing types during development
+ assert(false);
}
return result;
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/policy.c
----------------------------------------------------------------------
diff --git a/src/policy.c b/src/policy.c
index a7e31cf..35f3fb8 100644
--- a/src/policy.c
+++ b/src/policy.c
@@ -17,7 +17,6 @@
* under the License.
*/
-#include <Python.h>
#include "qpid/dispatch/python_embedded.h"
#include "policy.h"
#include "policy_internal.h"
@@ -33,6 +32,7 @@
#include <proton/transport.h>
#include <proton/error.h>
#include <proton/event.h>
+#include "python_private.h"
//
@@ -312,6 +312,7 @@ bool qd_policy_open_lookup_user(
{
// Lookup the user/host/vhost for allow/deny and to get settings name
bool res = false;
+ name_buf[0] = 0;
qd_python_lock_state_t lock_state = qd_python_lock();
PyObject *module = PyImport_ImportModule("qpid_dispatch_internal.policy.policy_manager");
if (module) {
@@ -321,10 +322,17 @@ bool qd_policy_open_lookup_user(
(PyObject *)policy->py_policy_manager,
username, hostip, vhost, conn_name, conn_id);
if (result) {
- const char *res_string = PyString_AsString(result);
- strncpy(name_buf, res_string, name_buf_size);
+ char *res_string = py_obj_2_c_string(result);
+ const size_t res_len = res_string ? strlen(res_string) : 0;
+ if (res_len < name_buf_size) {
+ strcpy(name_buf, res_string);
+ } else {
+ qd_log(policy->log_source, QD_LOG_ERROR,
+ "Internal: lookup_user: insufficient buffer for name");
+ }
Py_XDECREF(result);
- res = true; // settings name returned
+ free(res_string);
+ res = !!name_buf[0]; // settings name returned
} else {
qd_log(policy->log_source, QD_LOG_DEBUG, "Internal: lookup_user: result");
}
@@ -503,40 +511,25 @@ void _qd_policy_deny_amqp_receiver_link(pn_link_t *pn_link, qd_connection_t *qd_
//
#define MIN(a,b) (((a)<(b))?(a):(b))
+// substitute "${user}" in place of uname in proposed
char * _qd_policy_link_user_name_subst(const char *uname, const char *proposed, char *obuf, int osize)
{
if (strlen(uname) == 0)
return NULL;
- const char *duser = "${user}";
- char *retptr = obuf;
- const char *wiptr = proposed;
const char *findptr = strstr(proposed, uname);
if (findptr == NULL) {
return NULL;
}
- // Copy leading before match
- int segsize = findptr - wiptr;
- int copysize = MIN(osize, segsize);
- if (copysize)
- strncpy(obuf, wiptr, copysize);
- wiptr += copysize;
- osize -= copysize;
- obuf += copysize;
-
- // Copy the substitution string
- segsize = strlen(duser);
- copysize = MIN(osize, segsize);
- if (copysize)
- strncpy(obuf, duser, copysize);
- wiptr += strlen(uname);
- osize -= copysize;
- obuf += copysize;
-
- // Copy trailing after match
- strncpy(obuf, wiptr, osize);
- return retptr;
+ // Copy leading before match and trailing after
+ int segsize = findptr - proposed;
+ const char *suffix = findptr + strlen(uname);
+ int rc = snprintf(obuf, osize,
+ "%.*s${user}%s",
+ segsize, proposed,
+ suffix);
+ return (rc < osize) ? obuf : NULL;
}
@@ -565,15 +558,16 @@ bool _qd_policy_approve_link_name(const char *username, const char *allowed, con
// Create a temporary writable copy of incoming allowed list
char t_allow[QPALN_SIZE + 1]; // temporary buffer for normal allow lists
+ int buflen = sizeof(t_allow);
char * pa = t_allow;
- if (a_len > QPALN_SIZE) {
- pa = (char *)malloc(a_len + 1); // malloc a buffer for larger allow lists
+ if (a_len >= buflen) {
+ buflen = a_len + 1;
+ pa = (char *)malloc(buflen); // malloc a buffer for larger allow lists
+ if (!pa)
+ return false;
}
- if (!pa)
- return false;
+ strcpy(pa, allowed);
- strncpy(pa, allowed, a_len);
- pa[a_len] = 0;
// Do reverse user substitution into proposed
char substbuf[QPALN_USERBUFSIZE];
char * prop2 = _qd_policy_link_user_name_subst(username, proposed, substbuf, QPALN_USERBUFSIZE);
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/python_embedded.c
----------------------------------------------------------------------
diff --git a/src/python_embedded.c b/src/python_embedded.c
index eafd486..027f280 100644
--- a/src/python_embedded.c
+++ b/src/python_embedded.c
@@ -18,6 +18,7 @@
*/
#include "entity_cache.h"
+#include "python_private.h"
#include <qpid/dispatch/python_embedded.h>
#include <qpid/dispatch/threading.h>
#include <qpid/dispatch/log.h>
@@ -51,7 +52,7 @@ void qd_python_initialize(qd_dispatch_t *qd, const char *python_pkgdir)
dispatch = qd;
ilock = sys_mutex();
if (python_pkgdir)
- dispatch_python_pkgdir = PyString_FromString(python_pkgdir);
+ dispatch_python_pkgdir = PyUnicode_FromString(python_pkgdir);
qd_python_lock_state_t ls = qd_python_lock();
Py_Initialize();
@@ -89,7 +90,8 @@ void qd_python_check_lock(void)
static PyObject *parsed_to_py_string(qd_parsed_field_t *field)
{
- switch (qd_parse_tag(field)) {
+ uint8_t tag = qd_parse_tag(field);
+ switch (tag) {
case QD_AMQP_VBIN8:
case QD_AMQP_VBIN32:
case QD_AMQP_STR8_UTF8:
@@ -103,7 +105,7 @@ static PyObject *parsed_to_py_string(qd_parsed_field_t *field)
#define SHORT_BUF 1024
uint8_t short_buf[SHORT_BUF];
- PyObject *result;
+ PyObject *result = NULL;
qd_iterator_t *raw = qd_parse_raw(field);
qd_iterator_reset(raw);
uint32_t length = qd_iterator_remaining(raw);
@@ -119,10 +121,37 @@ static PyObject *parsed_to_py_string(qd_parsed_field_t *field)
ptr = buffer;
while (!qd_iterator_end(raw))
*(ptr++) = qd_iterator_octet(raw);
- result = PyString_FromStringAndSize((char*) buffer, ptr - buffer);
+
+ switch (tag) {
+ case QD_AMQP_VBIN8:
+ case QD_AMQP_VBIN32:
+ result = PyBytes_FromStringAndSize((char *)buffer,
+ ptr - buffer);
+ break;
+
+ case QD_AMQP_STR8_UTF8:
+ case QD_AMQP_STR32_UTF8:
+ // UTF-8 decoding
+ result = PyUnicode_FromStringAndSize((char *)buffer,
+ ptr - buffer);
+ break;
+
+ case QD_AMQP_SYM8:
+ case QD_AMQP_SYM32:
+ // ascii
+ result = PyUnicode_DecodeASCII((char *)buffer,
+ ptr - buffer, NULL);
+ break;
+ }
+
if (alloc)
free(buffer);
+ if (!result)
+ qd_log(log_source, QD_LOG_DEBUG,
+ "Cannot convert field type 0x%X to python string object",
+ tag);
+
return result;
}
@@ -135,17 +164,43 @@ qd_error_t qd_py_to_composed(PyObject *value, qd_composed_field_t *field)
qd_compose_insert_null(field);
}
else if (PyBool_Check(value)) {
- qd_compose_insert_bool(field, PyInt_AS_LONG(value) ? 1 : 0);
+ qd_compose_insert_bool(field, PyLong_AS_LONG(value) ? 1 : 0);
}
- else if (PyInt_Check(value)) {
- // We are now sure that the value is an int
- qd_compose_insert_int(field, (int32_t) PyInt_AS_LONG(value));
+ else if (QD_PY_INT_CHECK(value)) {
+ // We are now sure that the value is an integer type
+ int64_t ival = QD_PY_INT_2_INT64(value);
+ if (INT32_MIN <= ival && ival <= INT32_MAX) {
+ qd_compose_insert_int(field, (int32_t) ival);
+ } else {
+ qd_compose_insert_long(field, ival);
+ }
}
- else if (PyLong_Check(value)) {
- qd_compose_insert_long(field, (int64_t) PyLong_AsLongLong(value));
+ else if (PyUnicode_Check(value)) {
+ char *data = py_string_2_c(value);
+ if (data) {
+ qd_compose_insert_string(field, data);
+ free(data);
+ } else {
+ qd_log(log_source, QD_LOG_ERROR,
+ "Unable to convert python unicode object");
+ }
}
- else if (PyString_Check(value) || PyUnicode_Check(value)) {
- qd_compose_insert_string(field, PyString_AsString(value));
+ else if (PyBytes_Check(value)) {
+ // Note: In python 2.X PyBytes is simply an alias for the PyString
+ // type. In python 3.x PyBytes is a distinct type (may contain zeros),
+ // and all strings are PyUnicode types. Historically
+ // this code has just assumed this data is always a null terminated
+ // UTF8 string. We continue that tradition for Python2, but ending up
+ // here in Python3 means this is actually binary data which may have
+ // embedded zeros.
+ if (PY_MAJOR_VERSION <= 2) {
+ qd_compose_insert_string(field, PyBytes_AsString(value));
+ } else {
+ ssize_t len = 0;
+ char *data = NULL;
+ PyBytes_AsStringAndSize(value, &data, &len);
+ qd_compose_insert_binary(field, (uint8_t *)data, len);
+ }
}
else if (PyDict_Check(value)) {
Py_ssize_t iter = 0;
@@ -191,10 +246,15 @@ qd_error_t qd_py_to_composed(PyObject *value, qd_composed_field_t *field)
PyObject *type=0, *typestr=0, *repr=0;
if ((type = PyObject_Type(value)) &&
(typestr = PyObject_Str(type)) &&
- (repr = PyObject_Repr(value)))
+ (repr = PyObject_Repr(value))) {
+ char *t_str = py_string_2_c(typestr);
+ char *r_str = py_string_2_c(repr);
qd_error(QD_ERROR_TYPE, "Can't compose object of type %s: %s",
- PyString_AsString(typestr), PyString_AsString(repr));
- else
+ t_str ? t_str : "Unknown",
+ r_str ? r_str : "Unknown");
+ free(t_str);
+ free(r_str);
+ } else
qd_error(QD_ERROR_TYPE, "Can't compose python object of unknown type");
Py_XDECREF(type);
@@ -239,7 +299,7 @@ PyObject *qd_field_to_py(qd_parsed_field_t *field)
case QD_AMQP_UINT:
case QD_AMQP_SMALLUINT:
case QD_AMQP_UINT0:
- result = PyInt_FromLong((long) qd_parse_as_uint(field));
+ result = PyLong_FromLong((long) qd_parse_as_uint(field));
break;
case QD_AMQP_ULONG:
@@ -253,7 +313,7 @@ PyObject *qd_field_to_py(qd_parsed_field_t *field)
case QD_AMQP_SHORT:
case QD_AMQP_INT:
case QD_AMQP_SMALLINT:
- result = PyInt_FromLong((long) qd_parse_as_int(field));
+ result = PyLong_FromLong((long) qd_parse_as_int(field));
break;
case QD_AMQP_LONG:
@@ -337,7 +397,7 @@ static int LogAdapter_init(LogAdapter *self, PyObject *args, PyObject *kwds)
if (!PyArg_ParseTuple(args, "s", &text))
return -1;
- self->module_name = PyString_FromString(text);
+ self->module_name = PyUnicode_FromString(text);
self->log_source = qd_log_source(text);
return 0;
}
@@ -346,7 +406,7 @@ static int LogAdapter_init(LogAdapter *self, PyObject *args, PyObject *kwds)
static void LogAdapter_dealloc(LogAdapter* self)
{
Py_XDECREF(self->module_name);
- self->ob_type->tp_free((PyObject*)self);
+ Py_TYPE(self)->tp_free((PyObject*)self);
}
@@ -376,54 +436,14 @@ static PyMethodDef LogAdapter_methods[] = {
};
static PyTypeObject LogAdapterType = {
- PyObject_HEAD_INIT(0)
- 0, /* ob_size*/
- DISPATCH_MODULE ".LogAdapter", /* tp_name*/
- sizeof(LogAdapter), /* tp_basicsize*/
- 0, /* tp_itemsize*/
- (destructor)LogAdapter_dealloc, /* tp_dealloc*/
- 0, /* tp_print*/
- 0, /* tp_getattr*/
- 0, /* tp_setattr*/
- 0, /* tp_compare*/
- 0, /* tp_repr*/
- 0, /* tp_as_number*/
- 0, /* tp_as_sequence*/
- 0, /* tp_as_mapping*/
- 0, /* tp_hash */
- 0, /* tp_call*/
- 0, /* tp_str*/
- 0, /* tp_getattro*/
- 0, /* tp_setattro*/
- 0, /* tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /* tp_flags*/
- "Dispatch Log Adapter", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- LogAdapter_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)LogAdapter_init, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0, /* tp_free */
- 0, /* tp_is_gc */
- 0, /* tp_bases */
- 0, /* tp_mro */
- 0, /* tp_cache */
- 0, /* tp_subclasses */
- 0, /* tp_weaklist */
- 0, /* tp_del */
- 0 /* tp_version_tag */
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = DISPATCH_MODULE ".LogAdapter",
+ .tp_doc = "Dispatch Log Adapter",
+ .tp_basicsize = sizeof(LogAdapter),
+ .tp_dealloc = (destructor)LogAdapter_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_methods = LogAdapter_methods,
+ .tp_init = (initproc)LogAdapter_init
};
@@ -463,7 +483,7 @@ static PyObject *py_iter_copy(qd_iterator_t *iter)
{
unsigned char *bytes = 0;
PyObject *value = 0;
- (void)(iter && (bytes = qd_iterator_copy(iter)) && (value = PyString_FromString((char*)bytes)));
+ (void)(iter && (bytes = qd_iterator_copy(iter)) && (value = PyUnicode_FromString((char*)bytes)));
if (bytes) free(bytes);
return value;
}
@@ -529,8 +549,27 @@ static int IoAdapter_init(IoAdapter *self, PyObject *args, PyObject *kwds)
char aclass = 'L';
char phase = '0';
int treatment = QD_TREATMENT_ANYCAST_CLOSEST;
- if (!PyArg_ParseTuple(args, "OO|cci", &self->handler, &addr, &aclass, &phase, &treatment))
- return -1;
+ if (PY_MAJOR_VERSION == 2) {
+ if (!PyArg_ParseTuple(args, "OO|cci", &self->handler, &addr, &aclass, &phase, &treatment))
+ return -1;
+ } else {
+ // In Python3 all string text is unicode. Therefore the ParseTuple format
+ // no longer allows use of a char byte for extracted characters since a
+ // single character may be up to 4 bytes in length. Since class and
+ // phase can only be ascii we can simply downcast the returned value
+ // (being careful we do not overflow a single character).
+ unsigned int i_aclass = (int) aclass;
+ unsigned int i_phase = (int) phase;
+ if (!PyArg_ParseTuple(args, "OO|CCi", &self->handler, &addr, &i_aclass, &i_phase, &treatment))
+ return -1;
+ if (i_aclass > 0x7F || i_phase > 0x7F) {
+ PyErr_SetString(PyExc_TypeError, "Address class or phase not a single alpha character");
+ return -1;
+ }
+ aclass = (char) i_aclass;
+ phase = (char) i_phase;
+ }
+
if (!PyCallable_Check(self->handler)) {
PyErr_SetString(PyExc_TypeError, "IoAdapter.__init__ handler is not callable");
return -1;
@@ -542,10 +581,11 @@ static int IoAdapter_init(IoAdapter *self, PyObject *args, PyObject *kwds)
Py_INCREF(self->handler);
self->qd = dispatch;
self->core = qd_router_core(self->qd);
- const char *address = PyString_AsString(addr);
+ char *address = py_string_2_c(addr);
if (!address) return -1;
qd_error_clear();
self->sub = qdr_core_subscribe(self->core, address, aclass, phase, treatment, qd_io_rx_handler, self);
+ free(address);
if (qd_error_code()) {
PyErr_SetString(PyExc_RuntimeError, qd_error_message());
return -1;
@@ -557,7 +597,7 @@ static void IoAdapter_dealloc(IoAdapter* self)
{
qdr_core_unsubscribe(self->sub);
Py_DECREF(self->handler);
- self->ob_type->tp_free((PyObject*)self);
+ Py_TYPE(self)->tp_free((PyObject*)self);
}
static qd_error_t compose_python_message(qd_composed_field_t **field, PyObject *message,
@@ -618,7 +658,14 @@ static PyObject *qd_python_send(PyObject *self, PyObject *args)
PyObject *address = PyObject_GetAttrString(message, "address");
if (address) {
- qdr_send_to2(ioa->core, msg, PyString_AsString(address), (bool) no_echo, (bool) control);
+ char *a_str = py_obj_2_c_string(address);
+ if (a_str) {
+ qdr_send_to2(ioa->core, msg, a_str, (bool) no_echo, (bool) control);
+ free(a_str);
+ } else {
+ qd_log(log_source, QD_LOG_ERROR,
+ "Unable to convert message address to C string");
+ }
Py_DECREF(address);
}
qd_compose_free(field);
@@ -638,54 +685,14 @@ static PyMethodDef IoAdapter_methods[] = {
static PyTypeObject IoAdapterType = {
- PyObject_HEAD_INIT(0)
- 0, /* ob_size*/
- DISPATCH_MODULE ".IoAdapter", /* tp_name*/
- sizeof(IoAdapter), /* tp_basicsize*/
- 0, /* tp_itemsize*/
- (destructor)IoAdapter_dealloc, /* tp_dealloc*/
- 0, /* tp_print*/
- 0, /* tp_getattr*/
- 0, /* tp_setattr*/
- 0, /* tp_compare*/
- 0, /* tp_repr*/
- 0, /* tp_as_number*/
- 0, /* tp_as_sequence*/
- 0, /* tp_as_mapping*/
- 0, /* tp_hash */
- 0, /* tp_call*/
- 0, /* tp_str*/
- 0, /* tp_getattro*/
- 0, /* tp_setattro*/
- 0, /* tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /* tp_flags*/
- "Dispatch IO Adapter", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- IoAdapter_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)IoAdapter_init, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0, /* tp_free */
- 0, /* tp_is_gc */
- 0, /* tp_bases */
- 0, /* tp_mro */
- 0, /* tp_cache */
- 0, /* tp_subclasses */
- 0, /* tp_weaklist */
- 0, /* tp_del */
- 0 /* tp_version_tag */
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = DISPATCH_MODULE ".IoAdapter",
+ .tp_doc = "Dispatch IO Adapter",
+ .tp_basicsize = sizeof(IoAdapter),
+ .tp_dealloc = (destructor)IoAdapter_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_methods = IoAdapter_methods,
+ .tp_init = (initproc)IoAdapter_init,
};
@@ -695,7 +702,7 @@ static PyTypeObject IoAdapterType = {
static void qd_register_constant(PyObject *module, const char *name, uint32_t value)
{
- PyObject *const_object = PyInt_FromLong((long) value);
+ PyObject *const_object = PyLong_FromLong((long) value);
Py_INCREF(const_object);
PyModule_AddObject(module, name, const_object);
}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/python_private.h
----------------------------------------------------------------------
diff --git a/src/python_private.h b/src/python_private.h
new file mode 100644
index 0000000..ec85505
--- /dev/null
+++ b/src/python_private.h
@@ -0,0 +1,46 @@
+#ifndef __python_internal_h__
+#define __python_internal_h__ 1
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+#include <stdint.h>
+#include <Python.h>
+
+#if PY_MAJOR_VERSION <= 2
+// deal with the two integer types in Python2
+#define QD_PY_INT_CHECK(PO) (PyInt_Check(PO) || PyLong_Check(PO))
+#define QD_PY_INT_2_INT64(PO) (PyLong_Check(PO) ? \
+ (int64_t) PyLong_AsLongLong(PO) : \
+ (int64_t) PyInt_AS_LONG(PO))
+#else // Python3
+#define QD_PY_INT_CHECK(PO) (PyLong_Check(PO))
+#define QD_PY_INT_2_INT64(PO) ((int64_t)PyLong_AsLongLong(PO))
+#endif
+
+// Convert a Python string type to a C string. The resulting string may be
+// UTF-8 encoded. Caller must free returned string buffer. Returns NULL on
+// failure
+char *py_string_2_c(PyObject *py_str);
+
+// Convert the string representation of an arbitrary Python type object to a
+// null terminated C string. Equivalent to calling 'str(o)' in Python. The
+// resulting string may be UTF-8 encoded. Caller must free the returned string
+// buffer.
+char *py_obj_2_c_string(PyObject *py_obj);
+
+#endif
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/python_utils.c
----------------------------------------------------------------------
diff --git a/src/python_utils.c b/src/python_utils.c
new file mode 100644
index 0000000..170e259
--- /dev/null
+++ b/src/python_utils.c
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+#include "python_private.h"
+
+
+// Convert a Python string type object to a C null terminated string. Caller
+// must free the returned string buffer. Returns NULL if python object is not
+// a string-ish type to start with (i.e. expects string type, error if not)
+char *py_string_2_c(PyObject *py_str)
+{
+ char *str = NULL;
+ if (!py_str) return NULL;
+
+ if (PyUnicode_Check(py_str)) {
+ // python 3 str OR python 2 unicode type
+ PyObject *ref = PyUnicode_AsUTF8String(py_str);
+ if (ref) {
+ // now a bytes object
+ str = strdup(PyBytes_AS_STRING(ref));
+ Py_DECREF(ref);
+ }
+ } else if (PyBytes_Check(py_str)) {
+ // python 2 str
+ str = strdup(PyBytes_AS_STRING(py_str));
+ }
+ return str;
+}
+
+// Convert the string representation of an arbitrary Python type object to a
+// null terminated C string. Equivalent to calling 'str(o)' in Python. Caller
+// must free the returned string buffer.
+char *py_obj_2_c_string(PyObject *py_obj)
+{
+ char *str = NULL;
+ PyObject *tmp = NULL;
+
+ if (!py_obj) return NULL;
+
+ // first convert to a python string object
+ if (PyUnicode_Check(py_obj) || PyBytes_Check(py_obj)) {
+ // A python string type - no need to call str(py_obj)
+ tmp = py_obj;
+ Py_INCREF(tmp); // for decref below
+ } else {
+ // create a new object via str(py_obj);
+ tmp = PyObject_Str(py_obj);
+ }
+ str = py_string_2_c(tmp);
+ Py_XDECREF(tmp);
+ return str;
+}
+
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/router_core/agent_config_address.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_address.c b/src/router_core/agent_config_address.c
index 68a2280..b4f0f77 100644
--- a/src/router_core/agent_config_address.c
+++ b/src/router_core/agent_config_address.c
@@ -394,8 +394,8 @@ void qdra_config_address_create_CT(qdr_core_t *core,
bool waypoint = waypoint_field ? qd_parse_as_bool(waypoint_field) : false;
- int in_phase = in_phase_field ? qd_parse_as_int(in_phase_field) : -1;
- int out_phase = out_phase_field ? qd_parse_as_int(out_phase_field) : -1;
+ long in_phase = in_phase_field ? qd_parse_as_long(in_phase_field) : -1;
+ long out_phase = out_phase_field ? qd_parse_as_long(out_phase_field) : -1;
//
// Handle the address-phasing logic. If the phases are provided, use them. Otherwise
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/router_core/agent_config_auto_link.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_auto_link.c b/src/router_core/agent_config_auto_link.c
index 20d7bbf..b0f7fec 100644
--- a/src/router_core/agent_config_auto_link.c
+++ b/src/router_core/agent_config_auto_link.c
@@ -413,7 +413,7 @@ void qdra_config_auto_link_create_CT(qdr_core_t *core,
// Use the specified phase if present. Otherwise default based on the direction:
// Phase 0 for outgoing links and phase 1 for incoming links.
//
- int phase = phase_field ? qd_parse_as_int(phase_field) : (dir == QD_OUTGOING ? 0 : 1);
+ long phase = phase_field ? qd_parse_as_long(phase_field) : (dir == QD_OUTGOING ? 0 : 1);
//
// Validate the phase
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/router_core/agent_connection.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_connection.c b/src/router_core/agent_connection.c
index 810cbae..32da4c6 100644
--- a/src/router_core/agent_connection.c
+++ b/src/router_core/agent_connection.c
@@ -86,6 +86,9 @@ static void qd_get_next_pn_data(pn_data_t **data, const char **d, int *d1)
case PN_INT:
*d1 = pn_data_get_int(*data);
break;
+ case PN_LONG:
+ *d1 = pn_data_get_long(*data);
+ break;
default:
break;
}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/router_core/exchange_bindings.c
----------------------------------------------------------------------
diff --git a/src/router_core/exchange_bindings.c b/src/router_core/exchange_bindings.c
index d03f795..215c68a 100644
--- a/src/router_core/exchange_bindings.c
+++ b/src/router_core/exchange_bindings.c
@@ -469,11 +469,11 @@ void qdra_config_exchange_create_CT(qdr_core_t *core,
}
}
- int phase = 0;
+ long phase = 0;
qd_parsed_field_t *phase_field = qd_parse_value_by_key(in_body,
qdr_config_exchange_columns[QDR_CONFIG_EXCHANGE_PHASE]);
if (phase_field) {
- phase = qd_parse_as_int(phase_field);
+ phase = qd_parse_as_long(phase_field);
if (phase < 0 || phase > 9) {
query->status.description = "phase must be in the range 0-9";
goto exit;
@@ -481,7 +481,7 @@ void qdra_config_exchange_create_CT(qdr_core_t *core,
}
qd_iterator_t *alternate = NULL;
- int alt_phase = 0;
+ long alt_phase = 0;
qd_parsed_field_t *alternate_field = qd_parse_value_by_key(in_body,
qdr_config_exchange_columns[QDR_CONFIG_EXCHANGE_ALTERNATE]);
if (alternate_field) {
@@ -489,7 +489,7 @@ void qdra_config_exchange_create_CT(qdr_core_t *core,
qd_parsed_field_t *alt_phase_field = qd_parse_value_by_key(in_body,
qdr_config_exchange_columns[QDR_CONFIG_EXCHANGE_ALT_PHASE]);
if (alt_phase_field) {
- alt_phase = qd_parse_as_int(alt_phase_field);
+ alt_phase = qd_parse_as_long(alt_phase_field);
if (alt_phase < 0 || alt_phase > 9) {
query->status.description = "phase must be in the range 0-9";
goto exit;
@@ -725,7 +725,7 @@ void qdra_config_binding_create_CT(qdr_core_t *core,
qd_parsed_field_t *phase_field = qd_parse_value_by_key(in_body,
qdr_config_binding_columns[QDR_CONFIG_BINDING_NHOP_PHASE]);
- int phase = (phase_field ? qd_parse_as_int(phase_field) : 0);
+ long phase = (phase_field ? qd_parse_as_long(phase_field) : 0);
if (phase < 0 || phase > 9) {
query->status.description = "phase must be in the range 0-9";
goto exit;
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/router_core/management_agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/management_agent.c b/src/router_core/management_agent.c
index 60b6ee1..82e56d0 100644
--- a/src/router_core/management_agent.c
+++ b/src/router_core/management_agent.c
@@ -465,13 +465,13 @@ static bool qd_can_handle_request(qd_parsed_field_t *properties_fld,
// Obtain the count and offset.
parsed_field = qd_parse_value_by_key(properties_fld, COUNT);
if (parsed_field)
- (*count) = qd_parse_as_int(parsed_field);
+ (*count) = (int)qd_parse_as_long(parsed_field);
else
(*count) = -1;
parsed_field = qd_parse_value_by_key(properties_fld, OFFSET);
if (parsed_field)
- (*offset) = qd_parse_as_int(parsed_field);
+ (*offset) = (int)qd_parse_as_long(parsed_field);
else
(*offset) = 0;
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/router_pynode.c
----------------------------------------------------------------------
diff --git a/src/router_pynode.c b/src/router_pynode.c
index a791973..1d64cfc 100644
--- a/src/router_pynode.c
+++ b/src/router_pynode.c
@@ -26,6 +26,7 @@
#include "dispatch_private.h"
#include "router_private.h"
#include "entity_cache.h"
+#include "python_private.h"
static qd_log_source_t *log_source = 0;
static PyObject *pyRouter = 0;
@@ -188,7 +189,9 @@ static PyObject* qd_set_valid_origins(PyObject *self, PyObject *args)
int maskbit;
for (idx = 0; idx < origin_count; idx++) {
- maskbit = PyInt_AS_LONG(PyList_GetItem(origin_list, idx));
+ PyObject *pi = PyList_GetItem(origin_list, idx);
+ assert(QD_PY_INT_CHECK(pi));
+ maskbit = (int)QD_PY_INT_2_INT64(pi);
if (maskbit >= qd_bitmask_width() || maskbit < 0) {
error = "Origin bit mask out of range";
break;
@@ -198,7 +201,9 @@ static PyObject* qd_set_valid_origins(PyObject *self, PyObject *args)
if (error == 0) {
qd_bitmask_set_bit(core_bitmask, 0); // This router is a valid origin for all destinations
for (idx = 0; idx < origin_count; idx++) {
- maskbit = PyInt_AS_LONG(PyList_GetItem(origin_list, idx));
+ PyObject *pi = PyList_GetItem(origin_list, idx);
+ assert(QD_PY_INT_CHECK(pi));
+ maskbit = (int)QD_PY_INT_2_INT64(pi);
qd_bitmask_set_bit(core_bitmask, maskbit);
}
} else {
@@ -302,54 +307,12 @@ static PyMethodDef RouterAdapter_methods[] = {
};
static PyTypeObject RouterAdapterType = {
- PyObject_HEAD_INIT(0)
- 0, /* ob_size*/
- "dispatch.RouterAdapter", /* tp_name*/
- sizeof(RouterAdapter), /* tp_basicsize*/
- 0, /* tp_itemsize*/
- 0, /* tp_dealloc*/
- 0, /* tp_print*/
- 0, /* tp_getattr*/
- 0, /* tp_setattr*/
- 0, /* tp_compare*/
- 0, /* tp_repr*/
- 0, /* tp_as_number*/
- 0, /* tp_as_sequence*/
- 0, /* tp_as_mapping*/
- 0, /* tp_hash */
- 0, /* tp_call*/
- 0, /* tp_str*/
- 0, /* tp_getattro*/
- 0, /* tp_setattro*/
- 0, /* tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /* tp_flags*/
- "Dispatch Router Adapter", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- RouterAdapter_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0, /* tp_free */
- 0, /* tp_is_gc */
- 0, /* tp_bases */
- 0, /* tp_mro */
- 0, /* tp_cache */
- 0, /* tp_subclasses */
- 0, /* tp_weaklist */
- 0, /* tp_del */
- 0 /* tp_version_tag */
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "dispatch.RouterAdapter", /* tp_name*/
+ .tp_basicsize = sizeof(RouterAdapter), /* tp_basicsize*/
+ .tp_flags = Py_TPFLAGS_DEFAULT, /* tp_flags*/
+ .tp_doc = "Dispatch Router Adapter", /* tp_doc */
+ .tp_methods = RouterAdapter_methods, /* tp_methods */
};
@@ -362,7 +325,7 @@ static void qd_router_mobile_added(void *context, const char *address_hash)
if (pyAdded && router->router_mode == QD_ROUTER_MODE_INTERIOR) {
qd_python_lock_state_t lock_state = qd_python_lock();
pArgs = PyTuple_New(1);
- PyTuple_SetItem(pArgs, 0, PyString_FromString(address_hash));
+ PyTuple_SetItem(pArgs, 0, PyUnicode_FromString(address_hash));
pValue = PyObject_CallObject(pyAdded, pArgs);
qd_error_py();
Py_DECREF(pArgs);
@@ -381,7 +344,7 @@ static void qd_router_mobile_removed(void *context, const char *address_hash)
if (pyRemoved && router->router_mode == QD_ROUTER_MODE_INTERIOR) {
qd_python_lock_state_t lock_state = qd_python_lock();
pArgs = PyTuple_New(1);
- PyTuple_SetItem(pArgs, 0, PyString_FromString(address_hash));
+ PyTuple_SetItem(pArgs, 0, PyUnicode_FromString(address_hash));
pValue = PyObject_CallObject(pyRemoved, pArgs);
qd_error_py();
Py_DECREF(pArgs);
@@ -400,7 +363,7 @@ static void qd_router_link_lost(void *context, int link_mask_bit)
if (pyRemoved && router->router_mode == QD_ROUTER_MODE_INTERIOR) {
qd_python_lock_state_t lock_state = qd_python_lock();
pArgs = PyTuple_New(1);
- PyTuple_SetItem(pArgs, 0, PyInt_FromLong((long) link_mask_bit));
+ PyTuple_SetItem(pArgs, 0, PyLong_FromLong((long) link_mask_bit));
pValue = PyObject_CallObject(pyLinkLost, pArgs);
qd_error_py();
Py_DECREF(pArgs);
@@ -466,21 +429,21 @@ qd_error_t qd_router_python_setup(qd_router_t *router)
PyTuple_SetItem(pArgs, 0, adapterInstance);
// arg 1: router_id
- pId = PyString_FromString(router->router_id);
+ pId = PyUnicode_FromString(router->router_id);
PyTuple_SetItem(pArgs, 1, pId);
// arg 2: area_id
- pArea = PyString_FromString(router->router_area);
+ pArea = PyUnicode_FromString(router->router_area);
PyTuple_SetItem(pArgs, 2, pArea);
// arg 3: max_routers
- pMaxRouters = PyInt_FromLong((long) qd_bitmask_width());
+ pMaxRouters = PyLong_FromLong((long) qd_bitmask_width());
PyTuple_SetItem(pArgs, 3, pMaxRouters);
//
// Instantiate the router
//
- pyRouter = PyInstance_New(pClass, pArgs, 0);
+ pyRouter = PyObject_CallObject(pClass, pArgs);
Py_DECREF(pArgs);
Py_DECREF(adapterType);
QD_ERROR_PY_RET();
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/schema_c.py
----------------------------------------------------------------------
diff --git a/src/schema_c.py b/src/schema_c.py
index 80f6b3c..3c90b4d 100644
--- a/src/schema_c.py
+++ b/src/schema_c.py
@@ -97,8 +97,8 @@ class Generator(object):
def generate_enums(self):
enums = [self.EnumGenerator(self, entity, attribute)
- for entity in self.schema.entity_types.itervalues()
- for attribute in entity.attributes.itervalues()
+ for entity in self.schema.entity_types.values()
+ for attribute in entity.attributes.values()
if isinstance(attribute.atype, EnumType)]
self.header('schema_enum', '\n'.join(e.decl() for e in enums))
self.source('schema_enum', '#include "schema_enum.h"\n\n' + '\n'.join(e.defn() for e in enums))
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/src/server.c
----------------------------------------------------------------------
diff --git a/src/server.c b/src/server.c
index cb90510..64819d5 100644
--- a/src/server.c
+++ b/src/server.c
@@ -17,7 +17,6 @@
* under the License.
*/
-#include <Python.h>
#include <qpid/dispatch/ctools.h>
#include <qpid/dispatch/threading.h>
#include <qpid/dispatch/log.h>
@@ -41,6 +40,7 @@
#include "timer_private.h"
#include "config.h"
#include "remote_sasl.h"
+#include "python_private.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
@@ -302,11 +302,8 @@ static const char *transport_get_user(qd_connection_t *conn, pn_transport_t *tpo
qd_python_lock_state_t lock_state = qd_python_lock();
PyObject *result = PyObject_CallMethod((PyObject *)conn->server->py_displayname_obj, "query", "(ss)", config->ssl_profile, user_id );
if (result) {
- const char *res_string = PyString_AsString(result);
free(user_id);
- user_id = malloc(strlen(res_string) + 1);
- user_id[0] = '\0';
- strcat(user_id, res_string);
+ user_id = py_string_2_c(result);
Py_XDECREF(result);
} else {
qd_log(conn->server->log_source, QD_LOG_DEBUG, "Internal: failed to read displaynameservice query result");
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index ee4e080..11bf33c 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -116,6 +116,29 @@ foreach(py_test_module
list(APPEND SYSTEM_TEST_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${py_test_module}.py)
endforeach()
+# Use tox to run the flake8 python linter tool on all the python
+# sources. Highly recommended if you're hacking the python code
+#
+find_program(TOX_EXE "tox")
+if (TOX_EXE)
+ add_test (NAME python-checker
+ COMMAND ${TOX_EXE}
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
+ # Once we move to tox >= v1.7.2 we can remove the next
+ # line. See tox.ini file for details
+ set_tests_properties(python-checker
+ PROPERTIES
+ PASS_REGULAR_EXPRESSION "commands succeeded"
+ FAIL_REGULAR_EXPRESSION "commands failed")
+
+else (TOX_EXE)
+ message(STATUS "Could NOT find 'tox' tool - unable to validate python code")
+endif ()
+
+
+
+
+
# Additional files to install for running system tests.
# NOTE: Don't install run.py. A system test of a dispatch installation should pick everything
# up from standard install locations.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/management/__init__.py
----------------------------------------------------------------------
diff --git a/tests/management/__init__.py b/tests/management/__init__.py
index 41ecb77..3bfcbce 100644
--- a/tests/management/__init__.py
+++ b/tests/management/__init__.py
@@ -18,7 +18,6 @@
##
"""Management unit test package"""
-
-from schema import *
-from qdrouter import *
-from entity import *
+from .schema import *
+from .qdrouter import *
+from .entity import *
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/mock/dispatch.py
----------------------------------------------------------------------
diff --git a/tests/mock/dispatch.py b/tests/mock/dispatch.py
index dd08f7d..5a34e43 100644
--- a/tests/mock/dispatch.py
+++ b/tests/mock/dispatch.py
@@ -19,6 +19,7 @@
"""
Mock implementation of the dispatch C extension module for use in unit tests.
"""
+from __future__ import print_function
LOG_TRACE = 1
LOG_DEBUG = 2
@@ -41,7 +42,7 @@ class LogAdapter:
self.mod_name = mod_name
def log(self, level, text):
- print "LOG: mod=%s level=%d text=%s" % (self.mod_name, level, text)
+ print("LOG: mod=%s level=%d text=%s" % (self.mod_name, level, text))
class IoAdapter:
def __init__(self, handler, address, global_address=False):
@@ -50,4 +51,5 @@ class IoAdapter:
self.global_address = global_address
def send(self, address, properties, application_properties, body, correlation_id=None):
- print "IO: send(addr=%s properties=%r application_properties=%r body=%r" % (address, properties, application_properties, body)
+ print("IO: send(addr=%s properties=%r application_properties=%r body=%r"
+ % (address, properties, application_properties, body))
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/router_engine_test.py
----------------------------------------------------------------------
diff --git a/tests/router_engine_test.py b/tests/router_engine_test.py
index 7193443..0442088 100644
--- a/tests/router_engine_test.py
+++ b/tests/router_engine_test.py
@@ -17,6 +17,8 @@
# under the License.
#
+from __future__ import print_function
+
import os
import sys
import unittest2 as unittest
@@ -34,20 +36,20 @@ class Adapter(object):
self._domain = domain
def log(self, level, text):
- print "Adapter.log(%d): domain=%s, text=%s" % (level, self._domain, text)
+ print("Adapter.log(%d): domain=%s, text=%s" % (level, self._domain, text))
def send(self, dest, opcode, body):
- print "Adapter.send: domain=%s, dest=%s, opcode=%s, body=%s" % (self._domain, dest, opcode, body)
+ print("Adapter.send: domain=%s, dest=%s, opcode=%s, body=%s" % (self._domain, dest, opcode, body))
def remote_bind(self, subject, peer):
- print "Adapter.remote_bind: subject=%s, peer=%s" % (subject, peer)
+ print("Adapter.remote_bind: subject=%s, peer=%s" % (subject, peer))
def remote_unbind(self, subject, peer):
- print "Adapter.remote_unbind: subject=%s, peer=%s" % (subject, peer)
+ print("Adapter.remote_unbind: subject=%s, peer=%s" % (subject, peer))
def node_updated(self, address, reachable, neighbor, link_bit, router_bit):
- print "Adapter.node_updated: address=%s, reachable=%r, neighbor=%r, link_bit=%d, router_bit=%d" % \
- (address, reachable, neighbor, link_bit, router_bit)
+ print("Adapter.node_updated: address=%s, reachable=%r, neighbor=%r, link_bit=%d, router_bit=%d" % \
+ (address, reachable, neighbor, link_bit, router_bit))
class DataTest(unittest.TestCase):
@@ -189,7 +191,7 @@ class NeighborTest(unittest.TestCase):
self.engine.tick(2.0)
self.engine.tick(3.0)
self.assertEqual(len(self.neighbors), 1)
- self.assertEqual(self.neighbors.keys(), ['R2'])
+ self.assertEqual(list(self.neighbors.keys()), ['R2'])
def test_establish_multiple_peers(self):
self.sent = []
@@ -203,7 +205,7 @@ class NeighborTest(unittest.TestCase):
self.engine.handle_hello(MessageHELLO(None, 'R5', ['R2']), 2.5, 0, 1)
self.engine.handle_hello(MessageHELLO(None, 'R6', ['R1']), 2.5, 0, 1)
self.engine.tick(3.0)
- keys = self.neighbors.keys()
+ keys = [k for k in self.neighbors.keys()]
keys.sort()
self.assertEqual(keys, ['R2', 'R3', 'R4', 'R6'])
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/router_policy_test.py
----------------------------------------------------------------------
diff --git a/tests/router_policy_test.py b/tests/router_policy_test.py
index 42b78ab..3421250 100644
--- a/tests/router_policy_test.py
+++ b/tests/router_policy_test.py
@@ -17,6 +17,8 @@
# under the License.
#
+from __future__ import print_function
+
import unittest2 as unittest
from qpid_dispatch_internal.policy.policy_util import HostAddr, is_ipv6_enabled
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_test.py
----------------------------------------------------------------------
diff --git a/tests/system_test.py b/tests/system_test.py
index d8baed7..0ff97da 100755
--- a/tests/system_test.py
+++ b/tests/system_test.py
@@ -27,6 +27,7 @@ Features:
- Tools to manipulate qdrouter configuration files.
- Sundry other tools.
"""
+from __future__ import print_function
import errno, os, time, socket, random, subprocess, shutil, unittest, __main__, re, sys
from copy import copy
@@ -40,19 +41,20 @@ import proton
from proton import Message, Timeout
from proton.utils import BlockingConnection
from qpid_dispatch.management.client import Node
+from qpid_dispatch_internal.compat import dict_iteritems
# Optional modules
MISSING_MODULES = []
try:
import qpidtoollibs
-except ImportError, err:
+except ImportError as err:
qpidtoollibs = None # pylint: disable=invalid-name
MISSING_MODULES.append(str(err))
try:
import qpid_messaging as qm
-except ImportError, err:
+except ImportError as err:
qm = None # pylint: disable=invalid-name
MISSING_MODULES.append(str(err))
@@ -126,7 +128,7 @@ def retry_exception(function, timeout=TIMEOUT, delay=.001, max_delay=1, exceptio
while True:
try:
return function()
- except Exception, e: # pylint: disable=broad-except
+ except Exception as e: # pylint: disable=broad-except
if exception_test:
exception_test(e)
delay = retry_delay(deadline, delay, max_delay)
@@ -150,7 +152,7 @@ def port_available(port, protocol_family='IPv4'):
try:
s.connect((host, port))
s.close()
- except socket.error, e:
+ except socket.error as e:
return e.errno == errno.ECONNREFUSED
except:
pass
@@ -167,7 +169,7 @@ def wait_port(port, protocol_family='IPv4', **retry_kwargs):
try:
retry_exception(lambda: s.connect((host, port)), exception_test=check,
**retry_kwargs)
- except Exception, e:
+ except Exception as e:
raise Exception("wait_port timeout on host %s port %s: %s"%(host, port, e))
finally: s.close()
@@ -175,13 +177,13 @@ def wait_port(port, protocol_family='IPv4', **retry_kwargs):
def wait_ports(ports, **retry_kwargs):
"""Wait up to timeout for all ports (on host) to be connectable.
Takes same keyword arguments as retry to control the timeout"""
- for port, protocol_family in ports.iteritems():
+ for port, protocol_family in dict_iteritems(ports):
wait_port(port=port, protocol_family=protocol_family, **retry_kwargs)
def message(**properties):
"""Convenience to create a proton.Message with properties set"""
m = Message()
- for name, value in properties.iteritems():
+ for name, value in dict_iteritems(properties):
getattr(m, name) # Raise exception if not a valid message attribute.
setattr(m, name, value)
return m
@@ -227,7 +229,7 @@ class Process(subprocess.Popen):
super(Process, self).__init__(args, **kwargs)
with open(self.outfile + '.cmd', 'w') as f:
f.write("%s\npid=%s\n" % (' '.join(args), self.pid))
- except Exception, e:
+ except Exception as e:
raise Exception("subprocess.Popen(%s, %s) failed: %s: %s" %
(args, kwargs, type(e).__name__, e))
@@ -297,13 +299,13 @@ class Qdrouterd(Process):
"""Fill in default values in gconfiguration"""
for name, props in self:
if name in Qdrouterd.Config.DEFAULTS:
- for n,p in Qdrouterd.Config.DEFAULTS[name].iteritems():
+ for n,p in dict_iteritems(Qdrouterd.Config.DEFAULTS[name]):
props.setdefault(n,p)
def __str__(self):
"""Generate config file content. Calls default() first."""
def props(p):
- return "".join([" %s: %s\n"%(k, v) for k, v in p.iteritems()])
+ return "".join([" %s: %s\n"%(k, v) for k, v in dict_iteritems(p)])
self.defaults()
return "".join(["%s {\n%s}\n"%(n, props(p)) for n, p in self])
@@ -523,8 +525,8 @@ class Tester(object):
if cleanup:
cleanup()
break
- except Exception, e:
- errors.append(e)
+ except Exception as exc:
+ errors.append(exc)
if errors:
raise RuntimeError("Errors during teardown: \n\n%s" % "\n\n".join([str(e) for e in errors]))
@@ -543,14 +545,6 @@ class Tester(object):
"""Return a Qdrouterd that will be cleaned up on teardown"""
return self.cleanup(Qdrouterd(*args, **kwargs))
- def messenger(self, name=None, cleanup=True, **kwargs):
- """Return a started Messenger that will be cleaned up on teardown."""
- m = Messenger(name or os.path.basename(self.directory), **kwargs)
- m.start()
- if cleanup:
- self.cleanup(m)
- return m
-
port_range = (20000, 30000)
next_port = random.randint(port_range[0], port_range[1])
@@ -621,7 +615,7 @@ class TestCase(unittest.TestCase, Tester): # pylint: disable=too-many-public-met
if hasattr(unittest.TestCase, 'skipTest'):
unittest.TestCase.skipTest(self, reason)
else:
- print "Skipping test", self.id(), reason
+ print("Skipping test %s: %s" % (self.id(), reason))
# Hack to support tearDownClass on older versions of python.
# The default TestLoader sorts tests alphabetically so we insert
@@ -678,7 +672,7 @@ class SkipIfNeeded(object):
instance = args[0]
if isinstance(instance, TestCase) and hasattr(instance, "skip") and instance.skip[self.test_name]:
if sys.version_info < (2, 7):
- print "%s -> skipping (python<2.7) ..." % self.test_name
+ print("%s -> skipping (python<2.7) ..." % self.test_name)
return
else:
instance.skipTest(self.reason)
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_auth_service_plugin.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_auth_service_plugin.py b/tests/system_tests_auth_service_plugin.py
index f005766..013c87e 100644
--- a/tests/system_tests_auth_service_plugin.py
+++ b/tests/system_tests_auth_service_plugin.py
@@ -17,6 +17,8 @@
# under the License.
#
+from __future__ import print_function
+
import unittest2 as unittest
import os
from subprocess import PIPE, Popen
@@ -31,7 +33,7 @@ class AuthServicePluginTest(TestCase):
def createSaslFiles(cls):
# Create a sasl database.
p = Popen(['saslpasswd2', '-c', '-p', '-f', 'qdrouterd.sasldb', '-u', 'domain.com', 'test'],
- stdin=PIPE, stdout=PIPE, stderr=PIPE)
+ stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=True)
result = p.communicate('password')
assert p.returncode == 0, \
"saslpasswd2 exit status %s, output:\n%s" % (p.returncode, result)
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_authz_service_plugin.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_authz_service_plugin.py b/tests/system_tests_authz_service_plugin.py
index 0dc839f..994079d 100644
--- a/tests/system_tests_authz_service_plugin.py
+++ b/tests/system_tests_authz_service_plugin.py
@@ -17,7 +17,7 @@
# under the License.
#
-import unittest2 as unitest
+import unittest2 as unittest
import os, json
from subprocess import PIPE, Popen, STDOUT
from system_test import TestCase, Qdrouterd, main_module, DIR, TIMEOUT, Process
@@ -30,7 +30,7 @@ class AuthServicePluginAuthzTest(TestCase):
def addUser(cls, user, password):
# Create a sasl database.
p = Popen(['saslpasswd2', '-c', '-p', '-f', 'users.sasldb', user],
- stdin=PIPE, stdout=PIPE, stderr=PIPE)
+ stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=True)
result = p.communicate(password)
assert p.returncode == 0, "saslpasswd2 exit status %s, output:\n%s" % (p.returncode, result)
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_autolinks.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_autolinks.py b/tests/system_tests_autolinks.py
index 16aeca4..952644b 100644
--- a/tests/system_tests_autolinks.py
+++ b/tests/system_tests_autolinks.py
@@ -97,7 +97,8 @@ class AutolinkTest(TestCase):
cmd = ['qdstat', '--bus', str(AutolinkTest.normal_address), '--timeout', str(TIMEOUT)] + ['-g']
p = self.popen(
cmd,
- name='qdstat-'+self.id(), stdout=PIPE, expect=None)
+ name='qdstat-'+self.id(), stdout=PIPE, expect=None,
+ universal_newlines=True)
out = p.communicate()[0]
assert p.returncode == 0, "qdstat exit status %s, output:\n%s" % (p.returncode, out)
@@ -106,11 +107,12 @@ class AutolinkTest(TestCase):
def run_qdmanage(self, cmd, input=None, expect=Process.EXIT_OK):
p = self.popen(
['qdmanage'] + cmd.split(' ') + ['--bus', AutolinkTest.normal_address, '--indent=-1', '--timeout', str(TIMEOUT)],
- stdin=PIPE, stdout=PIPE, stderr=STDOUT, expect=expect)
+ stdin=PIPE, stdout=PIPE, stderr=STDOUT, expect=expect,
+ universal_newlines=True)
out = p.communicate(input)[0]
try:
p.teardown()
- except Exception, e:
+ except Exception as e:
raise Exception("%s\n%s" % (e, out))
return out
@@ -766,7 +768,7 @@ class ManageAutolinksTest(MessagingHandler):
self.send_ops()
def on_message(self, event):
- if event.message.properties['statusCode'] / 100 != 2:
+ if event.message.properties['statusCode'] // 100 != 2:
self.error = 'Op Error: %d %s' % (event.message.properties['statusCode'],
event.message.properties['statusDescription'])
self.timer.cancel()
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_bad_configuration.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_bad_configuration.py b/tests/system_tests_bad_configuration.py
index 1b9ecf0..8dd379d 100644
--- a/tests/system_tests_bad_configuration.py
+++ b/tests/system_tests_bad_configuration.py
@@ -141,10 +141,11 @@ class RouterTestBadConfiguration(TestCase):
"""
p = self.popen(
['qdmanage', '-b', self.address(), 'query', '--type=router', '--timeout', str(TIMEOUT)],
- stdin=PIPE, stdout=PIPE, stderr=STDOUT, expect=Process.EXIT_OK)
+ stdin=PIPE, stdout=PIPE, stderr=STDOUT, expect=Process.EXIT_OK,
+ universal_newlines=True)
out = p.communicate()[0]
try:
p.teardown()
- except Exception, e:
+ except Exception as e:
raise Exception("%s\n%s" % (e, out))
return out
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_broker.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_broker.py b/tests/system_tests_broker.py
index 3832bf0..bef3008 100644
--- a/tests/system_tests_broker.py
+++ b/tests/system_tests_broker.py
@@ -39,7 +39,7 @@ class DistributedQueueTest(system_test.TestCase): # pylint: disable=too-many-pub
"""Start 3 qpidd brokers, wait for them to be ready."""
super(DistributedQueueTest, cls).setUpClass()
cls.qpidds = [cls.tester.qpidd('qpidd%s'%i, port=cls.get_port(), wait=False)
- for i in xrange(3)]
+ for i in range(3)]
for q in cls.qpidds:
q.wait_ready()
@@ -98,7 +98,7 @@ class DistributedQueueTest(system_test.TestCase): # pylint: disable=too-many-pub
rconf += [
('connector', {'name':q.name, 'port':q.port})]
return self.qdrouterd(name, rconf, wait=False)
- routers = [router(i) for i in xrange(len(self.qpidds))]
+ routers = [router(i) for i in range(len(self.qpidds))]
for r in routers: r.wait_ready()
addrs = [r.addresses[0]+"/"+self.testq for r in routers]
self.verify_equal_spread(addrs, addrs)
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_cmdline_parsing.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_cmdline_parsing.py b/tests/system_tests_cmdline_parsing.py
index e68e6be..75526fb 100644
--- a/tests/system_tests_cmdline_parsing.py
+++ b/tests/system_tests_cmdline_parsing.py
@@ -65,7 +65,8 @@ class CommandLineTest(TestCase):
[os.path.join(os.environ.get('BUILD_DIR'), 'router', 'qdrouterd'), '-d',
'-I', os.path.join(os.environ.get('SOURCE_DIR'), 'python'),
'-c', self.config.write(config_file_name), '-P', pid_file_name],
- stdout=PIPE, stderr=STDOUT, expect=Process.EXIT_OK)
+ stdout=PIPE, stderr=STDOUT, expect=Process.EXIT_OK,
+ universal_newlines=True)
out = pipe.communicate()[0]
wait_port(CommandLineTest.testport)
@@ -127,7 +128,8 @@ class CommandLineTest2(TestCase):
[os.path.join(os.environ.get('BUILD_DIR'), 'router', 'qdrouterd'), '-d',
'-I', os.path.join(os.environ.get('SOURCE_DIR'), 'python'),
'-c', self.config.write(config_file_name), '-P', pid_file_name],
- stdout=PIPE, stderr=STDOUT, expect=Process.EXIT_OK)
+ stdout=PIPE, stderr=STDOUT, expect=Process.EXIT_OK,
+ universal_newlines=True)
out = pipe.communicate()[0]
wait_port(CommandLineTest2.testport)
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_default_distribution.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_default_distribution.py b/tests/system_tests_default_distribution.py
index 8d318e4..2bb9b4d 100644
--- a/tests/system_tests_default_distribution.py
+++ b/tests/system_tests_default_distribution.py
@@ -48,7 +48,8 @@ class DefaultDistributionTest(TestCase):
def run_qdstat(self, args, regexp=None, address=None):
p = self.popen(
['qdstat', '--bus', str(address or self.address), '--timeout', str(TIMEOUT) ] + args,
- name='qdstat-'+self.id(), stdout=PIPE, expect=None)
+ name='qdstat-'+self.id(), stdout=PIPE, expect=None,
+ universal_newlines=True)
out = p.communicate()[0]
assert p.returncode == 0, \
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_delivery_abort.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_delivery_abort.py b/tests/system_tests_delivery_abort.py
index fc60002..6051ebf 100644
--- a/tests/system_tests_delivery_abort.py
+++ b/tests/system_tests_delivery_abort.py
@@ -22,6 +22,7 @@ from proton import Message, Timeout
from system_test import TestCase, Qdrouterd, main_module
from proton.handlers import MessagingHandler
from proton.reactor import Container
+from qpid_dispatch_internal.compat import BINARY
# PROTON-828:
try:
@@ -211,7 +212,7 @@ class MessageRouteTruncateTest(MessagingHandler):
self.receiver = event.container.create_receiver(self.receiver_conn, self.address)
def stream(self):
- self.sender1.stream(self.long_data)
+ self.sender1.stream(BINARY(self.long_data))
self.sent_stream += len(self.long_data)
if self.sent_stream >= 1000000:
self.streaming = False
@@ -316,7 +317,7 @@ class LinkRouteTruncateTest(MessagingHandler):
self.sender1 = event.container.create_sender(self.sender_conn, self.address, name="S1")
def stream(self):
- self.sender1.stream(self.long_data)
+ self.sender1.stream(BINARY(self.long_data))
self.sent_stream += len(self.long_data)
if self.sent_stream >= 1000000:
self.streaming = False
@@ -434,7 +435,7 @@ class MessageRouteAbortTest(MessagingHandler):
if op == 'F':
body = "FINISH"
else:
- for i in range(size / 10):
+ for i in range(size // 10):
body += "0123456789"
msg = Message(body=body)
@@ -522,7 +523,7 @@ class MulticastTruncateTest(MessagingHandler):
self.receiver2 = event.container.create_receiver(self.receiver2_conn, self.address)
def stream(self):
- self.sender1.stream(self.long_data)
+ self.sender1.stream(BINARY(self.long_data))
self.sent_stream += len(self.long_data)
if self.sent_stream >= 1000000:
self.streaming = False
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_deprecated.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_deprecated.py b/tests/system_tests_deprecated.py
index 818d12d..6809e94 100644
--- a/tests/system_tests_deprecated.py
+++ b/tests/system_tests_deprecated.py
@@ -53,7 +53,7 @@ class RouterTestDeprecatedLinkRoute(TestCase):
with open('../setUpClass/test-router-2.out', 'r') as router_log:
log_lines = router_log.read().split("\n")
search_lines = [s for s in log_lines if "org.apache.qpid.dispatch.router.config.linkRoute: Both 'dir' and 'direction' cannot be specified for entity 'linkRoute'" in s]
- self.assertEqual(len(search_lines), 4)
+ self.assertTrue(len(search_lines) > 0)
class RouterTestDeprecatedLAutoLink(TestCase):
@@ -86,7 +86,7 @@ class RouterTestDeprecatedLAutoLink(TestCase):
log_lines = router_log.read().split("\n")
search_lines = [s for s in log_lines if
"org.apache.qpid.dispatch.router.config.autoLink: Both 'dir' and 'direction' cannot be specified for entity 'autoLink'" in s]
- self.assertEqual(len(search_lines), 4)
+ self.assertTrue(len(search_lines) > 0)
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_disallow_link_resumable_link_route.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_disallow_link_resumable_link_route.py b/tests/system_tests_disallow_link_resumable_link_route.py
index bac12ff..05d2ae8 100644
--- a/tests/system_tests_disallow_link_resumable_link_route.py
+++ b/tests/system_tests_disallow_link_resumable_link_route.py
@@ -92,7 +92,8 @@ class LinkRouteTest(TestCase):
try:
receiver = connection.create_receiver(address="org.apache", options=[DurableSubscription()])
self.fail("link should have been detached")
- except LinkDetached, e: None
+ except LinkDetached:
+ pass
connection.close()
def test_normal_sender_allowed(self):
@@ -109,7 +110,8 @@ class LinkRouteTest(TestCase):
try:
sender = connection.create_sender(address="org.apache", options=[SenderExpiry(Terminus.EXPIRE_NEVER)])
self.fail("link should have been detached")
- except LinkDetached, e: None
+ except LinkDetached:
+ pass
connection.close()
def test_non_zero_timeout_sender_disallowed(self):
@@ -119,7 +121,8 @@ class LinkRouteTest(TestCase):
try:
sender = connection.create_sender(address="org.apache", options=[SenderTimeout(10)])
self.fail("link should have been detached")
- except LinkDetached, e: None
+ except LinkDetached:
+ pass
connection.close()
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_distribution.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_distribution.py b/tests/system_tests_distribution.py
index d6ef781..b3484fd 100644
--- a/tests/system_tests_distribution.py
+++ b/tests/system_tests_distribution.py
@@ -17,6 +17,8 @@
# under the License.
#
+from __future__ import print_function
+
import unittest2 as unittest
from proton import Message, Timeout
from system_test import TestCase, Qdrouterd, main_module, TIMEOUT, SkipIfNeeded
@@ -1978,7 +1980,7 @@ class LinkAttachRoutingCheckOnly ( MessagingHandler ):
def debug_print ( self, message ) :
if self.debug :
- print message
+ print(message)
def timeout ( self ):
@@ -2886,7 +2888,7 @@ class RoutingTest ( MessagingHandler ):
def debug_print ( self, message ) :
if self.debug :
- print message
+ print(message)
# If this happens, the test is hanging.
@@ -2950,13 +2952,13 @@ class RoutingTest ( MessagingHandler ):
for router in range(len(self.where_to_make_connections)) :
how_many_for_this_router = self.where_to_make_connections[router]
for j in range(how_many_for_this_router) :
- route_container_addr = self.route_container_addrs[router]
- cnx = event.container.connect ( route_container_addr )
- # In the dict of connections and actual receiver
- # counts, store this cnx, and 0.
- self.router_cnx_counts[router][cnx] = 0
- self.cnx_status[cnx] = 1
- self.debug_print ( "on_start: made cnx %s on router %d" % ( str(cnx), router ) )
+ route_container_addr = self.route_container_addrs[router]
+ cnx = event.container.connect ( route_container_addr )
+ # In the dict of connections and actual receiver
+ # counts, store this cnx, and 0.
+ self.router_cnx_counts[router][cnx] = 0
+ self.cnx_status[cnx] = 1
+ self.debug_print ( "on_start: made cnx %s on router %d" % ( str(cnx), router ) )
# STEP 2 : Make a sender and receiver that we will use to tell when the router
# network is ready to handle our reoutable address. This sender will
@@ -3092,12 +3094,14 @@ class RoutingTest ( MessagingHandler ):
def print_receiver_distribution ( self ) :
- print "receiver distribution:"
+ print("receiver distribution:")
for router in range(len(self.router_cnx_counts)) :
- print " router", router
+ print(" router %s" % router)
cnx_dict = self.router_cnx_counts[router]
for cnx in cnx_dict :
- print " cnx:", cnx, "receivers: " , cnx_dict[cnx]
+ print(" cnx: %s receivers: %s"
+ % (cnx, cnx_dict[cnx]))
+
def get_receiver_distribution ( self ) :
threeple = ()
@@ -3232,7 +3236,7 @@ class RoutingTest ( MessagingHandler ):
#=================================================
def make_senders ( self, n ):
self.debug_print ( "making %d senders" % n )
- for i in xrange(n):
+ for i in range(n):
sender = self.sender_container.create_sender ( self.sender_cnx,
self.link_routable_address,
name=link_name()
@@ -3400,7 +3404,7 @@ class WaypointTest ( MessagingHandler ):
def debug_print ( self, message ) :
if self.debug :
- print message
+ print(message)
@@ -3644,7 +3648,7 @@ class SerialWaypointTest ( MessagingHandler ):
def debug_print ( self, message ) :
if self.debug :
- print message
+ print(message)
def send_from_client ( self, sender, n_messages, sender_index ):
@@ -3828,23 +3832,23 @@ class SerialWaypointTest ( MessagingHandler ):
def report ( self ) :
- print "\n\n==========================================================\nreport\n"
+ print("\n\n==========================================================\nreport\n")
for i in range(len(self.senders)) :
- print " client sender %d sent %d messages." % ( i, self.senders[i]['n_sent'] )
+ print(" client sender %d sent %d messages." % ( i, self.senders[i]['n_sent']))
- print "\n"
+ print("\n")
for i in range(len(self.waypoints)) :
- print " waypoint %d received %d messages." % ( i, self.waypoints[i]['n_received'] )
- print " waypoint %d sent %d messages." % ( i, self.waypoints[i]['n_sent'] )
+ print(" waypoint %d received %d messages." % ( i, self.waypoints[i]['n_received']))
+ print(" waypoint %d sent %d messages." % ( i, self.waypoints[i]['n_sent']))
- print "\n"
+ print("\n")
for i in range(len(self.receivers)) :
- print " client receiver %d received %d messages." % ( i, self.receivers[i]['n_received'] )
+ print(" client receiver %d received %d messages." % ( i, self.receivers[i]['n_received'] ))
- print "\nend report\n=========================================================\n\n"
+ print("\nend report\n=========================================================\n\n")
@@ -3959,7 +3963,7 @@ class ParallelWaypointTest ( MessagingHandler ):
def debug_print ( self, message ) :
if self.debug :
- print message
+ print(message)
def send_from_client ( self, sender, n_messages, sender_index ):
@@ -4148,23 +4152,23 @@ class ParallelWaypointTest ( MessagingHandler ):
def report ( self ) :
- print "\n\n==========================================================\nreport\n"
+ print("\n\n==========================================================\nreport\n")
for i in range(len(self.senders)) :
- print " client sender %d sent %d messages." % ( i, self.senders[i]['n_sent'] )
+ print(" client sender %d sent %d messages." % ( i, self.senders[i]['n_sent'] ))
- print "\n"
+ print("\n")
for i in range(len(self.waypoints)) :
- print " waypoint %d received %d messages." % ( i, self.waypoints[i]['n_received'] )
- print " waypoint %d sent %d messages." % ( i, self.waypoints[i]['n_sent'] )
+ print(" waypoint %d received %d messages." % ( i, self.waypoints[i]['n_received'] ))
+ print(" waypoint %d sent %d messages." % ( i, self.waypoints[i]['n_sent'] ))
- print "\n"
+ print("\n")
for i in range(len(self.receivers)) :
- print " client receiver %d received %d messages." % ( i, self.receivers[i]['n_received'] )
+ print( " client receiver %d received %d messages." % ( i, self.receivers[i]['n_received'] ))
- print "\nend report\n=========================================================\n\n"
+ print("\nend report\n=========================================================\n\n")
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_exchange_bindings.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_exchange_bindings.py b/tests/system_tests_exchange_bindings.py
index e03f36a..1449f77 100644
--- a/tests/system_tests_exchange_bindings.py
+++ b/tests/system_tests_exchange_bindings.py
@@ -51,11 +51,12 @@ class ExchangeBindingsTest(TestCase):
p = self.popen(
['qdmanage'] + cmd.split(' ')
+ ['--bus', router.addresses[0], '--indent=-1', '--timeout', str(TIMEOUT)],
- stdin=PIPE, stdout=PIPE, stderr=STDOUT, expect=expect)
+ stdin=PIPE, stdout=PIPE, stderr=STDOUT, expect=expect,
+ universal_newlines=True)
out = p.communicate(input)[0]
try:
p.teardown()
- except Exception, e:
+ except Exception as e:
raise Exception("%s\n%s" % (e, out))
return out
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/878534ec/tests/system_tests_handle_failover.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_handle_failover.py b/tests/system_tests_handle_failover.py
index f8c70e9..dcd9893 100644
--- a/tests/system_tests_handle_failover.py
+++ b/tests/system_tests_handle_failover.py
@@ -94,18 +94,20 @@ class FailoverTest(TestCase):
def run_qdmanage(self, cmd, input=None, expect=Process.EXIT_OK, address=None):
p = self.popen(
['qdmanage'] + cmd.split(' ') + ['--bus', address or self.address(), '--indent=-1', '--timeout', str(TIMEOUT)],
- stdin=PIPE, stdout=PIPE, stderr=STDOUT, expect=expect)
+ stdin=PIPE, stdout=PIPE, stderr=STDOUT, expect=expect,
+ universal_newlines=True)
out = p.communicate(input)[0]
try:
p.teardown()
- except Exception, e:
+ except Exception as e:
raise Exception("%s\n%s" % (e, out))
return out
def run_qdstat(self, args, regexp=None, address=None):
p = self.popen(
['qdstat', '--bus', str(address or self.router.addresses[0]), '--timeout', str(TIMEOUT) ] + args,
- name='qdstat-'+self.id(), stdout=PIPE, expect=None)
+ name='qdstat-'+self.id(), stdout=PIPE, expect=None,
+ universal_newlines=True)
out = p.communicate()[0]
assert p.returncode == 0, \
@@ -175,4 +177,4 @@ class FailoverTest(TestCase):
if __name__ == '__main__':
- unittest.main(main_module())
\ No newline at end of file
+ unittest.main(main_module())
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org