From 04c3fa84ccb6681759d68ee9d95dfd70cebe7443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 9 Apr 2023 21:45:09 +0200 Subject: [PATCH 01/50] QPID-8170: add basic GitHub Actions CI jobs (#3) --- .github/workflows/python-package.yml | 113 +++++++++++++++++++++++++++ .github/workflows/python-publish.yml | 61 +++++++++++++++ pyproject.toml | 28 +++++++ 3 files changed, 202 insertions(+) create mode 100644 .github/workflows/python-package.yml create mode 100644 .github/workflows/python-publish.yml create mode 100644 pyproject.toml diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml new file mode 100644 index 00000000..557641c3 --- /dev/null +++ b/.github/workflows/python-package.yml @@ -0,0 +1,113 @@ +# +# 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. +# + +# https://github.com/actions/starter-workflows/blob/main/ci/python-package.yml + +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python + +name: Python package + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + # https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json + python-version: ["2.7", "3.8", "3.9", "3.10", "3.11", "3.12.0-alpha.7"] + + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install --user poetry + + - name: Cache Poetry virtualenv + uses: actions/cache@v3 + id: cache-home-virtualenvs + with: + path: ~/.virtualenvs + key: poetry-${{ matrix.python-version }}-${{ hashFiles('pyproject.toml') }} + restore-keys: | + poetry-${{ matrix.python-version }}-${{ hashFiles('pyproject.toml') }} + + - name: Set Poetry config + run: | + echo "POETRY_VIRTUALENVS_PATH=${HOME}/.virtualenvs" >> ${GITHUB_ENV} + echo "POETRY_VIRTUALENVS_IN-PROJECT=false" >> ${GITHUB_ENV} + + - name: Set additional Poetry config (py2.7) + if: matrix.python-version == '2.7' + run: | + # https://github.com/python-poetry/poetry/issues/3010 + # workaround parallel installation bug in old poetry + echo "POETRY_INSTALLER_MAX-WORKERS=1" >> ${GITHUB_ENV} + + - name: Install Dependencies + run: | + poetry env use ${{ env.pythonLocation }}/bin/python + poetry install --no-root + if: steps.cache.outputs.cache-hit != 'true' + + - name: Lint with flake8 + continue-on-error: true + run: | + # stop the build if there are Python syntax errors or undefined names + poetry run flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + poetry run flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + + - name: Lint with ruff + continue-on-error: true + run: | + poetry run ruff check . + + - name: Test with our bespoke test runner + run: | + docker run --rm -d -p 5672:5672 irinabov/docker-qpid-cpp-broker + + attempts=0 + while ! nc -zv localhost 5672; do + attempts=$((attempts+1)) + if [ $attempts -ge 10 ]; then + echo >&2 "qpidd not reachable, giving up" + exit 1 + fi + sleep 3 + done + + ${{ env.pythonLocation }}/bin/python ./qpid-python-test + + - name: Test setup.py install + run: | + ${{ env.pythonLocation }}/bin/python setup.py install --user diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml new file mode 100644 index 00000000..5d459d1a --- /dev/null +++ b/.github/workflows/python-publish.yml @@ -0,0 +1,61 @@ +# +# 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. +# + +# https://github.com/actions/starter-workflows/blob/main/ci/python-publish.yml + +# This workflow will upload a Python Package using Twine when a release is created +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Upload Python Package + +on: + release: + types: [published] + workflow_dispatch: + +permissions: + contents: read + +jobs: + deploy: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: '3.x' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install build + - name: Build package + run: python -m build + - name: Publish package + uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..996ecde5 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,28 @@ +[tool.poetry] +name = "qpid-python" +version = "0.0.0" +description = "" +authors = ["Apache Qpid "] +license = "Apache Software License" +readme = "README.md" +packages = [{include = "qpid_python"}] + +[tool.poetry.dependencies] + +# https://github.com/python-poetry/poetry/issues/4983 +# dependency groups don't work on the latest poetry available for python 2.7 +# [tool.poetry.group.dev.dependencies] + +[tool.poetry.dev-dependencies] +# need this to resolve flake8 on python2.7 +importlib-metadata = {version = "^2.1.3", python = "^2.7"} +flake8 = [ + {version = "^3.9.2", python = "^2.7" }, + {version = "^6.0.0", python = ">=3.8.1" }, +] +pytest = { version = "^7.3.0", python = ">=3.7" } +ruff = { version = "^0.0.261", python = ">=3.7" } + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" From d361505c668374182b685613e5445b590553d441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 9 Apr 2023 21:51:00 +0200 Subject: [PATCH 02/50] NO-JIRA: configure additional GitHub features though .asf.yaml (#4) --- .asf.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.asf.yaml b/.asf.yaml index c5edce73..98dab138 100644 --- a/.asf.yaml +++ b/.asf.yaml @@ -26,3 +26,19 @@ github: - messaging - amqps - python + features: + wiki: false + issues: false + projects: true + enabled_merge_buttons: + merge: false + squash: true + rebase: true + protected_branches: + main: {} + autolink_jira: + - INFRA + - QPID + dependabot_alerts: true + dependabot_updates: true + del_branch_on_merge: true From bd80951458f5fac58adc16790942a1bf2d221910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 9 Apr 2023 22:37:22 +0200 Subject: [PATCH 03/50] QPID-8170: run also amqp0-10 broker tests on GitHub Actions --- .github/workflows/python-package.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 557641c3..9676c739 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -92,7 +92,7 @@ jobs: run: | poetry run ruff check . - - name: Test with our bespoke test runner + - name: Start qpidd in docker run: | docker run --rm -d -p 5672:5672 irinabov/docker-qpid-cpp-broker @@ -106,8 +106,16 @@ jobs: sleep 3 done + - name: Client tests with our bespoke test runner + run: | ${{ env.pythonLocation }}/bin/python ./qpid-python-test - name: Test setup.py install run: | ${{ env.pythonLocation }}/bin/python setup.py install --user + + - name: Broker tests with the 🛞 runner we ❤️ + run: | + # qpid-python dependency is the current package, it was installed in the prior step + ${{ env.pythonLocation }}/bin/python -m pip install --user qpid-tools qpid-qmf --no-deps + ${{ env.pythonLocation }}/bin/python qpid-python-test -m qpid_tests From 471398a82c2274e419d7a68d3c67bc8ca0f02271 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 9 Apr 2023 22:24:43 +0200 Subject: [PATCH 04/50] QPID-8170: fix qpid_tests.broker_0_10.management.ManagementTest.test_reroute_queue ``` qpid_tests.broker_0_10.management.ManagementTest.test_reroute_queue ... fail Error during test: Traceback (most recent call last): File "qpid-python-test", line 347, in run phase() File "/home/jdanek/repos/qpid/qpid-python/qpid_tests/broker_0_10/management.py", line 346, in test_reroute_queue url = "%s://%s:%d" % (self.broker.scheme or "amqp", self.broker.host, self.broker.port) TypeError: %d format: a number is required, not NoneType ``` --- qpid_tests/broker_0_10/management.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qpid_tests/broker_0_10/management.py b/qpid_tests/broker_0_10/management.py index 75183929..534196e6 100644 --- a/qpid_tests/broker_0_10/management.py +++ b/qpid_tests/broker_0_10/management.py @@ -343,7 +343,7 @@ def test_reroute_queue(self): self.assertEqual(aq.msgDepth,1) "Verify that the trace was cleared on the rerouted message" - url = "%s://%s:%d" % (self.broker.scheme or "amqp", self.broker.host, self.broker.port) + url = "%s://%s:%d" % (self.broker.scheme or "amqp", self.broker.host, self.broker.port or 5672) conn = qpid.messaging.Connection(url) conn.open() sess = conn.session() From 4123547a7514ffd6d650280d5ae8831613e635d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 9 Apr 2023 22:28:50 +0200 Subject: [PATCH 05/50] QPID-8170: fix exception string from qpid_tests.broker_1_0 tests running against amqp0-10 broker Issue was originally introduced in QPID-5836. ``` qpid_tests.broker_1_0.general.GeneralTests.test_anonymous_relay ... fail Error during setup: Traceback (most recent call last): File "qpid-python-test", line 347, in run phase() File "/home/jdanek/repos/qpid/qpid-python/qpid/tests/messaging/__init__.py", line 49, in setup self.conn = self.setup_connection() File "/home/jdanek/repos/qpid/qpid-python/qpid/tests/messaging/__init__.py", line 207, in setup_connection return self.create_connection() File "/home/jdanek/repos/qpid/qpid-python/qpid/tests/messaging/__init__.py", line 204, in create_connection return Connection.establish(self.broker, **opts) File "/home/jdanek/repos/qpid/qpid-python/qpid/messaging/endpoints.py", line 111, in establish conn = Connection(url, **options) File "/home/jdanek/repos/qpid/qpid-python/qpid/messaging/endpoints.py", line 209, in __init__ raise ConnectionError("Connection option 'protocol' value '" + value + "' unsupported (must be amqp0-10)") TypeError: cannot concatenate 'str' and 'bool' objects ``` --- qpid/messaging/endpoints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qpid/messaging/endpoints.py b/qpid/messaging/endpoints.py index 885b95a8..3ac9d8f6 100644 --- a/qpid/messaging/endpoints.py +++ b/qpid/messaging/endpoints.py @@ -206,7 +206,7 @@ def __init__(self, url=None, **options): self.port = default(url.port, default(self.port, AMQP_PORT)) if self.protocol and self.protocol != "amqp0-10": - raise ConnectionError("Connection option 'protocol' value '" + value + "' unsupported (must be amqp0-10)") + raise ConnectionError("Connection option 'protocol' value '" + self.protocol + "' unsupported (must be amqp0-10)") self.username = default(url.user, self.username) self.password = default(url.password, self.password) From 8ae83d19b9b83e1f4559295ed174e15085544065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 9 Apr 2023 22:58:31 +0200 Subject: [PATCH 06/50] QPID-8170: autoskip amqp1.0 tests AFAICT there is no AMQP 1.0 support in this library anyways --- qpid/messaging/endpoints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qpid/messaging/endpoints.py b/qpid/messaging/endpoints.py index 3ac9d8f6..d24eb09c 100644 --- a/qpid/messaging/endpoints.py +++ b/qpid/messaging/endpoints.py @@ -206,7 +206,7 @@ def __init__(self, url=None, **options): self.port = default(url.port, default(self.port, AMQP_PORT)) if self.protocol and self.protocol != "amqp0-10": - raise ConnectionError("Connection option 'protocol' value '" + self.protocol + "' unsupported (must be amqp0-10)") + raise VersionError(text="Connection option 'protocol' value '" + self.protocol + "' unsupported (must be amqp0-10)") self.username = default(url.user, self.username) self.password = default(url.password, self.password) From f28a657a1a9201cd628b5225a131751beffb2cd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 18:17:35 +0200 Subject: [PATCH 07/50] QPID-8632: use absolute, full imports when dealing with circular imports (#7) This patch leaves the circular import in place, but changes the importing code to make it overall safer. --- mllib/dom.py | 4 ++-- mllib/transforms.py | 6 +++--- qpid/connection.py | 6 +++--- qpid/delegates.py | 11 ++++++----- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/mllib/dom.py b/mllib/dom.py index 486f7082..1d2cb5e1 100644 --- a/mllib/dom.py +++ b/mllib/dom.py @@ -25,7 +25,7 @@ from __future__ import generators from __future__ import nested_scopes -import transforms +import mllib.transforms class Container: @@ -109,7 +109,7 @@ def __getitem__(self, name): return nd def text(self): - return self.dispatch(transforms.Text()) + return self.dispatch(mllib.transforms.Text()) def tag(self, name, *attrs, **kwargs): t = Tag(name, *attrs, **kwargs) diff --git a/mllib/transforms.py b/mllib/transforms.py index 69d99125..dc258ccf 100644 --- a/mllib/transforms.py +++ b/mllib/transforms.py @@ -21,7 +21,7 @@ Useful transforms for dom objects. """ -import dom +import mllib.dom from cStringIO import StringIO class Visitor: @@ -45,12 +45,12 @@ def descend(self, node): return result def default(self, tag): - result = dom.Tag(tag.name, *tag.attrs) + result = mllib.dom.Tag(tag.name, *tag.attrs) result.extend(self.descend(tag)) return result def tree(self, tree): - result = dom.Tree() + result = mllib.dom.Tree() result.extend(self.descend(tree)) return result diff --git a/qpid/connection.py b/qpid/connection.py index 2453f38c..2ab870b2 100644 --- a/qpid/connection.py +++ b/qpid/connection.py @@ -26,7 +26,7 @@ from generator import control_invoker from exceptions import * from logging import getLogger -import delegates, socket +import qpid.delegates, socket import sys class ChannelBusy(Exception): pass @@ -38,10 +38,10 @@ class SessionBusy(Exception): pass class ConnectionFailed(Exception): pass def client(*args, **kwargs): - return delegates.Client(*args, **kwargs) + return qpid.delegates.Client(*args, **kwargs) def server(*args, **kwargs): - return delegates.Server(*args, **kwargs) + return qpid.delegates.Server(*args, **kwargs) from framer import Framer diff --git a/qpid/delegates.py b/qpid/delegates.py index ae7ed7f9..90183513 100644 --- a/qpid/delegates.py +++ b/qpid/delegates.py @@ -17,7 +17,8 @@ # under the License. # -import os, connection, session +import os, session +import qpid.connection from util import notify, get_client_properties_with_defaults from datatypes import RangedSet from exceptions import VersionError, Closed @@ -37,7 +38,7 @@ def __init__(self, connection, delegate=session.client): def received(self, op): ssn = self.connection.attached.get(op.channel) if ssn is None: - ch = connection.Channel(self.connection, op.channel) + ch = qpid.connection.Channel(self.connection, op.channel) else: ch = ssn.channel @@ -66,9 +67,9 @@ def session_attach(self, ch, a): try: self.connection.attach(a.name, ch, self.delegate, a.force) ch.session_attached(a.name) - except connection.ChannelBusy: + except qpid.connection.ChannelBusy: ch.session_detached(a.name) - except connection.SessionBusy: + except qpid.connection.SessionBusy: ch.session_detached(a.name) def session_attached(self, ch, a): @@ -122,7 +123,7 @@ def start(self): self.connection.read_header() # XXX self.connection.write_header(0, 10) - connection.Channel(self.connection, 0).connection_start(mechanisms=["ANONYMOUS"]) + qpid.connection.Channel(self.connection, 0).connection_start(mechanisms=["ANONYMOUS"]) def connection_start_ok(self, ch, start_ok): ch.connection_tune(channel_max=65535) From 8cbd8ee4521afb5d571b585e9eacaa57e847558b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 21:16:27 +0200 Subject: [PATCH 08/50] QPID-7072: modernize the syntax of exec, before later hopefully replacing it (#8) --- qpid/concurrency.py | 4 ++-- qpid/spec08.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/qpid/concurrency.py b/qpid/concurrency.py index eefe0d44..b9df9f15 100644 --- a/qpid/concurrency.py +++ b/qpid/concurrency.py @@ -23,7 +23,7 @@ def synchronized(meth): args, vargs, kwargs, defs = inspect.getargspec(meth) scope = {} scope["meth"] = meth - exec """ + exec(""" def %s%s: %s %s._lock.acquire() @@ -35,7 +35,7 @@ def %s%s: repr(inspect.getdoc(meth)), args[0], inspect.formatargspec(args, vargs, kwargs, defs, formatvalue=lambda x: ""), - args[0]) in scope + args[0]), scope) return scope[meth.__name__] class Waiter(object): diff --git a/qpid/spec08.py b/qpid/spec08.py index a0047e71..b1d0242f 100644 --- a/qpid/spec08.py +++ b/qpid/spec08.py @@ -287,7 +287,7 @@ def define_method(self, name): if self.content: code += ", content" code += ")" - exec code in g, l + exec(code, g, l) return l[name] class Field(Metadata): From 37463700f806ed70561ba9a0d143278599b145c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 22:02:13 +0200 Subject: [PATCH 09/50] QPID-8631: modernize the `try: except as:` blocks and `raise`s (#9) --- examples/api/drain | 2 +- examples/api/hello | 2 +- examples/api/hello_xml | 2 +- examples/api/server | 4 +-- examples/api/spout | 2 +- examples/reservations/common.py | 2 +- qpid/compat.py | 2 +- qpid/connection.py | 4 +-- qpid/connection08.py | 4 +-- qpid/delegates.py | 4 +-- qpid/framer.py | 6 ++-- qpid/managementdata.py | 4 +-- qpid/messaging/driver.py | 22 ++++++------ qpid/messaging/endpoints.py | 6 ++-- qpid/messaging/transports.py | 4 +-- qpid/peer.py | 12 +++---- qpid/queue.py | 2 +- qpid/reference.py | 2 +- qpid/saslmech/finder.py | 2 +- qpid/selector.py | 8 ++--- qpid/spec08.py | 2 +- qpid/testlib.py | 8 ++--- qpid/tests/connection.py | 2 +- qpid/tests/messaging/__init__.py | 2 +- qpid/tests/messaging/address.py | 4 +-- qpid/tests/messaging/endpoints.py | 34 +++++++++--------- qpid/tests/messaging/implementation.py | 2 +- qpid/tests/messaging/message.py | 2 +- qpid/tests/messaging/selector.py | 2 +- qpid/tests/parser.py | 2 +- qpid/util.py | 2 +- qpid_tests/broker_0_10/alternate_exchange.py | 8 ++--- qpid_tests/broker_0_10/dtx.py | 32 ++++++++--------- qpid_tests/broker_0_10/exchange.py | 22 ++++++------ qpid_tests/broker_0_10/extensions.py | 4 +-- qpid_tests/broker_0_10/message.py | 14 ++++---- qpid_tests/broker_0_10/new_api.py | 2 +- qpid_tests/broker_0_10/queue.py | 38 ++++++++++---------- qpid_tests/broker_0_8/basic.py | 10 +++--- qpid_tests/broker_0_8/broker.py | 4 +-- qpid_tests/broker_0_8/exchange.py | 10 +++--- qpid_tests/broker_0_8/queue.py | 24 ++++++------- qpid_tests/broker_0_9/queue.py | 2 +- qpid_tests/broker_1_0/general.py | 2 +- setup.py | 20 +++++------ 45 files changed, 173 insertions(+), 177 deletions(-) diff --git a/examples/api/drain b/examples/api/drain index 5e30153b..97f644d0 100755 --- a/examples/api/drain +++ b/examples/api/drain @@ -89,7 +89,7 @@ try: ssn.acknowledge() except Empty: break -except ReceiverError, e: +except ReceiverError as e: print e except KeyboardInterrupt: pass diff --git a/examples/api/hello b/examples/api/hello index ad314da1..65b0edda 100755 --- a/examples/api/hello +++ b/examples/api/hello @@ -46,7 +46,7 @@ try: print message.content session.acknowledge() -except MessagingError,m: +except MessagingError as m: print m connection.close() diff --git a/examples/api/hello_xml b/examples/api/hello_xml index ab567ec5..addeaef9 100755 --- a/examples/api/hello_xml +++ b/examples/api/hello_xml @@ -71,7 +71,7 @@ try: print message.content session.acknowledge() -except MessagingError,m: +except MessagingError as m: print m connection.close() diff --git a/examples/api/server b/examples/api/server index 78d812bf..23734cb9 100755 --- a/examples/api/server +++ b/examples/api/server @@ -82,12 +82,12 @@ try: try: snd = ssn.sender(msg.reply_to) snd.send(response) - except SendError, e: + except SendError as e: print e if snd is not None: snd.close() ssn.acknowledge() -except ReceiverError, e: +except ReceiverError as e: print e except KeyboardInterrupt: pass diff --git a/examples/api/spout b/examples/api/spout index 6584b853..c1b16226 100755 --- a/examples/api/spout +++ b/examples/api/spout @@ -125,7 +125,7 @@ try: snd.send(msg) count += 1 print msg -except SendError, e: +except SendError as e: print e except KeyboardInterrupt: pass diff --git a/examples/reservations/common.py b/examples/reservations/common.py index 12f07e1c..7602fe1f 100644 --- a/examples/reservations/common.py +++ b/examples/reservations/common.py @@ -60,7 +60,7 @@ def run(self, session): try: snd = session.sender(to) snd.send(r) - except SendError, e: + except SendError as e: print e finally: snd.close() diff --git a/qpid/compat.py b/qpid/compat.py index 89e37879..edd604ce 100644 --- a/qpid/compat.py +++ b/qpid/compat.py @@ -126,7 +126,7 @@ def wait(self, timeout=None): try: ready, _, _ = select([self], [], [], timeout) break - except SelectError, e: + except SelectError as e: if e[0] == errno.EINTR: elapsed = time.time() - start timeout = timeout - elapsed diff --git a/qpid/connection.py b/qpid/connection.py index 2ab870b2..4bc9d9d3 100644 --- a/qpid/connection.py +++ b/qpid/connection.py @@ -182,7 +182,7 @@ def run(self): break else: continue - except socket.error, e: + except socket.error as e: if self.aborted() or str(e) != "The read operation timed out": self.close_code = (None, str(e)) self.detach_all() @@ -195,7 +195,7 @@ def run(self): for op in op_dec.read(): try: self.delegate.received(op) - except Closed, e: + except Closed as e: self.close_code = (None, str(e)) if not self.opened: self.failed = True diff --git a/qpid/connection08.py b/qpid/connection08.py index 54d7f88e..2c4fc914 100644 --- a/qpid/connection08.py +++ b/qpid/connection08.py @@ -63,7 +63,7 @@ def close(self): try: try: self.sock.shutdown(SHUT_RDWR) - except socket.error, e: + except socket.error as e: if (e.errno == errno.ENOTCONN): pass else: @@ -131,7 +131,7 @@ def connect(host, port, options = None): certfile=ssl_certfile, ca_certs=ssl_trustfile, cert_reqs=validate) - except ImportError, e: + except ImportError as e: # Python 2.5 and older if ssl_verify_hostname: log.error("Your version of Python does not support ssl hostname verification. Please upgrade your version of Python.") diff --git a/qpid/delegates.py b/qpid/delegates.py index 90183513..e231a851 100644 --- a/qpid/delegates.py +++ b/qpid/delegates.py @@ -188,7 +188,7 @@ def connection_start(self, ch, start): initial = None try: mech, initial = self.sasl.start(mech_list) - except Exception, e: + except Exception as e: raise Closed(str(e)) ch.connection_start_ok(client_properties=self.client_properties, mechanism=mech, response=initial) @@ -197,7 +197,7 @@ def connection_secure(self, ch, secure): resp = None try: resp = self.sasl.step(secure.challenge) - except Exception, e: + except Exception as e: raise Closed(str(e)) ch.connection_secure_ok(response=resp) diff --git a/qpid/framer.py b/qpid/framer.py index 08e17228..ff907e90 100644 --- a/qpid/framer.py +++ b/qpid/framer.py @@ -53,7 +53,7 @@ def flush(self): if self.security_layer_tx: try: cipher_buf = self.security_layer_tx.encode(self.tx_buf) - except SASLError, e: + except SASLError as e: raise Closed(str(e)) self._write(cipher_buf) else: @@ -96,14 +96,14 @@ def read(self, n): if self.security_layer_rx: try: s = self.security_layer_rx.decode(s) - except SASLError, e: + except SASLError as e: raise Closed(str(e)) except socket.timeout: if self.aborted(): raise Closed() else: continue - except socket.error, e: + except socket.error as e: if self.rx_buf != "": raise e else: diff --git a/qpid/managementdata.py b/qpid/managementdata.py index 61cb10c1..66a39c6b 100644 --- a/qpid/managementdata.py +++ b/qpid/managementdata.py @@ -645,7 +645,7 @@ def schemaTable (self, className): titles = ("Argument", "Type", "Direction", "Unit", "Notes", "Description") self.disp.table (caption, titles, rows) - except Exception,e: + except Exception as e: pass self.lock.release () @@ -686,7 +686,7 @@ def callMethod (self, userOid, methodName, args): self.methodSeq = self.methodSeq + 1 self.methodsPending[self.methodSeq] = methodName - except Exception, e: + except Exception as e: methodOk = False self.lock.release () if methodOk: diff --git a/qpid/messaging/driver.py b/qpid/messaging/driver.py index 46921444..7f72e0df 100644 --- a/qpid/messaging/driver.py +++ b/qpid/messaging/driver.py @@ -454,7 +454,7 @@ def readable(self): self._check_retry_ok() else: self.close_engine() - except socket.error, e: + except socket.error as e: self.close_engine(ConnectionError(text=str(e))) self.update_status() @@ -519,7 +519,7 @@ def writeable(self): if n == 0: return sent = self.engine.read(n) rawlog.debug("SENT[%s]: %r", self.log_id, sent) - except socket.error, e: + except socket.error as e: self.close_engine(e) notify = True @@ -551,10 +551,10 @@ def dispatch(self): self.connect() elif self.engine is not None: self.engine.dispatch() - except HeartbeatTimeout, e: + except HeartbeatTimeout as e: log.warn("Heartbeat timeout") self.close_engine(e) - except ContentError, e: + except ContentError as e: msg = compat.format_exc() self.connection.error = ContentError(text=msg) except: @@ -580,7 +580,7 @@ def connect(self): else: raise ConnectError("no such transport: %s" % self.connection.transport) self.schedule() - except socket.error, e: + except socket.error as e: self.close_engine(ConnectError(text=str(e))) DEFAULT_DISPOSITION = Disposition(None) @@ -696,7 +696,7 @@ def write(self, data): opslog.debug("RCVD[%s]: %r", self.log_id, op) op.dispatch(self) self.dispatch() - except MessagingError, e: + except MessagingError as e: self.close(e) except: self.close(InternalError(text=compat.format_exc())) @@ -759,7 +759,7 @@ def do_connection_start(self, start): mechs = start.mechanisms try: mech, initial = self._sasl.start(" ".join(mechs)) - except sasl.SASLError, e: + except sasl.SASLError as e: if "ANONYMOUS" not in mechs and self.connection.username is None: _text="Anonymous connections disabled, missing credentials" else: @@ -995,9 +995,9 @@ def parse_address(self, lnk, dir, addr): xdeclare['auto-delete'] = "True" if 'exclusive' not in xdeclare: xdeclare['exclusive'] = "True" - except address.LexError, e: + except address.LexError as e: return MalformedAddress(text=str(e)) - except address.ParseError, e: + except address.ParseError as e: return MalformedAddress(text=str(e)) def validate_options(self, lnk, dir): @@ -1369,7 +1369,7 @@ def send(self, snd, msg): enc, dec = get_codec(msg.content_type) try: body = enc(msg.content) - except AttributeError, e: + except AttributeError as e: # convert to non-blocking EncodeError raise EncodeError(e) @@ -1428,7 +1428,7 @@ def _decode(self, xfr): enc, dec = get_codec(mp.content_type) try: content = dec(xfr.payload) - except Exception, e: + except Exception as e: raise DecodeError(e) msg = Message(content) msg.id = mp.message_id diff --git a/qpid/messaging/endpoints.py b/qpid/messaging/endpoints.py index d24eb09c..a03749d5 100644 --- a/qpid/messaging/endpoints.py +++ b/qpid/messaging/endpoints.py @@ -671,7 +671,7 @@ def sender(self, target, **options): self._wakeup() try: sender._ewait(lambda: sender.linked) - except LinkError, e: + except LinkError as e: sender.close() raise e return sender @@ -695,7 +695,7 @@ def receiver(self, source, **options): self._wakeup() try: receiver._ewait(lambda: receiver.linked) - except LinkError, e: + except LinkError as e: receiver.close() raise e return receiver @@ -825,7 +825,7 @@ def commit(self, timeout=None): raise Timeout("commit timed out") except TransactionError: raise - except Exception, e: + except Exception as e: self.error = TransactionAborted(text="Transaction aborted: %s"%e) raise self.error if self.aborted: diff --git a/qpid/messaging/transports.py b/qpid/messaging/transports.py index c4e7c683..0b2334e6 100644 --- a/qpid/messaging/transports.py +++ b/qpid/messaging/transports.py @@ -149,7 +149,7 @@ def send(self, bytes): n = self.tls.write( self.write_retry ) self.write_retry = None return n - except SSLError, e: + except SSLError as e: if self._update_state(e.args[0]): # will retry on next invokation return 0 @@ -163,7 +163,7 @@ def recv(self, n): self._clear_state() try: return self.tls.read(n) - except SSLError, e: + except SSLError as e: if self._update_state(e.args[0]): # will retry later: return None diff --git a/qpid/peer.py b/qpid/peer.py index 2ff25c0b..0eee9ccc 100644 --- a/qpid/peer.py +++ b/qpid/peer.py @@ -104,12 +104,12 @@ def reader(self): while True: try: frame = self.conn.read() - except EOF, e: + except EOF as e: self.work.close("Connection lost") break ch = self.channel(frame.channel) ch.receive(frame, self.work) - except VersionError, e: + except VersionError as e: self.closed(e) except: self.fatal() @@ -129,7 +129,7 @@ def writer(self): try: message = self.outgoing.get() self.conn.write(message) - except socket.error, e: + except socket.error as e: self.closed(e) break self.conn.flush() @@ -150,7 +150,7 @@ def worker(self): content = None self.delegate(channel, Message(channel, frame, content)) - except QueueClosed, e: + except QueueClosed as e: self.closed(str(e) or "worker closed") except: self.fatal() @@ -339,7 +339,7 @@ def invoke_reliable(self, frame, content = None): return Message(self, resp, read_content(self.responses)) else: return Message(self, resp) - except QueueClosed, e: + except QueueClosed as e: if self._closed: raise Closed(self.reason) else: @@ -396,7 +396,7 @@ def invoke_method(self, frame, content = None): raise Closed(self.reason) if not completed: self.closed("Timed-out waiting for completion of %s" % frame) - except QueueClosed, e: + except QueueClosed as e: if self._closed: raise Closed(self.reason) else: diff --git a/qpid/queue.py b/qpid/queue.py index 100bb0bd..af7ee20b 100644 --- a/qpid/queue.py +++ b/qpid/queue.py @@ -83,7 +83,7 @@ def run(self): o = self.get() if o == Queue.STOP: break self.listener(o) - except Closed, e: + except Closed as e: if self.exc_listener is not None: self.exc_listener(e) break diff --git a/qpid/reference.py b/qpid/reference.py index 48ecb676..1f1d7614 100644 --- a/qpid/reference.py +++ b/qpid/reference.py @@ -71,7 +71,7 @@ def get_complete(self): def next(self): try: return self.get_chunk() - except Closed, e: + except Closed as e: raise StopIteration def __iter__(self): diff --git a/qpid/saslmech/finder.py b/qpid/saslmech/finder.py index 1dda9ec4..975e79a7 100644 --- a/qpid/saslmech/finder.py +++ b/qpid/saslmech/finder.py @@ -41,7 +41,7 @@ def get_sasl_mechanism(mechanismNames, username, password, namespace="qpid.saslm instances.append(instance) else: log.debug("SASL mechanism %s unavailable as the prerequistes for this mechanism have not been met", mechanismName) - except (ImportError, AttributeError), e: + except (ImportError, AttributeError) as e: # Unknown mechanism - this is normal if the server supports mechanism that the client does not log.debug("Could not load implementation for %s", canonicalName) pass diff --git a/qpid/selector.py b/qpid/selector.py index a67f0aea..f0f66c83 100644 --- a/qpid/selector.py +++ b/qpid/selector.py @@ -151,7 +151,7 @@ def run(self): timeout = max(0, wakeup - time.time()) rd, wr, ex = select(self.reading, self.writing, (), timeout) break - except SelectError, e: + except SelectError as e: # Repeat the select call if we were interrupted. if e[0] == errno.EINTR: continue @@ -172,7 +172,7 @@ def run(self): w = sel.timing() if w is not None and now > w: sel.timeout() - except Exception, e: + except Exception as e: log.error("qpid.messaging thread died: %s" % e) self.exception = SelectorStopped(str(e)) self.exception = self.exception or self.stopped @@ -198,11 +198,11 @@ def dead(self, e): disable(l, self.exception) disable(ssn, self.exception) disable(c, self.exception) - except Exception, e: + except Exception as e: log.error("error stopping qpid.messaging (%s)\n%s", self.exception, format_exc()) try: self.waiter.close() - except Exception, e: + except Exception as e: log.error("error stopping qpid.messaging (%s)\n%s", self.exception, format_exc()) # Disable an object to avoid hangs due to forked mutex locks or a stopped selector thread diff --git a/qpid/spec08.py b/qpid/spec08.py index b1d0242f..3a6f0ce0 100644 --- a/qpid/spec08.py +++ b/qpid/spec08.py @@ -372,7 +372,7 @@ def load(specfile, *errata): get_docs(nd)) try: spec.constants.add(const) - except ValueError, e: + except ValueError as e: pass #print "Warning:", e diff --git a/qpid/testlib.py b/qpid/testlib.py index 97dff14d..4022a7c1 100644 --- a/qpid/testlib.py +++ b/qpid/testlib.py @@ -93,12 +93,12 @@ def connect(self, host=None, port=None, user=None, password=None, tune_params=No client = qpid.client.Client(host, port) try: client.start(username = user, password=password, tune_params=tune_params, client_properties=client_properties, channel_options=channel_options) - except qpid.client.Closed, e: + except qpid.client.Closed as e: if isinstance(e.args[0], VersionError): raise Skipped(e.args[0]) else: raise e - except socket.error, e: + except socket.error as e: raise Skipped(e) return client @@ -230,7 +230,7 @@ def connect(self, host=None, port=None): default_port = self.DEFAULT_PORT try: sock = connect(host or url.host, port or url.port or default_port) - except socket.error, e: + except socket.error as e: raise Skipped(e) if url.scheme == URL.AMQPS: sock = ssl(sock) @@ -238,7 +238,7 @@ def connect(self, host=None, port=None): password=url.password or self.DEFAULT_PASSWORD) try: conn.start(timeout=10) - except VersionError, e: + except VersionError as e: raise Skipped(e) return conn diff --git a/qpid/tests/connection.py b/qpid/tests/connection.py index 6847285f..744a8be2 100644 --- a/qpid/tests/connection.py +++ b/qpid/tests/connection.py @@ -170,7 +170,7 @@ def testCloseGet(self): try: m = echos.get(timeout=10) assert False - except Closed, e: + except Closed as e: pass def testCloseListen(self): diff --git a/qpid/tests/messaging/__init__.py b/qpid/tests/messaging/__init__.py index e73c0587..dd86d9f1 100644 --- a/qpid/tests/messaging/__init__.py +++ b/qpid/tests/messaging/__init__.py @@ -47,7 +47,7 @@ def setup(self): try: self.conn = self.setup_connection() - except ConnectError, e: + except ConnectError as e: raise Skipped(e) self.ssn = self.setup_session() self.snd = self.setup_sender() diff --git a/qpid/tests/messaging/address.py b/qpid/tests/messaging/address.py index aa9562a7..a947ee7e 100644 --- a/qpid/tests/messaging/address.py +++ b/qpid/tests/messaging/address.py @@ -83,9 +83,9 @@ def call(self, parser, mode, input): try: from subprocess import Popen, PIPE, STDOUT po = Popen([parser, mode], stdin=PIPE, stdout=PIPE, stderr=STDOUT) - except ImportError, e: + except ImportError as e: raise Skipped("%s" % e) - except OSError, e: + except OSError as e: raise Skipped("%s: %s" % (e, parser)) out, _ = po.communicate(input=input) return out diff --git a/qpid/tests/messaging/endpoints.py b/qpid/tests/messaging/endpoints.py index ce2b4181..3c7df7ca 100644 --- a/qpid/tests/messaging/endpoints.py +++ b/qpid/tests/messaging/endpoints.py @@ -55,7 +55,7 @@ def testConnectError(self): # Specifying port 0 yields a bad address on Windows; port 4 is unassigned self.conn = Connection.establish("localhost:4") assert False, "connect succeeded" - except ConnectError, e: + except ConnectError as e: assert "refused" in str(e) def testGetError(self): @@ -63,7 +63,7 @@ def testGetError(self): try: self.conn.open() assert False, "connect succeeded" - except ConnectError, e: + except ConnectError as e: assert self.conn.get_error() == e def use_fds(self): @@ -71,7 +71,7 @@ def use_fds(self): try: while True: fds.append(os.open(getattr(os, "devnull", "/dev/null"), os.O_RDONLY)) - except OSError, e: + except OSError as e: if e.errno != errno.EMFILE: raise e else: @@ -103,7 +103,7 @@ def testOpenFailResourceLeaks(self): conn._lock.release() try: conn.open() - except ConnectError, e: + except ConnectError as e: pass finally: while fds: @@ -738,9 +738,9 @@ def fetchFromClosedTest(self, entry): try: msg = self.rcv.fetch(0) assert False, "unexpected result: %s" % msg - except Empty, e: + except Empty as e: assert False, "unexpected exception: %s" % e - except LinkClosed, e: + except LinkClosed as e: pass def testFetchFromClosedReceiver(self): @@ -761,9 +761,9 @@ def closer(): try: msg = self.rcv.fetch() assert False, "unexpected result: %s" % msg - except Empty, e: + except Empty as e: assert False, "unexpected exception: %s" % e - except LinkClosed, e: + except LinkClosed as e: pass t.join() @@ -971,13 +971,13 @@ def badOption(self, options, error): try: self.ssn.sender("test-bad-options-snd; %s" % options) assert False - except InvalidOption, e: + except InvalidOption as e: assert "error in options: %s" % error == str(e), e try: self.ssn.receiver("test-bad-options-rcv; %s" % options) assert False - except InvalidOption, e: + except InvalidOption as e: assert "error in options: %s" % error == str(e), e def testIllegalKey(self): @@ -1054,7 +1054,7 @@ def testDeleteBySender(self): snd.close() try: self.ssn.sender("test-delete") - except NotFound, e: + except NotFound as e: assert "no such queue" in str(e) def testDeleteByReceiver(self): @@ -1068,7 +1068,7 @@ def testDeleteByReceiver(self): try: self.ssn.receiver("test-delete") assert False - except NotFound, e: + except NotFound as e: assert "no such queue" in str(e) def testDeleteSpecial(self): @@ -1077,7 +1077,7 @@ def testDeleteSpecial(self): try: snd.close() assert False, "successfully deleted amq.topic" - except SessionError, e: + except SessionError as e: assert e.code == 530 # XXX: need to figure out close after error self.conn._remove_session(self.ssn) @@ -1230,9 +1230,9 @@ def testAssert1(self): try: snd = self.ssn.sender("amq.topic; {assert: always, node: {type: queue}}") assert 0, "assertion failed to trigger" - except AssertionFailed, e: + except AssertionFailed as e: pass - except NotFound, e: # queue named amp.topic not found + except NotFound as e: # queue named amp.topic not found pass def testAssert2(self): @@ -1254,14 +1254,14 @@ def senderErrorTest(self, addr, exc, check=lambda e: True): try: self.ssn.sender(addr, durable=self.durable()) assert False, "sender creation succeeded" - except exc, e: + except exc as e: assert check(e), "unexpected error: %s" % compat.format_exc(e) def receiverErrorTest(self, addr, exc, check=lambda e: True): try: self.ssn.receiver(addr) assert False, "receiver creation succeeded" - except exc, e: + except exc as e: assert check(e), "unexpected error: %s" % compat.format_exc(e) def testNoneTarget(self): diff --git a/qpid/tests/messaging/implementation.py b/qpid/tests/messaging/implementation.py index fce60c6f..553d06bb 100644 --- a/qpid/tests/messaging/implementation.py +++ b/qpid/tests/messaging/implementation.py @@ -21,7 +21,7 @@ try: from qpid_messaging import * from qpid.datatypes import uuid4 - except ImportError, e: + except ImportError as e: print "Swigged client not found. Falling back to pure bindings, %s\n" % e from qpid.messaging import * else: diff --git a/qpid/tests/messaging/message.py b/qpid/tests/messaging/message.py index bfdd2c79..76bb1031 100644 --- a/qpid/tests/messaging/message.py +++ b/qpid/tests/messaging/message.py @@ -179,7 +179,7 @@ def testExceptionRaisedMismatchedContentType(self): self.snd.send(msg) self.rcv.fetch(0) assert False, "Exception not raised on mismatched content/content_type" - except Exception, e: + except Exception as e: pass def testRecoverAfterException(self): diff --git a/qpid/tests/messaging/selector.py b/qpid/tests/messaging/selector.py index 6a40faff..33328943 100644 --- a/qpid/tests/messaging/selector.py +++ b/qpid/tests/messaging/selector.py @@ -85,7 +85,7 @@ def test_use_after_fork(self): self.assertRaises(SelectorStopped, c.session) # But can't use parent connection s.send("child") os._exit(0) - except Exception, e: + except Exception as e: print >>sys.stderr, "test child process error: %s" % e os.exit(1) finally: diff --git a/qpid/tests/parser.py b/qpid/tests/parser.py index a4865cc9..d6e1067e 100644 --- a/qpid/tests/parser.py +++ b/qpid/tests/parser.py @@ -33,5 +33,5 @@ def invalid(self, addr, error=None): try: p = self.do_parse(addr) assert False, "invalid address parsed: %s" % p - except ParseError, e: + except ParseError as e: assert error == str(e), "expected %r, got %r" % (error, str(e)) diff --git a/qpid/util.py b/qpid/util.py index b17f13e6..285d8b53 100644 --- a/qpid/util.py +++ b/qpid/util.py @@ -76,7 +76,7 @@ def connect(host, port): try: sock.connect(sa) break - except socket.error, msg: + except socket.error as msg: sock.close() else: # If we got here then we couldn't connect (yet) diff --git a/qpid_tests/broker_0_10/alternate_exchange.py b/qpid_tests/broker_0_10/alternate_exchange.py index 2e2d5de1..4d522c8c 100644 --- a/qpid_tests/broker_0_10/alternate_exchange.py +++ b/qpid_tests/broker_0_10/alternate_exchange.py @@ -110,7 +110,7 @@ def test_delete_while_used_by_queue(self): try: session2.exchange_delete(exchange="alternate") self.fail("Expected deletion of in-use alternate-exchange to fail") - except SessionException, e: + except SessionException as e: session = self.session session.queue_delete(queue="q") session.exchange_delete(exchange="alternate") @@ -130,7 +130,7 @@ def test_delete_while_used_by_exchange(self): try: session.exchange_delete(exchange="alternate") self.fail("Expected deletion of in-use alternate-exchange to fail") - except SessionException, e: + except SessionException as e: session = self.session session.exchange_delete(exchange="e") session.exchange_delete(exchange="alternate") @@ -150,7 +150,7 @@ def test_modify_existing_exchange_alternate(self): # attempt to change the alternate on an already existing exchange session.exchange_declare(exchange="onealternate", type="fanout", alternate_exchange="alt2") self.fail("Expected changing an alternate on an existing exchange to fail") - except SessionException, e: + except SessionException as e: self.assertEquals(530, e.args[0].error_code) session = self.conn.session("alternate", 2) session.exchange_delete(exchange="onealternate") @@ -170,7 +170,7 @@ def test_add_alternate_to_exchange(self): # attempt to add an alternate on an already existing exchange session.exchange_declare(exchange="noalternate", type="fanout", alternate_exchange="alt1") self.fail("Expected adding an alternate on an existing exchange to fail") - except SessionException, e: + except SessionException as e: self.assertEquals(530, e.args[0].error_code) session = self.conn.session("alternate", 2) session.exchange_delete(exchange="noalternate") diff --git a/qpid_tests/broker_0_10/dtx.py b/qpid_tests/broker_0_10/dtx.py index a9619bcd..b2cbe8a3 100644 --- a/qpid_tests/broker_0_10/dtx.py +++ b/qpid_tests/broker_0_10/dtx.py @@ -162,7 +162,7 @@ def test_select_required(self): session.dtx_end(xid=tx) session.dtx_rollback(xid=tx) self.fail("Session not selected for use with dtx, expected exception!") - except SessionException, e: + except SessionException as e: self.assertEquals(503, e.args[0].error_code) def test_start_already_known(self): @@ -187,7 +187,7 @@ def test_start_already_known(self): failed = False try: session2.dtx_start(xid=tx) - except SessionException, e: + except SessionException as e: failed = True error = e @@ -233,7 +233,7 @@ def test_start_join_and_resume(self): session.dtx_end(xid=tx) session.dtx_rollback(xid=tx) self.fail("Join and resume both set, expected exception!") - except SessionException, e: + except SessionException as e: self.assertEquals(503, e.args[0].error_code) def test_start_join(self): @@ -353,7 +353,7 @@ def test_end_suspend_and_fail(self): try: session.dtx_end(xid=tx, suspend=True, fail=True) self.fail("Suspend and fail both set, expected exception!") - except SessionException, e: + except SessionException as e: self.assertEquals(503, e.args[0].error_code) #cleanup @@ -376,7 +376,7 @@ def test_end_unknown_xid(self): try: session.dtx_end(xid=tx) self.fail("Attempted to end association with unknown xid, expected exception!") - except SessionException, e: + except SessionException as e: self.assertEquals(409, e.args[0].error_code) def test_end(self): @@ -431,7 +431,7 @@ def test_invalid_commit_one_phase_true(self): failed = False try: tester.dtx_commit(xid=tx, one_phase=True) - except SessionException, e: + except SessionException as e: failed = True error = e @@ -459,7 +459,7 @@ def test_invalid_commit_one_phase_false(self): failed = False try: tester.dtx_commit(xid=tx, one_phase=False) - except SessionException, e: + except SessionException as e: failed = True error = e @@ -486,7 +486,7 @@ def test_invalid_commit_not_ended(self): failed = False try: tester.dtx_commit(xid=tx, one_phase=False) - except SessionException, e: + except SessionException as e: failed = True error = e @@ -514,7 +514,7 @@ def test_invalid_rollback_not_ended(self): failed = False try: tester.dtx_rollback(xid=tx) - except SessionException, e: + except SessionException as e: failed = True error = e @@ -543,7 +543,7 @@ def test_invalid_prepare_not_ended(self): failed = False try: tester.dtx_prepare(xid=tx) - except SessionException, e: + except SessionException as e: failed = True error = e @@ -641,7 +641,7 @@ def test_set_timeout_too_high(self): session.dtx_start(xid=tx) try: session.dtx_set_timeout(xid=tx, timeout=3601) - except SessionException, e: + except SessionException as e: self.assertEquals(542, e.args[0].error_code) @@ -690,35 +690,35 @@ def test_bad_resume(self): session = self.session try: session.dtx_start(resume=True) - except SessionException, e: + except SessionException as e: self.assertEquals(503, e.args[0].error_code) def test_prepare_unknown(self): session = self.session try: session.dtx_prepare(xid=self.xid("unknown")) - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) def test_commit_unknown(self): session = self.session try: session.dtx_commit(xid=self.xid("unknown")) - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) def test_rollback_unknown(self): session = self.session try: session.dtx_rollback(xid=self.xid("unknown")) - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) def test_get_timeout_unknown(self): session = self.session try: session.dtx_get_timeout(xid=self.xid("unknown")) - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) def xid(self, txid): diff --git a/qpid_tests/broker_0_10/exchange.py b/qpid_tests/broker_0_10/exchange.py index 916f9d8b..350b96f8 100644 --- a/qpid_tests/broker_0_10/exchange.py +++ b/qpid_tests/broker_0_10/exchange.py @@ -299,7 +299,7 @@ def template(self, reservedString, exchangeType): try: self.session.exchange_declare(exchange=reservedString, type=exchangeType) self.fail("Expected not allowed error (530) for exchanges starting with \"" + reservedString + "\".") - except SessionException, e: + except SessionException as e: self.assertEquals(e.args[0].error_code, 530) # connection closed, reopen it self.tearDown() @@ -307,7 +307,7 @@ def template(self, reservedString, exchangeType): try: self.session.exchange_declare(exchange=reservedString + "abc123", type=exchangeType) self.fail("Expected not allowed error (530) for exchanges starting with \"" + reservedString + "\".") - except SessionException, e: + except SessionException as e: self.assertEquals(e.args[0].error_code, 530) # connection closed, reopen it self.tearDown() @@ -363,7 +363,7 @@ def test(self): try: self.session.exchange_declare(exchange="humpty_dumpty", passive=True) self.fail("Expected 404 for passive declaration of unknown exchange.") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) @@ -472,7 +472,7 @@ def testTypeNotKnown(self): try: self.session.exchange_declare(exchange="test_type_not_known_exchange", type="invalid_type") self.fail("Expected 404 for declaration of unknown exchange type.") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) def testDifferentDeclaredType(self): @@ -481,7 +481,7 @@ def testDifferentDeclaredType(self): session = self.conn.session("alternate", 2) session.exchange_declare(exchange="test_different_declared_type_exchange", type="topic") self.fail("Expected 530 for redeclaration of exchange with different type.") - except SessionException, e: + except SessionException as e: self.assertEquals(530, e.args[0].error_code) def testReservedExchangeRedeclaredSameType(self): @@ -491,7 +491,7 @@ def testReservedExchangeRedeclaredDifferentType(self): try: self.exchange_declare(exchange="amq.direct", type="topic") self.fail("Expected 530 for redeclaration of exchange with different type.") - except SessionException, e: + except SessionException as e: self.assertEquals(530, e.args[0].error_code) def testDefaultAccessBind(self): @@ -499,7 +499,7 @@ def testDefaultAccessBind(self): self.session.queue_declare(queue="my-queue", auto_delete=True, exclusive=True) self.session.exchange_bind(exchange="", queue="my-queue", binding_key="another-key") self.fail("Expected 542 (invalid-argument) code for bind to default exchange.") - except SessionException, e: + except SessionException as e: self.assertEquals(542, e.args[0].error_code) def testDefaultAccessUnbind(self): @@ -507,14 +507,14 @@ def testDefaultAccessUnbind(self): self.session.queue_declare(queue="my-queue", auto_delete=True, exclusive=True) self.session.exchange_unbind(exchange="", queue="my-queue", binding_key="my-queue") self.fail("Expected 542 (invalid-argument) code for unbind from default exchange.") - except SessionException, e: + except SessionException as e: self.assertEquals(542, e.args[0].error_code) def testDefaultAccessDelete(self): try: self.session.exchange_delete(exchange="") self.fail("Expected 542 (invalid-argument) code for delete of default exchange.") - except SessionException, e: + except SessionException as e: self.assertEquals(542, e.args[0].error_code) class ExchangeTests(TestHelper): @@ -523,7 +523,7 @@ def testHeadersBindNoMatchArg(self): try: self.session.exchange_bind(queue="q", exchange="amq.match", arguments={"name":"fred" , "age":3} ) self.fail("Expected failure for missing x-match arg.") - except SessionException, e: + except SessionException as e: self.assertEquals(541, e.args[0].error_code) class AutodeleteTests(TestHelper, StandardExchangeVerifier): @@ -533,7 +533,7 @@ def checkNotExists(self, e): s.exchange_declare(exchange=e, passive=True) s.exchange_delete(exchange=e) self.fail("Expected failure for passive declare of %s" % e) - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) diff --git a/qpid_tests/broker_0_10/extensions.py b/qpid_tests/broker_0_10/extensions.py index 50c0aa3d..944a8690 100644 --- a/qpid_tests/broker_0_10/extensions.py +++ b/qpid_tests/broker_0_10/extensions.py @@ -43,7 +43,7 @@ def valid_policy_args(self, args, name="test-queue"): try: self.session.queue_declare(queue=name, arguments=args) self.session.queue_delete(queue=name) # cleanup - except SessionException, e: + except SessionException as e: self.fail("declare with valid policy args failed: %s" % (args)) self.session = self.conn.session("replacement", 2) @@ -56,7 +56,7 @@ def invalid_policy_args(self, args, name="test-queue"): self.session.queue_declare(queue=name, arguments=args) self.session.queue_delete(queue=name) # cleanup self.fail("declare with invalid policy args suceeded: %s (iteration %d)" % (args, i)) - except SessionException, e: + except SessionException as e: self.session = self.conn.session(str(uuid4())) def test_policy_max_size_as_valid_string(self): diff --git a/qpid_tests/broker_0_10/message.py b/qpid_tests/broker_0_10/message.py index 48141682..42ab0713 100644 --- a/qpid_tests/broker_0_10/message.py +++ b/qpid_tests/broker_0_10/message.py @@ -166,7 +166,7 @@ def test_consume_exclusive(self): try: session.message_subscribe(destination="second", queue="test-queue-2") self.fail("Expected consume request to fail due to previous exclusive consumer") - except SessionException, e: + except SessionException as e: self.assertEquals(405, e.args[0].error_code) def test_consume_exclusive2(self): @@ -179,7 +179,7 @@ def test_consume_exclusive2(self): try: session.message_subscribe(destination="second", queue="test-queue-2", exclusive=True) self.fail("Expected exclusive consume request to fail due to previous consumer") - except SessionException, e: + except SessionException as e: self.assertEquals(405, e.args[0].error_code) def test_consume_queue_not_found(self): @@ -191,7 +191,7 @@ def test_consume_queue_not_found(self): #queue specified but doesn't exist: session.message_subscribe(queue="invalid-queue", destination="a") self.fail("Expected failure when consuming from non-existent queue") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) def test_consume_queue_not_specified(self): @@ -200,7 +200,7 @@ def test_consume_queue_not_specified(self): #queue not specified and none previously declared for channel: session.message_subscribe(destination="a") self.fail("Expected failure when consuming from unspecified queue") - except SessionException, e: + except SessionException as e: self.assertEquals(531, e.args[0].error_code) def test_consume_unique_consumers(self): @@ -216,7 +216,7 @@ def test_consume_unique_consumers(self): try: session.message_subscribe(destination="first", queue="test-queue-3") self.fail("Expected consume request to fail due to non-unique tag") - except SessionException, e: + except SessionException as e: self.assertEquals(530, e.args[0].error_code) def test_cancel(self): @@ -249,14 +249,14 @@ def test_cancel(self): try: session.message_cancel(destination="my-consumer") self.fail("Expected 404 for recancellation of subscription.") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) session = self.conn.session("alternate-session", timeout=10) try: session.message_cancel(destination="this-never-existed") self.fail("Expected 404 for cancellation of unknown subscription.") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) diff --git a/qpid_tests/broker_0_10/new_api.py b/qpid_tests/broker_0_10/new_api.py index 4e943951..a2d724f6 100644 --- a/qpid_tests/broker_0_10/new_api.py +++ b/qpid_tests/broker_0_10/new_api.py @@ -54,7 +54,7 @@ def test_not_found(self): try: ssn.receiver("does-not-exist") self.fail("Expected non-existent node to cause NotFound exception") - except NotFound, e: None + except NotFound as e: None def test_qpid_3481_acquired_to_alt_exchange(self): """ diff --git a/qpid_tests/broker_0_10/queue.py b/qpid_tests/broker_0_10/queue.py index 132bd7b9..68fe854a 100644 --- a/qpid_tests/broker_0_10/queue.py +++ b/qpid_tests/broker_0_10/queue.py @@ -65,7 +65,7 @@ def test_purge_queue_exists(self): #queue specified but doesn't exist: session.queue_purge(queue="invalid-queue") self.fail("Expected failure when purging non-existent queue") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) #not-found def test_purge_empty_name(self): @@ -78,7 +78,7 @@ def test_purge_empty_name(self): #queue not specified and none previously declared for channel: session.queue_purge() self.fail("Expected failure when purging unspecified queue") - except SessionException, e: + except SessionException as e: self.assertEquals(531, e.args[0].error_code) #illegal-argument def test_declare_exclusive(self): @@ -97,7 +97,7 @@ def test_declare_exclusive(self): #other connection should not be allowed to declare this: s2.queue_declare(queue="exclusive-queue", exclusive=True, auto_delete=True) self.fail("Expected second exclusive queue_declare to raise a channel exception") - except SessionException, e: + except SessionException as e: self.assertEquals(405, e.args[0].error_code) s3 = self.conn.session("subscriber") @@ -105,7 +105,7 @@ def test_declare_exclusive(self): #other connection should not be allowed to declare this: s3.message_subscribe(queue="exclusive-queue") self.fail("Expected message_subscribe on an exclusive queue to raise a channel exception") - except SessionException, e: + except SessionException as e: self.assertEquals(405, e.args[0].error_code) s4 = self.conn.session("deleter") @@ -113,7 +113,7 @@ def test_declare_exclusive(self): #other connection should not be allowed to declare this: s4.queue_delete(queue="exclusive-queue") self.fail("Expected queue_delete on an exclusive queue to raise a channel exception") - except SessionException, e: + except SessionException as e: self.assertEquals(405, e.args[0].error_code) s5 = self.conn.session("binder") @@ -121,7 +121,7 @@ def test_declare_exclusive(self): #other connection should not be allowed to declare this: s5.exchange_bind(exchange="amq.direct", queue="exclusive-queue", binding_key="abc") self.fail("Expected exchange_bind on an exclusive queue to raise an exception") - except SessionException, e: + except SessionException as e: self.assertEquals(405, e.args[0].error_code) s6 = self.conn.session("unbinder") @@ -129,7 +129,7 @@ def test_declare_exclusive(self): #other connection should not be allowed to declare this: s6.exchange_unbind(exchange="amq.fanout", queue="exclusive-queue") self.fail("Expected exchange_unbind on an exclusive queue to raise an exception") - except SessionException, e: + except SessionException as e: self.assertEquals(405, e.args[0].error_code) def test_declare_exclusive_alreadyinuse(self): @@ -148,7 +148,7 @@ def test_declare_exclusive_alreadyinuse(self): #other connection should not be allowed to declare this: s2.queue_declare(queue="a-queue", exclusive=True, auto_delete=True) self.fail("Expected request for exclusivity to fail") - except SessionException, e: + except SessionException as e: self.assertEquals(405, e.args[0].error_code) def test_declare_passive(self): @@ -175,7 +175,7 @@ def test_declare_passive_queue_not_found(self): try: s1.queue_declare(queue="passive-queue-not-found", passive=True) self.fail("Expected passive declaration of non-existent queue to raise a channel exception") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) #not-found @@ -198,7 +198,7 @@ def test_declare_passive_with_exclusive(self): try: s2.queue_declare(queue="passive-queue-nonexc", exclusive=True, passive=True) self.fail("Expected exclusive passive declaration of existing queue to raise a channel exception") - except SessionException, e: + except SessionException as e: self.assertEquals(405, e.args[0].error_code) # resource locked def test_bind(self): @@ -218,7 +218,7 @@ def test_bind(self): try: session.exchange_bind(queue="queue-1", exchange="an-invalid-exchange", binding_key="key1") self.fail("Expected bind to non-existant exchange to fail") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) @@ -228,7 +228,7 @@ def test_bind_queue_existence(self): try: session.exchange_bind(queue="queue-2", exchange="amq.direct", binding_key="key1") self.fail("Expected bind of non-existant queue to fail") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) def test_unbind_direct(self): @@ -312,7 +312,7 @@ def test_delete_simple(self): try: session.queue_declare(queue="delete-me", passive=True) self.fail("Queue has not been deleted") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) def test_delete_queue_exists(self): @@ -324,7 +324,7 @@ def test_delete_queue_exists(self): try: session.queue_delete(queue="i-dont-exist", if_empty=True) self.fail("Expected delete of non-existant queue to fail") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) @@ -344,7 +344,7 @@ def test_delete_ifempty(self): try: session.queue_delete(queue="delete-me-2", if_empty=True) self.fail("Expected delete if_empty to fail for non-empty queue") - except SessionException, e: + except SessionException as e: self.assertEquals(406, e.args[0].error_code) #need new session now: @@ -367,7 +367,7 @@ def test_delete_ifempty(self): try: session.queue_declare(queue="delete-me-2", passive=True) self.fail("Queue has not been deleted") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) def test_delete_ifunused(self): @@ -388,7 +388,7 @@ def test_delete_ifunused(self): try: session2.queue_delete(queue="delete-me-3", if_unused=True) self.fail("Expected delete if_unused to fail for queue with existing consumer") - except SessionException, e: + except SessionException as e: self.assertEquals(406, e.args[0].error_code) session.message_cancel(destination="consumer_tag") @@ -397,7 +397,7 @@ def test_delete_ifunused(self): try: session.queue_declare(queue="delete-me-3", passive=True) self.fail("Queue has not been deleted") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) @@ -430,7 +430,7 @@ def test_autodelete_shared(self): try: session.queue_declare(queue="auto-delete-me", passive=True) self.fail("Expected queue to have been deleted") - except SessionException, e: + except SessionException as e: self.assertEquals(404, e.args[0].error_code) diff --git a/qpid_tests/broker_0_8/basic.py b/qpid_tests/broker_0_8/basic.py index 9457897a..04b364cb 100644 --- a/qpid_tests/broker_0_8/basic.py +++ b/qpid_tests/broker_0_8/basic.py @@ -64,7 +64,7 @@ def test_consume_exclusive(self): try: channel.basic_consume(consumer_tag="second", queue="test-queue-2") self.fail("Expected consume request to fail due to previous exclusive consumer") - except Closed, e: + except Closed as e: self.assertChannelException(403, e.args[0]) #open new channel and cleanup last consumer: @@ -76,7 +76,7 @@ def test_consume_exclusive(self): try: channel.basic_consume(consumer_tag="second", queue="test-queue-2", exclusive=True) self.fail("Expected exclusive consume request to fail due to previous consumer") - except Closed, e: + except Closed as e: self.assertChannelException(403, e.args[0]) def test_reconnect_to_durable_subscription(self): @@ -133,7 +133,7 @@ def test_consume_queue_errors(self): #queue specified but doesn't exist: channel.basic_consume(queue="invalid-queue") self.fail("Expected failure when consuming from non-existent queue") - except Closed, e: + except Closed as e: self.assertChannelException(404, e.args[0]) channel = self.client.channel(2) @@ -142,7 +142,7 @@ def test_consume_queue_errors(self): #queue not specified and none previously declared for channel: channel.basic_consume(queue="") self.fail("Expected failure when consuming from unspecified queue") - except Closed, e: + except Closed as e: self.assertConnectionException(530, e.args[0]) def test_consume_unique_consumers(self): @@ -158,7 +158,7 @@ def test_consume_unique_consumers(self): try: channel.basic_consume(consumer_tag="first", queue="test-queue-3") self.fail("Expected consume request to fail due to non-unique tag") - except Closed, e: + except Closed as e: self.assertConnectionException(530, e.args[0]) def test_cancel(self): diff --git a/qpid_tests/broker_0_8/broker.py b/qpid_tests/broker_0_8/broker.py index 1948a139..b281c729 100644 --- a/qpid_tests/broker_0_8/broker.py +++ b/qpid_tests/broker_0_8/broker.py @@ -89,7 +89,7 @@ def test_invalid_channel(self): try: channel.queue_declare(exclusive=True) self.fail("Expected error on queue_declare for invalid channel") - except Closed, e: + except Closed as e: self.assertConnectionException(504, e.args[0]) def test_closed_channel(self): @@ -99,7 +99,7 @@ def test_closed_channel(self): try: channel.queue_declare(exclusive=True) self.fail("Expected error on queue_declare for closed channel") - except Closed, e: + except Closed as e: self.assertConnectionException(504, e.args[0]) def test_channel_flow(self): diff --git a/qpid_tests/broker_0_8/exchange.py b/qpid_tests/broker_0_8/exchange.py index 8d610a79..3c7b493a 100644 --- a/qpid_tests/broker_0_8/exchange.py +++ b/qpid_tests/broker_0_8/exchange.py @@ -221,7 +221,7 @@ def test(self): try: self.channel.exchange_declare(exchange="humpty_dumpty", passive=True) self.fail("Expected 404 for passive declaration of unknown exchange.") - except Closed, e: + except Closed as e: self.assertChannelException(404, e.args[0]) @@ -313,7 +313,7 @@ def testTypeNotKnown(self): try: self.channel.exchange_declare(exchange="test_type_not_known_exchange", type="invalid_type") self.fail("Expected 503 for declaration of unknown exchange type.") - except Closed, e: + except Closed as e: self.assertConnectionException(503, e.args[0]) def testDifferentDeclaredType(self): @@ -321,7 +321,7 @@ def testDifferentDeclaredType(self): try: self.channel.exchange_declare(exchange="test_different_declared_type_exchange", type="topic") self.fail("Expected 530 for redeclaration of exchange with different type.") - except Closed, e: + except Closed as e: self.assertConnectionException(530, e.args[0]) #cleanup other = self.connect() @@ -337,13 +337,13 @@ def testReservedExchangeNameRedeclaredDifferentType(self): try: self.channel.exchange_declare(exchange="amq.direct", type="topic", passive=False) self.fail("Expected 530 for redeclaration of exchange with different type.") - except Closed, e: + except Closed as e: self.assertConnectionException(530, e.args[0]) def testReservedExchangeNameDisallowed(self): try: self.channel.exchange_declare(exchange="amq.myexch", type="direct", passive=False) self.fail("Expected 530 for redeclaration of exchange with different type.") - except Closed, e: + except Closed as e: self.assertConnectionException(530, e.args[0]) diff --git a/qpid_tests/broker_0_8/queue.py b/qpid_tests/broker_0_8/queue.py index 32e087bf..a354d062 100644 --- a/qpid_tests/broker_0_8/queue.py +++ b/qpid_tests/broker_0_8/queue.py @@ -61,7 +61,7 @@ def test_purge(self): #queue specified but doesn't exist: channel.queue_purge(queue="invalid-queue") self.fail("Expected failure when purging non-existent queue") - except Closed, e: + except Closed as e: self.assertChannelException(404, e.args[0]) channel = self.client.channel(3) @@ -70,7 +70,7 @@ def test_purge(self): #queue not specified and none previously declared for channel: channel.queue_purge() self.fail("Expected failure when purging unspecified queue") - except Closed, e: + except Closed as e: self.assertConnectionException(530, e.args[0]) #cleanup @@ -96,7 +96,7 @@ def test_declare_exclusive(self): #other connection should not be allowed to declare this: c2.queue_declare(queue="exclusive-queue", exclusive="True") self.fail("Expected second exclusive queue_declare to raise a channel exception") - except Closed, e: + except Closed as e: self.assertChannelException(405, e.args[0]) @@ -112,7 +112,7 @@ def test_declare_passive(self): #other connection should not be allowed to declare this: channel.queue_declare(queue="passive-queue-2", passive="True") self.fail("Expected passive declaration of non-existant queue to raise a channel exception") - except Closed, e: + except Closed as e: self.assertChannelException(404, e.args[0]) @@ -136,7 +136,7 @@ def test_bind(self): try: channel.queue_bind(queue="queue-1", exchange="an-invalid-exchange", routing_key="key1") self.fail("Expected bind to non-existant exchange to fail") - except Closed, e: + except Closed as e: self.assertChannelException(404, e.args[0]) #need to reopen a channel: @@ -147,7 +147,7 @@ def test_bind(self): try: channel.queue_bind(queue="queue-2", exchange="amq.direct", routing_key="key1") self.fail("Expected bind of non-existant queue to fail") - except Closed, e: + except Closed as e: self.assertChannelException(404, e.args[0]) @@ -168,7 +168,7 @@ def test_delete_simple(self): try: channel.queue_declare(queue="delete-me", passive="True") self.fail("Queue has not been deleted") - except Closed, e: + except Closed as e: self.assertChannelException(404, e.args[0]) #check attempted deletion of non-existant queue is handled correctly: @@ -177,7 +177,7 @@ def test_delete_simple(self): try: channel.queue_delete(queue="i-dont-exist", if_empty="True") self.fail("Expected delete of non-existant queue to fail") - except Closed, e: + except Closed as e: self.assertChannelException(404, e.args[0]) @@ -197,7 +197,7 @@ def test_delete_ifempty(self): try: channel.queue_delete(queue="delete-me-2", if_empty="True") self.fail("Expected delete if_empty to fail for non-empty queue") - except Closed, e: + except Closed as e: self.assertChannelException(406, e.args[0]) #need new channel now: @@ -218,7 +218,7 @@ def test_delete_ifempty(self): try: channel.queue_declare(queue="delete-me-2", passive="True") self.fail("Queue has not been deleted") - except Closed, e: + except Closed as e: self.assertChannelException(404, e.args[0]) def test_delete_ifunused(self): @@ -239,7 +239,7 @@ def test_delete_ifunused(self): try: channel2.queue_delete(queue="delete-me-3", if_unused="True") self.fail("Expected delete if_unused to fail for queue with existing consumer") - except Closed, e: + except Closed as e: self.assertChannelException(406, e.args[0]) @@ -249,7 +249,7 @@ def test_delete_ifunused(self): try: channel.queue_declare(queue="delete-me-3", passive="True") self.fail("Queue has not been deleted") - except Closed, e: + except Closed as e: self.assertChannelException(404, e.args[0]) diff --git a/qpid_tests/broker_0_9/queue.py b/qpid_tests/broker_0_9/queue.py index 674895c5..8d6ae1cf 100644 --- a/qpid_tests/broker_0_9/queue.py +++ b/qpid_tests/broker_0_9/queue.py @@ -109,7 +109,7 @@ def test_autodelete_shared(self): try: channel.queue_declare(queue="auto-delete-me", passive=True) self.fail("Expected queue to have been deleted") - except Closed, e: + except Closed as e: self.assertChannelException(404, e.args[0]) def test_flow_control(self): diff --git a/qpid_tests/broker_1_0/general.py b/qpid_tests/broker_1_0/general.py index a5b9779a..9433e86d 100644 --- a/qpid_tests/broker_1_0/general.py +++ b/qpid_tests/broker_1_0/general.py @@ -59,7 +59,7 @@ def test_browse(self): assert msg.content == expected.content try: assert msg.properties.get('x-amqp-delivery-count') == 0, (msg.properties.get('x-amqp-delivery-count')) - except KeyError, e: None #default is 0 + except KeyError as e: None #default is 0 self.ssn.acknowledge(msg) rcv.close() diff --git a/setup.py b/setup.py index e3b13cb1..eef67356 100755 --- a/setup.py +++ b/setup.py @@ -39,8 +39,7 @@ def copy_file(self, src, dst, preserve_mode=1, preserve_times=1, name, actor = self.actor(src, dst) if actor: if not os.path.isfile(src): - raise DistutilsFileError, \ - "can't copy '%s': doesn't exist or not a regular file" % src + raise DistutilsFileError("can't copy '%s': doesn't exist or not a regular file" % src) if os.path.isdir(dst): dir = dst @@ -61,22 +60,19 @@ def copy_file(self, src, dst, preserve_mode=1, preserve_times=1, else: try: fsrc = open(src, 'rb') - except os.error, (errno, errstr): - raise DistutilsFileError, \ - "could not open '%s': %s" % (src, errstr) + except os.error as (errno, errstr): + raise DistutilsFileError("could not open '%s': %s" % (src, errstr)) if os.path.exists(dst): try: os.unlink(dst) - except os.error, (errno, errstr): - raise DistutilsFileError, \ - "could not delete '%s': %s" % (dst, errstr) + except os.error as (errno, errstr): + raise DistutilsFileError("could not delete '%s': %s" % (dst, errstr)) try: fdst = open(dst, 'wb') - except os.error, (errno, errstr): - raise DistutilsFileError, \ - "could not create '%s': %s" % (dst, errstr) + except os.error as (errno, errstr): + raise DistutilsFileError("could not create '%s': %s" % (dst, errstr)) try: fdst.write(actor(fsrc.read())) @@ -129,7 +125,7 @@ def run(self): try: from epydoc.docbuilder import build_doc_index from epydoc.docwriter.html import HTMLWriter - except ImportError, e: + except ImportError as e: log.warn('%s -- skipping build_doc', e) return From ee50491f65b8ae90f296874a87a6180ff7a984f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 22:14:19 +0200 Subject: [PATCH 10/50] QPID-8631: remove the `L` literal suffix from `long`s (#10) This suffix is meaningless in Python 2.2+ and it is forbidden in Python 3. See https://peps.python.org/pep-0237/ for details. --- qpid/datatypes.py | 6 +- qpid/management.py | 8 +- qpid/messaging/constants.py | 2 +- qpid/peer.py | 2 +- qpid/session.py | 2 +- qpid/testlib.py | 8 +- qpid/tests/codec.py | 8 +- qpid/tests/datatypes.py | 10 +- qpid/tests/spec010.py | 2 +- qpid_tests/broker_0_10/alternate_exchange.py | 22 ++--- qpid_tests/broker_0_10/broker.py | 16 ++-- qpid_tests/broker_0_10/dtx.py | 6 +- qpid_tests/broker_0_10/example.py | 4 +- qpid_tests/broker_0_10/exchange.py | 4 +- qpid_tests/broker_0_10/management.py | 4 +- qpid_tests/broker_0_10/message.py | 98 ++++++++++---------- qpid_tests/broker_0_10/persistence.py | 2 +- qpid_tests/broker_0_10/queue.py | 16 ++-- qpid_tests/broker_0_10/tx.py | 8 +- qpid_tests/broker_1_0/tx.py | 8 +- 20 files changed, 118 insertions(+), 118 deletions(-) diff --git a/qpid/datatypes.py b/qpid/datatypes.py index ca1466c2..985fc3a8 100644 --- a/qpid/datatypes.py +++ b/qpid/datatypes.py @@ -126,7 +126,7 @@ def serial(o): class Serial: def __init__(self, value): - self.value = value & 0xFFFFFFFFL + self.value = value & 0xFFFFFFFF def __hash__(self): return hash(self.value) @@ -137,8 +137,8 @@ def __cmp__(self, other): other = serial(other) - delta = (self.value - other.value) & 0xFFFFFFFFL - neg = delta & 0x80000000L + delta = (self.value - other.value) & 0xFFFFFFFF + neg = delta & 0x80000000 mag = delta & 0x7FFFFFFF if neg: diff --git a/qpid/management.py b/qpid/management.py index 3de8da9d..2e764362 100644 --- a/qpid/management.py +++ b/qpid/management.py @@ -177,12 +177,12 @@ def __init__ (self, ssn, topicCb, replyCb, exceptionCb, cbContext, _detlife=0): ssn.incoming ("rdest").listen (self.replyCb) ssn.message_set_flow_mode (destination="tdest", flow_mode=1) - ssn.message_flow (destination="tdest", unit=0, value=0xFFFFFFFFL) - ssn.message_flow (destination="tdest", unit=1, value=0xFFFFFFFFL) + ssn.message_flow (destination="tdest", unit=0, value=0xFFFFFFFF) + ssn.message_flow (destination="tdest", unit=1, value=0xFFFFFFFF) ssn.message_set_flow_mode (destination="rdest", flow_mode=1) - ssn.message_flow (destination="rdest", unit=0, value=0xFFFFFFFFL) - ssn.message_flow (destination="rdest", unit=1, value=0xFFFFFFFFL) + ssn.message_flow (destination="rdest", unit=0, value=0xFFFFFFFF) + ssn.message_flow (destination="rdest", unit=1, value=0xFFFFFFFF) def setBrokerInfo (self, data): self.brokerInfo = data diff --git a/qpid/messaging/constants.py b/qpid/messaging/constants.py index f230c4de..2c007032 100644 --- a/qpid/messaging/constants.py +++ b/qpid/messaging/constants.py @@ -34,7 +34,7 @@ def __repr__(self): AMQP_PORT = 5672 AMQPS_PORT = 5671 -UNLIMITED = Constant("UNLIMITED", 0xFFFFFFFFL) +UNLIMITED = Constant("UNLIMITED", 0xFFFFFFFF) REJECTED = Constant("REJECTED") RELEASED = Constant("RELEASED") diff --git a/qpid/peer.py b/qpid/peer.py index 0eee9ccc..545d8aa4 100644 --- a/qpid/peer.py +++ b/qpid/peer.py @@ -534,6 +534,6 @@ def complete(self, mark, cumulative=True): #TODO: record and manage the ranges properly range = [mark, mark] if (self.mark == -1):#hack until wraparound is implemented - self.channel.execution_complete(cumulative_execution_mark=0xFFFFFFFFL, ranged_execution_set=range) + self.channel.execution_complete(cumulative_execution_mark=0xFFFFFFFF, ranged_execution_set=range) else: self.channel.execution_complete(cumulative_execution_mark=self.mark, ranged_execution_set=range) diff --git a/qpid/session.py b/qpid/session.py index 95714a12..d04f369d 100644 --- a/qpid/session.py +++ b/qpid/session.py @@ -275,7 +275,7 @@ def __init__(self, session, destination): def start(self): self.session.message_set_flow_mode(self.destination, self.session.flow_mode.credit) for unit in self.session.credit_unit.VALUES: - self.session.message_flow(self.destination, unit, 0xFFFFFFFFL) + self.session.message_flow(self.destination, unit, 0xFFFFFFFF) def stop(self): self.session.message_cancel(self.destination) diff --git a/qpid/testlib.py b/qpid/testlib.py index 4022a7c1..94e0908f 100644 --- a/qpid/testlib.py +++ b/qpid/testlib.py @@ -136,8 +136,8 @@ def subscribe(self, channel=None, **keys): channel = channel or self.channel consumer_tag = keys["destination"] channel.message_subscribe(**keys) - channel.message_flow(destination=consumer_tag, unit=0, value=0xFFFFFFFFL) - channel.message_flow(destination=consumer_tag, unit=1, value=0xFFFFFFFFL) + channel.message_flow(destination=consumer_tag, unit=0, value=0xFFFFFFFF) + channel.message_flow(destination=consumer_tag, unit=1, value=0xFFFFFFFF) def assertEmpty(self, queue): """Assert that the queue is empty""" @@ -252,5 +252,5 @@ def subscribe(self, session=None, **keys): session = session or self.session consumer_tag = keys["destination"] session.message_subscribe(**keys) - session.message_flow(destination=consumer_tag, unit=0, value=0xFFFFFFFFL) - session.message_flow(destination=consumer_tag, unit=1, value=0xFFFFFFFFL) + session.message_flow(destination=consumer_tag, unit=0, value=0xFFFFFFFF) + session.message_flow(destination=consumer_tag, unit=1, value=0xFFFFFFFF) diff --git a/qpid/tests/codec.py b/qpid/tests/codec.py index 8017f794..8a8236d7 100644 --- a/qpid/tests/codec.py +++ b/qpid/tests/codec.py @@ -553,7 +553,7 @@ def test_resolve_int_above_signed_32bit_max(self): # Test resolving above the max signed 32bit integer value of 2^31 -1 # As above except use an explicitly cast python long def test_resolve_long_above_signed_32bit_max(self): - value = 2147483648L #2^31, i.e 1 above the 32bit signed max + value = 2147483648 #2^31, i.e 1 above the 32bit signed max expected = "signed_long" resolved = self.codec.resolve(value.__class__, value) self.failUnlessEqual(resolved, expected, "resolve FAILED...expected %s got %s" % (expected, resolved)) @@ -561,7 +561,7 @@ def test_resolve_long_above_signed_32bit_max(self): # Test resolving an explicitly cast python long of value 1, i.e less than the max signed 32bit integer value # Should be encoded as a 32bit signed int on the wire def test_resolve_long_1(self): - value = 1L + value = 1 expected = "signed_int" resolved = self.codec.resolve(value.__class__, value) self.failUnlessEqual(resolved, expected, "resolve FAILED...expected %s got %s" % (expected, resolved)) @@ -585,13 +585,13 @@ def test_resolve_64bit_signed_min(self): # Test resolving a value of 2^63, i.e more than the max a signed 64bit integer value can hold. # Should throw an exception indicating the value can't be encoded. def test_resolve_above_64bit_signed_max(self): - value = 9223372036854775808L #2^63 + value = 9223372036854775808 #2^63 self.failUnlessRaises(Exception, self.codec.resolve, value.__class__, value) # ------------------- # Test resolving a value of -2^63 -1, i.e less than the min a signed 64bit integer value can hold. # Should throw an exception indicating the value can't be encoded. def test_resolve_below_64bit_signed_min(self): - value = 9223372036854775808L # -2^63 -1 + value = 9223372036854775808 # -2^63 -1 self.failUnlessRaises(Exception, self.codec.resolve, value.__class__, value) # ------------------- # Test resolving a float. Should indicate use of double as python uses 64bit floats diff --git a/qpid/tests/datatypes.py b/qpid/tests/datatypes.py index 00e649d6..214e5806 100644 --- a/qpid/tests/datatypes.py +++ b/qpid/tests/datatypes.py @@ -24,16 +24,16 @@ class SerialTest(TestCase): def test(self): - for s in (serial(0), serial(0x8FFFFFFFL), serial(0xFFFFFFFFL)): + for s in (serial(0), serial(0x8FFFFFFF), serial(0xFFFFFFFF)): assert s + 1 > s assert s - 1 < s assert s < s + 1 assert s > s - 1 - assert serial(0xFFFFFFFFL) + 1 == serial(0) + assert serial(0xFFFFFFFF) + 1 == serial(0) - assert min(serial(0xFFFFFFFFL), serial(0x0)) == serial(0xFFFFFFFFL) - assert max(serial(0xFFFFFFFFL), serial(0x0)) == serial(0x0) + assert min(serial(0xFFFFFFFF), serial(0x0)) == serial(0xFFFFFFFF) + assert max(serial(0xFFFFFFFF), serial(0x0)) == serial(0x0) def testIncr(self): s = serial(0) @@ -43,7 +43,7 @@ def testIncr(self): def testIn(self): l = [serial(1), serial(2), serial(3), serial(4)] assert serial(1) in l - assert serial(0xFFFFFFFFL + 2) in l + assert serial(0xFFFFFFFF + 2) in l assert 4 in l def testNone(self): diff --git a/qpid/tests/spec010.py b/qpid/tests/spec010.py index ac04e1ee..9729efea 100644 --- a/qpid/tests/spec010.py +++ b/qpid/tests/spec010.py @@ -40,7 +40,7 @@ def encdec(self, value): return decoded def testMessageProperties(self): - props = MessageProperties(content_length=3735928559L, + props = MessageProperties(content_length=3735928559, reply_to=ReplyTo(exchange="the exchange name", routing_key="the routing key")) dec = self.encdec(props) diff --git a/qpid_tests/broker_0_10/alternate_exchange.py b/qpid_tests/broker_0_10/alternate_exchange.py index 4d522c8c..07ef7ea7 100644 --- a/qpid_tests/broker_0_10/alternate_exchange.py +++ b/qpid_tests/broker_0_10/alternate_exchange.py @@ -41,16 +41,16 @@ def test_unroutable(self): session.queue_declare(queue="returns", exclusive=True, auto_delete=True) session.exchange_bind(queue="returns", exchange="secondary") session.message_subscribe(destination="a", queue="returns") - session.message_flow(destination="a", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="a", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="a", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="a", unit=session.credit_unit.byte, value=0xFFFFFFFF) returned = session.incoming("a") #declare, bind (to the primary exchange) and consume from a queue for 'processed' messages session.queue_declare(queue="processed", exclusive=True, auto_delete=True) session.exchange_bind(queue="processed", exchange="primary", binding_key="my-key") session.message_subscribe(destination="b", queue="processed") - session.message_flow(destination="b", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="b", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="b", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="b", unit=session.credit_unit.byte, value=0xFFFFFFFF) processed = session.incoming("b") #publish to the primary exchange @@ -202,8 +202,8 @@ def test_queue_autodelete(self): session.queue_declare(queue="deleted", exclusive=True, auto_delete=True) session.exchange_bind(exchange="dlq", queue="deleted") session.message_subscribe(destination="dlq", queue="deleted") - session.message_flow(destination="dlq", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="dlq", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="dlq", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="dlq", unit=session.credit_unit.byte, value=0xFFFFFFFF) dlq = session.incoming("dlq") #on a separate session, create an auto-deleted queue using the @@ -220,7 +220,7 @@ def test_queue_autodelete(self): session2.message_transfer(message=Message(dp, "Three")) session2.message_subscribe(destination="incoming", queue="my-queue") session2.message_flow(destination="incoming", unit=session.credit_unit.message, value=1) - session2.message_flow(destination="incoming", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session2.message_flow(destination="incoming", unit=session.credit_unit.byte, value=0xFFFFFFFF) self.assertEqual("One", session2.incoming("incoming").get(timeout=1).body) session2.close() @@ -315,8 +315,8 @@ def test_reject_no_match(self): #get and reject those messages: session.message_subscribe(destination="a", queue="delivery-queue") - session.message_flow(destination="a", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="a", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="a", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="a", unit=session.credit_unit.byte, value=0xFFFFFFFF) incoming = session.incoming("a") for m in ["One", "Two", "Three"]: msg = incoming.get(timeout=1) @@ -339,8 +339,8 @@ def setup_dlq(self): session.queue_declare(queue="deleted", exclusive=True, auto_delete=True) session.exchange_bind(exchange="dlq", queue="deleted") session.message_subscribe(destination="dlq", queue="deleted") - session.message_flow(destination="dlq", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="dlq", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="dlq", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="dlq", unit=session.credit_unit.byte, value=0xFFFFFFFF) dlq = session.incoming("dlq") return dlq diff --git a/qpid_tests/broker_0_10/broker.py b/qpid_tests/broker_0_10/broker.py index 81d723e3..242b6f14 100644 --- a/qpid_tests/broker_0_10/broker.py +++ b/qpid_tests/broker_0_10/broker.py @@ -36,8 +36,8 @@ def test_ack_and_no_ack(self): # No ack consumer ctag = "tag1" session.message_subscribe(queue = "myqueue", destination = ctag) - session.message_flow(destination=ctag, unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination=ctag, unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination=ctag, unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination=ctag, unit=session.credit_unit.byte, value=0xFFFFFFFF) body = "test no-ack" session.message_transfer(message=Message(session.delivery_properties(routing_key="myqueue"), body)) msg = session.incoming(ctag).get(timeout = 5) @@ -47,8 +47,8 @@ def test_ack_and_no_ack(self): session.queue_declare(queue = "otherqueue", exclusive=True, auto_delete=True) ctag = "tag2" session.message_subscribe(queue = "otherqueue", destination = ctag, accept_mode = 1) - session.message_flow(destination=ctag, unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination=ctag, unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination=ctag, unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination=ctag, unit=session.credit_unit.byte, value=0xFFFFFFFF) body = "test ack" session.message_transfer(message=Message(session.delivery_properties(routing_key="otherqueue"), body)) msg = session.incoming(ctag).get(timeout = 5) @@ -64,8 +64,8 @@ def test_simple_delivery_immediate(self): session.exchange_bind(queue="test-queue", exchange="amq.fanout") consumer_tag = "tag1" session.message_subscribe(queue="test-queue", destination=consumer_tag) - session.message_flow(unit = session.credit_unit.message, value = 0xFFFFFFFFL, destination = consumer_tag) - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = consumer_tag) + session.message_flow(unit = session.credit_unit.message, value =0xFFFFFFFF, destination = consumer_tag) + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination = consumer_tag) queue = session.incoming(consumer_tag) body = "Immediate Delivery" @@ -86,8 +86,8 @@ def test_simple_delivery_queued(self): consumer_tag = "tag1" session.message_subscribe(queue="test-queue", destination=consumer_tag) - session.message_flow(unit = session.credit_unit.message, value = 0xFFFFFFFFL, destination = consumer_tag) - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = consumer_tag) + session.message_flow(unit = session.credit_unit.message, value =0xFFFFFFFF, destination = consumer_tag) + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination = consumer_tag) queue = session.incoming(consumer_tag) msg = queue.get(timeout=5) self.assert_(msg.body == body) diff --git a/qpid_tests/broker_0_10/dtx.py b/qpid_tests/broker_0_10/dtx.py index b2cbe8a3..4753998e 100644 --- a/qpid_tests/broker_0_10/dtx.py +++ b/qpid_tests/broker_0_10/dtx.py @@ -574,7 +574,7 @@ def test_implicit_end(self): session2.dtx_start(xid=tx) session2.message_subscribe(queue="dummy", destination="dummy") session2.message_flow(destination="dummy", unit=session2.credit_unit.message, value=1) - session2.message_flow(destination="dummy", unit=session2.credit_unit.byte, value=0xFFFFFFFFL) + session2.message_flow(destination="dummy", unit=session2.credit_unit.byte, value=0xFFFFFFFF) msg = session2.incoming("dummy").get(timeout=1) session2.message_accept(RangedSet(msg.id)) session2.message_cancel(destination="dummy") @@ -751,7 +751,7 @@ def swap(self, session, src, dest): #consume from src: session.message_subscribe(destination="temp-swap", queue=src) session.message_flow(destination="temp-swap", unit=session.credit_unit.message, value=1) - session.message_flow(destination="temp-swap", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="temp-swap", unit=session.credit_unit.byte, value=0xFFFFFFFF) msg = session.incoming("temp-swap").get(timeout=1) session.message_cancel(destination="temp-swap") session.message_accept(RangedSet(msg.id)) @@ -768,7 +768,7 @@ def assertMessageCount(self, expected, queue): def assertMessageId(self, expected, queue): self.session.message_subscribe(queue=queue, destination="results") self.session.message_flow(destination="results", unit=self.session.credit_unit.message, value=1) - self.session.message_flow(destination="results", unit=self.session.credit_unit.byte, value=0xFFFFFFFFL) + self.session.message_flow(destination="results", unit=self.session.credit_unit.byte, value=0xFFFFFFFF) self.assertEqual(expected, self.getMessageProperty(self.session.incoming("results").get(timeout=1), 'correlation_id')) self.session.message_cancel(destination="results") diff --git a/qpid_tests/broker_0_10/example.py b/qpid_tests/broker_0_10/example.py index e36907d5..83d20819 100644 --- a/qpid_tests/broker_0_10/example.py +++ b/qpid_tests/broker_0_10/example.py @@ -69,8 +69,8 @@ def test_example(self): # field that is filled if the reply includes content. In this case the # interesting field is the consumer_tag. session.message_subscribe(queue="test-queue", destination="consumer_tag") - session.message_flow(destination="consumer_tag", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="consumer_tag", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="consumer_tag", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="consumer_tag", unit=session.credit_unit.byte, value=0xFFFFFFFF) # We can use the session.incoming(...) method to access the messages # delivered for our consumer_tag. diff --git a/qpid_tests/broker_0_10/exchange.py b/qpid_tests/broker_0_10/exchange.py index 350b96f8..e05b9f9c 100644 --- a/qpid_tests/broker_0_10/exchange.py +++ b/qpid_tests/broker_0_10/exchange.py @@ -112,8 +112,8 @@ def consume(self, queueName): else: self.uniqueTag += 1 consumer_tag = "tag" + str(self.uniqueTag) self.session.message_subscribe(queue=queueName, destination=consumer_tag) - self.session.message_flow(destination=consumer_tag, unit=self.session.credit_unit.message, value=0xFFFFFFFFL) - self.session.message_flow(destination=consumer_tag, unit=self.session.credit_unit.byte, value=0xFFFFFFFFL) + self.session.message_flow(destination=consumer_tag, unit=self.session.credit_unit.message, value=0xFFFFFFFF) + self.session.message_flow(destination=consumer_tag, unit=self.session.credit_unit.byte, value=0xFFFFFFFF) self.subscriptions.append(consumer_tag) return self.session.incoming(consumer_tag) diff --git a/qpid_tests/broker_0_10/management.py b/qpid_tests/broker_0_10/management.py index 534196e6..d146ddf8 100644 --- a/qpid_tests/broker_0_10/management.py +++ b/qpid_tests/broker_0_10/management.py @@ -229,8 +229,8 @@ def test_move_queued_messages(self): "Consume the messages of the queue and check they are all there in order" session.message_subscribe(queue="src-queue", destination="tag") - session.message_flow(destination="tag", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="tag", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="tag", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="tag", unit=session.credit_unit.byte, value=0xFFFFFFFF) queue = session.incoming("tag") for count in twenty: consumed_msg = queue.get(timeout=1) diff --git a/qpid_tests/broker_0_10/message.py b/qpid_tests/broker_0_10/message.py index 42ab0713..ef388640 100644 --- a/qpid_tests/broker_0_10/message.py +++ b/qpid_tests/broker_0_10/message.py @@ -230,8 +230,8 @@ def test_cancel(self): session.message_subscribe(destination="my-consumer", queue="test-queue-4") myqueue = session.incoming("my-consumer") - session.message_flow(destination="my-consumer", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="my-consumer", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="my-consumer", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="my-consumer", unit=session.credit_unit.byte, value=0xFFFFFFFF) #should flush here @@ -282,8 +282,8 @@ def test_ack(self): # subscribe with implied acquire, explicit accept: session1.message_subscribe(queue = "test-ack-queue", destination = "consumer") - session1.message_flow(destination="consumer", unit=session1.credit_unit.message, value=0xFFFFFFFFL) - session1.message_flow(destination="consumer", unit=session1.credit_unit.byte, value=0xFFFFFFFFL) + session1.message_flow(destination="consumer", unit=session1.credit_unit.message, value=0xFFFFFFFF) + session1.message_flow(destination="consumer", unit=session1.credit_unit.byte, value=0xFFFFFFFF) queue = session1.incoming("consumer") msg1 = queue.get(timeout=1) @@ -335,8 +335,8 @@ def test_ack(self): self.assertEquals(queueObj.msgTotalEnqueues, 5) self.assertEquals(queueObj.msgTotalDequeues, 3) - session2.message_flow(destination="checker", unit=session2.credit_unit.message, value=0xFFFFFFFFL) - session2.message_flow(destination="checker", unit=session2.credit_unit.byte, value=0xFFFFFFFFL) + session2.message_flow(destination="checker", unit=session2.credit_unit.message, value=0xFFFFFFFF) + session2.message_flow(destination="checker", unit=session2.credit_unit.byte, value=0xFFFFFFFF) queue = session2.incoming("checker") msg3b = queue.get(timeout=1) @@ -370,8 +370,8 @@ def test_ack(self): self.assertEquals(queueObj.msgTotalEnqueues, 5) self.assertEquals(queueObj.msgTotalDequeues, 5) - self.session.message_flow(destination="final-checker", unit=self.session.credit_unit.message, value=0xFFFFFFFFL) - self.session.message_flow(destination="final-checker", unit=self.session.credit_unit.byte, value=0xFFFFFFFFL) + self.session.message_flow(destination="final-checker", unit=self.session.credit_unit.message, value=0xFFFFFFFF) + self.session.message_flow(destination="final-checker", unit=self.session.credit_unit.byte, value=0xFFFFFFFF) try: extra = self.session.incoming("final-checker").get(timeout=1) self.fail("Got unexpected message: " + extra.body) @@ -384,16 +384,16 @@ def test_reject(self): session.exchange_bind(queue = "r", exchange = "amq.fanout") session.message_subscribe(queue = "q", destination = "consumer") - session.message_flow(destination="consumer", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="consumer", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="consumer", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="consumer", unit=session.credit_unit.byte, value=0xFFFFFFFF) session.message_transfer(message=Message(session.delivery_properties(routing_key="q"), "blah, blah")) msg = session.incoming("consumer").get(timeout = 1) self.assertEquals(msg.body, "blah, blah") session.message_reject(RangedSet(msg.id)) session.message_subscribe(queue = "r", destination = "checker") - session.message_flow(destination="checker", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="checker", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="checker", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="checker", unit=session.credit_unit.byte, value=0xFFFFFFFF) msg = session.incoming("checker").get(timeout = 1) self.assertEquals(msg.body, "blah, blah") @@ -414,7 +414,7 @@ def test_credit_flow_messages(self): #set message credit to finite amount (less than enough for all messages) session.message_flow(unit = session.credit_unit.message, value = 5, destination = "c") #set infinite byte credit - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "c") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="c") #check that expected number were received q = session.incoming("c") for i in range(1, 6): @@ -447,7 +447,7 @@ def test_credit_flow_bytes(self): #set byte credit to finite amount (less than enough for all messages) session.message_flow(unit = session.credit_unit.byte, value = msg_size*5, destination = "c") #set infinite message credit - session.message_flow(unit = session.credit_unit.message, value = 0xFFFFFFFFL, destination = "c") + session.message_flow(unit = session.credit_unit.message, value =0xFFFFFFFF, destination ="c") #check that expected number were received q = session.incoming("c") for i in range(5): @@ -478,7 +478,7 @@ def test_window_flow_messages(self): #set message credit to finite amount (less than enough for all messages) session.message_flow(unit = session.credit_unit.message, value = 5, destination = "c") #set infinite byte credit - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "c") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="c") #check that expected number were received q = session.incoming("c") ids = [] @@ -519,7 +519,7 @@ def test_window_flow_bytes(self): #set byte credit to finite amount (less than enough for all messages) session.message_flow(unit = session.credit_unit.byte, value = msg_size*5, destination = "c") #set infinite message credit - session.message_flow(unit = session.credit_unit.message, value = 0xFFFFFFFFL, destination = "c") + session.message_flow(unit = session.credit_unit.message, value =0xFFFFFFFF, destination ="c") #check that expected number were received q = session.incoming("c") msgs = [] @@ -554,7 +554,7 @@ def test_window_flush_ack_flow(self): ssn.message_transfer(message=Message(ssn.delivery_properties(routing_key="q"), "A")) for unit in ssn.credit_unit.VALUES: - ssn.message_flow("c", unit, 0xFFFFFFFFL) + ssn.message_flow("c", unit, 0xFFFFFFFF) q = ssn.incoming("c") msgA = q.get(timeout=10) @@ -567,7 +567,7 @@ def test_window_flush_ack_flow(self): ssn.message_accept(RangedSet(msgA.id)) for unit in ssn.credit_unit.VALUES: - ssn.message_flow("c", unit, 0xFFFFFFFFL) + ssn.message_flow("c", unit, 0xFFFFFFFF) #send message B ssn.message_transfer(message=Message(ssn.delivery_properties(routing_key="q"), "B")) @@ -584,7 +584,7 @@ def test_window_stop(self): session.message_subscribe(queue = "q", destination = "c") session.message_set_flow_mode(flow_mode = 1, destination = "c") session.message_flow(unit = session.credit_unit.message, value = 5, destination = "c") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "c") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="c") #send batch of messages to queue @@ -609,7 +609,7 @@ def test_window_stop(self): #re-establish window and check remaining messages session.message_flow(unit = session.credit_unit.message, value = 5, destination = "c") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "c") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="c") for i in range(0, 5): msg = q.get(timeout = 1) self.assertDataEquals(session, msg, "Message %d" % (i+6)) @@ -634,7 +634,7 @@ def test_credit_window_after_messagestop(self): session.message_subscribe(queue=self.test_queue_name, destination="a") a = session.incoming("a") session.message_set_flow_mode(flow_mode = 1, destination = "a") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") # issue 5 message credits session.message_flow(unit = session.credit_unit.message, value = 5, destination = "a") @@ -653,7 +653,7 @@ def test_credit_window_after_messagestop(self): session.message_stop(destination = "a") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") session.message_flow(unit = session.credit_unit.message, value = 5, destination = "a") # complete earlier messages after setting the window to 5 message credits @@ -681,8 +681,8 @@ def test_no_credit_wrap(self): session.message_subscribe(queue=self.test_queue_name, destination="a") a = session.incoming("a") session.message_set_flow_mode(flow_mode = session.flow_mode.credit, destination = "a") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") - session.message_flow(unit = session.credit_unit.message, value = 0xFFFFFFFAL, destination = "a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") + session.message_flow(unit = session.credit_unit.message, value =0xFFFFFFFA, destination ="a") #test wraparound of credit balance does not occur session.message_flow(unit = session.credit_unit.message, value = 10, destination = "a") for i in range(1, 50): @@ -703,11 +703,11 @@ def test_subscribe_not_acquired(self): session.message_transfer(message=Message(session.delivery_properties(routing_key="q"), "Message %s" % i)) session.message_subscribe(queue = "q", destination = "a", acquire_mode = 1) - session.message_flow(unit = session.credit_unit.message, value = 0xFFFFFFFFL, destination = "a") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") + session.message_flow(unit = session.credit_unit.message, value =0xFFFFFFFF, destination ="a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") session.message_subscribe(queue = "q", destination = "b", acquire_mode = 1) - session.message_flow(unit = session.credit_unit.message, value = 0xFFFFFFFFL, destination = "b") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "b") + session.message_flow(unit = session.credit_unit.message, value =0xFFFFFFFF, destination ="b") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="b") for i in range(6, 11): session.message_transfer(message=Message(session.delivery_properties(routing_key="q"), "Message %s" % i)) @@ -739,8 +739,8 @@ def test_acquire_with_no_accept_and_credit_flow(self): session.message_subscribe(queue = "q", destination = "a", acquire_mode = 1, accept_mode = 1) session.message_set_flow_mode(flow_mode = session.flow_mode.credit, destination = "a") - session.message_flow(unit = session.credit_unit.message, value = 0xFFFFFFFFL, destination = "a") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") + session.message_flow(unit = session.credit_unit.message, value =0xFFFFFFFF, destination ="a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") msg = session.incoming("a").get(timeout = 1) self.assertEquals("acquire me", msg.body) #message should still be on the queue: @@ -763,8 +763,8 @@ def test_acquire(self): session.message_transfer(message=Message(session.delivery_properties(routing_key="q"), "acquire me")) session.message_subscribe(queue = "q", destination = "a", acquire_mode = 1) - session.message_flow(destination="a", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="a", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="a", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="a", unit=session.credit_unit.byte, value=0xFFFFFFFF) msg = session.incoming("a").get(timeout = 1) self.assertEquals("acquire me", msg.body) #message should still be on the queue: @@ -789,8 +789,8 @@ def test_release(self): session.message_transfer(message=Message(session.delivery_properties(routing_key="q"), "release me")) session.message_subscribe(queue = "q", destination = "a") - session.message_flow(destination="a", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="a", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="a", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="a", unit=session.credit_unit.byte, value=0xFFFFFFFF) msg = session.incoming("a").get(timeout = 1) self.assertEquals("release me", msg.body) session.message_cancel(destination = "a") @@ -810,7 +810,7 @@ def test_release_ordering(self): session.message_subscribe(queue = "q", destination = "a") session.message_flow(unit = session.credit_unit.message, value = 10, destination = "a") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") queue = session.incoming("a") first = queue.get(timeout = 1) for i in range(2, 10): @@ -843,7 +843,7 @@ def test_ranged_ack(self): session.message_subscribe(queue = "q", destination = "a") session.message_flow(unit = session.credit_unit.message, value = 10, destination = "a") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") queue = session.incoming("a") ids = [] for i in range (1, 11): @@ -868,8 +868,8 @@ def test_ranged_ack(self): session.close(timeout=10) session = self.session - session.message_flow(destination="checker", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="checker", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="checker", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="checker", unit=session.credit_unit.byte, value=0xFFFFFFFF) queue = session.incoming("checker") self.assertEquals("message 4", queue.get(timeout = 1).body) @@ -887,7 +887,7 @@ def test_subscribe_not_acquired_2(self): session.message_subscribe(queue = "q", destination = "a") session.message_set_flow_mode(flow_mode = 0, destination = "a") session.message_flow(unit = session.credit_unit.message, value = 5, destination = "a") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") queue = session.incoming("a") for i in range(1, 6): @@ -902,7 +902,7 @@ def test_subscribe_not_acquired_2(self): #now create a not-acquired subscriber session.message_subscribe(queue = "q", destination = "b", acquire_mode=1) - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "b") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="b") #check it gets those not consumed queue = session.incoming("b") @@ -930,7 +930,7 @@ def test_subscribe_not_acquired_3(self): #create a not-acquired subscriber session.message_subscribe(queue = "q", destination = "a", acquire_mode=1) - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") session.message_flow(unit = session.credit_unit.message, value = 10, destination = "a") #browse through messages @@ -952,7 +952,7 @@ def test_subscribe_not_acquired_3(self): #create a second not-acquired subscriber session.message_subscribe(queue = "q", destination = "b", acquire_mode=1) - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "b") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="b") session.message_flow(unit = session.credit_unit.message, value = 1, destination = "b") #check it gets those not consumed queue = session.incoming("b") @@ -979,12 +979,12 @@ def test_release_unacquired(self): #create two 'browsers' session.message_subscribe(queue = "q", destination = "a", acquire_mode=1) - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") session.message_flow(unit = session.credit_unit.message, value = 10, destination = "a") queueA = session.incoming("a") session.message_subscribe(queue = "q", destination = "b", acquire_mode=1) - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "b") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="b") session.message_flow(unit = session.credit_unit.message, value = 10, destination = "b") queueB = session.incoming("b") @@ -1001,7 +1001,7 @@ def test_release_unacquired(self): #create consumer session.message_subscribe(queue = "q", destination = "c") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "c") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="c") session.message_flow(unit = session.credit_unit.message, value = 10, destination = "c") queueC = session.incoming("c") #consume the message then ack it @@ -1023,7 +1023,7 @@ def test_release_order(self): #subscribe: session.message_subscribe(queue="q", destination="a") a = session.incoming("a") - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") session.message_flow(unit = session.credit_unit.message, value = 10, destination = "a") # receive all messages into list @@ -1058,8 +1058,8 @@ def test_empty_body(self): consumer_tag = "tag1" session.message_subscribe(queue="xyz", destination=consumer_tag) - session.message_flow(unit = session.credit_unit.message, value = 0xFFFFFFFFL, destination = consumer_tag) - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = consumer_tag) + session.message_flow(unit = session.credit_unit.message, value =0xFFFFFFFF, destination = consumer_tag) + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination = consumer_tag) queue = session.incoming(consumer_tag) msg = queue.get(timeout=1) self.assertEquals("", msg.body) @@ -1098,7 +1098,7 @@ def test_ttl(self): messages = session.incoming(d) sleep(1) session.message_flow(unit = session.credit_unit.message, value=2, destination=d) - session.message_flow(unit = session.credit_unit.byte, value=0xFFFFFFFFL, destination=d) + session.message_flow(unit = session.credit_unit.byte, value=0xFFFFFFFF, destination=d) assert messages.get(timeout=1).body == "second" self.assertEmpty(messages) diff --git a/qpid_tests/broker_0_10/persistence.py b/qpid_tests/broker_0_10/persistence.py index e9cf9b7c..42698ae3 100644 --- a/qpid_tests/broker_0_10/persistence.py +++ b/qpid_tests/broker_0_10/persistence.py @@ -50,7 +50,7 @@ def test_ack_message_from_deleted_queue(self): #create consumer session.message_subscribe(queue = "q", destination = "a", accept_mode = 1, acquire_mode=0) - session.message_flow(unit = session.credit_unit.byte, value = 0xFFFFFFFFL, destination = "a") + session.message_flow(unit = session.credit_unit.byte, value =0xFFFFFFFF, destination ="a") session.message_flow(unit = session.credit_unit.message, value = 10, destination = "a") queue = session.incoming("a") diff --git a/qpid_tests/broker_0_10/queue.py b/qpid_tests/broker_0_10/queue.py index 68fe854a..6dbc842f 100644 --- a/qpid_tests/broker_0_10/queue.py +++ b/qpid_tests/broker_0_10/queue.py @@ -49,8 +49,8 @@ def test_purge(self): #send a further message and consume it, ensuring that the other messages are really gone session.message_transfer(message=Message(session.delivery_properties(routing_key="test-queue"), "four")) session.message_subscribe(queue="test-queue", destination="tag") - session.message_flow(destination="tag", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="tag", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="tag", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="tag", unit=session.credit_unit.byte, value=0xFFFFFFFF) queue = session.incoming("tag") msg = queue.get(timeout=1) self.assertEqual("four", msg.body) @@ -251,11 +251,11 @@ def unbind_test(self, exchange, routing_key="", args=None, headers=None): session.queue_declare(queue="queue-2", exclusive=True, auto_delete=True) session.message_subscribe(queue="queue-1", destination="queue-1") - session.message_flow(destination="queue-1", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="queue-1", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="queue-1", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="queue-1", unit=session.credit_unit.byte, value=0xFFFFFFFF) session.message_subscribe(queue="queue-2", destination="queue-2") - session.message_flow(destination="queue-2", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="queue-2", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="queue-2", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="queue-2", unit=session.credit_unit.byte, value=0xFFFFFFFF) queue1 = session.incoming("queue-1") queue2 = session.incoming("queue-2") @@ -352,8 +352,8 @@ def test_delete_ifempty(self): #empty queue: session.message_subscribe(destination="consumer_tag", queue="delete-me-2") - session.message_flow(destination="consumer_tag", unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination="consumer_tag", unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination="consumer_tag", unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination="consumer_tag", unit=session.credit_unit.byte, value=0xFFFFFFFF) queue = session.incoming("consumer_tag") msg = queue.get(timeout=1) self.assertEqual("message", msg.body) diff --git a/qpid_tests/broker_0_10/tx.py b/qpid_tests/broker_0_10/tx.py index 8cdc539a..956e25ba 100644 --- a/qpid_tests/broker_0_10/tx.py +++ b/qpid_tests/broker_0_10/tx.py @@ -251,13 +251,13 @@ def subscribe(self, session=None, **keys): session = session or self.session consumer_tag = keys["destination"] session.message_subscribe(**keys) - session.message_flow(destination=consumer_tag, unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination=consumer_tag, unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination=consumer_tag, unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination=consumer_tag, unit=session.credit_unit.byte, value=0xFFFFFFFF) def enable_flow(self, tag, session=None): session = session or self.session - session.message_flow(destination=tag, unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination=tag, unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination=tag, unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination=tag, unit=session.credit_unit.byte, value=0xFFFFFFFF) def complete(self, session, msg): session.receiver._completed.add(msg.id)#TODO: this may be done automatically diff --git a/qpid_tests/broker_1_0/tx.py b/qpid_tests/broker_1_0/tx.py index 45817fc6..eb84f4ca 100644 --- a/qpid_tests/broker_1_0/tx.py +++ b/qpid_tests/broker_1_0/tx.py @@ -251,13 +251,13 @@ def subscribe(self, session=None, **keys): session = session or self.session consumer_tag = keys["destination"] session.message_subscribe(**keys) - session.message_flow(destination=consumer_tag, unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination=consumer_tag, unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination=consumer_tag, unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination=consumer_tag, unit=session.credit_unit.byte, value=0xFFFFFFFF) def enable_flow(self, tag, session=None): session = session or self.session - session.message_flow(destination=tag, unit=session.credit_unit.message, value=0xFFFFFFFFL) - session.message_flow(destination=tag, unit=session.credit_unit.byte, value=0xFFFFFFFFL) + session.message_flow(destination=tag, unit=session.credit_unit.message, value=0xFFFFFFFF) + session.message_flow(destination=tag, unit=session.credit_unit.byte, value=0xFFFFFFFF) def complete(self, session, msg): session.receiver._completed.add(msg.id)#TODO: this may be done automatically From f84a72f0c1f592642d713a6891c3afdaf22ef99e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 22:25:04 +0200 Subject: [PATCH 11/50] QPID-8631: modernize `print` statement uses to the `print()` function form (#11) This is the result of running ``` python-modernize -wnf libmodernize.fixes.fix_print ``` --- examples/api/drain | 5 +++-- examples/api/hello | 5 +++-- examples/api/hello_xml | 5 +++-- examples/api/server | 5 +++-- examples/api/spout | 5 +++-- examples/api/statistics.py | 7 ++++--- examples/reservations/common.py | 5 +++-- examples/reservations/reserve | 19 +++++++++--------- qpid-python-test | 19 +++++++++--------- qpid/debug.py | 11 ++++++----- qpid/delegate.py | 7 ++++--- qpid/disp.py | 9 +++++---- qpid/managementdata.py | 27 +++++++++++++------------- qpid/ops.py | 3 ++- qpid/spec08.py | 3 ++- qpid/testlib.py | 5 +++-- qpid/tests/__init__.py | 13 +++++++------ qpid/tests/codec.py | 21 ++++++++++---------- qpid/tests/messaging/implementation.py | 3 ++- qpid/tests/messaging/selector.py | 3 ++- qpid_tests/broker_0_10/exchange.py | 5 +++-- qpid_tests/broker_0_10/lvq.py | 3 ++- qpid_tests/broker_0_10/new_api.py | 9 +++++---- qpid_tests/broker_0_10/stats.py | 13 +++++++------ qpid_tests/broker_0_8/testlib.py | 3 ++- 25 files changed, 119 insertions(+), 94 deletions(-) diff --git a/examples/api/drain b/examples/api/drain index 97f644d0..213cbf75 100755 --- a/examples/api/drain +++ b/examples/api/drain @@ -18,6 +18,7 @@ # under the License. # +from __future__ import print_function import optparse from qpid.messaging import * from qpid.util import URL @@ -84,13 +85,13 @@ try: while not opts.count or count < opts.count: try: msg = rcv.fetch(timeout=timeout) - print opts.format % Formatter(msg) + print(opts.format % Formatter(msg)) count += 1 ssn.acknowledge() except Empty: break except ReceiverError as e: - print e + print(e) except KeyboardInterrupt: pass diff --git a/examples/api/hello b/examples/api/hello index 65b0edda..dffff885 100755 --- a/examples/api/hello +++ b/examples/api/hello @@ -18,6 +18,7 @@ # under the License. # +from __future__ import print_function import sys from qpid.messaging import * @@ -43,10 +44,10 @@ try: sender.send(Message("Hello world!")); message = receiver.fetch() - print message.content + print(message.content) session.acknowledge() except MessagingError as m: - print m + print(m) connection.close() diff --git a/examples/api/hello_xml b/examples/api/hello_xml index addeaef9..1314825d 100755 --- a/examples/api/hello_xml +++ b/examples/api/hello_xml @@ -18,6 +18,7 @@ # under the License. # +from __future__ import print_function import sys from qpid.messaging import * @@ -68,10 +69,10 @@ try: # Retrieve matching message from the receiver and print it message = receiver.fetch(timeout=1) - print message.content + print(message.content) session.acknowledge() except MessagingError as m: - print m + print(m) connection.close() diff --git a/examples/api/server b/examples/api/server index 23734cb9..aee47471 100755 --- a/examples/api/server +++ b/examples/api/server @@ -18,6 +18,7 @@ # under the License. # +from __future__ import print_function import optparse, sys, traceback from qpid.messaging import * from qpid.util import URL @@ -83,12 +84,12 @@ try: snd = ssn.sender(msg.reply_to) snd.send(response) except SendError as e: - print e + print(e) if snd is not None: snd.close() ssn.acknowledge() except ReceiverError as e: - print e + print(e) except KeyboardInterrupt: pass diff --git a/examples/api/spout b/examples/api/spout index c1b16226..ecf4ced0 100755 --- a/examples/api/spout +++ b/examples/api/spout @@ -18,6 +18,7 @@ # under the License. # +from __future__ import print_function import optparse, time from qpid.messaging import * from qpid.util import URL @@ -124,9 +125,9 @@ try: snd.send(msg) count += 1 - print msg + print(msg) except SendError as e: - print e + print(e) except KeyboardInterrupt: pass diff --git a/examples/api/statistics.py b/examples/api/statistics.py index e095920e..77f1e1f4 100644 --- a/examples/api/statistics.py +++ b/examples/api/statistics.py @@ -18,6 +18,7 @@ # under the License. # +from __future__ import print_function import time TS = "ts" @@ -110,7 +111,7 @@ def message(self, m): self.batchCount+=1 if self.batchCount == self.batchSize: self.header() - print self.batch.report() + print(self.batch.report()) self.create() self.batchCount = 0 @@ -119,13 +120,13 @@ def report(self): if self.overall == None: self.overall = self.create() self.header() - print self.overall.report() + print(self.overall.report()) def header(self): if not self.headerPrinted: if self.overall == None: self.overall = self.create() - print self.overall.header() + print(self.overall.header()) self.headerPrinted = True diff --git a/examples/reservations/common.py b/examples/reservations/common.py index 7602fe1f..85aeebcf 100644 --- a/examples/reservations/common.py +++ b/examples/reservations/common.py @@ -18,6 +18,7 @@ # under the License. # +from __future__ import print_function import traceback from fnmatch import fnmatch from qpid.messaging import * @@ -25,7 +26,7 @@ class Dispatcher: def unhandled(self, msg): - print "UNHANDLED MESSAGE: %s" % msg + print("UNHANDLED MESSAGE: %s" % msg) def ignored(self, msg): return False @@ -61,7 +62,7 @@ def run(self, session): snd = session.sender(to) snd.send(r) except SendError as e: - print e + print(e) finally: snd.close() diff --git a/examples/reservations/reserve b/examples/reservations/reserve index 68e7fee9..0290073d 100755 --- a/examples/reservations/reserve +++ b/examples/reservations/reserve @@ -18,6 +18,7 @@ # under the License. # +from __future__ import print_function import optparse, os, sys, time from uuid import uuid4 from qpid.messaging import * @@ -95,10 +96,10 @@ class Requester(Dispatcher): self.agents[id] = (status, owner) if opts.status: - print self.agent_status(id) + print(self.agent_status(id)) def do_empty(self, msg): - print "no matching resources" + print("no matching resources") def candidates(self, candidate_status, candidate_owner): for id, (status, owner) in self.agents.items(): @@ -160,8 +161,8 @@ try: "identity": [cid]}, content = {"owner": opts.owner}) if not requested: - print "requesting %s:" % request_type, - print cid, + print("requesting %s:" % request_type, end=' ') + print(cid, end=' ') sys.stdout.flush() req.correlation(req_msg.correlation_id) snd.send(req_msg) @@ -170,7 +171,7 @@ try: discovering = False if requested: - print + print() owners = {} for id in requested: st, ow = req.agents[id] @@ -183,14 +184,14 @@ try: owners[k].sort() v = ", ".join(owners[k]) if k is None: - print "free: %s" % v + print("free: %s" % v) else: - print "owner %s: %s" % (k, v) + print("owner %s: %s" % (k, v)) elif req.agents and not opts.status: - print "no available resources" + print("no available resources") if req.outstanding: - print "request timed out" + print("request timed out") except KeyboardInterrupt: pass finally: diff --git a/qpid-python-test b/qpid-python-test index dfe6a6fc..fef140b6 100755 --- a/qpid-python-test +++ b/qpid-python-test @@ -20,6 +20,7 @@ # TODO: summarize, test harness preconditions (e.g. broker is alive) +from __future__ import print_function import logging, optparse, os, struct, sys, time, traceback, types from fnmatch import fnmatchcase as match from getopt import GetoptError @@ -401,9 +402,9 @@ def run_test(name, test, config): if interceptor.last != "\n": sys.stdout.write("\n") sys.stdout.write(output) - print " %s" % colorize_word(runner.status()) + print(" %s" % colorize_word(runner.status())) if runner.failed() or runner.skipped(): - print runner.get_formatted_exceptions() + print(runner.get_formatted_exceptions()) root.setLevel(level) filter.patterns = patterns return TestResult(end - start, runner.passed(), runner.skipped(), runner.failed(), runner.get_formatted_exceptions()) @@ -579,7 +580,7 @@ skipped = 0 start = time.time() for t in filtered: if list_only: - print t.name() + print(t.name()) else: st = t.run() if xmlr: @@ -613,22 +614,22 @@ if not list_only: skip = "skip" else: skip = "pass" - print colorize("Totals:", 1), + print(colorize("Totals:", 1), end=' ') totals = [colorize_word("total", "%s tests" % total), colorize_word(_pass, "%s passed" % passed), colorize_word(skip, "%s skipped" % skipped), colorize_word(ign, "%s ignored" % len(ignored)), colorize_word(outcome, "%s failed" % failed)] - print ", ".join(totals), + print(", ".join(totals), end=' ') if opts.hoe and failed > 0: - print " -- (halted after %s)" % run + print(" -- (halted after %s)" % run) else: - print + print() if opts.time and run > 0: - print colorize("Timing:", 1), + print(colorize("Timing:", 1), end=' ') timing = [colorize_word("elapsed", "%.2fs elapsed" % (end - start)), colorize_word("average", "%.2fs average" % ((end - start)/run))] - print ", ".join(timing) + print(", ".join(timing)) if xmlr: xmlr.end() diff --git a/qpid/debug.py b/qpid/debug.py index b5dbd4d9..423b03de 100644 --- a/qpid/debug.py +++ b/qpid/debug.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import print_function import threading, traceback, signal, sys, time def stackdump(sig, frm): @@ -27,7 +28,7 @@ def stackdump(sig, frm): code.append('File: "%s", line %d, in %s' % (filename, lineno, name)) if line: code.append(" %s" % (line.strip())) - print "\n".join(code) + print("\n".join(code)) signal.signal(signal.SIGQUIT, stackdump) @@ -39,12 +40,12 @@ def __init__(self): def acquire(self, blocking=1): while not self.lock.acquire(blocking=0): time.sleep(1) - print >> sys.out, "TRYING" + print("TRYING", file=sys.out) traceback.print_stack(None, None, out) - print >> sys.out, "TRYING" - print >> sys.out, "ACQUIRED" + print("TRYING", file=sys.out) + print("ACQUIRED", file=sys.out) traceback.print_stack(None, None, out) - print >> sys.out, "ACQUIRED" + print("ACQUIRED", file=sys.out) return True def _is_owned(self): diff --git a/qpid/delegate.py b/qpid/delegate.py index b447c4aa..579cf6c9 100644 --- a/qpid/delegate.py +++ b/qpid/delegate.py @@ -21,6 +21,7 @@ Delegate implementation intended for use with the peer module. """ +from __future__ import print_function import threading, inspect, traceback, sys from connection08 import Method, Request, Response @@ -46,8 +47,8 @@ def __call__(self, channel, frame): try: return handler(channel, frame) except: - print >> sys.stderr, "Error in handler: %s\n\n%s" % \ - (_handler_name(method), traceback.format_exc()) + print("Error in handler: %s\n\n%s" % \ + (_handler_name(method), traceback.format_exc()), file=sys.stderr) def closed(self, reason): - print "Connection closed: %s" % reason + print("Connection closed: %s" % reason) diff --git a/qpid/disp.py b/qpid/disp.py index d1340b8a..2bef08ab 100644 --- a/qpid/disp.py +++ b/qpid/disp.py @@ -19,6 +19,7 @@ # under the License. # +from __future__ import print_function from time import strftime, gmtime class Header: @@ -130,7 +131,7 @@ def table(self, title, heads, rows): for idx in range(diff): row.append("") - print title + print(title) if len (rows) == 0: return colWidth = [] @@ -148,12 +149,12 @@ def table(self, title, heads, rows): for i in range (colWidth[col] - len (head)): line = line + " " col = col + 1 - print line + print(line) line = self.tablePrefix for width in colWidth: line = line + "=" * width line = line[:255] - print line + print(line) for row in rows: line = self.tablePrefix @@ -164,7 +165,7 @@ def table(self, title, heads, rows): for i in range (width - len (unicode (row[col]))): line = line + " " col = col + 1 - print line + print(line) def do_setTimeFormat (self, fmt): """ Select timestamp format """ diff --git a/qpid/managementdata.py b/qpid/managementdata.py index 66a39c6b..23261cc7 100644 --- a/qpid/managementdata.py +++ b/qpid/managementdata.py @@ -24,6 +24,7 @@ ## This file is being obsoleted by qmf/console.py ############################################################################### +from __future__ import print_function import qpid import re import socket @@ -171,14 +172,14 @@ def methodReply (self, broker, sequence, status, sText, args): try: line = "Call Result: " + self.methodsPending[sequence] + \ " " + str (status) + " (" + sText + ")" - print line, args + print(line, args) del self.methodsPending[sequence] finally: self.lock.release () def closeHandler (self, context, reason): if self.operational: - print "Connection to broker lost:", reason + print("Connection to broker lost:", reason) self.operational = False if self.cli != None: self.cli.setPromptMessage ("Broker Disconnected") @@ -458,21 +459,21 @@ def listClasses (self): self.disp.table ("Management Object Types:", ("ObjectType", "Active", "Deleted"), rows) else: - print "Waiting for next periodic update" + print("Waiting for next periodic update") finally: self.lock.release () def listObjects (self, tokens): """ Generate a display of a list of objects in a class """ if len(tokens) == 0: - print "Error - No class name provided" + print("Error - No class name provided") return self.lock.acquire () try: classKey = self.getClassKey (tokens[0]) if classKey == None: - print ("Object type %s not known" % tokens[0]) + print(("Object type %s not known" % tokens[0])) else: rows = [] if classKey in self.tables: @@ -506,18 +507,18 @@ def showObjects (self, tokens): classKey = self.getClassForId (self.rawObjId (rootId)) remaining = tokens if classKey == None: - print "Id not known: %d" % int (tokens[0]) + print("Id not known: %d" % int (tokens[0])) raise ValueError () else: classKey = self.getClassKey (tokens[0]) remaining = tokens[1:] if classKey not in self.tables: - print "Class not known: %s" % tokens[0] + print("Class not known: %s" % tokens[0]) raise ValueError () userIds = self.listOfIds (classKey, remaining) if len (userIds) == 0: - print "No object IDs supplied" + print("No object IDs supplied") raise ValueError () ids = [] @@ -586,7 +587,7 @@ def schemaTable (self, className): try: classKey = self.getClassKey (className) if classKey == None: - print ("Class name %s not known" % className) + print(("Class name %s not known" % className)) raise ValueError () rows = [] @@ -665,7 +666,7 @@ def callMethod (self, userOid, methodName, args): raise ValueError () if methodName not in self.schema[classKey][2]: - print "Method '%s' not valid for class '%s'" % (methodName, self.displayClassName(classKey)) + print("Method '%s' not valid for class '%s'" % (methodName, self.displayClassName(classKey))) raise ValueError () schemaMethod = self.schema[classKey][2][methodName] @@ -674,7 +675,7 @@ def callMethod (self, userOid, methodName, args): if schemaMethod[1][arg][2].find("I") != -1: count += 1 if len (args) != count: - print "Wrong number of method args: Need %d, Got %d" % (count, len (args)) + print("Wrong number of method args: Need %d, Got %d" % (count, len (args))) raise ValueError () namedArgs = {} @@ -723,7 +724,7 @@ def listIds (self, select): else: row = self.makeIdRow (select) if row == None: - print "Display Id %d not known" % select + print("Display Id %d not known" % select) return rows.append(row) self.disp.table("Translation of Display IDs:", @@ -754,7 +755,7 @@ def do_call (self, data): except: tokens = encTokens if len (tokens) < 2: - print "Not enough arguments supplied" + print("Not enough arguments supplied") return displayId = long (tokens[0]) diff --git a/qpid/ops.py b/qpid/ops.py index 390552be..2b07836b 100644 --- a/qpid/ops.py +++ b/qpid/ops.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import print_function import os, mllib, cPickle as pickle, sys from util import fill @@ -26,7 +27,7 @@ class Enum(object): # XXX: for backwards compatibility def values(cls): - print >> sys.stderr, "warning, please use .VALUES instead of .values()" + print("warning, please use .VALUES instead of .values()", file=sys.stderr) return cls.VALUES # we can't use the backport preprocessor here because this code gets # called by setup.py diff --git a/qpid/spec08.py b/qpid/spec08.py index 3a6f0ce0..64ebdd65 100644 --- a/qpid/spec08.py +++ b/qpid/spec08.py @@ -29,6 +29,7 @@ class so that the generated code can be reused in a variety of situations. """ +from __future__ import print_function import re, new, mllib, qpid from util import fill @@ -501,4 +502,4 @@ def test_summary(): rows.append('%s' % rule.text) rows.append(' ') - print template % "\n".join(rows) + print(template % "\n".join(rows)) diff --git a/qpid/testlib.py b/qpid/testlib.py index 94e0908f..0a4ad485 100644 --- a/qpid/testlib.py +++ b/qpid/testlib.py @@ -21,6 +21,7 @@ # Support library for qpid python tests. # +from __future__ import print_function import string import random @@ -71,8 +72,8 @@ def tearDown(self): for ch, ex in self.exchanges: ch.exchange_delete(exchange=ex) except: - print "Error on tearDown:" - print traceback.print_exc() + print("Error on tearDown:") + print(traceback.print_exc()) self.client.close() diff --git a/qpid/tests/__init__.py b/qpid/tests/__init__.py index 85ab013b..a9bbf85e 100644 --- a/qpid/tests/__init__.py +++ b/qpid/tests/__init__.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import print_function class Test: def __init__(self, name): @@ -43,14 +44,14 @@ def configure(self, config): class TestTestsXXX(Test): def testFoo(self): - print "this test has output" + print("this test has output") def testBar(self): - print "this test "*8 - print "has"*10 - print "a"*75 - print "lot of"*10 - print "output"*10 + print("this test "*8) + print("has"*10) + print("a"*75) + print("lot of"*10) + print("output"*10) def testQux(self): import sys diff --git a/qpid/tests/codec.py b/qpid/tests/codec.py index 8a8236d7..162b076a 100644 --- a/qpid/tests/codec.py +++ b/qpid/tests/codec.py @@ -18,6 +18,7 @@ # under the License. # +from __future__ import print_function import unittest from qpid.codec import Codec from qpid.spec08 import load @@ -704,25 +705,25 @@ def test_oldtestcases(self): test_runner = unittest.TextTestRunner(run_output_stream, '', '') test_result = test_runner.run(codec_test_suite) - print '\n%d test run...' % (test_result.testsRun) + print('\n%d test run...' % (test_result.testsRun)) if test_result.wasSuccessful(): - print '\nAll tests successful\n' + print('\nAll tests successful\n') if test_result.failures: - print '\n----------' - print '%d FAILURES:' % (len(test_result.failures)) - print '----------\n' + print('\n----------') + print('%d FAILURES:' % (len(test_result.failures))) + print('----------\n') for failure in test_result.failures: - print str(failure[0]) + ' ... FAIL' + print(str(failure[0]) + ' ... FAIL') if test_result.errors: - print '\n---------' - print '%d ERRORS:' % (len(test_result.errors)) - print '---------\n' + print('\n---------') + print('%d ERRORS:' % (len(test_result.errors))) + print('---------\n') for error in test_result.errors: - print str(error[0]) + ' ... ERROR' + print(str(error[0]) + ' ... ERROR') f = open('codec_unit_test_output.txt', 'w') f.write(str(run_output_stream.getvalue())) diff --git a/qpid/tests/messaging/implementation.py b/qpid/tests/messaging/implementation.py index 553d06bb..740dd273 100644 --- a/qpid/tests/messaging/implementation.py +++ b/qpid/tests/messaging/implementation.py @@ -16,13 +16,14 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import print_function import os if 'QPID_USE_SWIG_CLIENT' in os.environ and os.environ['QPID_USE_SWIG_CLIENT']: try: from qpid_messaging import * from qpid.datatypes import uuid4 except ImportError as e: - print "Swigged client not found. Falling back to pure bindings, %s\n" % e + print("Swigged client not found. Falling back to pure bindings, %s\n" % e) from qpid.messaging import * else: from qpid.messaging import * diff --git a/qpid/tests/messaging/selector.py b/qpid/tests/messaging/selector.py index 33328943..013c4132 100644 --- a/qpid/tests/messaging/selector.py +++ b/qpid/tests/messaging/selector.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import print_function import sys, os from logging import getLogger from unittest import TestCase @@ -86,7 +87,7 @@ def test_use_after_fork(self): s.send("child") os._exit(0) except Exception as e: - print >>sys.stderr, "test child process error: %s" % e + print("test child process error: %s" % e, file=sys.stderr) os.exit(1) finally: os._exit(1) # Hard exit from child to stop remaining tests running twice diff --git a/qpid_tests/broker_0_10/exchange.py b/qpid_tests/broker_0_10/exchange.py index e05b9f9c..ee03ce3a 100644 --- a/qpid_tests/broker_0_10/exchange.py +++ b/qpid_tests/broker_0_10/exchange.py @@ -23,6 +23,7 @@ Test classes ending in 'RuleTests' are derived from rules in amqp.xml. """ +from __future__ import print_function import Queue, logging, traceback from qpid.testlib import TestBase010 from qpid.datatypes import Message @@ -46,8 +47,8 @@ def tearDown(self): for ssn, ex in self.exchanges: ssn.exchange_delete(exchange=ex) except: - print "Error on tearDown:" - print traceback.print_exc() + print("Error on tearDown:") + print(traceback.print_exc()) TestBase010.tearDown(self) def createMessage(self, key="", body=""): diff --git a/qpid_tests/broker_0_10/lvq.py b/qpid_tests/broker_0_10/lvq.py index 07a8906f..40b98355 100644 --- a/qpid_tests/broker_0_10/lvq.py +++ b/qpid_tests/broker_0_10/lvq.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import print_function from qpid.tests.messaging.implementation import * from qpid.tests.messaging import Base import math @@ -82,7 +83,7 @@ def check_ring_lvq(self, ring_size, keys, message_count): rcv = self.ssn.receiver("lvq; {mode: browse}") retrieved = fetch_all_as_tuples(rcv) - print [v for k, v in retrieved] + print([v for k, v in retrieved]) for k, v in retrieved: assert v == "%s-%i" % (k, counters[k]) diff --git a/qpid_tests/broker_0_10/new_api.py b/qpid_tests/broker_0_10/new_api.py index a2d724f6..2dd91a40 100644 --- a/qpid_tests/broker_0_10/new_api.py +++ b/qpid_tests/broker_0_10/new_api.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import print_function from qpid.tests.messaging.implementation import * from qpid.tests.messaging import Base from qpidtoollibs import BrokerAgent @@ -33,14 +34,14 @@ class GeneralTests(Base): def assertEqual(self, left, right, text=None): if not left == right: - print "assertEqual failure: %r != %r" % (left, right) + print("assertEqual failure: %r != %r" % (left, right)) if text: - print " %r" % text + print(" %r" % text) assert None def fail(self, text=None): if text: - print "Fail: %r" % text + print("Fail: %r" % text) assert None def setup_connection(self): @@ -283,7 +284,7 @@ class SequenceNumberTests(Base): def fail(self, text=None): if text: - print "Fail: %r" % text + print("Fail: %r" % text) assert None def setup_connection(self): diff --git a/qpid_tests/broker_0_10/stats.py b/qpid_tests/broker_0_10/stats.py index 4f3931b7..9f7078d3 100644 --- a/qpid_tests/broker_0_10/stats.py +++ b/qpid_tests/broker_0_10/stats.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import print_function from qpid.tests.messaging.implementation import * from qpid.tests.messaging import Base from time import sleep @@ -33,24 +34,24 @@ class BrokerStatsTests(Base): def assertEqual(self, left, right, text=None): if not left == right: - print "assertEqual failure: %r != %r" % (left, right) + print("assertEqual failure: %r != %r" % (left, right)) if text: - print " %r" % text + print(" %r" % text) assert None def failUnless(self, value, text=None): if value: return - print "failUnless failure", + print("failUnless failure", end=' ') if text: - print ": %r" % text + print(": %r" % text) else: - print + print() assert None def fail(self, text=None): if text: - print "Fail: %r" % text + print("Fail: %r" % text) assert None def setup_connection(self): diff --git a/qpid_tests/broker_0_8/testlib.py b/qpid_tests/broker_0_8/testlib.py index 4f026b15..b1ceeb25 100644 --- a/qpid_tests/broker_0_8/testlib.py +++ b/qpid_tests/broker_0_8/testlib.py @@ -21,6 +21,7 @@ # Tests for the testlib itself. # +from __future__ import print_function from qpid.content import Content from qpid.testlib import TestBase from Queue import Empty @@ -30,7 +31,7 @@ def mytrace(frame, event, arg): print_stack(frame); - print "====" + print("====") return mytrace class TestBaseTest(TestBase): From f22f5adb21a0b65f88512399845ffb0e42c688bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 22:35:37 +0200 Subject: [PATCH 12/50] QPID-8631: remove use of `iteritems` and `xrange` (#12) These are somewhat helpful in Python 2, but they are not available in Python 3. --- qpid/client.py | 2 +- qpid/connection.py | 2 +- qpid/datatypes.py | 2 +- qpid/messaging/driver.py | 2 +- qpid/messaging/endpoints.py | 2 +- qpid/peer.py | 2 +- qpid/tests/codec.py | 2 +- qpid/tests/datatypes.py | 2 +- qpid/tests/messaging/endpoints.py | 4 ++-- qpid_tests/broker_0_10/lvq.py | 2 +- qpid_tests/broker_0_9/queue.py | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/qpid/client.py b/qpid/client.py index 39b7c584..b147062b 100644 --- a/qpid/client.py +++ b/qpid/client.py @@ -121,7 +121,7 @@ def session(self): self.lock.acquire() try: id = None - for i in xrange(1, 64*1024): + for i in range(1, 64*1024): if not self.sessions.has_key(i): id = i break diff --git a/qpid/connection.py b/qpid/connection.py index 4bc9d9d3..8d5f0377 100644 --- a/qpid/connection.py +++ b/qpid/connection.py @@ -111,7 +111,7 @@ def detach(self, name, ch): self.lock.release() def __channel(self): - for i in xrange(1, self.channel_max): + for i in range(1, self.channel_max): if not self.attached.has_key(i): return i else: diff --git a/qpid/datatypes.py b/qpid/datatypes.py index 985fc3a8..06528a52 100644 --- a/qpid/datatypes.py +++ b/qpid/datatypes.py @@ -319,7 +319,7 @@ def __hash__(self): rand = random.Random() rand.seed((os.getpid(), time.time(), socket.gethostname())) def random_uuid(): - bytes = [rand.randint(0, 255) for i in xrange(16)] + bytes = [rand.randint(0, 255) for i in range(16)] # From RFC4122, the version bits are set to 0100 bytes[7] &= 0x0F diff --git a/qpid/messaging/driver.py b/qpid/messaging/driver.py index 7f72e0df..2ca20b3a 100644 --- a/qpid/messaging/driver.py +++ b/qpid/messaging/driver.py @@ -894,7 +894,7 @@ def attach(self, ssn): if ssn.closed: return sst = self._attachments.get(ssn) if sst is None: - for i in xrange(0, self.channel_max): + for i in range(0, self.channel_max): if not self._sessions.has_key(i): ch = i break diff --git a/qpid/messaging/endpoints.py b/qpid/messaging/endpoints.py index a03749d5..d2a19d91 100644 --- a/qpid/messaging/endpoints.py +++ b/qpid/messaging/endpoints.py @@ -180,7 +180,7 @@ def __init__(self, url=None, **options): for key in opt_keys: setattr(self, key, None) # Get values from options, check for invalid options - for (key, value) in options.iteritems(): + for (key, value) in options.items(): if key in opt_keys: setattr(self, key, value) else: diff --git a/qpid/peer.py b/qpid/peer.py index 545d8aa4..fddddfdc 100644 --- a/qpid/peer.py +++ b/qpid/peer.py @@ -271,7 +271,7 @@ def write_content(self, klass, content): # if other type raise ContentError("Content body must be string or buffer, not a %s" % type(content.body)) frame_max = self.client.tune_params['frame_max'] - self.client.conn.AMQP_HEADER_SIZE - for chunk in (content.body[i:i + frame_max] for i in xrange(0, len(content.body), frame_max)): + for chunk in (content.body[i:i + frame_max] for i in range(0, len(content.body), frame_max)): self.write(Body(chunk)) def receive(self, frame, work): diff --git a/qpid/tests/codec.py b/qpid/tests/codec.py index 162b076a..1c68cfe6 100644 --- a/qpid/tests/codec.py +++ b/qpid/tests/codec.py @@ -637,7 +637,7 @@ def test(type, value): enc = stream.getvalue() stream.reset() dup = [] - for i in xrange(len(values)): + for i in range(len(values)): dup.append(codec.decode(type)) if values != dup: raise AssertionError("%r --> %r --> %r" % (values, enc, dup)) diff --git a/qpid/tests/datatypes.py b/qpid/tests/datatypes.py index 214e5806..e28a380f 100644 --- a/qpid/tests/datatypes.py +++ b/qpid/tests/datatypes.py @@ -210,7 +210,7 @@ def test(self): # this test is kind of lame, but it does excercise the basic # functionality of the class u = uuid4() - for i in xrange(1024): + for i in range(1024): assert u != uuid4() class MessageTest(TestCase): diff --git a/qpid/tests/messaging/endpoints.py b/qpid/tests/messaging/endpoints.py index 3c7df7ca..64b0a084 100644 --- a/qpid/tests/messaging/endpoints.py +++ b/qpid/tests/messaging/endpoints.py @@ -82,7 +82,7 @@ def testOpenCloseResourceLeaks(self): try: for i in range(32): if fds: os.close(fds.pop()) - for i in xrange(64): + for i in range(64): conn = Connection.establish(self.broker, **self.connection_options()) conn.close() finally: @@ -94,7 +94,7 @@ def testOpenFailResourceLeaks(self): try: for i in range(32): if fds: os.close(fds.pop()) - for i in xrange(64): + for i in range(64): conn = Connection("localhost:0", **self.connection_options()) # XXX: we need to force a waiter to be created for this test # to work diff --git a/qpid_tests/broker_0_10/lvq.py b/qpid_tests/broker_0_10/lvq.py index 40b98355..f5edc90d 100644 --- a/qpid_tests/broker_0_10/lvq.py +++ b/qpid_tests/broker_0_10/lvq.py @@ -73,7 +73,7 @@ def check_ring_lvq(self, ring_size, keys, message_count): counters[k] += 1 messages.append(create_message(k, "%s-%i" % (k, counters[k]))) # make sure we have sent at least one message for every key - for k, v in counters.iteritems(): + for k, v in counters.items(): if v == 0: counters[k] += 1 messages.append(create_message(k, "%s-%i" % (k, counters[k]))) diff --git a/qpid_tests/broker_0_9/queue.py b/qpid_tests/broker_0_9/queue.py index 8d6ae1cf..6ce8323f 100644 --- a/qpid_tests/broker_0_9/queue.py +++ b/qpid_tests/broker_0_9/queue.py @@ -121,7 +121,7 @@ def test_flow_control(self): channel.queue_declare(queue=queue_name, arguments={"x-qpid-capacity" : 25, "x-qpid-flow-resume-capacity" : 15}) try: - for i in xrange(100): + for i in range(100): channel.basic_publish(exchange="", routing_key=queue_name, content=Content("This is a message with more than 25 bytes. This should trigger flow control.")) time.sleep(.1) From 9a457018654d7bcd6e6304d1dbd74c2d52adb715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 22:49:20 +0200 Subject: [PATCH 13/50] QPID-8631: use the `in` operator for collection membership checks (#13) ``` python-modernize -wnf fissix.fixes.fix_has_key ``` --- qpid/__init__.py | 4 ++-- qpid/client.py | 6 +++--- qpid/codec.py | 6 +++--- qpid/codec010.py | 6 +++--- qpid/connection.py | 2 +- qpid/connection08.py | 4 ++-- qpid/datatypes.py | 4 ++-- qpid/framing.py | 4 ++-- qpid/message.py | 4 ++-- qpid/messaging/driver.py | 4 ++-- qpid/messaging/endpoints.py | 2 +- qpid/ops.py | 4 ++-- qpid/spec08.py | 18 +++++++++--------- qpid/tests/framing.py | 2 +- qpid/tests/messaging/__init__.py | 2 +- 15 files changed, 36 insertions(+), 36 deletions(-) diff --git a/qpid/__init__.py b/qpid/__init__.py index 780cab46..98c42c30 100644 --- a/qpid/__init__.py +++ b/qpid/__init__.py @@ -41,11 +41,11 @@ def _check(self, attr): return field def exists(self, attr): - return self.type.fields.byname.has_key(attr) + return attr in self.type.fields.byname def has(self, attr): self._check(attr) - return self._values.has_key(attr) + return attr in self._values def set(self, attr, value): self._check(attr) diff --git a/qpid/client.py b/qpid/client.py index b147062b..b4dba9e5 100644 --- a/qpid/client.py +++ b/qpid/client.py @@ -122,7 +122,7 @@ def session(self): try: id = None for i in range(1, 64*1024): - if not self.sessions.has_key(i): + if i not in self.sessions: id = i break finally: @@ -257,9 +257,9 @@ def __init__(self, spec): self.factories = {} def __getattr__(self, name): - if self.factories.has_key(name): + if name in self.factories: return self.factories[name] - elif self.spec.domains.byname.has_key(name): + elif name in self.spec.domains.byname: f = lambda *args, **kwargs: self.struct(name, *args, **kwargs) self.factories[name] = f return f diff --git a/qpid/codec.py b/qpid/codec.py index a4c54241..8f9d3743 100644 --- a/qpid/codec.py +++ b/qpid/codec.py @@ -131,7 +131,7 @@ def resolve(self, klass, value): return "signed_long" else: raise ValueError('Integer value is outwith the supported 64bit signed range') - if self.encodings.has_key(klass): + if klass in self.encodings: return self.encodings[klass] for base in klass.__bases__: result = self.resolve(base, value) @@ -461,7 +461,7 @@ def decode_table(self): log.debug("Field table entry key: %r", key) code = self.decode_octet() log.debug("Field table entry type code: %r", code) - if self.types.has_key(code): + if code in self.types: value = self.decode(self.types[code]) else: w = width(code) @@ -649,7 +649,7 @@ def decode_array(self): count = self.decode_long() result = [] for i in range(0, count): - if self.types.has_key(code): + if code in self.types: value = self.decode(self.types[code]) else: w = width(code) diff --git a/qpid/codec010.py b/qpid/codec010.py index f4dc60fc..78cd5923 100644 --- a/qpid/codec010.py +++ b/qpid/codec010.py @@ -60,7 +60,7 @@ def encoding(self, obj): return PRIMITIVE[enc] def _encoding(self, klass, obj): - if self.ENCODINGS.has_key(klass): + if klass in self.ENCODINGS: return self.ENCODINGS[klass](obj) for base in klass.__bases__: result = self._encoding(base, obj) @@ -339,7 +339,7 @@ def read_fields(self, op): for i in range(len(op.FIELDS)): f = op.FIELDS[i] if flags & (0x1 << i): - if COMPOUND.has_key(f.type): + if f.type in COMPOUND: value = self.read_compound(COMPOUND[f.type]) else: value = getattr(self, "read_%s" % f.type)() @@ -360,7 +360,7 @@ def write_fields(self, op): for i in range(len(op.FIELDS)): f = op.FIELDS[i] if flags & (0x1 << i): - if COMPOUND.has_key(f.type): + if f.type in COMPOUND: enc = self.write_compound else: enc = getattr(self, "write_%s" % f.type) diff --git a/qpid/connection.py b/qpid/connection.py index 8d5f0377..65c8ed74 100644 --- a/qpid/connection.py +++ b/qpid/connection.py @@ -112,7 +112,7 @@ def detach(self, name, ch): def __channel(self): for i in range(1, self.channel_max): - if not self.attached.has_key(i): + if i not in self.attached: return i else: raise ChannelsBusy() diff --git a/qpid/connection08.py b/qpid/connection08.py index 2c4fc914..23f75a2f 100644 --- a/qpid/connection08.py +++ b/qpid/connection08.py @@ -310,10 +310,10 @@ class __metaclass__(type): def __new__(cls, name, bases, dict): for attr in ("encode", "decode", "type"): - if not dict.has_key(attr): + if attr not in dict: raise TypeError("%s must define %s" % (name, attr)) dict["decode"] = staticmethod(dict["decode"]) - if dict.has_key("__init__"): + if "__init__" in dict: __init__ = dict["__init__"] def init(self, *args, **kwargs): args = list(args) diff --git a/qpid/datatypes.py b/qpid/datatypes.py index 06528a52..2f8a5d3d 100644 --- a/qpid/datatypes.py +++ b/qpid/datatypes.py @@ -33,10 +33,10 @@ def __init__(self, _type, *args, **kwargs): for field in _type.fields: if idx < len(args): arg = args[idx] - if kwargs.has_key(field.name): + if field.name in kwargs: raise TypeError("%s() got multiple values for keyword argument '%s'" % (_type.name, field.name)) - elif kwargs.has_key(field.name): + elif field.name in kwargs: arg = kwargs.pop(field.name) else: arg = field.default() diff --git a/qpid/framing.py b/qpid/framing.py index 389b6078..96af2311 100644 --- a/qpid/framing.py +++ b/qpid/framing.py @@ -208,11 +208,11 @@ def __init__(self): def write(self, *ops): for op in ops: - if COMMANDS.has_key(op.NAME): + if op.NAME in COMMANDS: seg_type = segment_type.command seg_track = track.command enc = self.encode_command(op) - elif CONTROLS.has_key(op.NAME): + elif op.NAME in CONTROLS: seg_type = segment_type.control seg_track = track.control enc = self.encode_compound(op) diff --git a/qpid/message.py b/qpid/message.py index 4d31da28..85de4400 100644 --- a/qpid/message.py +++ b/qpid/message.py @@ -43,7 +43,7 @@ def __getitem__(self, idx): def __getattr__(self, attr): fields = self.method.fields.byname - if fields.has_key(attr): + if attr in fields: f = fields[attr] result = self[self.method.fields.index(f)] else: @@ -51,7 +51,7 @@ def __getattr__(self, attr): if attr == r.name: def respond(*args, **kwargs): batch=0 - if kwargs.has_key("batchoffset"): + if "batchoffset" in kwargs: batch=kwargs.pop("batchoffset") self.channel.respond(Method(r, r.arguments(*args, **kwargs)), batch, self.frame) result = respond diff --git a/qpid/messaging/driver.py b/qpid/messaging/driver.py index 2ca20b3a..e6f7749a 100644 --- a/qpid/messaging/driver.py +++ b/qpid/messaging/driver.py @@ -820,7 +820,7 @@ def do_session_completed(self, sc): if not sc.commands.empty(): while sst.min_completion in sc.commands: - if sst.actions.has_key(sst.min_completion): + if sst.min_completion in sst.actions: sst.actions.pop(sst.min_completion)() sst.min_completion += 1 @@ -895,7 +895,7 @@ def attach(self, ssn): sst = self._attachments.get(ssn) if sst is None: for i in range(0, self.channel_max): - if not self._sessions.has_key(i): + if i not in self._sessions: ch = i break else: diff --git a/qpid/messaging/endpoints.py b/qpid/messaging/endpoints.py index d2a19d91..55ee1d12 100644 --- a/qpid/messaging/endpoints.py +++ b/qpid/messaging/endpoints.py @@ -298,7 +298,7 @@ def session(self, name=None, transactional=False): else: name = "%s:%s" % (self.id, name) - if self.sessions.has_key(name): + if name in self.sessions: return self.sessions[name] else: ssn = Session(self, name, transactional) diff --git a/qpid/ops.py b/qpid/ops.py index 2b07836b..acaadb13 100644 --- a/qpid/ops.py +++ b/qpid/ops.py @@ -226,8 +226,8 @@ def qualify(nd, field="@name"): def resolve(nd, domains): candidates = qualify(nd, "@type"), pythonize(nd["@type"]) for c in candidates: - if domains.has_key(c): - while domains.has_key(c): + if c in domains: + while c in domains: c = domains[c] return c else: diff --git a/qpid/spec08.py b/qpid/spec08.py index 64ebdd65..d0277209 100644 --- a/qpid/spec08.py +++ b/qpid/spec08.py @@ -42,11 +42,11 @@ def __init__(self): self.indexes = {} def add(self, item): - if self.byname.has_key(item.name): + if item.name in self.byname: raise ValueError("duplicate name: %s" % item) if item.id == None: item.id = len(self) - elif self.byid.has_key(item.id): + elif item.id in self.byid: raise ValueError("duplicate id: %s" % item) self.indexes[item] = len(self.items) self.items.append(item) @@ -101,12 +101,12 @@ def post_load(self): self.klass = self.define_class("Amqp%s%s" % (self.major, self.minor)) def method(self, name): - if not self.methods.has_key(name): + if name not in self.methods: for cls in self.classes: clen = len(cls.name) if name.startswith(cls.name) and name[clen] == "_": end = name[clen + 1:] - if cls.methods.byname.has_key(end): + if end in cls.methods.byname: self.methods[name] = cls.methods.byname[end] return self.methods.get(name) @@ -226,12 +226,12 @@ def arguments(self, *args, **kwargs): idx = self.fields.index(f) if idx < len(args): result.append(args[idx]) - elif kwargs.has_key(f.name): + elif f.name in kwargs: result.append(kwargs.pop(f.name)) else: result.append(Method.DEFAULTS[f.type]) for key, value in kwargs.items(): - if self.fields.byname.has_key(key): + if key in self.fields.byname: self._type_error("got multiple values for keyword argument '%s'", key) else: self._type_error("got an unexpected keyword argument '%s'", key) @@ -352,7 +352,7 @@ def load_fields(nd, l, domains): type = f_nd["@type"] type = pythonize(type) domain = None - while domains.has_key(type) and domains[type].type != type: + while type in domains and domains[type].type != type: domain = domains[type] type = domain.type l.add(Field(pythonize(f_nd["@name"]), f_nd.index(), type, domain, @@ -403,7 +403,7 @@ def load(specfile, *errata): # classes for c_nd in root.query["class"]: cname = pythonize(c_nd["@name"]) - if spec.classes.byname.has_key(cname): + if cname in spec.classes.byname: klass = spec.classes.byname[cname] else: klass = Class(spec, cname, int(c_nd["@index"]), c_nd["@handler"], @@ -414,7 +414,7 @@ def load(specfile, *errata): load_fields(c_nd, klass.fields, spec.domains.byname) for m_nd in c_nd.query["method"]: mname = pythonize(m_nd["@name"]) - if klass.methods.byname.has_key(mname): + if mname in klass.methods.byname: meth = klass.methods.byname[mname] else: meth = Method(klass, mname, diff --git a/qpid/tests/framing.py b/qpid/tests/framing.py index 0b33df8b..c421513b 100644 --- a/qpid/tests/framing.py +++ b/qpid/tests/framing.py @@ -65,7 +65,7 @@ def cmp_ops(self, op1, op2): for f in cls.FIELDS: v1 = getattr(op1, f.name) v2 = getattr(op2, f.name) - if COMPOUND.has_key(f.type) or f.type == "struct32": + if f.type in COMPOUND or f.type == "struct32": self.cmp_ops(v1, v2) elif f.type in ("list", "array"): self.cmp_list(v1, v2) diff --git a/qpid/tests/messaging/__init__.py b/qpid/tests/messaging/__init__.py index dd86d9f1..45d7eb80 100644 --- a/qpid/tests/messaging/__init__.py +++ b/qpid/tests/messaging/__init__.py @@ -125,7 +125,7 @@ def assertEcho(self, msg, echo, redelivered=False): if redelivered: assert echo.redelivered, \ "expected %s to be redelivered: %s" % (msg, echo) - if delta.has_key("redelivered"): + if "redelivered" in delta: del delta["redelivered"] assert mttl is not None and ettl is not None, "%s, %s" % (mttl, ettl) assert mttl >= ettl, "%s, %s" % (mttl, ettl) From d0050c6e3f80133f41e9bbcccaf3a2a7bde0c34b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 23:13:53 +0200 Subject: [PATCH 14/50] QPID-8631: make the `qpid-python-test` script Python 3 compatible (#14) This takes inspiration from the PROTON-490 changes done in the Qpid Proton Python client. --- qpid-python-test | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/qpid-python-test b/qpid-python-test index fef140b6..f877c03b 100755 --- a/qpid-python-test +++ b/qpid-python-test @@ -29,6 +29,11 @@ from logging import getLogger, StreamHandler, Formatter, Filter, \ from qpid.harness import Skipped from qpid.util import URL +if sys.version_info.major == 3: + CLASS_TYPES = (type,) +else: + CLASS_TYPES = (type, types.ClassType) + levels = { "DEBUG": DEBUG, "WARN": WARN, @@ -502,7 +507,7 @@ class FunctionScanner(PatternMatcher): class ClassScanner(PatternMatcher): def inspect(self, obj): - return type(obj) in (types.ClassType, types.TypeType) and self.matches(obj.__name__) + return type(obj) in CLASS_TYPES and self.matches(obj.__name__) def descend(self, cls): # the None is required for older versions of python @@ -514,7 +519,7 @@ class ClassScanner(PatternMatcher): for name in names: obj = getattr(cls, name) t = type(obj) - if t == types.MethodType and name.startswith("test"): + if hasattr(obj, '__call__') and name.startswith("test"): yield MethodTest(cls, name) class ModuleScanner: From c3f3a058350ef3ac66f27ce16f4085eee4c7bb41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 8 Apr 2023 17:45:16 +0200 Subject: [PATCH 15/50] QPID-8631: `new.module` -> `types.ModuleType` --- qpid/spec08.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qpid/spec08.py b/qpid/spec08.py index d0277209..cc86d26b 100644 --- a/qpid/spec08.py +++ b/qpid/spec08.py @@ -30,7 +30,7 @@ class so that the generated code can be reused in a variety of """ from __future__ import print_function -import re, new, mllib, qpid +import re, types, mllib, qpid from util import fill class SpecContainer: @@ -122,7 +122,7 @@ def struct(self, name, *args, **kwargs): return qpid.Struct(type, *args, **kwargs) def define_module(self, name, doc = None): - module = new.module(name, doc) + module = types.ModuleType(name, doc) module.__file__ = self.file for c in self.classes: cls = c.define_class(c.name) From 36eec7986b3d1f9145a05ffe569d81e10bc96542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 8 Apr 2023 18:02:37 +0200 Subject: [PATCH 16/50] QPID-8631: `rfc822.unquote` -> `email.utils.unquote` --- qpid/mimetype.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qpid/mimetype.py b/qpid/mimetype.py index f512996b..1c428b59 100644 --- a/qpid/mimetype.py +++ b/qpid/mimetype.py @@ -16,7 +16,7 @@ # specific language governing permissions and limitations # under the License. # -import re, rfc822 +import re, email.utils from lexer import Lexicon, LexError from parser import Parser, ParseError @@ -96,7 +96,7 @@ def value(self): if self.matches(TOKEN): return self.eat().value elif self.matches(STRING): - return rfc822.unquote(self.eat().value) + return email.utils.unquote(self.eat().value) else: raise ParseError(self.next(), TOKEN, STRING) From 2bc6123f8e80c21c7e765d3deb7528be1b67ff9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 8 Apr 2023 18:07:40 +0200 Subject: [PATCH 17/50] QPID-8631: `sgmllib.SGMLParser` -> `HTMLParser` --- mllib/parsers.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/mllib/parsers.py b/mllib/parsers.py index 3e7cc10d..48573f2c 100644 --- a/mllib/parsers.py +++ b/mllib/parsers.py @@ -21,7 +21,12 @@ Parsers for SGML and XML to dom. """ -import sgmllib, xml.sax.handler +from __future__ import absolute_import +try: + from HTMLParser import HTMLParser +except ImportError: + from html.parser import HTMLParser +import xml.sax.handler from dom import * class Parser: @@ -73,10 +78,10 @@ def balance(self, name = None): self.node = self.node.parent -class SGMLParser(sgmllib.SGMLParser): +class SGMLParser(HTMLParser): - def __init__(self, entitydefs = None): - sgmllib.SGMLParser.__init__(self) + def __init__(self, entitydefs=None): + super(SGMLParser, self).__init__() if entitydefs == None: self.entitydefs = {} else: @@ -102,7 +107,7 @@ def unknown_endtag(self, name): self.parser.end(name) def close(self): - sgmllib.SGMLParser.close(self) + super(SGMLParser, self).close() self.parser.balance() assert self.parser.node == self.parser.tree From 045e90408b4d3416e1ae4af893c4b4426d9e98a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 8 Apr 2023 17:40:19 +0200 Subject: [PATCH 18/50] QPID-8631: fallback import for `cStringIO.StringIO` or `io.StringIO` --- mllib/__init__.py | 5 ++++- mllib/transforms.py | 5 ++++- qpid/codec.py | 5 ++++- qpid/connection08.py | 5 ++++- qpid/management.py | 5 ++++- qpid/peer.py | 5 ++++- qpid/tests/codec.py | 5 ++++- 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/mllib/__init__.py b/mllib/__init__.py index 7d0ba993..f41ebe6f 100644 --- a/mllib/__init__.py +++ b/mllib/__init__.py @@ -26,7 +26,10 @@ import xml.sax, types from xml.sax.handler import ErrorHandler from xml.sax.xmlreader import InputSource -from cStringIO import StringIO +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO def transform(node, *args): result = node diff --git a/mllib/transforms.py b/mllib/transforms.py index dc258ccf..397e25cd 100644 --- a/mllib/transforms.py +++ b/mllib/transforms.py @@ -22,7 +22,10 @@ """ import mllib.dom -from cStringIO import StringIO +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO class Visitor: diff --git a/qpid/codec.py b/qpid/codec.py index 8f9d3743..78ea0d00 100644 --- a/qpid/codec.py +++ b/qpid/codec.py @@ -27,7 +27,10 @@ """ import re, qpid, spec08, os -from cStringIO import StringIO +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO from struct import * from reference import ReferenceId from logging import getLogger diff --git a/qpid/connection08.py b/qpid/connection08.py index 23f75a2f..d0faa004 100644 --- a/qpid/connection08.py +++ b/qpid/connection08.py @@ -24,7 +24,10 @@ """ import socket, codec, errno, qpid -from cStringIO import StringIO +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO from codec import EOF from compat import SHUT_RDWR from exceptions import VersionError diff --git a/qpid/management.py b/qpid/management.py index 2e764362..cd8e6b50 100644 --- a/qpid/management.py +++ b/qpid/management.py @@ -31,7 +31,10 @@ from threading import Thread from datatypes import Message, RangedSet from time import time -from cStringIO import StringIO +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO from codec010 import StringCodec as Codec from threading import Lock, Condition diff --git a/qpid/peer.py b/qpid/peer.py index fddddfdc..b6de3ce3 100644 --- a/qpid/peer.py +++ b/qpid/peer.py @@ -29,7 +29,10 @@ from message import Message from queue import Queue, Closed as QueueClosed from content import Content -from cStringIO import StringIO +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO from time import time from exceptions import Closed, Timeout, ContentError from logging import getLogger diff --git a/qpid/tests/codec.py b/qpid/tests/codec.py index 1c68cfe6..e18b01b5 100644 --- a/qpid/tests/codec.py +++ b/qpid/tests/codec.py @@ -22,7 +22,10 @@ import unittest from qpid.codec import Codec from qpid.spec08 import load -from cStringIO import StringIO +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO from qpid.reference import ReferenceId __doc__ = """ From 84abc181d2e44760c15178a584aac924b29f0bbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 8 Apr 2023 17:49:28 +0200 Subject: [PATCH 19/50] QPID-8631: fallback import for `cPickle` or `pickle` --- qpid/ops.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/qpid/ops.py b/qpid/ops.py index acaadb13..8f299454 100644 --- a/qpid/ops.py +++ b/qpid/ops.py @@ -17,7 +17,11 @@ # under the License. # from __future__ import print_function -import os, mllib, cPickle as pickle, sys +import os, mllib, sys +try: + import cPickle as pickle +except ImportError: + import pickle from util import fill class Primitive(object): From 9651001c6fe0b65e538a96e27df36582b7ccb004 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 12:48:14 +0200 Subject: [PATCH 20/50] QPID-8631: enable `absolute_import` from `__future__` and fix relative imports ``` python-modernize -wnf libmodernize.fixes.fix_import ``` --- examples/api/statistics.py | 1 + examples/reservations/common.py | 1 + mllib/__init__.py | 4 +- mllib/dom.py | 1 + mllib/parsers.py | 2 +- mllib/transforms.py | 1 + qpid-python-test | 1 + qpid/__init__.py | 3 +- qpid/client.py | 21 ++++++----- qpid/codec.py | 6 ++- qpid/codec010.py | 7 ++-- qpid/compat.py | 1 + qpid/concurrency.py | 4 +- qpid/connection.py | 20 +++++----- qpid/connection08.py | 10 +++-- qpid/datatypes.py | 3 +- qpid/debug.py | 1 + qpid/delegate.py | 3 +- qpid/delegates.py | 12 +++--- qpid/disp.py | 1 + qpid/framer.py | 5 ++- qpid/framing.py | 5 ++- qpid/generator.py | 3 +- qpid/lexer.py | 1 + qpid/log.py | 1 + qpid/management.py | 5 ++- qpid/managementdata.py | 3 +- qpid/message.py | 3 +- qpid/messaging/__init__.py | 1 + qpid/messaging/address.py | 1 + qpid/messaging/driver.py | 1 + qpid/messaging/endpoints.py | 3 +- qpid/messaging/message.py | 1 + qpid/messaging/transports.py | 1 + qpid/messaging/util.py | 1 + qpid/mimetype.py | 5 ++- qpid/ops.py | 5 ++- qpid/packer.py | 1 + qpid/peer.py | 11 +++--- qpid/queue.py | 8 +++- qpid/reference.py | 3 +- qpid/sasl.py | 1 + qpid/saslmech/amqplain.py | 3 +- qpid/saslmech/anonymous.py | 3 +- qpid/saslmech/cram_md5.py | 3 +- qpid/saslmech/cram_md5_hex.py | 3 +- qpid/saslmech/external.py | 3 +- qpid/saslmech/finder.py | 1 + qpid/saslmech/plain.py | 3 +- qpid/saslmech/scram.py | 3 +- qpid/saslmech/scram_sha_1.py | 3 +- qpid/saslmech/scram_sha_256.py | 3 +- qpid/selector.py | 3 +- qpid/session.py | 17 +++++---- qpid/spec08.py | 3 +- qpid/specs_config.py | 1 + qpid/testlib.py | 6 ++- qpid/tests/__init__.py | 1 + qpid/tests/codec.py | 1 + qpid/tests/codec010.py | 1 + qpid/tests/connection.py | 1 + qpid/tests/datatypes.py | 1 + qpid/tests/framing.py | 1 + qpid/tests/messaging/__init__.py | 3 +- qpid/tests/messaging/address.py | 1 + qpid/tests/messaging/endpoints.py | 1 + qpid/tests/messaging/implementation.py | 1 + qpid/tests/messaging/message.py | 1 + qpid/tests/messaging/selector.py | 1 + qpid/tests/mimetype.py | 3 +- qpid/tests/parser.py | 1 + qpid/tests/queue.py | 1 + qpid/tests/saslmech/finder.py | 5 ++- qpid/tests/saslmech/my_sasl.py | 1 + qpid/tests/saslmech/my_sasl2.py | 1 + qpid/tests/spec010.py | 1 + qpid/tests/util.py | 1 + qpid/util.py | 1 + qpid_tests/broker_0_10/__init__.py | 37 ++++++++++--------- qpid_tests/broker_0_10/alternate_exchange.py | 1 + qpid_tests/broker_0_10/broker.py | 1 + qpid_tests/broker_0_10/dtx.py | 1 + qpid_tests/broker_0_10/example.py | 1 + qpid_tests/broker_0_10/exchange.py | 7 +++- qpid_tests/broker_0_10/extensions.py | 1 + qpid_tests/broker_0_10/lvq.py | 1 + qpid_tests/broker_0_10/management.py | 1 + qpid_tests/broker_0_10/message.py | 1 + qpid_tests/broker_0_10/msg_groups.py | 1 + qpid_tests/broker_0_10/new_api.py | 1 + qpid_tests/broker_0_10/persistence.py | 1 + qpid_tests/broker_0_10/priority.py | 1 + qpid_tests/broker_0_10/qmf_events.py | 1 + qpid_tests/broker_0_10/query.py | 1 + qpid_tests/broker_0_10/queue.py | 1 + qpid_tests/broker_0_10/stats.py | 1 + qpid_tests/broker_0_10/threshold.py | 1 + qpid_tests/broker_0_10/tx.py | 1 + qpid_tests/broker_0_8/__init__.py | 3 +- qpid_tests/broker_0_8/basic.py | 1 + qpid_tests/broker_0_8/broker.py | 1 + qpid_tests/broker_0_8/example.py | 1 + qpid_tests/broker_0_8/exchange.py | 7 +++- qpid_tests/broker_0_8/queue.py | 1 + qpid_tests/broker_0_8/testlib.py | 6 ++- qpid_tests/broker_0_8/tx.py | 1 + qpid_tests/broker_0_9/__init__.py | 3 +- qpid_tests/broker_0_9/echo.py | 1 + qpid_tests/broker_0_9/messageheader.py | 1 + qpid_tests/broker_0_9/query.py | 1 + qpid_tests/broker_0_9/queue.py | 1 + qpid_tests/broker_1_0/general.py | 1 + qpid_tests/broker_1_0/legacy_exchanges.py | 1 + qpid_tests/broker_1_0/selector.py | 1 + qpid_tests/broker_1_0/translation.py | 1 + qpid_tests/broker_1_0/tx.py | 1 + qpid_tests/client/client-api-example-tests.py | 1 + setup.py | 1 + 118 files changed, 248 insertions(+), 108 deletions(-) diff --git a/examples/api/statistics.py b/examples/api/statistics.py index 77f1e1f4..32e4099f 100644 --- a/examples/api/statistics.py +++ b/examples/api/statistics.py @@ -18,6 +18,7 @@ # under the License. # +from __future__ import absolute_import from __future__ import print_function import time diff --git a/examples/reservations/common.py b/examples/reservations/common.py index 85aeebcf..381e0284 100644 --- a/examples/reservations/common.py +++ b/examples/reservations/common.py @@ -18,6 +18,7 @@ # under the License. # +from __future__ import absolute_import from __future__ import print_function import traceback from fnmatch import fnmatch diff --git a/mllib/__init__.py b/mllib/__init__.py index f41ebe6f..d978a0c5 100644 --- a/mllib/__init__.py +++ b/mllib/__init__.py @@ -22,7 +22,9 @@ both SGML and XML. """ -import os, dom, transforms, parsers, sys +from __future__ import absolute_import +import os, sys +from . import dom, transforms, parsers import xml.sax, types from xml.sax.handler import ErrorHandler from xml.sax.xmlreader import InputSource diff --git a/mllib/dom.py b/mllib/dom.py index 1d2cb5e1..916f8148 100644 --- a/mllib/dom.py +++ b/mllib/dom.py @@ -21,6 +21,7 @@ Simple DOM for both SGML and XML documents. """ +from __future__ import absolute_import from __future__ import division from __future__ import generators from __future__ import nested_scopes diff --git a/mllib/parsers.py b/mllib/parsers.py index 48573f2c..03c67647 100644 --- a/mllib/parsers.py +++ b/mllib/parsers.py @@ -27,7 +27,7 @@ except ImportError: from html.parser import HTMLParser import xml.sax.handler -from dom import * +from .dom import * class Parser: diff --git a/mllib/transforms.py b/mllib/transforms.py index 397e25cd..b64af5e8 100644 --- a/mllib/transforms.py +++ b/mllib/transforms.py @@ -21,6 +21,7 @@ Useful transforms for dom objects. """ +from __future__ import absolute_import import mllib.dom try: from cStringIO import StringIO diff --git a/qpid-python-test b/qpid-python-test index f877c03b..791f38b2 100755 --- a/qpid-python-test +++ b/qpid-python-test @@ -20,6 +20,7 @@ # TODO: summarize, test harness preconditions (e.g. broker is alive) +from __future__ import absolute_import from __future__ import print_function import logging, optparse, os, struct, sys, time, traceback, types from fnmatch import fnmatchcase as match diff --git a/qpid/__init__.py b/qpid/__init__.py index 98c42c30..a2f1a313 100644 --- a/qpid/__init__.py +++ b/qpid/__init__.py @@ -17,7 +17,8 @@ # under the License. # -import connection +from __future__ import absolute_import +from . import connection class Struct: diff --git a/qpid/client.py b/qpid/client.py index b4dba9e5..b062ea5d 100644 --- a/qpid/client.py +++ b/qpid/client.py @@ -22,16 +22,17 @@ interacting with the server. """ +from __future__ import absolute_import import os, threading -from peer import Peer, Channel, Closed -from delegate import Delegate -from util import get_client_properties_with_defaults -from connection08 import Connection, Frame, connect -from spec08 import load -from queue import Queue -from reference import ReferenceId, References -from saslmech.finder import get_sasl_mechanism -from saslmech.sasl import SaslException +from .peer import Peer, Channel, Closed +from .delegate import Delegate +from .util import get_client_properties_with_defaults +from .connection08 import Connection, Frame, connect +from .spec08 import load +from .queue import Queue +from .reference import ReferenceId, References +from .saslmech.finder import get_sasl_mechanism +from .saslmech.sasl import SaslException class Client: @@ -42,7 +43,7 @@ def __init__(self, host, port, spec = None, vhost = None): if spec: self.spec = spec else: - from specs_config import amqp_spec_0_9 + from .specs_config import amqp_spec_0_9 self.spec = load(amqp_spec_0_9) self.structs = StructFactory(self.spec) self.sessions = {} diff --git a/qpid/codec.py b/qpid/codec.py index 78ea0d00..42977042 100644 --- a/qpid/codec.py +++ b/qpid/codec.py @@ -26,13 +26,15 @@ The unit test for this module is located in tests/codec.py """ -import re, qpid, spec08, os +from __future__ import absolute_import +import re, qpid, os +from . import spec08 try: from cStringIO import StringIO except ImportError: from io import StringIO from struct import * -from reference import ReferenceId +from .reference import ReferenceId from logging import getLogger log = getLogger("qpid.codec") diff --git a/qpid/codec010.py b/qpid/codec010.py index 78cd5923..a03e60e2 100644 --- a/qpid/codec010.py +++ b/qpid/codec010.py @@ -17,10 +17,11 @@ # under the License. # +from __future__ import absolute_import import datetime, string -from packer import Packer -from datatypes import serial, timestamp, RangedSet, Struct, UUID -from ops import Compound, PRIMITIVE, COMPOUND +from .packer import Packer +from .datatypes import serial, timestamp, RangedSet, Struct, UUID +from .ops import Compound, PRIMITIVE, COMPOUND class CodecException(Exception): pass diff --git a/qpid/compat.py b/qpid/compat.py index edd604ce..f3559ab1 100644 --- a/qpid/compat.py +++ b/qpid/compat.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import sys import errno import time diff --git a/qpid/concurrency.py b/qpid/concurrency.py index b9df9f15..89f8740d 100644 --- a/qpid/concurrency.py +++ b/qpid/concurrency.py @@ -17,7 +17,9 @@ # under the License. # -import compat, inspect, time +from __future__ import absolute_import +import inspect, time +from . import compat def synchronized(meth): args, vargs, kwargs, defs = inspect.getargspec(meth) diff --git a/qpid/connection.py b/qpid/connection.py index 65c8ed74..498e6384 100644 --- a/qpid/connection.py +++ b/qpid/connection.py @@ -17,16 +17,18 @@ # under the License. # -import datatypes, session +from __future__ import absolute_import +from . import datatypes, session from threading import Thread, Condition, RLock -from util import wait, notify -from codec010 import StringCodec -from framing import * -from session import Session -from generator import control_invoker -from exceptions import * +from .util import wait, notify +from .codec010 import StringCodec +from .framing import * +from .session import Session +from .generator import control_invoker +from .exceptions import * from logging import getLogger -import qpid.delegates, socket +import qpid.delegates +import socket import sys class ChannelBusy(Exception): pass @@ -43,7 +45,7 @@ def client(*args, **kwargs): def server(*args, **kwargs): return qpid.delegates.Server(*args, **kwargs) -from framer import Framer +from .framer import Framer class Connection(Framer): diff --git a/qpid/connection08.py b/qpid/connection08.py index d0faa004..527e9b67 100644 --- a/qpid/connection08.py +++ b/qpid/connection08.py @@ -23,14 +23,16 @@ server, or even a proxy implementation. """ -import socket, codec, errno, qpid +from __future__ import absolute_import +import socket, errno, qpid +from . import codec try: from cStringIO import StringIO except ImportError: from io import StringIO -from codec import EOF -from compat import SHUT_RDWR -from exceptions import VersionError +from .codec import EOF +from .compat import SHUT_RDWR +from .exceptions import VersionError from logging import getLogger, DEBUG log = getLogger("qpid.connection08") diff --git a/qpid/datatypes.py b/qpid/datatypes.py index 2f8a5d3d..b6d5452a 100644 --- a/qpid/datatypes.py +++ b/qpid/datatypes.py @@ -17,8 +17,9 @@ # under the License. # +from __future__ import absolute_import import threading, struct, datetime, time -from exceptions import Timeout +from .exceptions import Timeout class Struct: diff --git a/qpid/debug.py b/qpid/debug.py index 423b03de..bc02ae58 100644 --- a/qpid/debug.py +++ b/qpid/debug.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from __future__ import print_function import threading, traceback, signal, sys, time diff --git a/qpid/delegate.py b/qpid/delegate.py index 579cf6c9..b8ee687a 100644 --- a/qpid/delegate.py +++ b/qpid/delegate.py @@ -21,9 +21,10 @@ Delegate implementation intended for use with the peer module. """ +from __future__ import absolute_import from __future__ import print_function import threading, inspect, traceback, sys -from connection08 import Method, Request, Response +from .connection08 import Method, Request, Response def _handler_name(method): return "%s_%s" % (method.klass.name, method.name) diff --git a/qpid/delegates.py b/qpid/delegates.py index e231a851..8071296f 100644 --- a/qpid/delegates.py +++ b/qpid/delegates.py @@ -17,13 +17,15 @@ # under the License. # -import os, session +from __future__ import absolute_import +import os import qpid.connection -from util import notify, get_client_properties_with_defaults -from datatypes import RangedSet -from exceptions import VersionError, Closed +from . import session +from .util import notify, get_client_properties_with_defaults +from .datatypes import RangedSet +from .exceptions import VersionError, Closed from logging import getLogger -from ops import Control +from .ops import Control import sys from qpid import sasl diff --git a/qpid/disp.py b/qpid/disp.py index 2bef08ab..67031c79 100644 --- a/qpid/disp.py +++ b/qpid/disp.py @@ -19,6 +19,7 @@ # under the License. # +from __future__ import absolute_import from __future__ import print_function from time import strftime, gmtime diff --git a/qpid/framer.py b/qpid/framer.py index ff907e90..95d9d7c4 100644 --- a/qpid/framer.py +++ b/qpid/framer.py @@ -17,9 +17,10 @@ # under the License. # +from __future__ import absolute_import import struct, socket -from exceptions import Closed -from packer import Packer +from .exceptions import Closed +from .packer import Packer from threading import RLock from logging import getLogger diff --git a/qpid/framing.py b/qpid/framing.py index 96af2311..a441487d 100644 --- a/qpid/framing.py +++ b/qpid/framing.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import struct FIRST_SEG = 0x08 @@ -197,9 +198,9 @@ def read(self): self.frames = [] return result -from ops import COMMANDS, CONTROLS, COMPOUND, Header, segment_type, track +from .ops import COMMANDS, CONTROLS, COMPOUND, Header, segment_type, track -from codec010 import StringCodec +from .codec010 import StringCodec class OpEncoder: diff --git a/qpid/generator.py b/qpid/generator.py index 02d11e50..8fb602ea 100644 --- a/qpid/generator.py +++ b/qpid/generator.py @@ -17,9 +17,10 @@ # under the License. # +from __future__ import absolute_import import sys -from ops import * +from .ops import * def METHOD(module, op): method = lambda self, *args, **kwargs: self.invoke(op, args, kwargs) diff --git a/qpid/lexer.py b/qpid/lexer.py index ec28bbb9..acf01bc3 100644 --- a/qpid/lexer.py +++ b/qpid/lexer.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import import re class Type: diff --git a/qpid/log.py b/qpid/log.py index 1fd7d741..6296a4ef 100644 --- a/qpid/log.py +++ b/qpid/log.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from logging import getLogger, StreamHandler, Formatter from logging import DEBUG, INFO, WARN, ERROR, CRITICAL diff --git a/qpid/management.py b/qpid/management.py index cd8e6b50..7d5e39a5 100644 --- a/qpid/management.py +++ b/qpid/management.py @@ -25,17 +25,18 @@ Management API for Qpid """ +from __future__ import absolute_import import qpid import struct import socket from threading import Thread -from datatypes import Message, RangedSet +from .datatypes import Message, RangedSet from time import time try: from cStringIO import StringIO except ImportError: from io import StringIO -from codec010 import StringCodec as Codec +from .codec010 import StringCodec as Codec from threading import Lock, Condition diff --git a/qpid/managementdata.py b/qpid/managementdata.py index 23261cc7..b6338eee 100644 --- a/qpid/managementdata.py +++ b/qpid/managementdata.py @@ -24,6 +24,7 @@ ## This file is being obsoleted by qmf/console.py ############################################################################### +from __future__ import absolute_import from __future__ import print_function import qpid import re @@ -35,7 +36,7 @@ from qpid.connection import Timeout from qpid.management import managementChannel, managementClient from threading import Lock -from disp import Display +from .disp import Display from shlex import split from qpid.connection import Connection from qpid.util import connect diff --git a/qpid/message.py b/qpid/message.py index 85de4400..f703dd43 100644 --- a/qpid/message.py +++ b/qpid/message.py @@ -16,7 +16,8 @@ # specific language governing permissions and limitations # under the License. # -from connection08 import Method, Request +from __future__ import absolute_import +from .connection08 import Method, Request class Message: diff --git a/qpid/messaging/__init__.py b/qpid/messaging/__init__.py index f9ddda2e..82946864 100644 --- a/qpid/messaging/__init__.py +++ b/qpid/messaging/__init__.py @@ -28,6 +28,7 @@ - protocol negotiation/multiprotocol impl """ +from __future__ import absolute_import from qpid.datatypes import timestamp, uuid4, Serial from qpid.messaging.constants import * from qpid.messaging.endpoints import * diff --git a/qpid/messaging/address.py b/qpid/messaging/address.py index e423f091..786481b4 100644 --- a/qpid/messaging/address.py +++ b/qpid/messaging/address.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import import re from qpid.lexer import Lexicon, LexError from qpid.parser import Parser, ParseError diff --git a/qpid/messaging/driver.py b/qpid/messaging/driver.py index e6f7749a..11066353 100644 --- a/qpid/messaging/driver.py +++ b/qpid/messaging/driver.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import socket, struct, sys, time from logging import getLogger, DEBUG from qpid import compat diff --git a/qpid/messaging/endpoints.py b/qpid/messaging/endpoints.py index 55ee1d12..56c24263 100644 --- a/qpid/messaging/endpoints.py +++ b/qpid/messaging/endpoints.py @@ -28,6 +28,7 @@ - protocol negotiation/multiprotocol impl """ +from __future__ import absolute_import from logging import getLogger from math import ceil from qpid.codec010 import StringCodec @@ -245,7 +246,7 @@ def __init__(self, url=None, **options): self._condition = Condition(self._lock) self._waiter = Waiter(self._condition) self._modcount = Serial(0) - from driver import Driver + from .driver import Driver self._driver = Driver(self) def _wait(self, predicate, timeout=None): diff --git a/qpid/messaging/message.py b/qpid/messaging/message.py index b70b365c..3891665e 100644 --- a/qpid/messaging/message.py +++ b/qpid/messaging/message.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.codec010 import StringCodec from qpid.ops import PRIMITIVE diff --git a/qpid/messaging/transports.py b/qpid/messaging/transports.py index 0b2334e6..839210ec 100644 --- a/qpid/messaging/transports.py +++ b/qpid/messaging/transports.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import socket from qpid.util import connect diff --git a/qpid/messaging/util.py b/qpid/messaging/util.py index 726cfd51..f83106ad 100644 --- a/qpid/messaging/util.py +++ b/qpid/messaging/util.py @@ -21,6 +21,7 @@ Add-on utilities for the L{qpid.messaging} API. """ +from __future__ import absolute_import from qpid.messaging import * from logging import getLogger from threading import Thread diff --git a/qpid/mimetype.py b/qpid/mimetype.py index 1c428b59..a7b5cbc6 100644 --- a/qpid/mimetype.py +++ b/qpid/mimetype.py @@ -16,9 +16,10 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import import re, email.utils -from lexer import Lexicon, LexError -from parser import Parser, ParseError +from .lexer import Lexicon, LexError +from .parser import Parser, ParseError l = Lexicon() diff --git a/qpid/ops.py b/qpid/ops.py index 8f299454..a54e3524 100644 --- a/qpid/ops.py +++ b/qpid/ops.py @@ -16,13 +16,14 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from __future__ import print_function import os, mllib, sys try: import cPickle as pickle except ImportError: import pickle -from util import fill +from .util import fill class Primitive(object): pass @@ -269,7 +270,7 @@ def load_types(file): f.close() return types -from specs_config import amqp_spec as file +from .specs_config import amqp_spec as file types = load_types(file) ENUMS = {} diff --git a/qpid/packer.py b/qpid/packer.py index 22c16918..25b7957c 100644 --- a/qpid/packer.py +++ b/qpid/packer.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import struct class Packer: diff --git a/qpid/peer.py b/qpid/peer.py index b6de3ce3..5d863b3a 100644 --- a/qpid/peer.py +++ b/qpid/peer.py @@ -24,17 +24,18 @@ incoming method frames to a delegate. """ +from __future__ import absolute_import import threading, traceback, socket, sys -from connection08 import EOF, Method, Header, Body, Request, Response, VersionError -from message import Message -from queue import Queue, Closed as QueueClosed -from content import Content +from .connection08 import EOF, Method, Header, Body, Request, Response, VersionError +from .message import Message +from .queue import Queue, Closed as QueueClosed +from .content import Content try: from cStringIO import StringIO except ImportError: from io import StringIO from time import time -from exceptions import Closed, Timeout, ContentError +from .exceptions import Closed, Timeout, ContentError from logging import getLogger log = getLogger("qpid.peer") diff --git a/qpid/queue.py b/qpid/queue.py index af7ee20b..86b5d987 100644 --- a/qpid/queue.py +++ b/qpid/queue.py @@ -23,9 +23,13 @@ content of a queue can be notified if the queue is no longer in use. """ -from Queue import Queue as BaseQueue, Empty, Full +from __future__ import absolute_import +try: + from Queue import Queue as BaseQueue, Empty, Full +except ImportError: + from queue import Queue as BaseQueue, Empty, Full from threading import Thread -from exceptions import Closed +from .exceptions import Closed class Queue(BaseQueue): diff --git a/qpid/reference.py b/qpid/reference.py index 1f1d7614..50c5c5fd 100644 --- a/qpid/reference.py +++ b/qpid/reference.py @@ -23,8 +23,9 @@ Support for amqp 'reference' content (as opposed to inline content) """ +from __future__ import absolute_import import threading -from queue import Queue, Closed +from .queue import Queue, Closed class NotOpened(Exception): pass diff --git a/qpid/sasl.py b/qpid/sasl.py index a2147e3c..0531760e 100644 --- a/qpid/sasl.py +++ b/qpid/sasl.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import socket class SASLError(Exception): diff --git a/qpid/saslmech/amqplain.py b/qpid/saslmech/amqplain.py index 731f6b66..e8bea5d9 100644 --- a/qpid/saslmech/amqplain.py +++ b/qpid/saslmech/amqplain.py @@ -17,7 +17,8 @@ # under the License. # -from sasl import Sasl +from __future__ import absolute_import +from .sasl import Sasl class AMQPLAIN(Sasl): diff --git a/qpid/saslmech/anonymous.py b/qpid/saslmech/anonymous.py index 1002a3aa..ce24b1c6 100644 --- a/qpid/saslmech/anonymous.py +++ b/qpid/saslmech/anonymous.py @@ -17,7 +17,8 @@ # under the License. # -from sasl import Sasl +from __future__ import absolute_import +from .sasl import Sasl class ANONYMOUS(Sasl): diff --git a/qpid/saslmech/cram_md5.py b/qpid/saslmech/cram_md5.py index a351f438..5dec9759 100644 --- a/qpid/saslmech/cram_md5.py +++ b/qpid/saslmech/cram_md5.py @@ -17,7 +17,8 @@ # under the License. # -from sasl import Sasl +from __future__ import absolute_import +from .sasl import Sasl from hmac import HMAC class CRAM_MD5(Sasl): diff --git a/qpid/saslmech/cram_md5_hex.py b/qpid/saslmech/cram_md5_hex.py index 03463db0..cdc4ff49 100644 --- a/qpid/saslmech/cram_md5_hex.py +++ b/qpid/saslmech/cram_md5_hex.py @@ -17,7 +17,8 @@ # under the License. # -from sasl import Sasl +from __future__ import absolute_import +from .sasl import Sasl from hmac import HMAC from hashlib import md5 diff --git a/qpid/saslmech/external.py b/qpid/saslmech/external.py index 51c8d975..098835fc 100644 --- a/qpid/saslmech/external.py +++ b/qpid/saslmech/external.py @@ -17,7 +17,8 @@ # under the License. # -from sasl import Sasl +from __future__ import absolute_import +from .sasl import Sasl class EXTERNAL(Sasl): diff --git a/qpid/saslmech/finder.py b/qpid/saslmech/finder.py index 975e79a7..8aac8825 100644 --- a/qpid/saslmech/finder.py +++ b/qpid/saslmech/finder.py @@ -18,6 +18,7 @@ # +from __future__ import absolute_import from logging import getLogger log = getLogger("qpid.saslmech") diff --git a/qpid/saslmech/plain.py b/qpid/saslmech/plain.py index 8e6fb74f..0040372e 100644 --- a/qpid/saslmech/plain.py +++ b/qpid/saslmech/plain.py @@ -17,7 +17,8 @@ # under the License. # -from sasl import Sasl +from __future__ import absolute_import +from .sasl import Sasl class PLAIN(Sasl): diff --git a/qpid/saslmech/scram.py b/qpid/saslmech/scram.py index 11a2d2fb..a6c112c9 100644 --- a/qpid/saslmech/scram.py +++ b/qpid/saslmech/scram.py @@ -17,9 +17,10 @@ # under the License. # +from __future__ import absolute_import from hmac import HMAC from binascii import b2a_hex -from sasl import Sasl +from .sasl import Sasl import os import base64 diff --git a/qpid/saslmech/scram_sha_1.py b/qpid/saslmech/scram_sha_1.py index 83f58f8e..7022dc80 100644 --- a/qpid/saslmech/scram_sha_1.py +++ b/qpid/saslmech/scram_sha_1.py @@ -17,7 +17,8 @@ # under the License. # -from scram import SCRAM_base +from __future__ import absolute_import +from .scram import SCRAM_base from hashlib import sha1 class SCRAM_SHA_1(SCRAM_base): diff --git a/qpid/saslmech/scram_sha_256.py b/qpid/saslmech/scram_sha_256.py index cc894895..47d8b716 100644 --- a/qpid/saslmech/scram_sha_256.py +++ b/qpid/saslmech/scram_sha_256.py @@ -17,7 +17,8 @@ # under the License. # -from scram import SCRAM_base +from __future__ import absolute_import +from .scram import SCRAM_base import hashlib class SCRAM_SHA_256(SCRAM_base): diff --git a/qpid/selector.py b/qpid/selector.py index f0f66c83..72eca72b 100644 --- a/qpid/selector.py +++ b/qpid/selector.py @@ -16,8 +16,9 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import import time, errno, os, atexit, traceback -from compat import select, SelectError, set, selectable_waiter, format_exc +from .compat import select, SelectError, set, selectable_waiter, format_exc from threading import Thread, Lock from logging import getLogger from qpid.messaging import InternalError diff --git a/qpid/session.py b/qpid/session.py index d04f369d..266113b1 100644 --- a/qpid/session.py +++ b/qpid/session.py @@ -17,15 +17,16 @@ # under the License. # +from __future__ import absolute_import from threading import Condition, RLock, Lock, currentThread -from generator import command_invoker -from datatypes import RangedSet, Struct, Future -from codec010 import StringCodec -from queue import Queue -from datatypes import Message, serial -from ops import Command, MessageTransfer -from util import wait, notify -from exceptions import * +from .generator import command_invoker +from .datatypes import RangedSet, Struct, Future +from .codec010 import StringCodec +from .queue import Queue +from .datatypes import Message, serial +from .ops import Command, MessageTransfer +from .util import wait, notify +from .exceptions import * from logging import getLogger log = getLogger("qpid.io.cmd") diff --git a/qpid/spec08.py b/qpid/spec08.py index cc86d26b..343312ef 100644 --- a/qpid/spec08.py +++ b/qpid/spec08.py @@ -29,9 +29,10 @@ class so that the generated code can be reused in a variety of situations. """ +from __future__ import absolute_import from __future__ import print_function import re, types, mllib, qpid -from util import fill +from .util import fill class SpecContainer: diff --git a/qpid/specs_config.py b/qpid/specs_config.py index d991e8b0..23694c50 100644 --- a/qpid/specs_config.py +++ b/qpid/specs_config.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import os AMQP_SPEC_DIR=os.path.join(os.path.dirname(os.path.abspath(__file__)), "specs") diff --git a/qpid/testlib.py b/qpid/testlib.py index 0a4ad485..d3d48e83 100644 --- a/qpid/testlib.py +++ b/qpid/testlib.py @@ -21,13 +21,17 @@ # Support library for qpid python tests. # +from __future__ import absolute_import from __future__ import print_function import string import random import unittest, traceback, socket import qpid.client, qmf.console -import Queue +try: + import Queue +except ImportError: + import queue as Queue from qpid.content import Content from qpid.message import Message from qpid.harness import Skipped diff --git a/qpid/tests/__init__.py b/qpid/tests/__init__.py index a9bbf85e..37b8fe44 100644 --- a/qpid/tests/__init__.py +++ b/qpid/tests/__init__.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from __future__ import print_function class Test: diff --git a/qpid/tests/codec.py b/qpid/tests/codec.py index e18b01b5..e0ac26df 100644 --- a/qpid/tests/codec.py +++ b/qpid/tests/codec.py @@ -18,6 +18,7 @@ # under the License. # +from __future__ import absolute_import from __future__ import print_function import unittest from qpid.codec import Codec diff --git a/qpid/tests/codec010.py b/qpid/tests/codec010.py index 787ebc14..cf0ab501 100644 --- a/qpid/tests/codec010.py +++ b/qpid/tests/codec010.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import time from unittest import TestCase diff --git a/qpid/tests/connection.py b/qpid/tests/connection.py index 744a8be2..fe51367a 100644 --- a/qpid/tests/connection.py +++ b/qpid/tests/connection.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import time from threading import * from unittest import TestCase diff --git a/qpid/tests/datatypes.py b/qpid/tests/datatypes.py index e28a380f..86e5470b 100644 --- a/qpid/tests/datatypes.py +++ b/qpid/tests/datatypes.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from unittest import TestCase from qpid.datatypes import * from qpid.ops import DeliveryProperties, FragmentProperties, MessageProperties diff --git a/qpid/tests/framing.py b/qpid/tests/framing.py index c421513b..2d987f8b 100644 --- a/qpid/tests/framing.py +++ b/qpid/tests/framing.py @@ -20,6 +20,7 @@ # setup, usage, teardown, errors(sync), errors(async), stress, soak, # boundary-conditions, config +from __future__ import absolute_import from qpid.tests import Test from qpid.framing import * diff --git a/qpid/tests/messaging/__init__.py b/qpid/tests/messaging/__init__.py index 45d7eb80..29d9bab9 100644 --- a/qpid/tests/messaging/__init__.py +++ b/qpid/tests/messaging/__init__.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import time from math import ceil from qpid.harness import Skipped @@ -233,4 +234,4 @@ def __str__(self): s += ":%s" % self.port return s -import address, endpoints, message, selector +from . import address, endpoints, message, selector diff --git a/qpid/tests/messaging/address.py b/qpid/tests/messaging/address.py index a947ee7e..c1860ab6 100644 --- a/qpid/tests/messaging/address.py +++ b/qpid/tests/messaging/address.py @@ -18,6 +18,7 @@ # +from __future__ import absolute_import from qpid.tests import Test from qpid.messaging.address import lex, parse, ParseError, EOF, ID, NUMBER, \ SYM, WSPACE, LEXER diff --git a/qpid/tests/messaging/endpoints.py b/qpid/tests/messaging/endpoints.py index 64b0a084..1320ac2f 100644 --- a/qpid/tests/messaging/endpoints.py +++ b/qpid/tests/messaging/endpoints.py @@ -20,6 +20,7 @@ # setup, usage, teardown, errors(sync), errors(async), stress, soak, # boundary-conditions, config +from __future__ import absolute_import import errno, os, socket, sys, time from qpid import compat from qpid.compat import set diff --git a/qpid/tests/messaging/implementation.py b/qpid/tests/messaging/implementation.py index 740dd273..e8a039f3 100644 --- a/qpid/tests/messaging/implementation.py +++ b/qpid/tests/messaging/implementation.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from __future__ import print_function import os if 'QPID_USE_SWIG_CLIENT' in os.environ and os.environ['QPID_USE_SWIG_CLIENT']: diff --git a/qpid/tests/messaging/message.py b/qpid/tests/messaging/message.py index 76bb1031..ee5b56e2 100644 --- a/qpid/tests/messaging/message.py +++ b/qpid/tests/messaging/message.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.tests.messaging.implementation import * from qpid.messaging.address import parse from qpid.tests.messaging import Base diff --git a/qpid/tests/messaging/selector.py b/qpid/tests/messaging/selector.py index 013c4132..40236278 100644 --- a/qpid/tests/messaging/selector.py +++ b/qpid/tests/messaging/selector.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from __future__ import print_function import sys, os from logging import getLogger diff --git a/qpid/tests/mimetype.py b/qpid/tests/mimetype.py index 22760316..441bc532 100644 --- a/qpid/tests/mimetype.py +++ b/qpid/tests/mimetype.py @@ -17,9 +17,10 @@ # under the License. # +from __future__ import absolute_import from qpid.tests import Test from qpid.mimetype import lex, parse, ParseError, EOF, WSPACE -from parser import ParserBase +from qpid.tests.parser import ParserBase class MimeTypeTests(ParserBase, Test): diff --git a/qpid/tests/parser.py b/qpid/tests/parser.py index d6e1067e..3ff4548c 100644 --- a/qpid/tests/parser.py +++ b/qpid/tests/parser.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.parser import ParseError class ParserBase: diff --git a/qpid/tests/queue.py b/qpid/tests/queue.py index e12354eb..b9d8f56f 100644 --- a/qpid/tests/queue.py +++ b/qpid/tests/queue.py @@ -18,6 +18,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import import threading, time from unittest import TestCase from qpid.queue import Queue, Empty, Closed diff --git a/qpid/tests/saslmech/finder.py b/qpid/tests/saslmech/finder.py index 3ad5e727..bdeb438b 100644 --- a/qpid/tests/saslmech/finder.py +++ b/qpid/tests/saslmech/finder.py @@ -17,10 +17,11 @@ # under the License. # +from __future__ import absolute_import from unittest import TestCase from qpid.saslmech.finder import get_sasl_mechanism -from my_sasl import MY_SASL -from my_sasl2 import MY_SASL2 +from .my_sasl import MY_SASL +from .my_sasl2 import MY_SASL2 class SaslFinderTests (TestCase): """Tests the ability to chose the a sasl mechanism from those available to be loaded""" diff --git a/qpid/tests/saslmech/my_sasl.py b/qpid/tests/saslmech/my_sasl.py index c15fe445..c7a3e47a 100644 --- a/qpid/tests/saslmech/my_sasl.py +++ b/qpid/tests/saslmech/my_sasl.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.saslmech.sasl import Sasl class MY_SASL(Sasl): pass diff --git a/qpid/tests/saslmech/my_sasl2.py b/qpid/tests/saslmech/my_sasl2.py index e0b3dfa5..da1429b5 100644 --- a/qpid/tests/saslmech/my_sasl2.py +++ b/qpid/tests/saslmech/my_sasl2.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.saslmech.sasl import Sasl class MY_SASL2(Sasl): diff --git a/qpid/tests/spec010.py b/qpid/tests/spec010.py index 9729efea..cce8ca3e 100644 --- a/qpid/tests/spec010.py +++ b/qpid/tests/spec010.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import os, tempfile, shutil, stat from unittest import TestCase from qpid.codec010 import Codec, StringCodec diff --git a/qpid/tests/util.py b/qpid/tests/util.py index 4e901218..5fcb1811 100644 --- a/qpid/tests/util.py +++ b/qpid/tests/util.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from unittest import TestCase from qpid.util import get_client_properties_with_defaults diff --git a/qpid/util.py b/qpid/util.py index 285d8b53..2e0984c8 100644 --- a/qpid/util.py +++ b/qpid/util.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import import os, socket, time, textwrap, re, sys try: diff --git a/qpid_tests/broker_0_10/__init__.py b/qpid_tests/broker_0_10/__init__.py index 312dc226..4e50931b 100644 --- a/qpid_tests/broker_0_10/__init__.py +++ b/qpid_tests/broker_0_10/__init__.py @@ -19,21 +19,22 @@ # under the License. # -from alternate_exchange import * -from broker import * -from dtx import * -from example import * -from exchange import * -from management import * -from message import * -from query import * -from queue import * -from tx import * -from lvq import * -from priority import * -from threshold import * -from extensions import * -from msg_groups import * -from new_api import * -from stats import * -from qmf_events import * +from __future__ import absolute_import +from .alternate_exchange import * +from .broker import * +from .dtx import * +from .example import * +from .exchange import * +from .management import * +from .message import * +from .query import * +from .queue import * +from .tx import * +from .lvq import * +from .priority import * +from .threshold import * +from .extensions import * +from .msg_groups import * +from .new_api import * +from .stats import * +from .qmf_events import * diff --git a/qpid_tests/broker_0_10/alternate_exchange.py b/qpid_tests/broker_0_10/alternate_exchange.py index 07ef7ea7..0ed40c51 100644 --- a/qpid_tests/broker_0_10/alternate_exchange.py +++ b/qpid_tests/broker_0_10/alternate_exchange.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import import traceback from qpid.queue import Empty from qpid.datatypes import Message, RangedSet diff --git a/qpid_tests/broker_0_10/broker.py b/qpid_tests/broker_0_10/broker.py index 242b6f14..f906e4ee 100644 --- a/qpid_tests/broker_0_10/broker.py +++ b/qpid_tests/broker_0_10/broker.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Closed from qpid.queue import Empty from qpid.testlib import TestBase010 diff --git a/qpid_tests/broker_0_10/dtx.py b/qpid_tests/broker_0_10/dtx.py index 4753998e..2f757b8e 100644 --- a/qpid_tests/broker_0_10/dtx.py +++ b/qpid_tests/broker_0_10/dtx.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Client, Closed from qpid.queue import Empty from qpid.datatypes import Message, RangedSet diff --git a/qpid_tests/broker_0_10/example.py b/qpid_tests/broker_0_10/example.py index 83d20819..2e3fa81c 100644 --- a/qpid_tests/broker_0_10/example.py +++ b/qpid_tests/broker_0_10/example.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.datatypes import Message, RangedSet from qpid.testlib import TestBase010 diff --git a/qpid_tests/broker_0_10/exchange.py b/qpid_tests/broker_0_10/exchange.py index ee03ce3a..0cd0a550 100644 --- a/qpid_tests/broker_0_10/exchange.py +++ b/qpid_tests/broker_0_10/exchange.py @@ -23,8 +23,13 @@ Test classes ending in 'RuleTests' are derived from rules in amqp.xml. """ +from __future__ import absolute_import from __future__ import print_function -import Queue, logging, traceback +import logging, traceback +try: + import Queue +except ImportError: + import queue as Queue from qpid.testlib import TestBase010 from qpid.datatypes import Message from qpid.client import Closed diff --git a/qpid_tests/broker_0_10/extensions.py b/qpid_tests/broker_0_10/extensions.py index 944a8690..f967f5ea 100644 --- a/qpid_tests/broker_0_10/extensions.py +++ b/qpid_tests/broker_0_10/extensions.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Client, Closed from qpid.queue import Empty from qpid.content import Content diff --git a/qpid_tests/broker_0_10/lvq.py b/qpid_tests/broker_0_10/lvq.py index f5edc90d..34ea63fa 100644 --- a/qpid_tests/broker_0_10/lvq.py +++ b/qpid_tests/broker_0_10/lvq.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from __future__ import print_function from qpid.tests.messaging.implementation import * from qpid.tests.messaging import Base diff --git a/qpid_tests/broker_0_10/management.py b/qpid_tests/broker_0_10/management.py index d146ddf8..c1d4cf5f 100644 --- a/qpid_tests/broker_0_10/management.py +++ b/qpid_tests/broker_0_10/management.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.datatypes import Message, RangedSet from qpid.testlib import TestBase010 from qpid.management import managementChannel, managementClient diff --git a/qpid_tests/broker_0_10/message.py b/qpid_tests/broker_0_10/message.py index ef388640..9b9a051f 100644 --- a/qpid_tests/broker_0_10/message.py +++ b/qpid_tests/broker_0_10/message.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Client, Closed from qpid.queue import Empty from qpid.testlib import TestBase010 diff --git a/qpid_tests/broker_0_10/msg_groups.py b/qpid_tests/broker_0_10/msg_groups.py index ec015e1b..124625ae 100644 --- a/qpid_tests/broker_0_10/msg_groups.py +++ b/qpid_tests/broker_0_10/msg_groups.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.messaging import * from qpid.tests.messaging import Base import qmf.console diff --git a/qpid_tests/broker_0_10/new_api.py b/qpid_tests/broker_0_10/new_api.py index 2dd91a40..301b0ad8 100644 --- a/qpid_tests/broker_0_10/new_api.py +++ b/qpid_tests/broker_0_10/new_api.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from __future__ import print_function from qpid.tests.messaging.implementation import * from qpid.tests.messaging import Base diff --git a/qpid_tests/broker_0_10/persistence.py b/qpid_tests/broker_0_10/persistence.py index 42698ae3..a204ded0 100644 --- a/qpid_tests/broker_0_10/persistence.py +++ b/qpid_tests/broker_0_10/persistence.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.datatypes import Message, RangedSet #from qpid.testlib import testrunner, TestBase010 from qpid.testlib import TestBase010 diff --git a/qpid_tests/broker_0_10/priority.py b/qpid_tests/broker_0_10/priority.py index 47aae6df..8311a3a5 100644 --- a/qpid_tests/broker_0_10/priority.py +++ b/qpid_tests/broker_0_10/priority.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.tests.messaging.implementation import * from qpid.tests.messaging import Base from qpid.compat import set diff --git a/qpid_tests/broker_0_10/qmf_events.py b/qpid_tests/broker_0_10/qmf_events.py index 7ab7b0a1..cfc7129b 100644 --- a/qpid_tests/broker_0_10/qmf_events.py +++ b/qpid_tests/broker_0_10/qmf_events.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.messaging import * from qpid.tests.messaging import Base from qpidtoollibs.broker import EventHelper diff --git a/qpid_tests/broker_0_10/query.py b/qpid_tests/broker_0_10/query.py index fd741821..45cf44b2 100644 --- a/qpid_tests/broker_0_10/query.py +++ b/qpid_tests/broker_0_10/query.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Client, Closed from qpid.queue import Empty from qpid.content import Content diff --git a/qpid_tests/broker_0_10/queue.py b/qpid_tests/broker_0_10/queue.py index 6dbc842f..a3de6cb2 100644 --- a/qpid_tests/broker_0_10/queue.py +++ b/qpid_tests/broker_0_10/queue.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Client, Closed from qpid.queue import Empty from qpid.testlib import TestBase010 diff --git a/qpid_tests/broker_0_10/stats.py b/qpid_tests/broker_0_10/stats.py index 9f7078d3..bf48371d 100644 --- a/qpid_tests/broker_0_10/stats.py +++ b/qpid_tests/broker_0_10/stats.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from __future__ import print_function from qpid.tests.messaging.implementation import * from qpid.tests.messaging import Base diff --git a/qpid_tests/broker_0_10/threshold.py b/qpid_tests/broker_0_10/threshold.py index fa172c66..7d9ad7c1 100644 --- a/qpid_tests/broker_0_10/threshold.py +++ b/qpid_tests/broker_0_10/threshold.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.messaging import * from qpid.tests.messaging import Base import math diff --git a/qpid_tests/broker_0_10/tx.py b/qpid_tests/broker_0_10/tx.py index 956e25ba..ac1b250f 100644 --- a/qpid_tests/broker_0_10/tx.py +++ b/qpid_tests/broker_0_10/tx.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Client, Closed from qpid.queue import Empty from qpid.datatypes import Message, RangedSet diff --git a/qpid_tests/broker_0_8/__init__.py b/qpid_tests/broker_0_8/__init__.py index 526f2452..0acd7b46 100644 --- a/qpid_tests/broker_0_8/__init__.py +++ b/qpid_tests/broker_0_8/__init__.py @@ -19,4 +19,5 @@ # under the License. # -import basic, broker, example, exchange, queue, testlib, tx +from __future__ import absolute_import +from . import basic, broker, example, exchange, queue, testlib, tx diff --git a/qpid_tests/broker_0_8/basic.py b/qpid_tests/broker_0_8/basic.py index 04b364cb..4638a9f6 100644 --- a/qpid_tests/broker_0_8/basic.py +++ b/qpid_tests/broker_0_8/basic.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Client, Closed from qpid.queue import Empty from qpid.content import Content diff --git a/qpid_tests/broker_0_8/broker.py b/qpid_tests/broker_0_8/broker.py index b281c729..7538c896 100644 --- a/qpid_tests/broker_0_8/broker.py +++ b/qpid_tests/broker_0_8/broker.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Closed from qpid.queue import Empty from qpid.content import Content diff --git a/qpid_tests/broker_0_8/example.py b/qpid_tests/broker_0_8/example.py index 17e9a454..55c672df 100644 --- a/qpid_tests/broker_0_8/example.py +++ b/qpid_tests/broker_0_8/example.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.content import Content from qpid.testlib import TestBase diff --git a/qpid_tests/broker_0_8/exchange.py b/qpid_tests/broker_0_8/exchange.py index 3c7b493a..bd496b0e 100644 --- a/qpid_tests/broker_0_8/exchange.py +++ b/qpid_tests/broker_0_8/exchange.py @@ -23,7 +23,12 @@ Test classes ending in 'RuleTests' are derived from rules in amqp.xml. """ -import Queue, logging +from __future__ import absolute_import +try: + import Queue +except ImportError: + import queue as Queue +import logging from qpid.testlib import TestBase from qpid.content import Content from qpid.client import Closed diff --git a/qpid_tests/broker_0_8/queue.py b/qpid_tests/broker_0_8/queue.py index a354d062..f5e17e2a 100644 --- a/qpid_tests/broker_0_8/queue.py +++ b/qpid_tests/broker_0_8/queue.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Client, Closed from qpid.queue import Empty from qpid.content import Content diff --git a/qpid_tests/broker_0_8/testlib.py b/qpid_tests/broker_0_8/testlib.py index b1ceeb25..592eeaf5 100644 --- a/qpid_tests/broker_0_8/testlib.py +++ b/qpid_tests/broker_0_8/testlib.py @@ -21,10 +21,14 @@ # Tests for the testlib itself. # +from __future__ import absolute_import from __future__ import print_function from qpid.content import Content from qpid.testlib import TestBase -from Queue import Empty +try: + from Queue import Empty +except ImportError: + from queue import Empty import sys from traceback import * diff --git a/qpid_tests/broker_0_8/tx.py b/qpid_tests/broker_0_8/tx.py index 39251caa..e9c7ceb0 100644 --- a/qpid_tests/broker_0_8/tx.py +++ b/qpid_tests/broker_0_8/tx.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Client, Closed from qpid.queue import Empty from qpid.content import Content diff --git a/qpid_tests/broker_0_9/__init__.py b/qpid_tests/broker_0_9/__init__.py index 72e69a51..2ddefcf2 100644 --- a/qpid_tests/broker_0_9/__init__.py +++ b/qpid_tests/broker_0_9/__init__.py @@ -19,4 +19,5 @@ # under the License. # -import query, queue, messageheader, echo +from __future__ import absolute_import +from . import query, queue, messageheader, echo diff --git a/qpid_tests/broker_0_9/echo.py b/qpid_tests/broker_0_9/echo.py index 8cd9fab4..b8b5535e 100644 --- a/qpid_tests/broker_0_9/echo.py +++ b/qpid_tests/broker_0_9/echo.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.testlib import TestBase from qpid.content import Content from qpid.harness import Skipped diff --git a/qpid_tests/broker_0_9/messageheader.py b/qpid_tests/broker_0_9/messageheader.py index 3d64adfc..b6284dd7 100644 --- a/qpid_tests/broker_0_9/messageheader.py +++ b/qpid_tests/broker_0_9/messageheader.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.testlib import TestBase class MessageHeaderTests(TestBase): diff --git a/qpid_tests/broker_0_9/query.py b/qpid_tests/broker_0_9/query.py index cb66d079..ae6c8de7 100644 --- a/qpid_tests/broker_0_9/query.py +++ b/qpid_tests/broker_0_9/query.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Client, Closed from qpid.queue import Empty from qpid.content import Content diff --git a/qpid_tests/broker_0_9/queue.py b/qpid_tests/broker_0_9/queue.py index 6ce8323f..79981ae7 100644 --- a/qpid_tests/broker_0_9/queue.py +++ b/qpid_tests/broker_0_9/queue.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import import time from qpid.client import Client, Closed from qpid.queue import Empty diff --git a/qpid_tests/broker_1_0/general.py b/qpid_tests/broker_1_0/general.py index 9433e86d..3f0dbe70 100644 --- a/qpid_tests/broker_1_0/general.py +++ b/qpid_tests/broker_1_0/general.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.tests.messaging.implementation import * from qpid.tests.messaging import VersionTest diff --git a/qpid_tests/broker_1_0/legacy_exchanges.py b/qpid_tests/broker_1_0/legacy_exchanges.py index eefa49e8..ad196dac 100644 --- a/qpid_tests/broker_1_0/legacy_exchanges.py +++ b/qpid_tests/broker_1_0/legacy_exchanges.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.tests.messaging.implementation import * from qpid.tests.messaging import VersionTest diff --git a/qpid_tests/broker_1_0/selector.py b/qpid_tests/broker_1_0/selector.py index 323baaab..e979d792 100644 --- a/qpid_tests/broker_1_0/selector.py +++ b/qpid_tests/broker_1_0/selector.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.tests.messaging.implementation import * from qpid.tests.messaging import VersionTest diff --git a/qpid_tests/broker_1_0/translation.py b/qpid_tests/broker_1_0/translation.py index a6394fb8..b54209cb 100644 --- a/qpid_tests/broker_1_0/translation.py +++ b/qpid_tests/broker_1_0/translation.py @@ -17,6 +17,7 @@ # under the License. # +from __future__ import absolute_import from qpid.tests.messaging.implementation import * from qpid.tests.messaging import VersionTest diff --git a/qpid_tests/broker_1_0/tx.py b/qpid_tests/broker_1_0/tx.py index eb84f4ca..5c05daee 100644 --- a/qpid_tests/broker_1_0/tx.py +++ b/qpid_tests/broker_1_0/tx.py @@ -16,6 +16,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import from qpid.client import Client, Closed from qpid.queue import Empty from qpid.datatypes import Message, RangedSet diff --git a/qpid_tests/client/client-api-example-tests.py b/qpid_tests/client/client-api-example-tests.py index 43e0aada..9fb15408 100755 --- a/qpid_tests/client/client-api-example-tests.py +++ b/qpid_tests/client/client-api-example-tests.py @@ -28,6 +28,7 @@ """ +from __future__ import absolute_import import os import shlex import subprocess diff --git a/setup.py b/setup.py index eef67356..87b3000e 100755 --- a/setup.py +++ b/setup.py @@ -17,6 +17,7 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import absolute_import import os, re, sys, string, platform from distutils.core import setup, Command from distutils.command.build import build as _build From bf7eec3d294a3ba0990f69d8a37fe9e54285503b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 8 Apr 2023 18:27:08 +0200 Subject: [PATCH 21/50] QPID-8631: use the `list.sort(key=` parameter --- qpid_tests/broker_0_10/priority.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/qpid_tests/broker_0_10/priority.py b/qpid_tests/broker_0_10/priority.py index 8311a3a5..c49ef65d 100644 --- a/qpid_tests/broker_0_10/priority.py +++ b/qpid_tests/broker_0_10/priority.py @@ -242,12 +242,5 @@ def sorted_(msgs, key=None, reverse=False): of keyword arguments to list.sort() """ temp = [m for m in msgs] - temp.sort(key_to_cmp(key, reverse=reverse)) + temp.sort(key=key, reverse=reverse) return temp - -def key_to_cmp(key, reverse=False): - if key: - if reverse: return lambda a, b: cmp(key(b), key(a)) - else: return lambda a, b: cmp(key(a), key(b)) - else: - return None From 127ca4a4082579f93ad38e9a9dc0146def65edb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 10:53:17 +0200 Subject: [PATCH 22/50] QPID-8631: fix some deprecation warnings by using new `notify_all`, `is_set`, `is_alive`, `daemon` --- qpid/connection.py | 2 +- qpid/datatypes.py | 4 ++-- qpid/messaging/util.py | 2 +- qpid/peer.py | 10 +++++----- qpid/queue.py | 4 ++-- qpid/selector.py | 2 +- qpid/tests/connection.py | 4 ++-- qpid/util.py | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/qpid/connection.py b/qpid/connection.py index 498e6384..0905aaaa 100644 --- a/qpid/connection.py +++ b/qpid/connection.py @@ -64,7 +64,7 @@ def __init__(self, sock, delegate=client, **args): self.close_code = (None, "connection aborted") self.thread = Thread(target=self.run) - self.thread.setDaemon(True) + self.thread.daemon = True self.channel_max = 65535 self.user_id = None diff --git a/qpid/datatypes.py b/qpid/datatypes.py index b6d5452a..5fc6ee21 100644 --- a/qpid/datatypes.py +++ b/qpid/datatypes.py @@ -276,7 +276,7 @@ def set(self, value): def get(self, timeout=None): self._set.wait(timeout) - if self._set.isSet(): + if self._set.is_set(): if self._error != None: raise self.exception(self._error) return self.value @@ -284,7 +284,7 @@ def get(self, timeout=None): raise Timeout() def is_set(self): - return self._set.isSet() + return self._set.is_set() try: from uuid import uuid4 diff --git a/qpid/messaging/util.py b/qpid/messaging/util.py index f83106ad..18e58d86 100644 --- a/qpid/messaging/util.py +++ b/qpid/messaging/util.py @@ -43,7 +43,7 @@ def main(): ssn.acknowledge(msg, sync=False) thread = Thread(name="auto-fetch-reconnect-urls", target=main) - thread.setDaemon(True) + thread.daemon = True thread.start() diff --git a/qpid/peer.py b/qpid/peer.py index 5d863b3a..6386584f 100644 --- a/qpid/peer.py +++ b/qpid/peer.py @@ -167,13 +167,13 @@ def stop(self): finally: timeout = 1; self.worker_thread.join(timeout); - if self.worker_thread.isAlive(): + if self.worker_thread.is_alive(): log.warn("Worker thread failed to shutdown within timeout") self.reader_thread.join(timeout); - if self.reader_thread.isAlive(): + if self.reader_thread.is_alive(): log.warn("Reader thread failed to shutdown within timeout") self.writer_thread.join(timeout); - if self.writer_thread.isAlive(): + if self.writer_thread.is_alive(): log.warn("Writer thread failed to shutdown within timeout") class Requester: @@ -452,13 +452,13 @@ def put_response(self, channel, response): def get_response(self, timeout=None): self.completed.wait(timeout) - if self.completed.isSet(): + if self.completed.is_set(): return self.response else: return None def is_complete(self): - return self.completed.isSet() + return self.completed.is_set() class OutgoingCompletion: """ diff --git a/qpid/queue.py b/qpid/queue.py index 86b5d987..aa190ad9 100644 --- a/qpid/queue.py +++ b/qpid/queue.py @@ -69,7 +69,7 @@ def listen(self, listener, exc_listener = None): if self.thread is not None: self.put(Queue.STOP) # loop and timed join permit keyboard interrupts to work - while self.thread.isAlive(): + while self.thread.is_alive(): self.thread.join(3) self.thread = None @@ -78,7 +78,7 @@ def listen(self, listener, exc_listener = None): if listener is not None and self.thread is None: self.thread = Thread(target = self.run) - self.thread.setDaemon(True) + self.thread.daemon = True self.thread.start() def run(self): diff --git a/qpid/selector.py b/qpid/selector.py index 72eca72b..d26829d8 100644 --- a/qpid/selector.py +++ b/qpid/selector.py @@ -125,7 +125,7 @@ def unregister(self, selectable): def start(self): _check(self.exception) self.thread = Thread(target=self.run) - self.thread.setDaemon(True) + self.thread.daemon = True self.thread.start(); def run(self): diff --git a/qpid/tests/connection.py b/qpid/tests/connection.py index fe51367a..f223501f 100644 --- a/qpid/tests/connection.py +++ b/qpid/tests/connection.py @@ -85,11 +85,11 @@ def run(): pass self.server = Thread(target=run) - self.server.setDaemon(True) + self.server.daemon = True self.server.start() started.wait(3) - assert started.isSet() + assert started.is_set() def tearDown(self): self.running = False diff --git a/qpid/util.py b/qpid/util.py index 2e0984c8..b91005aa 100644 --- a/qpid/util.py +++ b/qpid/util.py @@ -120,7 +120,7 @@ def notify(condition, action=lambda: None): condition.acquire() try: action() - condition.notifyAll() + condition.notify_all() finally: condition.release() From d4d92964fa586c6349edc86100567058d341dbb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 11:13:42 +0200 Subject: [PATCH 23/50] QPID-8631: prefer list comprehension syntax over `map()` and `filter()` --- qpid/spec08.py | 2 +- qpid/tests/codec.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qpid/spec08.py b/qpid/spec08.py index 343312ef..d28aa640 100644 --- a/qpid/spec08.py +++ b/qpid/spec08.py @@ -364,7 +364,7 @@ def load(specfile, *errata): spec_root = doc["amqp"] spec = Spec(int(spec_root["@major"]), int(spec_root["@minor"]), specfile) - for root in [spec_root] + map(lambda x: mllib.xml_parse(x)["amqp"], errata): + for root in [spec_root] + [mllib.xml_parse(x)["amqp"] for x in errata]: # constants for nd in root.query["constant"]: val = nd["@value"] diff --git a/qpid/tests/codec.py b/qpid/tests/codec.py index e0ac26df..03f6fc24 100644 --- a/qpid/tests/codec.py +++ b/qpid/tests/codec.py @@ -661,7 +661,7 @@ def oldtests(): """ for value in ("1", "0", "110", "011", "11001", "10101", "10011"): for i in range(10): - dotest("bit", map(lambda x: x == "1", value*i)) + dotest("bit", [x == "1" for x in value*i]) for value in ({}, {"asdf": "fdsa", "fdsa": 1, "three": 3}, {"one": 1}): dotest("table", value) From 5f4b01e0292e46e862011338b3e5b4858f76833a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 9 Apr 2023 12:06:10 +0200 Subject: [PATCH 24/50] QPID-8631: replace use of `string.joinfields` function --- qpid/codec010.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qpid/codec010.py b/qpid/codec010.py index a03e60e2..bd6a3aae 100644 --- a/qpid/codec010.py +++ b/qpid/codec010.py @@ -18,7 +18,7 @@ # from __future__ import absolute_import -import datetime, string +import datetime from .packer import Packer from .datatypes import serial, timestamp, RangedSet, Struct, UUID from .ops import Compound, PRIMITIVE, COMPOUND @@ -258,7 +258,7 @@ def write_map(self, m): sc = StringCodec() if m is not None: sc.write_uint32(len(m)) - sc.write(string.joinfields(map(self._write_map_elem, m.keys(), m.values()), "")) + sc.write(b"".join(map(self._write_map_elem, m.keys(), m.values()))) self.write_vbin32(sc.encoded) def read_array(self): From 86bea7c3a9a97cbf71ed7bf5a39a8d53a3015bfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 8 Apr 2023 18:33:45 +0200 Subject: [PATCH 25/50] QPID-8631: remove extraneous semicolons --- examples/api/hello | 2 +- qpid-python-test | 6 ++-- qpid/client.py | 2 +- qpid/codec.py | 2 +- qpid/connection08.py | 3 +- qpid/delegates.py | 2 +- qpid/management.py | 4 +-- qpid/managementdata.py | 4 +-- qpid/messaging/driver.py | 2 +- qpid/peer.py | 14 +++++----- qpid/selector.py | 2 +- qpid/tests/messaging/__init__.py | 2 +- qpid/tests/messaging/endpoints.py | 2 +- qpid_tests/broker_0_10/exchange.py | 10 +++---- qpid_tests/broker_0_10/message.py | 2 +- qpid_tests/broker_0_10/msg_groups.py | 42 ++++++++++++++-------------- qpid_tests/broker_0_10/new_api.py | 16 +++++------ qpid_tests/broker_0_10/queue.py | 2 +- qpid_tests/broker_0_8/basic.py | 2 +- qpid_tests/broker_0_8/exchange.py | 4 +-- qpid_tests/broker_0_8/queue.py | 2 +- qpid_tests/broker_0_8/testlib.py | 4 +-- 22 files changed, 66 insertions(+), 65 deletions(-) diff --git a/examples/api/hello b/examples/api/hello index dffff885..ac2311e0 100755 --- a/examples/api/hello +++ b/examples/api/hello @@ -41,7 +41,7 @@ try: sender = session.sender(address) receiver = session.receiver(address) - sender.send(Message("Hello world!")); + sender.send(Message("Hello world!")) message = receiver.fetch() print(message.content) diff --git a/qpid-python-test b/qpid-python-test index 791f38b2..ac7d70b4 100755 --- a/qpid-python-test +++ b/qpid-python-test @@ -201,7 +201,7 @@ def indent(text): class JunitXmlStyleReporter: def __init__(self, file): - self.f = open(file, "w"); + self.f = open(file, "w") def begin(self): self.f.write('\n') @@ -575,8 +575,8 @@ ignored = [t for t in h.tests if is_ignored(t.name())] total = len(filtered) + len(ignored) if opts.xml and not list_only: - xmlr = JunitXmlStyleReporter(opts.xml); - xmlr.begin(); + xmlr = JunitXmlStyleReporter(opts.xml) + xmlr.begin() else: xmlr = None diff --git a/qpid/client.py b/qpid/client.py index b062ea5d..305f6b3e 100644 --- a/qpid/client.py +++ b/qpid/client.py @@ -137,7 +137,7 @@ def close(self): if self.peer: try: if not self.closed: - channel = self.channel(0); + channel = self.channel(0) if channel and not channel._closed: try: channel.connection_close(reply_code=200) diff --git a/qpid/codec.py b/qpid/codec.py index 42977042..a300dc59 100644 --- a/qpid/codec.py +++ b/qpid/codec.py @@ -536,7 +536,7 @@ def decode_rfc1982_long_set(self): set = [] for i in range(0, count): set.append(self.decode_long()) - return set; + return set def encode_uuid(self, s): self.pack("16s", s) diff --git a/qpid/connection08.py b/qpid/connection08.py index 527e9b67..4272c018 100644 --- a/qpid/connection08.py +++ b/qpid/connection08.py @@ -305,7 +305,8 @@ def read_99_0(self): return self.read_0_10() def close(self): - self.io.close(); + self.io.close() + class Frame: diff --git a/qpid/delegates.py b/qpid/delegates.py index 8071296f..482f59fc 100644 --- a/qpid/delegates.py +++ b/qpid/delegates.py @@ -90,7 +90,7 @@ def session_detached(self, ch, d): self.connection.detach(d.name, ch) def session_request_timeout(self, ch, rt): - ch.session_timeout(rt.timeout); + ch.session_timeout(rt.timeout) def session_command_point(self, ch, cp): ssn = ch.session diff --git a/qpid/management.py b/qpid/management.py index 7d5e39a5..1f115358 100644 --- a/qpid/management.py +++ b/qpid/management.py @@ -656,7 +656,7 @@ def handleEvent (self, ch, codec): name = codec.read_str8() classKey = (packageName, className, hash) if classKey not in self.schema: - return; + return schemaClass = self.schema[classKey] row = [] es = schemaClass['E'] @@ -880,7 +880,7 @@ def parse (self, ch, codec, opcode, seq): elif opcode == 'g': self.parseContent (ch, 'B', codec, seq) else: - raise ValueError ("Unknown opcode: %c" % opcode); + raise ValueError ("Unknown opcode: %c" % opcode) def method (self, channel, userSequence, objId, classId, methodName, args): """ Invoke a method on an object """ diff --git a/qpid/managementdata.py b/qpid/managementdata.py index b6338eee..514dd6f3 100644 --- a/qpid/managementdata.py +++ b/qpid/managementdata.py @@ -162,10 +162,10 @@ def ctrlHandler (self, context, op, data): pass def configHandler (self, context, className, list, timestamps): - self.dataHandler (0, className, list, timestamps); + self.dataHandler (0, className, list, timestamps) def instHandler (self, context, className, list, timestamps): - self.dataHandler (1, className, list, timestamps); + self.dataHandler (1, className, list, timestamps) def methodReply (self, broker, sequence, status, sText, args): """ Callback for method-reply messages """ diff --git a/qpid/messaging/driver.py b/qpid/messaging/driver.py index 11066353..cb6c9314 100644 --- a/qpid/messaging/driver.py +++ b/qpid/messaging/driver.py @@ -767,7 +767,7 @@ def do_connection_start(self, start): _text=str(e) raise AuthenticationFailure(text=_text) - client_properties = get_client_properties_with_defaults(provided_client_properties=self.connection.client_properties); + client_properties = get_client_properties_with_defaults(provided_client_properties=self.connection.client_properties) self.write_op(ConnectionStartOk(client_properties=client_properties, mechanism=mech, response=initial)) diff --git a/qpid/peer.py b/qpid/peer.py index 6386584f..290ff3f0 100644 --- a/qpid/peer.py +++ b/qpid/peer.py @@ -161,18 +161,18 @@ def worker(self): def stop(self): try: - self.work.close(); - self.outgoing.close(); - self.conn.close(); + self.work.close() + self.outgoing.close() + self.conn.close() finally: - timeout = 1; - self.worker_thread.join(timeout); + timeout = 1 + self.worker_thread.join(timeout) if self.worker_thread.is_alive(): log.warn("Worker thread failed to shutdown within timeout") - self.reader_thread.join(timeout); + self.reader_thread.join(timeout) if self.reader_thread.is_alive(): log.warn("Reader thread failed to shutdown within timeout") - self.writer_thread.join(timeout); + self.writer_thread.join(timeout) if self.writer_thread.is_alive(): log.warn("Writer thread failed to shutdown within timeout") diff --git a/qpid/selector.py b/qpid/selector.py index d26829d8..ef7b4419 100644 --- a/qpid/selector.py +++ b/qpid/selector.py @@ -126,7 +126,7 @@ def start(self): _check(self.exception) self.thread = Thread(target=self.run) self.thread.daemon = True - self.thread.start(); + self.thread.start() def run(self): try: diff --git a/qpid/tests/messaging/__init__.py b/qpid/tests/messaging/__init__.py index 29d9bab9..1753eec3 100644 --- a/qpid/tests/messaging/__init__.py +++ b/qpid/tests/messaging/__init__.py @@ -201,7 +201,7 @@ class VersionTest (Base): def create_connection(self, version="amqp1.0", force=False): opts = self.connection_options() if force or not 'protocol' in opts: - opts['protocol'] = version; + opts['protocol'] = version return Connection.establish(self.broker, **opts) def setup_connection(self): diff --git a/qpid/tests/messaging/endpoints.py b/qpid/tests/messaging/endpoints.py index 1320ac2f..a5c6d179 100644 --- a/qpid/tests/messaging/endpoints.py +++ b/qpid/tests/messaging/endpoints.py @@ -681,7 +681,7 @@ def __call__(self, ssn): deadline = time.time() + self.timeout() while time.time() < deadline: if cb.handler_called: - break; + break assert cb.handler_called assert cb.ssn == self.ssn snd.close() diff --git a/qpid_tests/broker_0_10/exchange.py b/qpid_tests/broker_0_10/exchange.py index 0cd0a550..83c71f4a 100644 --- a/qpid_tests/broker_0_10/exchange.py +++ b/qpid_tests/broker_0_10/exchange.py @@ -185,7 +185,7 @@ def verifyHeadersExchange(self, ex, unbind=False): headers = {"name":"fred", "age":3} self.assertPublishGet(q, exchange=ex, properties=headers) self.session.message_transfer(destination=ex) # No headers, won't deliver - self.assertEmpty(q); + self.assertEmpty(q) finally: if unbind: self.session.exchange_unbind(queue="q", exchange=ex, binding_key="") @@ -546,19 +546,19 @@ def checkNotExists(self, e): def testAutodeleteFanout(self): self.session.exchange_declare(exchange="e", type="fanout", auto_delete=True) self.verifyFanOutExchange("e", unbind=True) - self.checkNotExists("e"); + self.checkNotExists("e") def testAutodeleteDirect(self): self.session.exchange_declare(exchange="e", type="direct", auto_delete=True) self.verifyDirectExchange("e", unbind=True) - self.checkNotExists("e"); + self.checkNotExists("e") def testAutodeleteTopic(self): self.session.exchange_declare(exchange="e", type="topic", auto_delete=True) self.verifyTopicExchange("e", unbind=True) - self.checkNotExists("e"); + self.checkNotExists("e") def testAutodeleteHeaders(self): self.session.exchange_declare(exchange="e", type="headers", auto_delete=True) self.verifyHeadersExchange("e", unbind=True) - self.checkNotExists("e"); + self.checkNotExists("e") diff --git a/qpid_tests/broker_0_10/message.py b/qpid_tests/broker_0_10/message.py index 9b9a051f..76813e48 100644 --- a/qpid_tests/broker_0_10/message.py +++ b/qpid_tests/broker_0_10/message.py @@ -1028,7 +1028,7 @@ def test_release_order(self): session.message_flow(unit = session.credit_unit.message, value = 10, destination = "a") # receive all messages into list - messages = []; + messages = [] for i in range(1, 11): msg = a.get(timeout = 1) self.assertEquals("message-%d" % (i), msg.body) diff --git a/qpid_tests/broker_0_10/msg_groups.py b/qpid_tests/broker_0_10/msg_groups.py index 124625ae..ca229e69 100644 --- a/qpid_tests/broker_0_10/msg_groups.py +++ b/qpid_tests/broker_0_10/msg_groups.py @@ -71,24 +71,24 @@ def test_simple(self): # C1 should acquire A-0, then C2 should acquire B-3 - m1 = c1.fetch(0); + m1 = c1.fetch(0) assert m1.properties['THE-GROUP'] == 'A' assert m1.content['index'] == 0 - m2 = c2.fetch(0); + m2 = c2.fetch(0) assert m2.properties['THE-GROUP'] == 'B' assert m2.content['index'] == 3 # C1 Acknowledge A-0 - c1.session.acknowledge(m1); + c1.session.acknowledge(m1) # C2 should next acquire A-1 - m3 = c2.fetch(0); + m3 = c2.fetch(0) assert m3.properties['THE-GROUP'] == 'A' assert m3.content['index'] == 1 # C1 should next acquire C-6, since groups A&B are held by c2 - m4 = c1.fetch(0); + m4 = c1.fetch(0) assert m4.properties['THE-GROUP'] == 'C' assert m4.content['index'] == 6 @@ -96,13 +96,13 @@ def test_simple(self): ## Owners= ---, ^C2, +C2, ^C2, +C2, +C2, ^C1, +C1, +C1, # C2 Acknowledge B-3, freeing up the rest of B group - c2.session.acknowledge(m2); + c2.session.acknowledge(m2) ## Queue = XXX, a-1, a-2, XXX, b-4, b-5, c-6, c-7, c-8... ## Owners= ---, ^C2, +C2, ---, ---, ---, ^C1, +C1, +C1, # C1 should now acquire B-4, since it is next "free" - m5 = c1.fetch(0); + m5 = c1.fetch(0) assert m5.properties['THE-GROUP'] == 'B' assert m5.content['index'] == 4 @@ -116,11 +116,11 @@ def test_simple(self): ## Owners= ---, ^C2, +C2, ---, ^C1, +C1, ---, ---, --- # C2 should next fetch A-2, followed by C-7 - m7 = c2.fetch(0); + m7 = c2.fetch(0) assert m7.properties['THE-GROUP'] == 'A' assert m7.content['index'] == 2 - m8 = c2.fetch(0); + m8 = c2.fetch(0) assert m8.properties['THE-GROUP'] == 'C' assert m8.content['index'] == 7 @@ -134,7 +134,7 @@ def test_simple(self): ## Owners= ---, ---, ---, ---, ^C1, +C1, ---, ---, --- # the next fetch of C2 would get C-8, since B-5 is "owned" - m9 = c2.fetch(0); + m9 = c2.fetch(0) assert m9.properties['THE-GROUP'] == 'C' assert m9.content['index'] == 8 @@ -148,7 +148,7 @@ def test_simple(self): ## Owners= ---, ---, ---, ---, ---, ^C2, ---, ---, ^C2 # the next fetch of C2 would get B-5 - m10 = c2.fetch(0); + m10 = c2.fetch(0) assert m10.properties['THE-GROUP'] == 'B' assert m10.content['index'] == 5 @@ -194,13 +194,13 @@ def test_simple_browse(self): s2 = self.setup_session() b1 = s2.receiver("msg-group-q; {mode: browse}", options={"capacity":0}) - m2 = b1.fetch(0); + m2 = b1.fetch(0) assert m2.properties['THE-GROUP'] == 'A' assert m2.content['index'] == 0 # C1 should acquire A-0 - m1 = c1.fetch(0); + m1 = c1.fetch(0) assert m1.properties['THE-GROUP'] == 'A' assert m1.content['index'] == 0 @@ -222,7 +222,7 @@ def test_simple_browse(self): assert m2.content['index'] == 3 # verify the consumer can own groups currently seen by the browser - m3 = c1.fetch(0); + m3 = c1.fetch(0) assert m3.properties['THE-GROUP'] == 'B' assert m3.content['index'] == 1 @@ -337,7 +337,7 @@ def test_close(self): assert m2.content['index'] == 2 # C1 shuffles off the mortal coil... - c1.close(); + c1.close() # but the session (s1) remains active, so "A" remains blocked # from c2, c2 should fetch the next B-3 @@ -1024,7 +1024,7 @@ def test_queue_delete(self): c2 = s2.receiver("msg-group-q", options={"capacity":0}) # C1 should acquire A-0 - m1 = c1.fetch(0); + m1 = c1.fetch(0) assert m1.properties['THE-GROUP'] == 'A' assert m1.content['index'] == 0 @@ -1138,7 +1138,7 @@ def test_ttl_expire(self): m.content['index'] = index index += 1 if m.properties['THE-GROUP'] == 'B': - m.ttl = 1; + m.ttl = 1 snd.send(m) sleep(2) # let all B's expire @@ -1152,19 +1152,19 @@ def test_ttl_expire(self): # C1 should acquire A-0, then C2 should acquire C-2, Group B should # expire and never be fetched - m1 = c1.fetch(0); + m1 = c1.fetch(0) assert m1.properties['THE-GROUP'] == 'A' assert m1.content['index'] == 0 - m2 = c2.fetch(0); + m2 = c2.fetch(0) assert m2.properties['THE-GROUP'] == 'C' assert m2.content['index'] == 2 - m1 = c1.fetch(0); + m1 = c1.fetch(0) assert m1.properties['THE-GROUP'] == 'A' assert m1.content['index'] == 3 - m2 = c2.fetch(0); + m2 = c2.fetch(0) assert m2.properties['THE-GROUP'] == 'C' assert m2.content['index'] == 5 diff --git a/qpid_tests/broker_0_10/new_api.py b/qpid_tests/broker_0_10/new_api.py index 301b0ad8..48a46912 100644 --- a/qpid_tests/broker_0_10/new_api.py +++ b/qpid_tests/broker_0_10/new_api.py @@ -156,12 +156,12 @@ def test_nolocal_rerouted(self): conn2 = Connection.establish(self.broker, **self.connection_options()) ssn2 = conn2.session() - s1 = self.ssn.sender("holding_q; {create:always, delete:always, node:{x-declare:{alternate-exchange:'amq.fanout'}}}"); - s2 = ssn2.sender("holding_q"); + s1 = self.ssn.sender("holding_q; {create:always, delete:always, node:{x-declare:{alternate-exchange:'amq.fanout'}}}") + s2 = ssn2.sender("holding_q") - s2.send(Message("a")); - s1.send(Message("b")); - s2.send(Message("c")); + s2.send(Message("a")) + s1.send(Message("b")) + s2.send(Message("c")) r = self.ssn.receiver("amq.fanout; {link:{x-declare:{arguments:{'no-local':True}}}}") @@ -181,15 +181,15 @@ def test_nolocal_rerouted(self): self.assertEqual(received, ["a", "c"]) def _node_disambiguation_test(self, e, q, ambiguous_send=False): - s1 = self.ssn.sender("ambiguous; {node:{type:topic}}"); - s2 = self.ssn.sender("ambiguous; {node:{type:queue}}"); + s1 = self.ssn.sender("ambiguous; {node:{type:topic}}") + s2 = self.ssn.sender("ambiguous; {node:{type:queue}}") s1.send(Message("a")) s2.send(Message("b")) if ambiguous_send: # pure python client defaults to using the queue when the # node name is ambiguous and no type is specified; the # swigged version treats this as an error - s3 = self.ssn.sender("ambiguous"); + s3 = self.ssn.sender("ambiguous") s3.send(Message("c")) self.assertEqual(e.fetch().content, "a") self.assertEqual(q.fetch().content, "b") diff --git a/qpid_tests/broker_0_10/queue.py b/qpid_tests/broker_0_10/queue.py index a3de6cb2..2416afa1 100644 --- a/qpid_tests/broker_0_10/queue.py +++ b/qpid_tests/broker_0_10/queue.py @@ -43,7 +43,7 @@ def test_purge(self): self.assertEqual(3, reply.message_count) #now do the purge, then test that three messages are purged and the count drops to 0 - session.queue_purge(queue="test-queue"); + session.queue_purge(queue="test-queue") reply = session.queue_query(queue="test-queue") self.assertEqual(0, reply.message_count) diff --git a/qpid_tests/broker_0_8/basic.py b/qpid_tests/broker_0_8/basic.py index 4638a9f6..286acb0a 100644 --- a/qpid_tests/broker_0_8/basic.py +++ b/qpid_tests/broker_0_8/basic.py @@ -375,7 +375,7 @@ def test_qos_prefetch_size(self): #make sure that a single oversized message still gets delivered large = "abcdefghijklmnopqrstuvwxyz" - large = large + "-" + large; + large = large + "-" + large channel.basic_publish(routing_key="test-prefetch-size", content=Content(large)) msg = queue.get(timeout=self.recv_timeout()) self.assertEqual(large, msg.content.body) diff --git a/qpid_tests/broker_0_8/exchange.py b/qpid_tests/broker_0_8/exchange.py index bd496b0e..3a24784b 100644 --- a/qpid_tests/broker_0_8/exchange.py +++ b/qpid_tests/broker_0_8/exchange.py @@ -80,8 +80,8 @@ def verifyHeadersExchange(self, ex): headers = {"name":"fred", "age":3} self.assertPublishGet(q, exchange=ex, properties={'headers':headers}) self.channel.basic_publish(exchange=ex) # No headers, won't deliver - self.assertEmpty(q); - + self.assertEmpty(q) + class RecommendedTypesRuleTests(TestBase, StandardExchangeVerifier): """ diff --git a/qpid_tests/broker_0_8/queue.py b/qpid_tests/broker_0_8/queue.py index f5e17e2a..f7551371 100644 --- a/qpid_tests/broker_0_8/queue.py +++ b/qpid_tests/broker_0_8/queue.py @@ -43,7 +43,7 @@ def test_purge(self): self.assertEqual(3, reply.message_count) #now do the purge, then test that three messages are purged and the count drops to 0 - reply = channel.queue_purge(queue="test-queue"); + reply = channel.queue_purge(queue="test-queue") self.assertEqual(3, reply.message_count) reply = channel.queue_declare(queue="test-queue") self.assertEqual(0, reply.message_count) diff --git a/qpid_tests/broker_0_8/testlib.py b/qpid_tests/broker_0_8/testlib.py index 592eeaf5..02e7ad77 100644 --- a/qpid_tests/broker_0_8/testlib.py +++ b/qpid_tests/broker_0_8/testlib.py @@ -34,7 +34,7 @@ from traceback import * def mytrace(frame, event, arg): - print_stack(frame); + print_stack(frame) print("====") return mytrace @@ -56,7 +56,7 @@ def testAssertEmptyFail(self): q = self.consume("full") self.channel.basic_publish(routing_key="full") try: - self.assertEmpty(q); + self.assertEmpty(q) self.fail("assertEmpty did not assert on non-empty queue") except AssertionError: None # Ignore From 71171f7ea61b3ebfef6217f807a35db88fef905d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Wed, 12 Apr 2023 21:49:09 +0200 Subject: [PATCH 26/50] QPID-8170: fix qpid-python-test discovery broken by commit 85348b01 (#18) The problem stems from the way the testcode imports the production code, so that when both have a module of the same name, the test runner descends into the production code when discovering tests, instead of into the test code. ``` {code:title=qpid/tests/messaging/__init__.py} from qpid.tests.messaging.implementation import * [...] from . import address, endpoints, message, selector {code} The file imported on the first line contains {code:title=qpid/tests/messaging/implementation.py} from qpid.messaging import * {code} ``` and {{qpid.messaging}} contains its own {{address.py}} submodule. Therefore, when {{qpid-test-runner}} tries to access {{qpid.tests.messaging.mesage}}, it actually gets {{qpid.messaging.message}}, which was imported first. But that does not contain any tests, and the message tests are missed and never executed. This only started happening after my relative imports modernizing commit https://github.com/apache/qpid-python/commit/9651001c6fe0b65e538a96e27df36582b7ccb004. Before, Totals: 349 tests, 349 passed, 0 skipped, 0 ignored, 0 failed and Totals: 678 tests, 585 passed, 93 skipped, 0 ignored, 0 failed (https://github.com/apache/qpid-python/actions/runs/4661323947/jobs/8250463871) After, Totals: 218 tests, 218 passed, 0 skipped, 0 ignored, 0 failed and Totals: 547 tests, 454 passed, 93 skipped, 0 ignored, 0 failed (https://github.com/apache/qpid-python/actions/runs/4661535006/jobs/8250915935) --- qpid-python-test | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/qpid-python-test b/qpid-python-test index ac7d70b4..ea575ae3 100755 --- a/qpid-python-test +++ b/qpid-python-test @@ -22,6 +22,8 @@ from __future__ import absolute_import from __future__ import print_function + +import importlib import logging, optparse, os, struct, sys, time, traceback, types from fnmatch import fnmatchcase as match from getopt import GetoptError @@ -532,7 +534,19 @@ class ModuleScanner: names = dir(obj) names.sort() for name in names: - yield getattr(obj, name) + child = getattr(obj, name) + if type(child) is not types.ModuleType: + yield child + else: + # import the submodule of the given name afresh + absname = "%s.%s" % (obj.__name__, name) + try: + yield importlib.import_module(absname) + except ImportError: + # if module m imports module n, then we end up trying to import module m.n, which does not exist + # therefore fail only if the import we tried looks very reasonable but it still did not succeed + if absname == child.__name__: + raise def extract(self, obj): # the None is required for older versions of python From 7e6d8fc0ad5411525ef9e1a87a3dbad3f239da3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Wed, 12 Apr 2023 23:09:47 +0200 Subject: [PATCH 27/50] QPID-8170: run CI also with qpid-j broker in GitHub Actions, disable failing tests for it (#19) --- .github/workflows/initial-config.json | 93 +++++++++++++++ .github/workflows/python-package.yml | 162 +++++++++++++++++++++++++- 2 files changed, 253 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/initial-config.json diff --git a/.github/workflows/initial-config.json b/.github/workflows/initial-config.json new file mode 100644 index 00000000..6b13bfab --- /dev/null +++ b/.github/workflows/initial-config.json @@ -0,0 +1,93 @@ +{ + "name": "${broker.name}", + "modelVersion": "7.1", + "authenticationproviders" : [ { + "name" : "plain", + "type" : "Plain", + "secureOnlyMechanisms": "", + "users" : [ { + "name" : "guest", + "type" : "managed", + "password" : "guest" + } ] + } ], + "brokerloggers" : [ { + "name" : "console", + "type" : "Console", + "brokerloginclusionrules" : [ { + "name" : "Root", + "type" : "NameAndLevel", + "level" : "WARN", + "loggerName" : "ROOT" + }, { + "name" : "Qpid", + "type" : "NameAndLevel", + "level" : "INFO", + "loggerName" : "org.apache.qpid.*" + }, { + "name" : "Operational", + "type" : "NameAndLevel", + "level" : "INFO", + "loggerName" : "qpid.message.*" + }, { + "name" : "Statistics", + "type" : "NameAndLevel", + "level" : "INFO", + "loggerName" : "qpid.statistics.*" + } ] + }, { + "name" : "memory", + "type" : "Memory", + "brokerloginclusionrules" : [ { + "name" : "Root", + "type" : "NameAndLevel", + "level" : "WARN", + "loggerName" : "ROOT" + }, { + "name" : "Qpid", + "type" : "NameAndLevel", + "level" : "INFO", + "loggerName" : "org.apache.qpid.*" + }, { + "name" : "Operational", + "type" : "NameAndLevel", + "level" : "INFO", + "loggerName" : "qpid.message.*" + }, { + "name" : "Statistics", + "type" : "NameAndLevel", + "level" : "INFO", + "loggerName" : "qpid.statistics.*" + } ] + } ], + "ports" : [ { + "name" : "AMQP", + "port" : "${qpid.amqp_port}", + "authenticationProvider" : "plain", + "virtualhostaliases" : [ { + "name" : "nameAlias", + "type" : "nameAlias" + }, { + "name" : "defaultAlias", + "type" : "defaultAlias" + }, { + "name" : "hostnameAlias", + "type" : "hostnameAlias" + } ] + }, { + "name" : "HTTP", + "port" : "${qpid.http_port}", + "authenticationProvider" : "plain", + "protocols" : [ "HTTP" ] + }], + "virtualhostnodes" : [ { + "name" : "default", + "type" : "JSON", + "defaultVirtualHostNode" : "true", + "virtualHostInitialConfiguration" : "${qpid.initial_config_virtualhost_config}" + }], + "plugins" : [ { + "type" : "MANAGEMENT-HTTP", + "name" : "httpManagement" + } ] +} diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 9676c739..4d92bf49 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -94,7 +94,7 @@ jobs: - name: Start qpidd in docker run: | - docker run --rm -d -p 5672:5672 irinabov/docker-qpid-cpp-broker + docker run --name qpid-cpp --rm -d -p 5672:5672 irinabov/docker-qpid-cpp-broker attempts=0 while ! nc -zv localhost 5672; do @@ -107,6 +107,7 @@ jobs: done - name: Client tests with our bespoke test runner + continue-on-error: ${{ matrix.python-version != '2.7' }} run: | ${{ env.pythonLocation }}/bin/python ./qpid-python-test @@ -114,8 +115,165 @@ jobs: run: | ${{ env.pythonLocation }}/bin/python setup.py install --user - - name: Broker tests with the 🛞 runner we ❤️ + # https://qpid.apache.org/releases/qpid-cpp-1.39.0/cpp-broker/book/AMQP-Compatibility.html + # we need qpid-cpp broker to test amqp0-10 and qpid-j broker to test amqp0-8 and amqp0-9 + + - name: Install test dependencies from pip run: | # qpid-python dependency is the current package, it was installed in the prior step ${{ env.pythonLocation }}/bin/python -m pip install --user qpid-tools qpid-qmf --no-deps + + - name: C++ Broker tests with the 🛞 runner we ❤️ + run: | ${{ env.pythonLocation }}/bin/python qpid-python-test -m qpid_tests + + - name: Kill qpidd + run: docker stop qpid-cpp + + # https://github.com/chrisob/qpid-broker-j-docker + - name: Start qpidj + run: | + docker run --name qpid-j --rm -d \ + -p 5672:5672 -p 8080:8080 \ + -v $PWD/.github/workflows/initial-config.json:/usr/local/etc/initial-config.json \ + chrisob/qpid-broker-j-docker + + # the `while ! nc` from outside of container to exposed port does not work, because docker itself accepts + # lets exec nc inside the container, even though installing the netcat usually takes longer than the router startup + docker exec -u 0:0 qpid-j apt-get update + docker exec -u 0:0 qpid-j apt-get install -y netcat + + attempts=0 + while ! docker exec qpid-j nc -zv localhost 5672; do + attempts=$((attempts+1)) + if [ $attempts -ge 10 ]; then + echo >&2 "qpid-j not reachable, giving up" + exit 1 + fi + sleep 3 + done + + - name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 0-8) + continue-on-error: ${{ matrix.python-version != '2.7' }} + run: | + ${{ env.pythonLocation }}/bin/python qpid-python-test \ + -m qpid_tests.broker_0_8 \ + --broker amqp://guest/guest@localhost:5672 \ + -i qpid_tests.broker_0_8.basic.BasicTests.test_consume_exclusive \ + -i qpid_tests.broker_0_8.broker.BrokerTests.test_basic_delivery_immediate \ + -i qpid_tests.broker_0_8.exchange.DefaultExchangeRuleTests.testDefaultExchangeExplicitBind \ + -i qpid_tests.broker_0_8.queue.QueueTests.test_declare_exclusive \ + -i qpid_tests.broker_0_8.queue.QueueTests.test_purge \ + -i qpid_tests.broker_0_8.tx.TxTests.test_auto_rollback \ + -i qpid_tests.broker_0_8.tx.TxTests.test_rollback + + - name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 0-9) + continue-on-error: ${{ matrix.python-version != '2.7' }} + run: | + ${{ env.pythonLocation }}/bin/python qpid-python-test \ + -m qpid_tests.broker_0_9 \ + --broker amqp://guest/guest@localhost:5672 \ + -i qpid_tests.broker_0_9.query.QueryTests.test_binding_query_direct \ + -i qpid_tests.broker_0_9.query.QueryTests.test_binding_query_fanout \ + -i qpid_tests.broker_0_9.query.QueryTests.test_binding_query_header \ + -i qpid_tests.broker_0_9.query.QueryTests.test_binding_query_topic \ + -i qpid_tests.broker_0_9.query.QueryTests.test_exchange_query + + - name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 0-10) + continue-on-error: ${{ matrix.python-version != '2.7' }} + run: | + ${{ env.pythonLocation }}/bin/python qpid-python-test \ + -m qpid_tests.broker_0_10 \ + --broker amqp://guest/guest@localhost:5672 \ + -i qpid_tests.broker_0_10.dtx.DtxTests.test_forget_xid_on_completion \ + -i qpid_tests.broker_0_10.dtx.DtxTests.test_get_timeout \ + -i qpid_tests.broker_0_10.dtx.DtxTests.test_implicit_end \ + -i qpid_tests.broker_0_10.dtx.DtxTests.test_simple_commit \ + -i qpid_tests.broker_0_10.dtx.DtxTests.test_simple_prepare_commit \ + -i qpid_tests.broker_0_10.dtx.DtxTests.test_simple_prepare_rollback \ + -i qpid_tests.broker_0_10.dtx.DtxTests.test_simple_rollback \ + -i qpid_tests.broker_0_10.exchange.AutodeleteTests.testAutodeleteFanout \ + -i qpid_tests.broker_0_10.exchange.AutodeleteTests.testAutodeleteHeaders \ + -i qpid_tests.broker_0_10.extensions.ExtensionTests.test_policy_negative_count \ + -i qpid_tests.broker_0_10.extensions.ExtensionTests.test_policy_negative_size \ + -i qpid_tests.broker_0_10.extensions.ExtensionTests.test_policy_size_as_float \ + -i qpid_tests.broker_0_10.extensions.ExtensionTests.test_timed_autodelete \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_binding_count_on_queue \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_broker_connectivity_oldAPI \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_connection_close \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_connection_stats \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_get_objects \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_immediate_method \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_methods_async \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_methods_sync \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_move_queued_messages \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_move_queued_messages_empty \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_purge_queue \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_reroute_alternate_exchange \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_reroute_invalid_alt_exchange \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_reroute_priority_queue \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_reroute_queue \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_self_session_id \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_standard_exchanges \ + -i qpid_tests.broker_0_10.management.ManagementTest.test_timestamp_config \ + -i qpid_tests.broker_0_10.message.MessageTests.test_ack \ + -i qpid_tests.broker_0_10.message.MessageTests.test_acquire \ + -i qpid_tests.broker_0_10.message.MessageTests.test_acquire_with_no_accept_and_credit_flow \ + -i qpid_tests.broker_0_10.message.MessageTests.test_credit_flow_bytes \ + -i qpid_tests.broker_0_10.message.MessageTests.test_no_local_awkward \ + -i qpid_tests.broker_0_10.message.MessageTests.test_window_flow_bytes \ + -i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_default_group_id \ + -i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_move_all \ + -i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_move_count \ + -i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_purge_acquired \ + -i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_purge_count \ + -i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_purge_free \ + -i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_query \ + -i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_reroute \ + -i qpid_tests.broker_0_10.new_api.GeneralTests.test_ambiguous_create_1 \ + -i qpid_tests.broker_0_10.new_api.GeneralTests.test_ambiguous_create_2 \ + -i qpid_tests.broker_0_10.new_api.GeneralTests.test_ambiguous_delete_1 \ + -i qpid_tests.broker_0_10.new_api.GeneralTests.test_ambiguous_delete_2 \ + -i qpid_tests.broker_0_10.new_api.GeneralTests.test_node_disambiguation_1 \ + -i qpid_tests.broker_0_10.new_api.GeneralTests.test_node_disambiguation_2 \ + -i qpid_tests.broker_0_10.new_api.GeneralTests.test_qpid_3481_acquired_to_alt_exchange_2_consumers \ + -i qpid_tests.broker_0_10.new_api.SequenceNumberTests.test_create_sequence_queue \ + -i qpid_tests.broker_0_10.new_api.SequenceNumberTests.test_get_sequence_number \ + -i qpid_tests.broker_0_10.new_api.SequenceNumberTests.test_sequence_number_gap \ + -i qpid_tests.broker_0_10.priority.PriorityTests.test_fairshare_1 \ + -i qpid_tests.broker_0_10.priority.PriorityTests.test_fairshare_2 \ + -i qpid_tests.broker_0_10.priority.PriorityTests.test_fairshare_3 \ + -i qpid_tests.broker_0_10.priority.PriorityTests.test_fairshare_with_alias \ + -i qpid_tests.broker_0_10.priority.PriorityTests.test_prioritised_delivery_with_alias \ + -i qpid_tests.broker_0_10.qmf_events.EventTests.test_queue_autodelete_exclusive \ + -i qpid_tests.broker_0_10.qmf_events.EventTests.test_queue_autodelete_shared \ + -i qpid_tests.broker_0_10.qmf_events.EventTests.test_queue_declare \ + -i qpid_tests.broker_0_10.qmf_events.EventTests.test_queue_delete \ + -i qpid_tests.broker_0_10.queue.QueueTests.test_declare_exclusive \ + -i qpid_tests.broker_0_10.queue.QueueTests.test_declare_exclusive_alreadyinuse \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_abandoned_alt \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_limit_overflow \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_lvq_replace \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_no_route \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_purge \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_reject \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_ring_overflow \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_ttl \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_enqueues_dequeues \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_exchange_stats \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_message_release \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_reroutes \ + -i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_transactional_enqueues_dequeues \ + -i qpid_tests.broker_0_10.threshold.ThresholdTests.test_alert_count \ + -i qpid_tests.broker_0_10.threshold.ThresholdTests.test_alert_count_alias \ + -i qpid_tests.broker_0_10.threshold.ThresholdTests.test_alert_on_alert_queue \ + -i qpid_tests.broker_0_10.threshold.ThresholdTests.test_alert_size \ + -i qpid_tests.broker_0_10.threshold.ThresholdTests.test_alert_size_alias \ + -i qpid_tests.broker_0_10.threshold.ThresholdTests.test_hysteresis + + - name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 1.0, or whatever this actually happens to test) + continue-on-error: ${{ matrix.python-version != '2.7' }} + run: | + ${{ env.pythonLocation }}/bin/python qpid-python-test \ + -m qpid_tests.broker_1_0 \ + --broker amqp://guest/guest@localhost:5672 From 566dc213822c1cd2343dbcc836e36b7c3c23be68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Wed, 12 Apr 2023 23:24:11 +0200 Subject: [PATCH 28/50] QPID-8631: fix setup.py incompatible syntax for Python 3 (#17) --- setup.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 87b3000e..92f4c969 100755 --- a/setup.py +++ b/setup.py @@ -61,18 +61,21 @@ def copy_file(self, src, dst, preserve_mode=1, preserve_times=1, else: try: fsrc = open(src, 'rb') - except os.error as (errno, errstr): + except os.error as e: + errno, errstr = e.args raise DistutilsFileError("could not open '%s': %s" % (src, errstr)) if os.path.exists(dst): try: os.unlink(dst) - except os.error as (errno, errstr): + except os.error as e: + errno, errstr = e.args raise DistutilsFileError("could not delete '%s': %s" % (dst, errstr)) try: fdst = open(dst, 'wb') - except os.error as (errno, errstr): + except os.error as e: + errno, errstr = e.args raise DistutilsFileError("could not create '%s': %s" % (dst, errstr)) try: From d6fc95a972f72e4ea0152669c950775172c1ac7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Thu, 13 Apr 2023 20:18:59 +0200 Subject: [PATCH 29/50] QPID-8631: conditionally fill-in types removed in Python 3, so that setup.py runs --- mllib/dom.py | 5 +++++ qpid/codec010.py | 15 +++++++++++++++ qpid/generator.py | 5 +++++ 3 files changed, 25 insertions(+) diff --git a/mllib/dom.py b/mllib/dom.py index 916f8148..47620875 100644 --- a/mllib/dom.py +++ b/mllib/dom.py @@ -28,6 +28,11 @@ import mllib.transforms +try: + basestring +except NameError: + basestring = str + class Container: def __init__(self): diff --git a/qpid/codec010.py b/qpid/codec010.py index bd6a3aae..8f9eee08 100644 --- a/qpid/codec010.py +++ b/qpid/codec010.py @@ -23,6 +23,21 @@ from .datatypes import serial, timestamp, RangedSet, Struct, UUID from .ops import Compound, PRIMITIVE, COMPOUND +try: + buffer +except NameError: + buffer = memoryview + +try: + long +except NameError: + long = int + +try: + unicode +except NameError: + unicode = str + class CodecException(Exception): pass def direct(t): diff --git a/qpid/generator.py b/qpid/generator.py index 8fb602ea..e52bb751 100644 --- a/qpid/generator.py +++ b/qpid/generator.py @@ -22,6 +22,11 @@ from .ops import * +try: + basestring +except NameError: + basestring = str + def METHOD(module, op): method = lambda self, *args, **kwargs: self.invoke(op, args, kwargs) if sys.version_info[:2] > (2, 3): From 47a68f1d44a6de4143dc2e86014425cee8d8aa1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Thu, 13 Apr 2023 20:19:31 +0200 Subject: [PATCH 30/50] QPID-8631: use `next()` to progress the iterator in dom.py, so that setup.py runs --- mllib/dom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mllib/dom.py b/mllib/dom.py index 47620875..49ba0d00 100644 --- a/mllib/dom.py +++ b/mllib/dom.py @@ -244,7 +244,7 @@ def __iter__(self): sources = [iter(self.source)] while sources: try: - nd = sources[-1].next() + nd = next(sources[-1]) if isinstance(nd, Tree): sources.append(iter(nd.children)) else: From 6d96be653dc5d3fe576c82101be33eb714aa6211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Fri, 14 Apr 2023 11:33:07 +0200 Subject: [PATCH 31/50] QPID-8631: make package version string in setup.py compliant with PEP-440 Contemporary versions of setuptools and pip will bork at misformatted version strings and refuse to install the package --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 92f4c969..d95b5618 100755 --- a/setup.py +++ b/setup.py @@ -300,7 +300,7 @@ def install(self): scripts = ["qpid-python-test", "qpid-python-test.bat"] setup(name="qpid-python", - version="1.38.0-SNAPSHOT", + version="1.38.0.dev0+SNAPSHOT", author="Apache Qpid", author_email="users@qpid.apache.org", packages=["mllib", "qpid", "qpid.messaging", "qpid.tests", From 8a23065e46fefa3076c89c7d0a31bd30194afec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Tue, 11 Apr 2023 14:16:13 +0200 Subject: [PATCH 32/50] QPID-8631: `qpid_tests` also need `absolute_import` from `__future__` and fix relative imports --- qpid_tests/__init__.py | 3 ++- qpid_tests/broker_1_0/__init__.py | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/qpid_tests/__init__.py b/qpid_tests/__init__.py index 0459ace6..5477007a 100644 --- a/qpid_tests/__init__.py +++ b/qpid_tests/__init__.py @@ -19,4 +19,5 @@ # under the License. # -import broker_1_0, broker_0_10, broker_0_9, broker_0_8 +from __future__ import absolute_import +from . import broker_1_0, broker_0_10, broker_0_9, broker_0_8 diff --git a/qpid_tests/broker_1_0/__init__.py b/qpid_tests/broker_1_0/__init__.py index b14bb96d..4d6a345a 100644 --- a/qpid_tests/broker_1_0/__init__.py +++ b/qpid_tests/broker_1_0/__init__.py @@ -19,8 +19,9 @@ # under the License. # -from general import * -from legacy_exchanges import * -from selector import * -from translation import * -from tx import * +from __future__ import absolute_import +from .general import * +from .legacy_exchanges import * +from .selector import * +from .translation import * +from .tx import * From 0bac85c96b19732964ef9ca893cbb7bbac5b7695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 16 Apr 2023 19:11:58 +0200 Subject: [PATCH 33/50] QPID-8636: separate out lint, qpid-cpp, and qpid-j ci jobs, add windows job for the ci (#22) --- .github/workflows/python-package.yml | 163 +++++++++++++++++++++++---- 1 file changed, 139 insertions(+), 24 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 4d92bf49..784593ed 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -30,27 +30,28 @@ on: workflow_dispatch: jobs: - build: + lint: runs-on: ubuntu-latest strategy: fail-fast: false matrix: # https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json - python-version: ["2.7", "3.8", "3.9", "3.10", "3.11", "3.12.0-alpha.7"] + python-version: ["2.7", "3.8", "3.11"] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 + uses: actions/setup-python@v4 + id: python with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | - python -m pip install --upgrade pip - python -m pip install --user poetry + ${{ steps.python.outputs.python-path }} -m pip install --upgrade pip + ${{ steps.python.outputs.python-path }} -m pip install --user poetry - name: Cache Poetry virtualenv uses: actions/cache@v3 @@ -75,7 +76,7 @@ jobs: - name: Install Dependencies run: | - poetry env use ${{ env.pythonLocation }}/bin/python + poetry env use ${{ steps.python.outputs.python-path }} poetry install --no-root if: steps.cache.outputs.cache-hit != 'true' @@ -92,7 +93,37 @@ jobs: run: | poetry run ruff check . + test: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest, windows-latest ] + # https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json + python-version: ["2.7", "3.8", "3.9", "3.10", "3.11", "3.12.0-alpha.7"] + exclude: + - os: windows-latest + python-version: "3.9" + - os: windows-latest + python-version: "3.10" + - os: windows-latest + python-version: "3.12.0-alpha.7" + + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + id: python + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + ${{ steps.python.outputs.python-path }} -m pip install --upgrade pip + - name: Start qpidd in docker + if: matrix.os == 'ubuntu-latest' run: | docker run --name qpid-cpp --rm -d -p 5672:5672 irinabov/docker-qpid-cpp-broker @@ -107,28 +138,112 @@ jobs: done - name: Client tests with our bespoke test runner - continue-on-error: ${{ matrix.python-version != '2.7' }} run: | - ${{ env.pythonLocation }}/bin/python ./qpid-python-test + ${{ steps.python.outputs.python-path }} ./qpid-python-test + + test-install: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest, windows-latest ] + # https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json + python-version: ["2.7", "3.8", "3.9", "3.10", "3.11", "3.12.0-alpha.7"] + exclude: + - os: windows-latest + python-version: "3.9" + - os: windows-latest + python-version: "3.10" + - os: windows-latest + python-version: "3.12.0-alpha.7" + + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + id: python + with: + python-version: ${{ matrix.python-version }} - name: Test setup.py install run: | - ${{ env.pythonLocation }}/bin/python setup.py install --user + ${{ steps.python.outputs.python-path }} setup.py install --user - # https://qpid.apache.org/releases/qpid-cpp-1.39.0/cpp-broker/book/AMQP-Compatibility.html - # we need qpid-cpp broker to test amqp0-10 and qpid-j broker to test amqp0-8 and amqp0-9 + # https://qpid.apache.org/releases/qpid-cpp-1.39.0/cpp-broker/book/AMQP-Compatibility.html + # we need qpid-cpp broker to test amqp0-10 and qpid-j broker to test amqp0-8 and amqp0-9 + + test-qpid-cpp: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest ] + # https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json + python-version: ["2.7", "3.8", "3.9", "3.10", "3.11", "3.12.0-alpha.7"] + + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + id: python + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + ${{ steps.python.outputs.python-path }} -m pip install --upgrade pip + + - name: Start qpidd in docker + run: | + docker run --name qpid-cpp --rm -d -p 5672:5672 irinabov/docker-qpid-cpp-broker + + attempts=0 + while ! nc -zv localhost 5672; do + attempts=$((attempts+1)) + if [ $attempts -ge 10 ]; then + echo >&2 "qpidd not reachable, giving up" + exit 1 + fi + sleep 3 + done + shell: bash - name: Install test dependencies from pip run: | - # qpid-python dependency is the current package, it was installed in the prior step - ${{ env.pythonLocation }}/bin/python -m pip install --user qpid-tools qpid-qmf --no-deps + # the qpid-python dependency is the current package + ${{ steps.python.outputs.python-path }} -m pip install --user qpid-tools qpid-qmf --no-deps - name: C++ Broker tests with the 🛞 runner we ❤️ run: | - ${{ env.pythonLocation }}/bin/python qpid-python-test -m qpid_tests + ${{ steps.python.outputs.python-path }} qpid-python-test -m qpid_tests - - name: Kill qpidd - run: docker stop qpid-cpp + test-qpid-j: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + # https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json + python-version: ["2.7", "3.8", "3.9", "3.10", "3.11", "3.12.0-alpha.7"] + + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + id: python + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + ${{ steps.python.outputs.python-path }} -m pip install --upgrade pip + + - name: Install test dependencies from pip + run: | + # the qpid-python dependency is the current package + ${{ steps.python.outputs.python-path }} -m pip install --user qpid-tools qpid-qmf --no-deps # https://github.com/chrisob/qpid-broker-j-docker - name: Start qpidj @@ -154,9 +269,9 @@ jobs: done - name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 0-8) - continue-on-error: ${{ matrix.python-version != '2.7' }} + if: ${{ ! cancelled() }} run: | - ${{ env.pythonLocation }}/bin/python qpid-python-test \ + ${{ steps.python.outputs.python-path }} qpid-python-test \ -m qpid_tests.broker_0_8 \ --broker amqp://guest/guest@localhost:5672 \ -i qpid_tests.broker_0_8.basic.BasicTests.test_consume_exclusive \ @@ -168,9 +283,9 @@ jobs: -i qpid_tests.broker_0_8.tx.TxTests.test_rollback - name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 0-9) - continue-on-error: ${{ matrix.python-version != '2.7' }} + if: ${{ ! cancelled() }} run: | - ${{ env.pythonLocation }}/bin/python qpid-python-test \ + ${{ steps.python.outputs.python-path }} qpid-python-test \ -m qpid_tests.broker_0_9 \ --broker amqp://guest/guest@localhost:5672 \ -i qpid_tests.broker_0_9.query.QueryTests.test_binding_query_direct \ @@ -180,9 +295,9 @@ jobs: -i qpid_tests.broker_0_9.query.QueryTests.test_exchange_query - name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 0-10) - continue-on-error: ${{ matrix.python-version != '2.7' }} + if: ${{ ! cancelled() }} run: | - ${{ env.pythonLocation }}/bin/python qpid-python-test \ + ${{ steps.python.outputs.python-path }} qpid-python-test \ -m qpid_tests.broker_0_10 \ --broker amqp://guest/guest@localhost:5672 \ -i qpid_tests.broker_0_10.dtx.DtxTests.test_forget_xid_on_completion \ @@ -272,8 +387,8 @@ jobs: -i qpid_tests.broker_0_10.threshold.ThresholdTests.test_hysteresis - name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 1.0, or whatever this actually happens to test) - continue-on-error: ${{ matrix.python-version != '2.7' }} + if: ${{ ! cancelled() }} run: | - ${{ env.pythonLocation }}/bin/python qpid-python-test \ + ${{ steps.python.outputs.python-path }} qpid-python-test \ -m qpid_tests.broker_1_0 \ --broker amqp://guest/guest@localhost:5672 From 868842ebd6b453d6551cbe1390773802f0201335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 1 May 2023 19:29:36 +0200 Subject: [PATCH 34/50] QPID-8642: fix installation on windows by eliminating buggy path manipulation (#23) --- mllib/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mllib/__init__.py b/mllib/__init__.py index d978a0c5..68761045 100644 --- a/mllib/__init__.py +++ b/mllib/__init__.py @@ -71,13 +71,13 @@ def resolveEntity(self, publicId, systemId): return InputSource(systemId) def xml_parse(filename, path=()): - source = "file://%s" % os.path.abspath(filename) h = parsers.XMLParser() p = xml.sax.make_parser() p.setContentHandler(h) p.setErrorHandler(ErrorHandler()) p.setEntityResolver(Resolver(path)) - p.parse(source) + with open(filename, mode='rt') as source: + p.parse(source) return h.parser.tree def sexp(node): From b81faca08ef0b83161157fbe2652cfcc9dba2334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 27 May 2023 16:24:42 +0200 Subject: [PATCH 35/50] QPID-7070: add flake8 to CI as first step towards PEP-8, fix some most egregious things reported (#6) --- qpid/connection08.py | 4 ++-- qpid/datatypes.py | 2 +- qpid/debug.py | 4 ++-- qpid/framer.py | 1 + qpid/packer.py | 4 ++-- qpid/saslmech/scram.py | 2 +- qpid/tests/__init__.py | 2 +- qpid_tests/broker_0_10/management.py | 1 + 8 files changed, 11 insertions(+), 9 deletions(-) diff --git a/qpid/connection08.py b/qpid/connection08.py index 4272c018..d8f14a26 100644 --- a/qpid/connection08.py +++ b/qpid/connection08.py @@ -341,9 +341,9 @@ def init(self, args, kwargs): self.bof = True self.eof = True - def encode(self, enc): abstract + def encode(self, enc): abstract # noqa: F821 - def decode(spec, dec, size): abstract + def decode(spec, dec, size): abstract # noqa: F821 class Method(Frame): diff --git a/qpid/datatypes.py b/qpid/datatypes.py index 5fc6ee21..ec42eff0 100644 --- a/qpid/datatypes.py +++ b/qpid/datatypes.py @@ -293,7 +293,7 @@ def is_set(self): class UUID: def __init__(self, hex=None, bytes=None): if [hex, bytes].count(None) != 1: - raise TypeErrror("need one of hex or bytes") + raise TypeError("need one of hex or bytes") if bytes is not None: self.bytes = bytes elif hex is not None: diff --git a/qpid/debug.py b/qpid/debug.py index bc02ae58..a8d3d2d6 100644 --- a/qpid/debug.py +++ b/qpid/debug.py @@ -42,10 +42,10 @@ def acquire(self, blocking=1): while not self.lock.acquire(blocking=0): time.sleep(1) print("TRYING", file=sys.out) - traceback.print_stack(None, None, out) + traceback.print_stack(None, None, sys.out) print("TRYING", file=sys.out) print("ACQUIRED", file=sys.out) - traceback.print_stack(None, None, out) + traceback.print_stack(None, None, sys.out) print("ACQUIRED", file=sys.out) return True diff --git a/qpid/framer.py b/qpid/framer.py index 95d9d7c4..e6766124 100644 --- a/qpid/framer.py +++ b/qpid/framer.py @@ -21,6 +21,7 @@ import struct, socket from .exceptions import Closed from .packer import Packer +from .sasl import SASLError from threading import RLock from logging import getLogger diff --git a/qpid/packer.py b/qpid/packer.py index 25b7957c..4b22d6cf 100644 --- a/qpid/packer.py +++ b/qpid/packer.py @@ -22,9 +22,9 @@ class Packer: - def read(self, n): abstract + def read(self, n): abstract # noqa: F821 - def write(self, s): abstract + def write(self, s): abstract # noqa: F821 def unpack(self, fmt): values = struct.unpack(fmt, self.read(struct.calcsize(fmt))) diff --git a/qpid/saslmech/scram.py b/qpid/saslmech/scram.py index a6c112c9..be8f2e38 100644 --- a/qpid/saslmech/scram.py +++ b/qpid/saslmech/scram.py @@ -20,7 +20,7 @@ from __future__ import absolute_import from hmac import HMAC from binascii import b2a_hex -from .sasl import Sasl +from .sasl import Sasl, SaslException import os import base64 diff --git a/qpid/tests/__init__.py b/qpid/tests/__init__.py index 37b8fe44..ec734da1 100644 --- a/qpid/tests/__init__.py +++ b/qpid/tests/__init__.py @@ -61,4 +61,4 @@ def testQux(self): def testQuxFail(self): import sys sys.stdout.write("this test has output with no newline") - fdsa + fdsa # noqa: F821 diff --git a/qpid_tests/broker_0_10/management.py b/qpid_tests/broker_0_10/management.py index c1d4cf5f..436c429a 100644 --- a/qpid_tests/broker_0_10/management.py +++ b/qpid_tests/broker_0_10/management.py @@ -25,6 +25,7 @@ from time import sleep import qmf.console import qpid.messaging +from qpid.messaging.exceptions import Empty from qpidtoollibs import BrokerAgent class ManagementTest (TestBase010): From ad5ab960e9f47ac18a7eab84d8ffc4253053e40a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Fri, 29 Sep 2023 11:59:31 +0200 Subject: [PATCH 36/50] NO-JIRA: fix Python 2.7 CI jobs after actions/setup-python removed this version --- .github/workflows/python-package.yml | 131 ++++++++++++++++++++++++++- 1 file changed, 126 insertions(+), 5 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 784593ed..fd54bc9e 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -43,11 +43,30 @@ jobs: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version != '2.7' uses: actions/setup-python@v4 - id: python + id: setup-python with: python-version: ${{ matrix.python-version }} + # Python 2.7 was removed from actions/setup-python https://github.com/actions/setup-python/issues/672 + - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version == '2.7' + run: | + sudo apt install -y python2 + curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + sudo python2 get-pip.py + id: apt-install-python + + - name: Configure steps.python.outputs + run: | + if [[ -f "${{ steps.setup-python.outputs.python-path }}" ]]; then + echo "python-path=${{ steps.setup-python.outputs.python-path }}" >> "$GITHUB_OUTPUT" + else + echo "python-path=/usr/bin/python2.7" >> "$GITHUB_OUTPUT" + fi + id: python + - name: Install dependencies run: | ${{ steps.python.outputs.python-path }} -m pip install --upgrade pip @@ -113,11 +132,39 @@ jobs: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version != '2.7' uses: actions/setup-python@v4 - id: python + id: setup-python with: python-version: ${{ matrix.python-version }} + - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version == '2.7' && matrix.os == 'ubuntu-latest' + run: | + sudo apt install -y python2 + curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + sudo python2 get-pip.py + id: apt-install-python + + - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version == '2.7' && matrix.os == 'windows-latest' + run: | + choco install python2 + id: choco-install-python + shell: pwsh + + - name: Configure steps.python.outputs + run: | + if (Test-Path "${{ steps.setup-python.outputs.python-path }}") { + "python-path=${{ steps.setup-python.outputs.python-path }}" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + } elseif (Test-Path C:/Python27/python.exe) { + "python-path=C:/Python27/python.exe" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + } else { + "python-path=/usr/bin/python2.7" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + } + id: python + shell: pwsh + - name: Install dependencies run: | ${{ steps.python.outputs.python-path }} -m pip install --upgrade pip @@ -161,11 +208,39 @@ jobs: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version != '2.7' uses: actions/setup-python@v4 - id: python + id: setup-python with: python-version: ${{ matrix.python-version }} + - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version == '2.7' && matrix.os == 'ubuntu-latest' + run: | + sudo apt install -y python2 + curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + sudo python2 get-pip.py + id: apt-install-python + + - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version == '2.7' && matrix.os == 'windows-latest' + run: | + choco install python2 + id: choco-install-python + shell: pwsh + + - name: Configure steps.python.outputs + run: | + if (Test-Path "${{ steps.setup-python.outputs.python-path }}") { + "python-path=${{ steps.setup-python.outputs.python-path }}" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + } elseif (Test-Path C:/Python27/python.exe) { + "python-path=C:/Python27/python.exe" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + } else { + "python-path=/usr/bin/python2.7" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + } + id: python + shell: pwsh + - name: Test setup.py install run: | ${{ steps.python.outputs.python-path }} setup.py install --user @@ -186,11 +261,39 @@ jobs: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version != '2.7' uses: actions/setup-python@v4 - id: python + id: setup-python with: python-version: ${{ matrix.python-version }} + - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version == '2.7' && matrix.os == 'ubuntu-latest' + run: | + sudo apt install -y python2 + curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + sudo python2 get-pip.py + id: apt-install-python + + - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version == '2.7' && matrix.os == 'windows-latest' + run: | + choco install python2 + id: choco-install-python + shell: pwsh + + - name: Configure steps.python.outputs + run: | + if (Test-Path "${{ steps.setup-python.outputs.python-path }}") { + "python-path=${{ steps.setup-python.outputs.python-path }}" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + } elseif (Test-Path C:/Python27/python.exe) { + "python-path=C:/Python27/python.exe" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + } else { + "python-path=/usr/bin/python2.7" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + } + id: python + shell: pwsh + - name: Install dependencies run: | ${{ steps.python.outputs.python-path }} -m pip install --upgrade pip @@ -231,11 +334,29 @@ jobs: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version != '2.7' uses: actions/setup-python@v4 - id: python + id: setup-python with: python-version: ${{ matrix.python-version }} + - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version == '2.7' + run: | + sudo apt install -y python2 + curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + sudo python2 get-pip.py + id: apt-install-python + + - name: Configure steps.python.outputs + run: | + if [[ -f "${{ steps.setup-python.outputs.python-path }}" ]]; then + echo "python-path=${{ steps.setup-python.outputs.python-path }}" >> "$GITHUB_OUTPUT" + else + echo "python-path=/usr/bin/python2.7" >> "$GITHUB_OUTPUT" + fi + id: python + - name: Install dependencies run: | ${{ steps.python.outputs.python-path }} -m pip install --upgrade pip From 20811aff2ac6876caef1c4b333f9373276c0ff22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 8 Apr 2023 18:39:54 +0200 Subject: [PATCH 37/50] QPID-8631: use the `next()` builtin to progress iterators ``` python-modernize -wnf libmodernize.fixes.fix_next ``` --- qpid_tests/broker_0_10/priority.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/qpid_tests/broker_0_10/priority.py b/qpid_tests/broker_0_10/priority.py index c49ef65d..ccce6ccc 100644 --- a/qpid_tests/broker_0_10/priority.py +++ b/qpid_tests/broker_0_10/priority.py @@ -136,23 +136,23 @@ def ring_queue_check(self, msgs, count=10): def test_ring_queue_1(self): priorities = [4,5,3,6,9,9,2,9,2,9,9,1,9,9,9,3,3,3,9,9,3,9,3,9,9,9,9,9,9,2,3] seq = content("msg") - self.ring_queue_check([Message(content=seq.next(), priority = p) for p in priorities]) + self.ring_queue_check([Message(content=next(seq), priority = p) for p in priorities]) def test_ring_queue_2(self): priorities = [9,0,2,3,6,3,4,2,9,2,9,9,1,9,4,7,1,1,3,9,7,3,9,3,9,1,5,1,9,7,2,3,0,9] seq = content("msg") - self.ring_queue_check([Message(content=seq.next(), priority = p) for p in priorities]) + self.ring_queue_check([Message(content=next(seq), priority = p) for p in priorities]) def test_ring_queue_3(self): #test case given for QPID-3866 priorities = [8,9,5,1,2,2,3,4,9,7,8,9,9,2] seq = content("msg") - self.ring_queue_check([Message(content=seq.next(), priority = p) for p in priorities], 5) + self.ring_queue_check([Message(content=next(seq), priority = p) for p in priorities], 5) def test_ring_queue_4(self): priorities = [9,0,2,3,6,3,4,2,9,2,9,3,1,9,4,7,1,1,3,2,7,3,9,3,6,1,5,1,9,7,2,3,0,2] seq = content("msg") - self.ring_queue_check([Message(content=seq.next(), priority = p) for p in priorities]) + self.ring_queue_check([Message(content=next(seq), priority = p) for p in priorities]) def test_requeue(self): priorities = [4,5,3,6,9,9,2,9,2,9,9,1,9,9,9,3,3,3,9,9,3,9,3,9,9,9,9,9,9,2,3] From 787c8b9475a0a6daffb6883feeba93fea6fdd062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 11:21:22 +0200 Subject: [PATCH 38/50] QPID-8631: use b"" to mark bytestring literals --- qpid/codec.py | 6 +- qpid/codec010.py | 4 +- qpid/compat.py | 4 +- qpid/connection08.py | 8 +-- qpid/delegates.py | 2 +- qpid/framer.py | 10 +-- qpid/framing.py | 10 +-- qpid/messaging/driver.py | 6 +- qpid/tests/codec.py | 62 ++++++++--------- qpid/tests/codec010.py | 6 +- qpid/tests/connection.py | 22 +++--- qpid/tests/framing.py | 120 ++++++++++++++++---------------- qpid/tests/messaging/message.py | 10 +-- qpid/tests/spec010.py | 8 +-- qpid_tests/broker_0_9/echo.py | 2 +- 15 files changed, 140 insertions(+), 140 deletions(-) diff --git a/qpid/codec.py b/qpid/codec.py index a300dc59..01c4309d 100644 --- a/qpid/codec.py +++ b/qpid/codec.py @@ -667,13 +667,13 @@ def decode_array(self): def encode_boolean(self, s): if (s): - self.pack("!c", "\x01") + self.pack("!c", b"\x01") else: - self.pack("!c", "\x00") + self.pack("!c", b"\x00") def decode_boolean(self): b = self.unpack("!c") - if b == "\x00": + if b == b"\x00": return False else: # AMQP spec says anything else is True diff --git a/qpid/codec010.py b/qpid/codec010.py index 8f9eee08..f742d4ae 100644 --- a/qpid/codec010.py +++ b/qpid/codec010.py @@ -240,7 +240,7 @@ def read_vbin32(self): return self.read(self.read_uint32()) def write_vbin32(self, b): if isinstance(b, buffer): - b = str(b) + b = bytes(b) # Allow unicode values in connection 'response' field if isinstance(b, unicode): b = b.encode('utf8') @@ -408,7 +408,7 @@ def write_bin128(self, b): class StringCodec(Codec): - def __init__(self, encoded = ""): + def __init__(self, encoded = b""): self.encoded = encoded def read(self, n): diff --git a/qpid/compat.py b/qpid/compat.py index f3559ab1..c6619bd5 100644 --- a/qpid/compat.py +++ b/qpid/compat.py @@ -158,7 +158,7 @@ def __init__(self, read_sock, write_sock): self.write_sock = write_sock def _do_write(self): - self.write_sock.send("\0") + self.write_sock.send(b"\0") def _do_read(self): self.read_sock.recv(65536) @@ -198,7 +198,7 @@ def __init__(self): self.read_fd, self.write_fd = os.pipe() def _do_write(self): - os.write(self.write_fd, "\0") + os.write(self.write_fd, b"\0") def _do_read(self): os.read(self.read_fd, 65536) diff --git a/qpid/connection08.py b/qpid/connection08.py index d8f14a26..338e79f7 100644 --- a/qpid/connection08.py +++ b/qpid/connection08.py @@ -48,7 +48,7 @@ def write(self, buf): self.sock.sendall(buf) def read(self, n): - data = "" + data = b"" while len(data) < n: try: s = self.sock.recv(n - len(data)) @@ -179,7 +179,7 @@ def flush(self): INIT="!4s4B" def init(self): - self.codec.pack(Connection.INIT, "AMQP", 1, 1, self.spec.major, + self.codec.pack(Connection.INIT, b"AMQP", 1, 1, self.spec.major, self.spec.minor) def tini(self): @@ -216,7 +216,7 @@ def read_8_0(self): frame.channel = channel end = c.decode_octet() if end != self.FRAME_END: - garbage = "" + garbage = b"" while end != self.FRAME_END: garbage += chr(end) end = c.decode_octet() @@ -291,7 +291,7 @@ def read_0_10(self): frame.subchannel = subchannel end = c.decode_octet() if end != self.FRAME_END: - garbage = "" + garbage = b"" while end != self.FRAME_END: garbage += chr(end) end = c.decode_octet() diff --git a/qpid/delegates.py b/qpid/delegates.py index 482f59fc..487a3765 100644 --- a/qpid/delegates.py +++ b/qpid/delegates.py @@ -177,7 +177,7 @@ def start(self): cli_minor = 10 self.connection.write_header(cli_major, cli_minor) magic, _, _, major, minor = self.connection.read_header() - if not (magic == "AMQP" and major == cli_major and minor == cli_minor): + if not (magic == b"AMQP" and major == cli_major and minor == cli_minor): raise VersionError("client: %s-%s, server: %s-%s" % (cli_major, cli_minor, major, minor)) diff --git a/qpid/framer.py b/qpid/framer.py index e6766124..b0146b2c 100644 --- a/qpid/framer.py +++ b/qpid/framer.py @@ -37,8 +37,8 @@ class Framer(Packer): def __init__(self, sock): self.sock = sock self.sock_lock = RLock() - self.tx_buf = "" - self.rx_buf = "" + self.tx_buf = b"" + self.rx_buf = b"" self.security_layer_tx = None self.security_layer_rx = None self.maxbufsize = 65535 @@ -60,7 +60,7 @@ def flush(self): self._write(cipher_buf) else: self._write(self.tx_buf) - self.tx_buf = "" + self.tx_buf = b"" frm.debug("FLUSHED") finally: self.sock_lock.release() @@ -106,7 +106,7 @@ def read(self, n): else: continue except socket.error as e: - if self.rx_buf != "": + if self.rx_buf != b"": raise e else: raise Closed() @@ -124,7 +124,7 @@ def read_header(self): def write_header(self, major, minor): self.sock_lock.acquire() try: - self.pack(Framer.HEADER, "AMQP", 1, 1, major, minor) + self.pack(Framer.HEADER, b"AMQP", 1, 1, major, minor) self.flush() finally: self.sock_lock.release() diff --git a/qpid/framing.py b/qpid/framing.py index a441487d..e44918b4 100644 --- a/qpid/framing.py +++ b/qpid/framing.py @@ -81,7 +81,7 @@ def __repr__(self): class FrameDecoder: def __init__(self): - self.input = "" + self.input = b"" self.output = [] self.parse = self.__frame_header @@ -122,7 +122,7 @@ def read(self): class FrameEncoder: def __init__(self): - self.output = "" + self.output = b"" def write(self, *frames): for frame in frames: @@ -134,7 +134,7 @@ def write(self, *frames): def read(self): result = self.output - self.output = "" + self.output = b"" return result class SegmentDecoder: @@ -150,7 +150,7 @@ def write(self, *frames): if seg == None: seg = Segment(frm.isFirstSegment(), frm.isLastSegment(), - frm.type, frm.track, frm.channel, "") + frm.type, frm.track, frm.channel, b"") self.fragments[key] = seg seg.payload += frm.payload @@ -222,7 +222,7 @@ def write(self, *ops): seg = Segment(True, False, seg_type, seg_track, op.channel, enc) self.segments.append(seg) if hasattr(op, "headers") and op.headers is not None: - hdrs = "" + hdrs = b"" for h in op.headers: hdrs += self.encode_compound(h) seg = Segment(False, False, segment_type.header, seg_track, op.channel, diff --git a/qpid/messaging/driver.py b/qpid/messaging/driver.py index cb6c9314..ae2d4e64 100644 --- a/qpid/messaging/driver.py +++ b/qpid/messaging/driver.py @@ -631,8 +631,8 @@ def __init__(self, connection): self.address_cache = Cache(self.connection.address_ttl) self._status = CLOSED - self._buf = "" - self._hdr = "" + self._buf = b"" + self._hdr = b"" # Set _last_in and _last_out here so heartbeats will be timed from the # beginning of connection if no data is sent/received. self._last_in = time.time() @@ -885,7 +885,7 @@ def dispatch(self): def open(self): self._reset() self._status = OPEN - self._buf += struct.pack(HEADER, "AMQP", 1, 1, 0, 10) + self._buf += struct.pack(HEADER, b"AMQP", 1, 1, 0, 10) def disconnect(self): self.write_op(ConnectionClose(close_code.normal)) diff --git a/qpid/tests/codec.py b/qpid/tests/codec.py index 03f6fc24..6520e0e8 100644 --- a/qpid/tests/codec.py +++ b/qpid/tests/codec.py @@ -121,10 +121,10 @@ def __init__(self, *args): BaseDataTypes.__init__(self, *args) self.const_integer = 2 - self.const_integer_octet_encoded = '\x02' - self.const_integer_short_encoded = '\x00\x02' - self.const_integer_long_encoded = '\x00\x00\x00\x02' - self.const_integer_long_long_encoded = '\x00\x00\x00\x00\x00\x00\x00\x02' + self.const_integer_octet_encoded = b'\x02' + self.const_integer_short_encoded = b'\x00\x02' + self.const_integer_long_encoded = b'\x00\x00\x00\x02' + self.const_integer_long_long_encoded = b'\x00\x00\x00\x00\x00\x00\x00\x02' # -------------------------- # # Unsigned Octect - 8 bits # @@ -308,35 +308,35 @@ def test_bit1(self): """ sends in 11 """ - self.failUnlessEqual(self.callFunc('encode_bit', 1, 1), '\x03', '11 bit encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_bit', 1, 1), b'\x03', '11 bit encoding FAILED...') # ------------------- def test_bit2(self): """ sends in 10011 """ - self.failUnlessEqual(self.callFunc('encode_bit', 1, 1, 0, 0, 1), '\x13', '10011 bit encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_bit', 1, 1, 0, 0, 1), b'\x13', '10011 bit encoding FAILED...') # ------------------- def test_bit3(self): """ sends in 1110100111 [10 bits(right to left), should be compressed into two octets] """ - self.failUnlessEqual(self.callFunc('encode_bit', 1,1,1,0,0,1,0,1,1,1), '\xa7\x03', '1110100111(right to left) bit encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_bit', 1,1,1,0,0,1,0,1,1,1), b'\xa7\x03', '1110100111(right to left) bit encoding FAILED...') # ------------------------------------ def test_bit_decode_1(self): """ decode bit 1 """ - self.failUnlessEqual(self.readFunc('decode_bit', '\x01'), 1, 'decode bit 1 FAILED...') + self.failUnlessEqual(self.readFunc('decode_bit', b'\x01'), 1, 'decode bit 1 FAILED...') # ------------------------------------ def test_bit_decode_0(self): """ decode bit 0 """ - self.failUnlessEqual(self.readFunc('decode_bit', '\x00'), 0, 'decode bit 0 FAILED...') + self.failUnlessEqual(self.readFunc('decode_bit', b'\x00'), 0, 'decode bit 0 FAILED...') # ----------------------------------- # ----------------------------------- @@ -355,28 +355,28 @@ def test_short_string_zero_length(self): """ 0 length short string """ - self.failUnlessEqual(self.callFunc('encode_shortstr', ''), '\x00', '0 length short string encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_shortstr', b''), b'\x00', '0 length short string encoding FAILED...') # ------------------------------------------- def test_short_string_positive_length(self): """ positive length short string """ - self.failUnlessEqual(self.callFunc('encode_shortstr', 'hello world'), '\x0bhello world', 'positive length short string encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_shortstr', b'hello world'), b'\x0bhello world', 'positive length short string encoding FAILED...') # ------------------------------------------- def test_short_string_out_of_upper_range(self): """ string length > 255 """ - self.failUnlessRaises(Exception, self.codec.encode_shortstr, 'x'*256) + self.failUnlessRaises(Exception, self.codec.encode_shortstr, b'x'*256) # ------------------------------------ def test_short_string_decode(self): """ short string decode """ - self.failUnlessEqual(self.readFunc('decode_shortstr', '\x0bhello world'), 'hello world', 'short string decode FAILED...') + self.failUnlessEqual(self.readFunc('decode_shortstr', b'\x0bhello world'), b'hello world', 'short string decode FAILED...') # ------------------------------------------------------------- # @@ -388,21 +388,21 @@ def test_long_string_zero_length(self): """ 0 length long string """ - self.failUnlessEqual(self.callFunc('encode_longstr', ''), '\x00\x00\x00\x00', '0 length long string encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_longstr', b''), b'\x00\x00\x00\x00', '0 length long string encoding FAILED...') # ------------------------------------------- def test_long_string_positive_length(self): """ positive length long string """ - self.failUnlessEqual(self.callFunc('encode_longstr', 'hello world'), '\x00\x00\x00\x0bhello world', 'positive length long string encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_longstr', b'hello world'), b'\x00\x00\x00\x0bhello world', 'positive length long string encoding FAILED...') # ------------------------------------ def test_long_string_decode(self): """ long string decode """ - self.failUnlessEqual(self.readFunc('decode_longstr', '\x00\x00\x00\x0bhello world'), 'hello world', 'long string decode FAILED...') + self.failUnlessEqual(self.readFunc('decode_longstr', b'\x00\x00\x00\x0bhello world'), b'hello world', 'long string decode FAILED...') # -------------------------------------- @@ -431,15 +431,15 @@ def __init__(self, *args): """ BaseDataTypes.__init__(self, *args) - self.const_field_table_dummy_dict = {'$key1':'value1','$key2':'value2'} - self.const_field_table_dummy_dict_encoded = '\x00\x00\x00\x22\x05$key2S\x00\x00\x00\x06value2\x05$key1S\x00\x00\x00\x06value1' + self.const_field_table_dummy_dict = {b'$key2':b'value2',b'$key1':b'value1'} + self.const_field_table_dummy_dict_encoded = b'\x00\x00\x00\x22\x05$key2S\x00\x00\x00\x06value2\x05$key1S\x00\x00\x00\x06value1' # ------------------------------------------- def test_field_table_name_value_pair(self): """ valid name value pair """ - self.failUnlessEqual(self.callFunc('encode_table', {'$key1':'value1'}), '\x00\x00\x00\x11\x05$key1S\x00\x00\x00\x06value1', 'valid name value pair encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_table', {'$key1':'value1'}), b'\x00\x00\x00\x11\x05$key1S\x00\x00\x00\x06value1', 'valid name value pair encoding FAILED...') # --------------------------------------------------- def test_field_table_multiple_name_value_pair(self): @@ -469,28 +469,28 @@ def test_content_inline(self): """ inline content """ - self.failUnlessEqual(self.callFunc('encode_content', 'hello inline message'), '\x00\x00\x00\x00\x14hello inline message', 'inline content encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_content', 'hello inline message'), b'\x00\x00\x00\x00\x14hello inline message', 'inline content encoding FAILED...') # -------------------------------- def test_content_reference(self): """ reference content """ - self.failUnlessEqual(self.callFunc('encode_content', ReferenceId('dummyId')), '\x01\x00\x00\x00\x07dummyId', 'reference content encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_content', ReferenceId('dummyId')), b'\x01\x00\x00\x00\x07dummyId', 'reference content encoding FAILED...') # ------------------------------------ def test_content_inline_decode(self): """ inline content decode """ - self.failUnlessEqual(self.readFunc('decode_content', '\x00\x00\x00\x00\x14hello inline message'), 'hello inline message', 'inline content decode FAILED...') + self.failUnlessEqual(self.readFunc('decode_content', b'\x00\x00\x00\x00\x14hello inline message'), b'hello inline message', 'inline content decode FAILED...') # ------------------------------------ def test_content_reference_decode(self): """ reference content decode """ - self.failUnlessEqual(self.readFunc('decode_content', '\x01\x00\x00\x00\x07dummyId').id, 'dummyId', 'reference content decode FAILED...') + self.failUnlessEqual(self.readFunc('decode_content', b'\x01\x00\x00\x00\x07dummyId').id, b'dummyId', 'reference content decode FAILED...') # ----------------------------------- # ----------------------------------- @@ -498,21 +498,21 @@ class BooleanTestCase(BaseDataTypes): # ------------------- def test_true_encode(self): - self.failUnlessEqual(self.callFunc('encode_boolean', True), '\x01', 'True encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_boolean', True), b'\x01', 'True encoding FAILED...') # ------------------- def test_true_decode(self): - self.failUnlessEqual(self.readFunc('decode_boolean', '\x01'), True, 'True decoding FAILED...') - self.failUnlessEqual(self.readFunc('decode_boolean', '\x02'), True, 'True decoding FAILED...') - self.failUnlessEqual(self.readFunc('decode_boolean', '\xFF'), True, 'True decoding FAILED...') + self.failUnlessEqual(self.readFunc('decode_boolean', b'\x01'), True, 'True decoding FAILED...') + self.failUnlessEqual(self.readFunc('decode_boolean', b'\x02'), True, 'True decoding FAILED...') + self.failUnlessEqual(self.readFunc('decode_boolean', b'\xFF'), True, 'True decoding FAILED...') # ------------------- def test_false_encode(self): - self.failUnlessEqual(self.callFunc('encode_boolean', False), '\x00', 'False encoding FAILED...') + self.failUnlessEqual(self.callFunc('encode_boolean', False), b'\x00', 'False encoding FAILED...') # ------------------- def test_false_decode(self): - self.failUnlessEqual(self.readFunc('decode_boolean', '\x00'), False, 'False decoding FAILED...') + self.failUnlessEqual(self.readFunc('decode_boolean', b'\x00'), False, 'False decoding FAILED...') # ----------------------------------- # ----------------------------------- @@ -663,7 +663,7 @@ def oldtests(): for i in range(10): dotest("bit", [x == "1" for x in value*i]) - for value in ({}, {"asdf": "fdsa", "fdsa": 1, "three": 3}, {"one": 1}): + for value in ({}, {b"asdf": b"fdsa", b"fdsa": 1, b"three": 3}, {b"one": 1}): dotest("table", value) for type in ("octet", "short", "long", "longlong"): @@ -671,7 +671,7 @@ def oldtests(): dotest(type, value) for type in ("shortstr", "longstr"): - for value in ("", "a", "asdf"): + for value in (b"", b"a", b"asdf"): dotest(type, value) # ----------------------------------------- diff --git a/qpid/tests/codec010.py b/qpid/tests/codec010.py index cf0ab501..7f22b89b 100644 --- a/qpid/tests/codec010.py +++ b/qpid/tests/codec010.py @@ -43,10 +43,10 @@ def testMapUnicode(self): self.check("map", {"unicode": u"this is a unicode test"}) def testMapBinary(self): - self.check("map", {"binary": "\x7f\xb4R^\xe5\xf0:\x89\x96E1\xf6\xfe\xb9\x1b\xf5"}) + self.check("map", {"binary": b"\x7f\xb4R^\xe5\xf0:\x89\x96E1\xf6\xfe\xb9\x1b\xf5"}) def testMapBuffer(self): - s = "\x7f\xb4R^\xe5\xf0:\x89\x96E1\xf6\xfe\xb9\x1b\xf5" + s = b"\x7f\xb4R^\xe5\xf0:\x89\x96E1\xf6\xfe\xb9\x1b\xf5" dec = self.check("map", {"buffer": buffer(s)}, False) assert dec["buffer"] == s @@ -82,7 +82,7 @@ def testMapUUID(self): def testMapAll(self): decoded = self.check("map", {"string": "this is a test", "unicode": u"this is a unicode test", - "binary": "\x7f\xb4R^\xe5\xf0:\x89\x96E1\xf6\xfe\xb9\x1b\xf5", + "binary": b"\x7f\xb4R^\xe5\xf0:\x89\x96E1\xf6\xfe\xb9\x1b\xf5", "int": 3, "long": 2**32, "timestamp": timestamp(0), diff --git a/qpid/tests/connection.py b/qpid/tests/connection.py index f223501f..e1dc7ddb 100644 --- a/qpid/tests/connection.py +++ b/qpid/tests/connection.py @@ -103,11 +103,11 @@ def test(self): c = self.connect() c.start(10) - ssn1 = c.session("test1", timeout=10) - ssn2 = c.session("test2", timeout=10) + ssn1 = c.session(b"test1", timeout=10) + ssn2 = c.session(b"test2", timeout=10) - assert ssn1 == c.sessions["test1"] - assert ssn2 == c.sessions["test2"] + assert ssn1 == c.sessions[b"test1"] + assert ssn2 == c.sessions[b"test2"] assert ssn1.channel != None assert ssn2.channel != None assert ssn1 in c.attached.values() @@ -125,7 +125,7 @@ def test(self): assert ssn2 not in c.attached.values() assert ssn2 not in c.sessions.values() - ssn = c.session("session", timeout=10) + ssn = c.session(b"session", timeout=10) assert ssn.channel != None assert ssn in c.sessions.values() @@ -141,7 +141,7 @@ def test(self): assert cmd.headers == None assert cmd.payload == None - msg = Message("this is a test") + msg = Message(b"this is a test") ssn.message_transfer("four", message=msg) cmd = self.queue.get(10) assert cmd.destination == "four" @@ -159,14 +159,14 @@ def testCloseGet(self): echos = ssn.incoming("echo") for i in range(10): - ssn.message_transfer("echo", message=Message("test%d" % i)) + ssn.message_transfer("echo", message=Message(b"test%d" % i)) ssn.auto_sync=False ssn.message_transfer("abort") for i in range(10): m = echos.get(timeout=10) - assert m.body == "test%d" % i + assert m.body == b"test%d" % i try: m = echos.get(timeout=10) @@ -193,7 +193,7 @@ def exc_listener(e): echos.listen(listener, exc_listener) for i in range(10): - ssn.message_transfer("echo", message=Message("test%d" % i)) + ssn.message_transfer("echo", message=Message(b"test%d" % i)) ssn.auto_sync=False ssn.message_transfer("abort") @@ -208,7 +208,7 @@ def exc_listener(e): for i in range(10): m = messages.pop(0) - assert m.body == "test%d" % i + assert m.body == b"test%d" % i assert len(exceptions) == 1 @@ -217,7 +217,7 @@ def testSync(self): c.start(10) s = c.session("test") s.auto_sync = False - s.message_transfer("echo", message=Message("test")) + s.message_transfer("echo", message=Message(b"test")) s.sync(10) def testHeartbeat(self): diff --git a/qpid/tests/framing.py b/qpid/tests/framing.py index 2d987f8b..2b39143a 100644 --- a/qpid/tests/framing.py +++ b/qpid/tests/framing.py @@ -103,42 +103,42 @@ def enc_dec(self, frames, encoded=None): self.cmp_frames(f, df) def testEmpty(self): - self.enc_dec([Frame(0, 0, 0, 0, "")], - "\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00") + self.enc_dec([Frame(0, 0, 0, 0, b"")], + b"\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00") def testSingle(self): - self.enc_dec([Frame(0, 0, 0, 1, "payload")], - "\x00\x00\x00\x13\x00\x00\x00\x01\x00\x00\x00\x00payload") + self.enc_dec([Frame(0, 0, 0, 1, b"payload")], + b"\x00\x00\x00\x13\x00\x00\x00\x01\x00\x00\x00\x00payload") def testMaxChannel(self): - self.enc_dec([Frame(0, 0, 0, 65535, "max-channel")], - "\x00\x00\x00\x17\x00\x00\xff\xff\x00\x00\x00\x00max-channel") + self.enc_dec([Frame(0, 0, 0, 65535, b"max-channel")], + b"\x00\x00\x00\x17\x00\x00\xff\xff\x00\x00\x00\x00max-channel") def testMaxType(self): - self.enc_dec([Frame(0, 255, 0, 0, "max-type")], - "\x00\xff\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00max-type") + self.enc_dec([Frame(0, 255, 0, 0, b"max-type")], + b"\x00\xff\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00max-type") def testMaxTrack(self): - self.enc_dec([Frame(0, 0, 15, 0, "max-track")], - "\x00\x00\x00\x15\x00\x0f\x00\x00\x00\x00\x00\x00max-track") + self.enc_dec([Frame(0, 0, 15, 0, b"max-track")], + b"\x00\x00\x00\x15\x00\x0f\x00\x00\x00\x00\x00\x00max-track") def testSequence(self): - self.enc_dec([Frame(0, 0, 0, 0, "zero"), - Frame(0, 0, 0, 1, "one"), - Frame(0, 0, 1, 0, "two"), - Frame(0, 0, 1, 1, "three"), - Frame(0, 1, 0, 0, "four"), - Frame(0, 1, 0, 1, "five"), - Frame(0, 1, 1, 0, "six"), - Frame(0, 1, 1, 1, "seven"), - Frame(1, 0, 0, 0, "eight"), - Frame(1, 0, 0, 1, "nine"), - Frame(1, 0, 1, 0, "ten"), - Frame(1, 0, 1, 1, "eleven"), - Frame(1, 1, 0, 0, "twelve"), - Frame(1, 1, 0, 1, "thirteen"), - Frame(1, 1, 1, 0, "fourteen"), - Frame(1, 1, 1, 1, "fifteen")]) + self.enc_dec([Frame(0, 0, 0, 0, b"zero"), + Frame(0, 0, 0, 1, b"one"), + Frame(0, 0, 1, 0, b"two"), + Frame(0, 0, 1, 1, b"three"), + Frame(0, 1, 0, 0, b"four"), + Frame(0, 1, 0, 1, b"five"), + Frame(0, 1, 1, 0, b"six"), + Frame(0, 1, 1, 1, b"seven"), + Frame(1, 0, 0, 0, b"eight"), + Frame(1, 0, 0, 1, b"nine"), + Frame(1, 0, 1, 0, b"ten"), + Frame(1, 0, 1, 1, b"eleven"), + Frame(1, 1, 0, 0, b"twelve"), + Frame(1, 1, 0, 1, b"thirteen"), + Frame(1, 1, 1, 0, b"fourteen"), + Frame(1, 1, 1, 1, b"fifteen")]) class SegmentTest(Base): @@ -168,54 +168,54 @@ def enc_dec(self, segments, frames=None, interleave=None, max_payload=Frame.MAX_ self.cmp_segments(s1, s2) def testEmpty(self): - self.enc_dec([Segment(True, True, 0, 0, 0, "")], + self.enc_dec([Segment(True, True, 0, 0, 0, b"")], [Frame(FIRST_FRM | LAST_FRM | FIRST_SEG | LAST_SEG, 0, 0, 0, - "")]) + b"")]) def testSingle(self): - self.enc_dec([Segment(True, True, 0, 0, 0, "payload")], + self.enc_dec([Segment(True, True, 0, 0, 0, b"payload")], [Frame(FIRST_FRM | LAST_FRM | FIRST_SEG | LAST_SEG, 0, 0, 0, - "payload")]) + b"payload")]) def testMaxChannel(self): - self.enc_dec([Segment(False, False, 0, 0, 65535, "max-channel")], - [Frame(FIRST_FRM | LAST_FRM, 0, 0, 65535, "max-channel")]) + self.enc_dec([Segment(False, False, 0, 0, 65535, b"max-channel")], + [Frame(FIRST_FRM | LAST_FRM, 0, 0, 65535, b"max-channel")]) def testMaxType(self): - self.enc_dec([Segment(False, False, 255, 0, 0, "max-type")], - [Frame(FIRST_FRM | LAST_FRM, 255, 0, 0, "max-type")]) + self.enc_dec([Segment(False, False, 255, 0, 0, b"max-type")], + [Frame(FIRST_FRM | LAST_FRM, 255, 0, 0, b"max-type")]) def testMaxTrack(self): - self.enc_dec([Segment(False, False, 0, 15, 0, "max-track")], - [Frame(FIRST_FRM | LAST_FRM, 0, 15, 0, "max-track")]) + self.enc_dec([Segment(False, False, 0, 15, 0, b"max-track")], + [Frame(FIRST_FRM | LAST_FRM, 0, 15, 0, b"max-track")]) def testSequence(self): - self.enc_dec([Segment(True, False, 0, 0, 0, "one"), - Segment(False, False, 0, 0, 0, "two"), - Segment(False, True, 0, 0, 0, "three")], - [Frame(FIRST_FRM | LAST_FRM | FIRST_SEG, 0, 0, 0, "one"), - Frame(FIRST_FRM | LAST_FRM, 0, 0, 0, "two"), - Frame(FIRST_FRM | LAST_FRM | LAST_SEG, 0, 0, 0, "three")]) + self.enc_dec([Segment(True, False, 0, 0, 0, b"one"), + Segment(False, False, 0, 0, 0, b"two"), + Segment(False, True, 0, 0, 0, b"three")], + [Frame(FIRST_FRM | LAST_FRM | FIRST_SEG, 0, 0, 0, b"one"), + Frame(FIRST_FRM | LAST_FRM, 0, 0, 0, b"two"), + Frame(FIRST_FRM | LAST_FRM | LAST_SEG, 0, 0, 0, b"three")]) def testInterleaveChannel(self): - frames = [Frame(0, 0, 0, 0, chr(ord("a") + i)) for i in range(7)] + frames = [Frame(0, 0, 0, 0, b'%c' % (ord("a") + i,)) for i in range(7)] frames[0].flags |= FIRST_FRM frames[-1].flags |= LAST_FRM - ilvd = [Frame(0, 0, 0, 1, chr(ord("a") + i)) for i in range(7)] + ilvd = [Frame(0, 0, 0, 1, b'%c' % (ord("a") + i,)) for i in range(7)] - self.enc_dec([Segment(False, False, 0, 0, 0, "abcdefg")], frames, ilvd, max_payload=1) + self.enc_dec([Segment(False, False, 0, 0, 0, b"abcdefg")], frames, ilvd, max_payload=1) def testInterleaveTrack(self): - frames = [Frame(0, 0, 0, 0, "%c%c" % (ord("a") + i, ord("a") + i + 1)) + frames = [Frame(0, 0, 0, 0, b"%c%c" % (ord("a") + i, ord("a") + i + 1)) for i in range(0, 8, 2)] frames[0].flags |= FIRST_FRM frames[-1].flags |= LAST_FRM - ilvd = [Frame(0, 0, 1, 0, "%c%c" % (ord("a") + i, ord("a") + i + 1)) + ilvd = [Frame(0, 0, 1, 0, b"%c%c" % (ord("a") + i, ord("a") + i + 1)) for i in range(0, 8, 2)] - self.enc_dec([Segment(False, False, 0, 0, 0, "abcdefgh")], frames, ilvd, max_payload=2) + self.enc_dec([Segment(False, False, 0, 0, 0, b"abcdefgh")], frames, ilvd, max_payload=2) from qpid.ops import * @@ -245,46 +245,46 @@ def testSyncMT(self): self.enc_dec([MessageTransfer(destination="asdf", sync=True)]) def testEmptyPayloadMT(self): - self.enc_dec([MessageTransfer(payload="")]) + self.enc_dec([MessageTransfer(payload=b"")]) def testPayloadMT(self): - self.enc_dec([MessageTransfer(payload="test payload")]) + self.enc_dec([MessageTransfer(payload=b"test payload")]) def testHeadersEmptyPayloadMT(self): self.enc_dec([MessageTransfer(headers=[DeliveryProperties()])]) def testHeadersPayloadMT(self): - self.enc_dec([MessageTransfer(headers=[DeliveryProperties()], payload="test payload")]) + self.enc_dec([MessageTransfer(headers=[DeliveryProperties()], payload=b"test payload")]) def testMultiHeadersEmptyPayloadMT(self): self.enc_dec([MessageTransfer(headers=[DeliveryProperties(), MessageProperties()])]) def testMultiHeadersPayloadMT(self): - self.enc_dec([MessageTransfer(headers=[MessageProperties(), DeliveryProperties()], payload="test payload")]) + self.enc_dec([MessageTransfer(headers=[MessageProperties(), DeliveryProperties()], payload=b"test payload")]) def testContentTypeHeadersPayloadMT(self): - self.enc_dec([MessageTransfer(headers=[MessageProperties(content_type="text/plain")], payload="test payload")]) + self.enc_dec([MessageTransfer(headers=[MessageProperties(content_type="text/plain")], payload=b"test payload")]) def testMulti(self): self.enc_dec([MessageTransfer(), MessageTransfer(sync=True), MessageTransfer(destination="one"), MessageTransfer(destination="two", sync=True), - MessageTransfer(destination="three", payload="test payload")]) + MessageTransfer(destination="three", payload=b"test payload")]) def testControl(self): - self.enc_dec([SessionAttach(name="asdf")]) + self.enc_dec([SessionAttach(name=b"asdf")]) def testMixed(self): - self.enc_dec([SessionAttach(name="fdsa"), MessageTransfer(destination="test")]) + self.enc_dec([SessionAttach(name=b"fdsa"), MessageTransfer(destination="test")]) def testChannel(self): - self.enc_dec([SessionAttach(name="asdf", channel=3), MessageTransfer(destination="test", channel=1)]) + self.enc_dec([SessionAttach(name=b"asdf", channel=3), MessageTransfer(destination="test", channel=1)]) def testCompound(self): self.enc_dec([MessageTransfer(headers=[MessageProperties(reply_to=ReplyTo(exchange="exch", routing_key="rk"))])]) def testListCompound(self): - self.enc_dec([ExecutionResult(value=RecoverResult(in_doubt=[Xid(global_id="one"), - Xid(global_id="two"), - Xid(global_id="three")]))]) + self.enc_dec([ExecutionResult(value=RecoverResult(in_doubt=[Xid(global_id=b"one"), + Xid(global_id=b"two"), + Xid(global_id=b"three")]))]) diff --git a/qpid/tests/messaging/message.py b/qpid/tests/messaging/message.py index ee5b56e2..ed6604df 100644 --- a/qpid/tests/messaging/message.py +++ b/qpid/tests/messaging/message.py @@ -25,8 +25,8 @@ class MessageTests(Base): def testCreateString(self): - m = Message("string") - assert m.content == "string" + m = Message(b"string") + assert m.content == b"string" assert m.content_type is None def testCreateUnicode(self): @@ -79,7 +79,7 @@ def testUnicodeContent(self): self.check(Message(u"unicode")) - TEST_MAP = {"key1": "string", + TEST_MAP = {"key1": b"string", "key2": u"unicode", "key3": 3, "key4": -3, @@ -90,7 +90,7 @@ def testUnicodeContent(self): "key9": {"sub-key0": 3}, "key10": True, "key11": False, - "x-amqp-0-10.app-id": "test-app-id", + "x-amqp-0-10.app-id": b"test-app-id", "x-amqp-0-10.content-encoding": "test-content-encoding"} def testMapContent(self): @@ -104,7 +104,7 @@ def testListContent(self): def testProperties(self): msg = Message() msg.subject = "subject" - msg.correlation_id = str(self.test_id) + msg.correlation_id = str(self.test_id).encode() msg.durable = True msg.priority = 7 msg.ttl = 60 diff --git a/qpid/tests/spec010.py b/qpid/tests/spec010.py index cce8ca3e..f662d7ba 100644 --- a/qpid/tests/spec010.py +++ b/qpid/tests/spec010.py @@ -28,11 +28,11 @@ class SpecTest(TestCase): def testSessionHeader(self): sc = StringCodec() sc.write_compound(Header(sync=True)) - assert sc.encoded == "\x01\x01" + assert sc.encoded == b"\x01\x01" sc = StringCodec() sc.write_compound(Header(sync=False)) - assert sc.encoded == "\x01\x00" + assert sc.encoded == b"\x01\x00" def encdec(self, value): sc = StringCodec() @@ -57,9 +57,9 @@ def testMessageSubscribe(self): def testXid(self): sc = StringCodec() - xid = Xid(format=0, global_id="gid", branch_id="bid") + xid = Xid(format=0, global_id=b"gid", branch_id=b"bid") sc.write_compound(xid) - assert sc.encoded == '\x00\x00\x00\x10\x06\x04\x07\x00\x00\x00\x00\x00\x03gid\x03bid' + assert sc.encoded == b'\x00\x00\x00\x10\x06\x04\x07\x00\x00\x00\x00\x00\x03gid\x03bid' dec = sc.read_compound(Xid) assert xid.__dict__ == dec.__dict__ diff --git a/qpid_tests/broker_0_9/echo.py b/qpid_tests/broker_0_9/echo.py index b8b5535e..6391d335 100644 --- a/qpid_tests/broker_0_9/echo.py +++ b/qpid_tests/broker_0_9/echo.py @@ -33,7 +33,7 @@ def setUp(self): self.assertTrue(self.frame_max_size >= self.client.conn.FRAME_MIN_SIZE) def test_empty_message(self): - body = '' + body = b'' self.echo_message(body) def test_small_message(self): From bd2a9f1bba2809a6429b1b66202c68f0f14287c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Tue, 11 Apr 2023 10:21:54 +0200 Subject: [PATCH 39/50] QPID-8631: use io.BytesIO for bytes --- qpid/codec.py | 13 +++++-------- qpid/connection08.py | 13 +++++-------- qpid/tests/codec.py | 17 ++++++++--------- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/qpid/codec.py b/qpid/codec.py index 01c4309d..4ee38efb 100644 --- a/qpid/codec.py +++ b/qpid/codec.py @@ -29,10 +29,7 @@ from __future__ import absolute_import import re, qpid, os from . import spec08 -try: - from cStringIO import StringIO -except ImportError: - from io import StringIO +from io import BytesIO from struct import * from .reference import ReferenceId from logging import getLogger @@ -438,7 +435,7 @@ def encode_table(self, tbl): """ encodes a table data structure in network byte order """ - enc = StringIO() + enc = BytesIO() codec = Codec(enc, self.spec) if tbl: for key, value in tbl.items(): @@ -573,7 +570,7 @@ def dec_num(self, width): def encode_struct(self, type, s): if type.size: - enc = StringIO() + enc = BytesIO() codec = Codec(enc, self.spec) codec.encode_struct_body(type, s) codec.flush() @@ -636,7 +633,7 @@ def decode_struct_body(self, type): return s def encode_long_struct(self, s): - enc = StringIO() + enc = BytesIO() codec = Codec(enc, self.spec) type = s.type codec.encode_short(type.type) @@ -644,7 +641,7 @@ def encode_long_struct(self, s): self.encode_longstr(enc.getvalue()) def decode_long_struct(self): - codec = Codec(StringIO(self.decode_longstr()), self.spec) + codec = Codec(BytesIO(self.decode_longstr()), self.spec) type = self.spec.structs[codec.decode_short()] return codec.decode_struct_body(type) diff --git a/qpid/connection08.py b/qpid/connection08.py index 338e79f7..ecd4eb0f 100644 --- a/qpid/connection08.py +++ b/qpid/connection08.py @@ -26,10 +26,7 @@ from __future__ import absolute_import import socket, errno, qpid from . import codec -try: - from cStringIO import StringIO -except ImportError: - from io import StringIO +from io import BytesIO from .codec import EOF from .compat import SHUT_RDWR from .exceptions import VersionError @@ -189,7 +186,7 @@ def write_8_0(self, frame): c = self.codec c.encode_octet(self.spec.constants.byname[frame.type].id) c.encode_short(frame.channel) - body = StringIO() + body = BytesIO() enc = codec.Codec(body, self.spec) frame.encode(enc) enc.flush() @@ -211,7 +208,7 @@ def read_8_0(self): try: channel = c.decode_short() body = c.decode_longstr() - dec = codec.Codec(StringIO(body), self.spec) + dec = codec.Codec(BytesIO(body), self.spec) frame = Frame.DECODERS[type].decode(self.spec, dec, len(body)) frame.channel = channel end = c.decode_octet() @@ -250,7 +247,7 @@ def write_0_10(self, frame): c.encode_octet(flags) # TODO: currently fixed at ver=0, B=E=b=e=1 c.encode_octet(self.spec.constants.byname[frame.type].id) - body = StringIO() + body = BytesIO() enc = codec.Codec(body, self.spec) frame.encode(enc) enc.flush() @@ -282,7 +279,7 @@ def read_0_10(self): raise FramingError("frame error: reserved bits not all zero") body_size = frame_size - 12 # TODO: Magic number (frame header size) body = c.read(body_size) - dec = codec.Codec(StringIO(body), self.spec) + dec = codec.Codec(BytesIO(body), self.spec) try: frame = Frame.DECODERS[type].decode(self.spec, dec, len(body)) except EOF: diff --git a/qpid/tests/codec.py b/qpid/tests/codec.py index 6520e0e8..9d77b225 100644 --- a/qpid/tests/codec.py +++ b/qpid/tests/codec.py @@ -23,10 +23,7 @@ import unittest from qpid.codec import Codec from qpid.spec08 import load -try: - from cStringIO import StringIO -except ImportError: - from io import StringIO +from io import BytesIO from qpid.reference import ReferenceId __doc__ = """ @@ -75,7 +72,7 @@ def setUp(self): """ standard setUp for unitetest (refer unittest documentation for details) """ - self.codec = Codec(StringIO(), SPEC) + self.codec = Codec(BytesIO(), SPEC) # ------------------ def tearDown(self): @@ -100,7 +97,7 @@ def readFunc(self, functionName, *args): helper function - creates a input stream and then calls the function with arguments as have been supplied """ - self.codec.stream = StringIO(args[0]) + self.codec.stream = BytesIO(args[0]) return getattr(self.codec, functionName)() @@ -212,7 +209,7 @@ def test_ushort_int_decode(self): # ----------------------- def test_ulong_int(self): """ - testing unsigned long iteger + testing unsigned long integer """ self.failUnlessEqual(self.callFunc('encode_long', self.const_integer), self.const_integer_long_encoded, 'long encoding FAILED...') @@ -633,19 +630,21 @@ def test(type, value): values = value else: values = [value] - stream = StringIO() + stream = BytesIO() codec = Codec(stream, SPEC) for v in values: codec.encode(type, v) codec.flush() enc = stream.getvalue() - stream.reset() + stream.seek(0) dup = [] for i in range(len(values)): dup.append(codec.decode(type)) if values != dup: raise AssertionError("%r --> %r --> %r" % (values, enc, dup)) +test.__test__ = False # tells pytest to not try run this as a test function + # ----------------------- def dotest(type, value): """ From 1ff4397672f4c52f12530bd9470de0a67aa7378e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Tue, 11 Apr 2023 11:03:11 +0200 Subject: [PATCH 40/50] QPID-8631: fix RuntimeError: dictionary changed size during iteration ``` Traceback (most recent call last): File "/opt/hostedtoolcache/Python/3.8.16/x64/lib/python3.8/threading.py", line 932, in _bootstrap_inner self.run() File "/opt/hostedtoolcache/Python/3.8.16/x64/lib/python3.8/threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "/home/runner/work/qpid-python/qpid-python/qpid/connection.py", line 190, in run self.detach_all() File "/home/runner/work/qpid-python/qpid-python/qpid/connection.py", line 140, in detach_all self.run() File "/opt/hostedtoolcache/Python/3.8.16/x64/lib/python3.8/threading.py", line 870, in run for ssn in self.attached.values(): ``` This is Python's version of the concurrent modification exception in Java. --- qpid/client.py | 2 +- qpid/connection.py | 2 +- qpid/messaging/endpoints.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/qpid/client.py b/qpid/client.py index 305f6b3e..f31edd86 100644 --- a/qpid/client.py +++ b/qpid/client.py @@ -248,7 +248,7 @@ def closed(self, reason): self.client.reason = reason self.client.started.set() with self.client.lock: - for queue in self.client.queues.values(): + for queue in list(self.client.queues.values()): queue.close(reason) class StructFactory: diff --git a/qpid/connection.py b/qpid/connection.py index 0905aaaa..7d1785f6 100644 --- a/qpid/connection.py +++ b/qpid/connection.py @@ -137,7 +137,7 @@ def detach_all(self): self.lock.acquire() self.failed = True try: - for ssn in self.attached.values(): + for ssn in list(self.attached.values()): if self.close_code[0] != 200: ssn.exceptions.append(self.close_code) self.detach(ssn.name, ssn.channel) diff --git a/qpid/messaging/endpoints.py b/qpid/messaging/endpoints.py index 56c24263..95db77ee 100644 --- a/qpid/messaging/endpoints.py +++ b/qpid/messaging/endpoints.py @@ -382,7 +382,7 @@ def close(self, timeout=None): Close the connection and all sessions. """ try: - for ssn in self.sessions.values(): + for ssn in list(self.sessions.values()): ssn.close(timeout=timeout) finally: self.detach(timeout=timeout) From d596150c876e31e22b5a9edab2aba606e64e6a8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Thu, 13 Apr 2023 19:04:30 +0200 Subject: [PATCH 41/50] QPID-8631: HMAC in Python 3 has mandatory digestmod parameter, it is no longer defaulted to `hashlib.md5` --- qpid/saslmech/cram_md5.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/qpid/saslmech/cram_md5.py b/qpid/saslmech/cram_md5.py index 5dec9759..00f65b90 100644 --- a/qpid/saslmech/cram_md5.py +++ b/qpid/saslmech/cram_md5.py @@ -18,11 +18,14 @@ # from __future__ import absolute_import + +import hashlib + from .sasl import Sasl from hmac import HMAC class CRAM_MD5(Sasl): def response(self, challenge): - digest = HMAC( self.password, challenge).hexdigest() + digest = HMAC(self.password.encode(), challenge, digestmod=hashlib.md5).hexdigest() return "%s %s" % (self.user, digest) From 945a8372b4189f07a2372e3e5e84bb2637a96a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 16 Apr 2023 18:07:09 +0200 Subject: [PATCH 42/50] QPID-8631: remember exception to raise, due to changed py3 exception object lifetime --- qpid/util.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qpid/util.py b/qpid/util.py index b91005aa..fd5c26d0 100644 --- a/qpid/util.py +++ b/qpid/util.py @@ -79,9 +79,10 @@ def connect(host, port): break except socket.error as msg: sock.close() + last_msg = msg # https://portingguide.readthedocs.io/en/latest/exceptions.html#caught-exception-scope else: # If we got here then we couldn't connect (yet) - raise + raise last_msg return sock def listen(host, port, predicate = lambda: True, bound = lambda: None): From e4b2a2f1e0e789b105680a5e9f46e6c2b9296805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 16 Apr 2023 18:08:08 +0200 Subject: [PATCH 43/50] QPID-8631: Use the // operator to divide ints when desiring an int result --- qpid/tests/messaging/endpoints.py | 2 +- qpid_tests/broker_0_9/echo.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qpid/tests/messaging/endpoints.py b/qpid/tests/messaging/endpoints.py index a5c6d179..a3d33859 100644 --- a/qpid/tests/messaging/endpoints.py +++ b/qpid/tests/messaging/endpoints.py @@ -819,7 +819,7 @@ def capacityTest(self, capacity, threshold=None): self.sleep() self.assertAvailable(self.rcv) - first = capacity/2 + first = capacity//2 second = capacity - first self.drain(self.rcv, limit = first) self.sleep() diff --git a/qpid_tests/broker_0_9/echo.py b/qpid_tests/broker_0_9/echo.py index 6391d335..3cbf7648 100644 --- a/qpid_tests/broker_0_9/echo.py +++ b/qpid_tests/broker_0_9/echo.py @@ -46,7 +46,7 @@ def test_largest_single_frame_message(self): self.echo_message(body) def test_multiple_frame_message(self): - size = self.frame_max_size * 2 - (self.client.conn.FRAME_MIN_SIZE / 2) + size = self.frame_max_size * 2 - (self.client.conn.FRAME_MIN_SIZE // 2) body = self.randomLongString(size) self.echo_message(body) From 2262c34d89ec76045c47da0037cada008886d29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 16 Apr 2023 18:08:35 +0200 Subject: [PATCH 44/50] NO-JIRA: fix few random typos --- README.md | 2 +- qpid_tests/broker_0_10/alternate_exchange.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dd8442d2..6a9a5141 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ by default run the Python unit tests and the 0-10 conformance tests: $ ./qpid-python-test -If you wish to run the 0-8 or 0-9 conformence tests, they may be +If you wish to run the 0-8 or 0-9 conformance tests, they may be selected as follows: 1. Run a broker on the default port. diff --git a/qpid_tests/broker_0_10/alternate_exchange.py b/qpid_tests/broker_0_10/alternate_exchange.py index 0ed40c51..02e9356d 100644 --- a/qpid_tests/broker_0_10/alternate_exchange.py +++ b/qpid_tests/broker_0_10/alternate_exchange.py @@ -180,7 +180,7 @@ def test_add_alternate_to_exchange(self): def test_del_alternate_to_exchange(self): """ - Ensure that attempting to modify an exhange by declaring + Ensure that attempting to modify an exchange by declaring it again without an alternate does nothing """ session = self.session From 94e25cd754a5e4ecb32ef5eaee9feff76b209b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 8 Apr 2023 18:39:08 +0200 Subject: [PATCH 45/50] QPID-8631: fill-in the Python 2 types that are missing in Python 3 --- mllib/dom.py | 5 +++++ qpid/codec.py | 15 +++++++++++++++ qpid/management.py | 4 ++++ qpid/managementdata.py | 5 +++++ qpid/messaging/driver.py | 10 ++++++++++ qpid/messaging/endpoints.py | 5 +++++ qpid/messaging/message.py | 12 +++++++++++- qpid/peer.py | 12 +++++++++++- qpid/tests/codec010.py | 10 ++++++++++ qpid/tests/messaging/address.py | 5 +++++ 10 files changed, 81 insertions(+), 2 deletions(-) diff --git a/mllib/dom.py b/mllib/dom.py index 49ba0d00..0012d66b 100644 --- a/mllib/dom.py +++ b/mllib/dom.py @@ -26,6 +26,11 @@ from __future__ import generators from __future__ import nested_scopes +try: + basestring +except NameError: + basestring = str + import mllib.transforms try: diff --git a/qpid/codec.py b/qpid/codec.py index 4ee38efb..f3029551 100644 --- a/qpid/codec.py +++ b/qpid/codec.py @@ -34,6 +34,21 @@ from .reference import ReferenceId from logging import getLogger +try: + basestring +except: + basestring = bytes + +try: + unicode +except NameError: + unicode = str + +try: + long +except NameError: + long = int + log = getLogger("qpid.codec") class EOF(Exception): diff --git a/qpid/management.py b/qpid/management.py index 1f115358..3cd93766 100644 --- a/qpid/management.py +++ b/qpid/management.py @@ -39,6 +39,10 @@ from .codec010 import StringCodec as Codec from threading import Lock, Condition +try: + long +except NameError: + long = int class SequenceManager: """ Manage sequence numbers for asynchronous method calls """ diff --git a/qpid/managementdata.py b/qpid/managementdata.py index 514dd6f3..4092b5d0 100644 --- a/qpid/managementdata.py +++ b/qpid/managementdata.py @@ -41,6 +41,11 @@ from qpid.connection import Connection from qpid.util import connect +try: + long +except NameError: + long = int + class Broker: def __init__ (self, text): rex = re.compile(r""" diff --git a/qpid/messaging/driver.py b/qpid/messaging/driver.py index ae2d4e64..223f0019 100644 --- a/qpid/messaging/driver.py +++ b/qpid/messaging/driver.py @@ -37,6 +37,16 @@ from qpid.validator import And, Context, List, Map, Types, Values from threading import Condition, Thread +try: + basestring +except NameError: + basestring = str + +try: + long +except NameError: + long = int + log = getLogger("qpid.messaging") rawlog = getLogger("qpid.messaging.io.raw") opslog = getLogger("qpid.messaging.io.ops") diff --git a/qpid/messaging/endpoints.py b/qpid/messaging/endpoints.py index 95db77ee..1ab663f2 100644 --- a/qpid/messaging/endpoints.py +++ b/qpid/messaging/endpoints.py @@ -41,6 +41,11 @@ from qpid.util import default, URL from threading import Thread, RLock +try: + basestring +except NameError: + basestring = str + log = getLogger("qpid.messaging") static = staticmethod diff --git a/qpid/messaging/message.py b/qpid/messaging/message.py index 3891665e..e29fe04a 100644 --- a/qpid/messaging/message.py +++ b/qpid/messaging/message.py @@ -21,6 +21,16 @@ from qpid.codec010 import StringCodec from qpid.ops import PRIMITIVE +try: + unicode +except NameError: + unicode = str + +try: + buffer +except NameError: + buffer = memoryview + def codec(name): type = PRIMITIVE[name] @@ -44,7 +54,7 @@ def decode(x): unicode: "text/plain; charset=utf8", unicode: "text/plain", buffer: None, - str: None, + bytes: None, None.__class__: None } diff --git a/qpid/peer.py b/qpid/peer.py index 290ff3f0..82dcac4c 100644 --- a/qpid/peer.py +++ b/qpid/peer.py @@ -38,6 +38,16 @@ from .exceptions import Closed, Timeout, ContentError from logging import getLogger +try: + basestring +except NameError: + basestring = str + +try: + buffer +except NameError: + buffer = memoryview + log = getLogger("qpid.peer") class Sequence: @@ -273,7 +283,7 @@ def write_content(self, klass, content): if not isinstance(content.body, (basestring, buffer)): # The 0-8..0-91 client does not support the messages bodies apart from string/buffer - fail early # if other type - raise ContentError("Content body must be string or buffer, not a %s" % type(content.body)) + raise ContentError("Content body must be bytes or buffer, not a %s" % type(content.body)) frame_max = self.client.tune_params['frame_max'] - self.client.conn.AMQP_HEADER_SIZE for chunk in (content.body[i:i + frame_max] for i in range(0, len(content.body), frame_max)): self.write(Body(chunk)) diff --git a/qpid/tests/codec010.py b/qpid/tests/codec010.py index 7f22b89b..80d71379 100644 --- a/qpid/tests/codec010.py +++ b/qpid/tests/codec010.py @@ -25,6 +25,16 @@ from qpid.datatypes import timestamp, uuid4 from qpid.ops import PRIMITIVE +try: + long +except NameError: + long = int + +try: + buffer +except NameError: + buffer = memoryview + class CodecTest(TestCase): def check(self, type, value, compare=True): diff --git a/qpid/tests/messaging/address.py b/qpid/tests/messaging/address.py index c1860ab6..2730e553 100644 --- a/qpid/tests/messaging/address.py +++ b/qpid/tests/messaging/address.py @@ -26,6 +26,11 @@ from qpid.harness import Skipped from qpid.tests.parser import ParserBase +try: + basestring +except NameError: + basestring = str + def indent(st): return " " + st.replace("\n", "\n ") From 90ea5638bf456d4e71a9296309a8d864c08222c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Mon, 10 Apr 2023 13:52:26 +0200 Subject: [PATCH 46/50] QPID-8631: add py3compat.py helper; fill in for the removed `__cmp__` in Python 3 --- qpid/datatypes.py | 7 +++++ qpid/disp.py | 2 ++ qpid/messaging/constants.py | 9 +++++++ qpid/py3compat.py | 52 +++++++++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 qpid/py3compat.py diff --git a/qpid/datatypes.py b/qpid/datatypes.py index ec42eff0..69e27f15 100644 --- a/qpid/datatypes.py +++ b/qpid/datatypes.py @@ -20,7 +20,12 @@ from __future__ import absolute_import import threading, struct, datetime, time from .exceptions import Timeout +from .py3compat import PY3__cmp__, cmp +try: + long +except NameError: + long = int class Struct: def __init__(self, _type, *args, **kwargs): @@ -124,6 +129,7 @@ def serial(o): else: return Serial(o) +@PY3__cmp__ class Serial: def __init__(self, value): @@ -290,6 +296,7 @@ def is_set(self): from uuid import uuid4 from uuid import UUID except ImportError: + @PY3__cmp__ class UUID: def __init__(self, hex=None, bytes=None): if [hex, bytes].count(None) != 1: diff --git a/qpid/disp.py b/qpid/disp.py index 67031c79..e655a832 100644 --- a/qpid/disp.py +++ b/qpid/disp.py @@ -22,6 +22,7 @@ from __future__ import absolute_import from __future__ import print_function from time import strftime, gmtime +from qpid.py3compat import PY3__cmp__ class Header: """ """ @@ -195,6 +196,7 @@ def duration(self, nsec): result += "%ds" % (sec % 60) return result +@PY3__cmp__ class Sortable: """ """ def __init__(self, row, sortIndex): diff --git a/qpid/messaging/constants.py b/qpid/messaging/constants.py index 2c007032..67958cc5 100644 --- a/qpid/messaging/constants.py +++ b/qpid/messaging/constants.py @@ -17,8 +17,12 @@ # under the License. # +from __future__ import absolute_import +import qpid.py3compat + __SELF__ = object() +@qpid.py3compat.PY3__cmp__ class Constant: def __init__(self, name, value=__SELF__): @@ -31,6 +35,11 @@ def __init__(self, name, value=__SELF__): def __repr__(self): return self.name + # NOTE: this method was not implemented in the Python 2 version, + # filling in the default Python 2 __cmp__ to preserve behavior + def __cmp__(self, other): + return qpid.py3compat.cmp(id(self), id(other)) + AMQP_PORT = 5672 AMQPS_PORT = 5671 diff --git a/qpid/py3compat.py b/qpid/py3compat.py new file mode 100644 index 00000000..5e85c2f7 --- /dev/null +++ b/qpid/py3compat.py @@ -0,0 +1,52 @@ +# +# 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. +# + +"""Python 3 compatibility helpers""" + +import sys + +PY2 = sys.version_info.major == 2 +PY3 = sys.version_info.major == 3 + + +def cmp(a, b): + return (a > b) - (a < b) + + +_convert = { + '__eq__': lambda self, other: self.__cmp__(other) == 0, + '__ne__': lambda self, other: self.__cmp__(other) != 0, + '__lt__': lambda self, other: self.__cmp__(other) < 0, + '__le__': lambda self, other: self.__cmp__(other) <= 0, + '__gt__': lambda self, other: self.__cmp__(other) > 0, + '__ge__': lambda self, other: self.__cmp__(other) >= 0, +} + + +def PY3__cmp__(cls): + """Class decorator that fills in missing ordering methods when Python2's __cmp__ is provided.""" + if not hasattr(cls, '__cmp__'): + raise ValueError('must define the __cmp__ Python2 operation') + if sys.version_info < (3, 0, 0): + return cls + for op, opfunc in _convert.items(): + # Overwrite `raise NotImplemented` comparisons inherited from object + if getattr(cls, op, None) is getattr(object, op, None): + setattr(cls, op, opfunc) + return cls From 2e65fb29b98749e8bf4d5e6cae8f11f12f0562dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Fri, 29 Sep 2023 14:36:26 +0200 Subject: [PATCH 47/50] QPID-8631: add encodings for Python 3 types --- qpid/codec.py | 12 ++++++------ qpid/codec010.py | 38 ++++++++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/qpid/codec.py b/qpid/codec.py index f3029551..3b616779 100644 --- a/qpid/codec.py +++ b/qpid/codec.py @@ -34,11 +34,6 @@ from .reference import ReferenceId from logging import getLogger -try: - basestring -except: - basestring = bytes - try: unicode except NameError: @@ -92,7 +87,8 @@ def __init__(self, stream, spec): self.integertypes = [int, long] self.encodings = { float: "double", # python uses 64bit floats, send them as doubles - basestring: "longstr", + bytes: "longstr", + unicode: "longstr", None.__class__:"void", list: "sequence", tuple: "sequence", @@ -403,6 +399,8 @@ def enc_str(self, fmt, s): """ encodes a string 's' in network byte order as per format 'fmt' """ + if not isinstance(s, bytes): + s = s.encode() size = len(s) self.pack(fmt, size) self.write(s) @@ -418,6 +416,8 @@ def encode_shortstr(self, s): """ encodes a short string 's' in network byte order """ + if not isinstance(s, bytes): + s.encode() # short strings are limited to 255 octets if len(s) > 255: diff --git a/qpid/codec010.py b/qpid/codec010.py index f742d4ae..eff003a5 100644 --- a/qpid/codec010.py +++ b/qpid/codec010.py @@ -22,6 +22,7 @@ from .packer import Packer from .datatypes import serial, timestamp, RangedSet, Struct, UUID from .ops import Compound, PRIMITIVE, COMPOUND +from qpid.py3compat import PY2 try: buffer @@ -49,9 +50,9 @@ def map_str(s): return "vbin16" return "str16" -class Codec(Packer): - ENCODINGS = { +if PY2: + _ENCODINGS = { bool: direct("boolean"), unicode: direct("str16"), str: map_str, @@ -68,6 +69,28 @@ class Codec(Packer): UUID: direct("uuid"), Compound: direct("struct32") } +else: + _ENCODINGS = { + bool: direct("boolean"), + int: direct("int64"), + float: direct("double"), + None.__class__: direct("void"), + list: direct("list"), + tuple: direct("list"), + dict: direct("map"), + timestamp: direct("datetime"), + datetime.datetime: direct("datetime"), + UUID: direct("uuid"), + Compound: direct("struct32"), + + str: direct("str16"), + bytes: direct("vbin16"), + memoryview: direct("vbin32"), + } + +class Codec(Packer): + + ENCODINGS = _ENCODINGS def encoding(self, obj): enc = self._encoding(obj.__class__, obj) @@ -180,6 +203,9 @@ def read_datetime(self): def write_datetime(self, t): if isinstance(t, datetime.datetime): t = timestamp(t) + # python2 does this conversion implicitly in struct.pack("!Q", ...) + if isinstance(t, timestamp): + t = int(t) self.write_uint64(t) def read_double(self): @@ -191,7 +217,9 @@ def read_vbin8(self): return self.read(self.read_uint8()) def write_vbin8(self, b): if isinstance(b, buffer): - b = str(b) + b = bytes(b) + if not isinstance(b, bytes): + b = b.encode() self.write_uint8(len(b)) self.write(b) @@ -215,7 +243,9 @@ def read_vbin16(self): return self.read(self.read_uint16()) def write_vbin16(self, b): if isinstance(b, buffer): - b = str(b) + b = bytes(b) + if not isinstance(b, bytes): + b = b.encode() self.write_uint16(len(b)) self.write(b) From c91db59a38dc7e95fc64dcbc1a8923c5dc38a0b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sun, 16 Apr 2023 18:06:14 +0200 Subject: [PATCH 48/50] QPID-8631: fix Python 3 comparisons, None cannot be compared using < --- qpid/messaging/endpoints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qpid/messaging/endpoints.py b/qpid/messaging/endpoints.py index 1ab663f2..f5f0f0f2 100644 --- a/qpid/messaging/endpoints.py +++ b/qpid/messaging/endpoints.py @@ -324,7 +324,7 @@ def open(self, timeout=None): if self._open: raise ConnectionError("already open") self._open = True - if self.reconnect and self.reconnect_timeout > 0: + if self.reconnect and self.reconnect_timeout is not None and self.reconnect_timeout > 0: timeout = self.reconnect_timeout self.attach(timeout=timeout) From 4f8c376332697a84b9a41b2c5cef7abbc0c5775c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 30 Sep 2023 10:04:37 +0200 Subject: [PATCH 49/50] QPID-8631: fix qpid.tests.codec.IntegerTestCase.test_ulong_long_int_with_fraction on Python 3 --- qpid/codec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qpid/codec.py b/qpid/codec.py index 3b616779..c9f12e2a 100644 --- a/qpid/codec.py +++ b/qpid/codec.py @@ -354,7 +354,7 @@ def encode_longlong(self, o): encodes an UNSIGNED long long (64 bits) data 'o' in network byte order AMQP 0-9-1 type: long-long-uint """ - self.pack("!Q", o) + self.pack("!Q", long(o)) def decode_longlong(self): """ From 115a82993f32cbf25e2406ace1ef763cab9e227a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Dan=C4=9Bk?= Date: Sat, 30 Sep 2023 11:44:39 +0200 Subject: [PATCH 50/50] QPID-8631: temporarily use qpid-cpp main branch (instead of the last released version) when running tests (#26) --- .github/workflows/python-package.yml | 33 +++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index fd54bc9e..ca2bee89 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -318,6 +318,21 @@ jobs: # the qpid-python dependency is the current package ${{ steps.python.outputs.python-path }} -m pip install --user qpid-tools qpid-qmf --no-deps + - name: Clone qpid-cpp main + if: matrix.python-version != '2.7' + uses: actions/checkout@v3 + with: + repository: apache/qpid-cpp + ref: main + path: qpid-cpp + + - name: Install test dependencies from qpid-cpp main (for Python 3) + if: matrix.python-version != '2.7' + run: | + for d in $(find $PWD/qpid-cpp/management/python/lib/* -type d); do + ln -s $d ./ + done + - name: C++ Broker tests with the 🛞 runner we ❤️ run: | ${{ steps.python.outputs.python-path }} qpid-python-test -m qpid_tests @@ -361,11 +376,27 @@ jobs: run: | ${{ steps.python.outputs.python-path }} -m pip install --upgrade pip - - name: Install test dependencies from pip + - name: Install test dependencies from pip (for Python 2) + if: matrix.python-version == '2.7' run: | # the qpid-python dependency is the current package ${{ steps.python.outputs.python-path }} -m pip install --user qpid-tools qpid-qmf --no-deps + - name: Clone qpid-cpp main + if: matrix.python-version != '2.7' + uses: actions/checkout@v3 + with: + repository: apache/qpid-cpp + ref: main + path: qpid-cpp + + - name: Install test dependencies from qpid-cpp main (for Python 3) + if: matrix.python-version != '2.7' + run: | + for d in $(find $PWD/qpid-cpp/management/python/lib/* -type d); do + ln -s $d ./ + done + # https://github.com/chrisob/qpid-broker-j-docker - name: Start qpidj run: |