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 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 new file mode 100644 index 00000000..ca2bee89 --- /dev/null +++ b/.github/workflows/python-package.yml @@ -0,0 +1,546 @@ +# +# 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: + + 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.11"] + + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version != '2.7' + uses: actions/setup-python@v4 + 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 + ${{ steps.python.outputs.python-path }} -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 ${{ steps.python.outputs.python-path }} + 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 . + + 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 }} + if: matrix.python-version != '2.7' + uses: actions/setup-python@v4 + 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 + + - 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 + + 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 + + - name: Client tests with our bespoke test runner + run: | + ${{ 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 }} + if: matrix.python-version != '2.7' + uses: actions/setup-python@v4 + 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 + + # 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 }} + if: matrix.python-version != '2.7' + uses: actions/setup-python@v4 + 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 + + - 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: | + # 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 + + 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 }} + if: matrix.python-version != '2.7' + uses: actions/setup-python@v4 + 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 + + - 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: | + 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) + if: ${{ ! cancelled() }} + run: | + ${{ 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 \ + -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) + if: ${{ ! cancelled() }} + run: | + ${{ 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 \ + -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) + if: ${{ ! cancelled() }} + run: | + ${{ 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 \ + -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) + if: ${{ ! cancelled() }} + run: | + ${{ steps.python.outputs.python-path }} qpid-python-test \ + -m qpid_tests.broker_1_0 \ + --broker amqp://guest/guest@localhost:5672 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/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/examples/api/drain b/examples/api/drain index 5e30153b..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, e: - print e +except ReceiverError as e: + print(e) except KeyboardInterrupt: pass diff --git a/examples/api/hello b/examples/api/hello index ad314da1..ac2311e0 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 * @@ -40,13 +41,13 @@ 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 + print(message.content) session.acknowledge() -except MessagingError,m: - print m +except MessagingError as m: + print(m) connection.close() diff --git a/examples/api/hello_xml b/examples/api/hello_xml index ab567ec5..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,m: - print m +except MessagingError as m: + print(m) connection.close() diff --git a/examples/api/server b/examples/api/server index 78d812bf..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 @@ -82,13 +83,13 @@ try: try: snd = ssn.sender(msg.reply_to) snd.send(response) - except SendError, e: - print e + except SendError as e: + print(e) if snd is not None: snd.close() ssn.acknowledge() -except ReceiverError, e: - print e +except ReceiverError as e: + print(e) except KeyboardInterrupt: pass diff --git a/examples/api/spout b/examples/api/spout index 6584b853..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 -except SendError, e: - print e + print(msg) +except SendError as e: + print(e) except KeyboardInterrupt: pass diff --git a/examples/api/statistics.py b/examples/api/statistics.py index e095920e..32e4099f 100644 --- a/examples/api/statistics.py +++ b/examples/api/statistics.py @@ -18,6 +18,8 @@ # under the License. # +from __future__ import absolute_import +from __future__ import print_function import time TS = "ts" @@ -110,7 +112,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 +121,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 12f07e1c..381e0284 100644 --- a/examples/reservations/common.py +++ b/examples/reservations/common.py @@ -18,6 +18,8 @@ # under the License. # +from __future__ import absolute_import +from __future__ import print_function import traceback from fnmatch import fnmatch from qpid.messaging import * @@ -25,7 +27,7 @@ class Dispatcher: def unhandled(self, msg): - print "UNHANDLED MESSAGE: %s" % msg + print("UNHANDLED MESSAGE: %s" % msg) def ignored(self, msg): return False @@ -60,8 +62,8 @@ def run(self, session): try: snd = session.sender(to) snd.send(r) - except SendError, e: - print e + except SendError as 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/mllib/__init__.py b/mllib/__init__.py index 7d0ba993..68761045 100644 --- a/mllib/__init__.py +++ b/mllib/__init__.py @@ -22,11 +22,16 @@ 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 -from cStringIO import StringIO +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO def transform(node, *args): result = node @@ -66,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): diff --git a/mllib/dom.py b/mllib/dom.py index 486f7082..0012d66b 100644 --- a/mllib/dom.py +++ b/mllib/dom.py @@ -21,11 +21,22 @@ 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 -import transforms +try: + basestring +except NameError: + basestring = str + +import mllib.transforms + +try: + basestring +except NameError: + basestring = str class Container: @@ -109,7 +120,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) @@ -238,7 +249,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: diff --git a/mllib/parsers.py b/mllib/parsers.py index 3e7cc10d..03c67647 100644 --- a/mllib/parsers.py +++ b/mllib/parsers.py @@ -21,8 +21,13 @@ Parsers for SGML and XML to dom. """ -import sgmllib, xml.sax.handler -from dom import * +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 diff --git a/mllib/transforms.py b/mllib/transforms.py index 69d99125..b64af5e8 100644 --- a/mllib/transforms.py +++ b/mllib/transforms.py @@ -21,8 +21,12 @@ Useful transforms for dom objects. """ -import dom -from cStringIO import StringIO +from __future__ import absolute_import +import mllib.dom +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO class Visitor: @@ -45,12 +49,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/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" diff --git a/qpid-python-test b/qpid-python-test index dfe6a6fc..ea575ae3 100755 --- a/qpid-python-test +++ b/qpid-python-test @@ -20,6 +20,10 @@ # TODO: summarize, test harness preconditions (e.g. broker is alive) +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 @@ -28,6 +32,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, @@ -194,7 +203,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') @@ -401,9 +410,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()) @@ -501,7 +510,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 @@ -513,7 +522,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: @@ -525,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 @@ -568,8 +589,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 @@ -579,7 +600,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 +634,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/__init__.py b/qpid/__init__.py index 780cab46..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: @@ -41,11 +42,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 39b7c584..f31edd86 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 = {} @@ -121,8 +122,8 @@ def session(self): self.lock.acquire() try: id = None - for i in xrange(1, 64*1024): - if not self.sessions.has_key(i): + for i in range(1, 64*1024): + if i not in self.sessions: id = i break finally: @@ -136,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) @@ -247,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: @@ -257,9 +258,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..c9f12e2a 100644 --- a/qpid/codec.py +++ b/qpid/codec.py @@ -26,12 +26,24 @@ The unit test for this module is located in tests/codec.py """ -import re, qpid, spec08, os -from cStringIO import StringIO +from __future__ import absolute_import +import re, qpid, os +from . import spec08 +from io import BytesIO from struct import * -from reference import ReferenceId +from .reference import ReferenceId from logging import getLogger +try: + unicode +except NameError: + unicode = str + +try: + long +except NameError: + long = int + log = getLogger("qpid.codec") class EOF(Exception): @@ -75,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", @@ -131,7 +144,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) @@ -341,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): """ @@ -386,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) @@ -401,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: @@ -433,7 +450,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(): @@ -461,7 +478,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) @@ -531,7 +548,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) @@ -568,7 +585,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() @@ -631,7 +648,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) @@ -639,7 +656,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) @@ -649,7 +666,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) @@ -662,13 +679,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 f4dc60fc..eff003a5 100644 --- a/qpid/codec010.py +++ b/qpid/codec010.py @@ -17,10 +17,27 @@ # under the License. # -import datetime, string -from packer import Packer -from datatypes import serial, timestamp, RangedSet, Struct, UUID -from ops import Compound, PRIMITIVE, COMPOUND +from __future__ import absolute_import +import datetime +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 +except NameError: + buffer = memoryview + +try: + long +except NameError: + long = int + +try: + unicode +except NameError: + unicode = str class CodecException(Exception): pass @@ -33,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, @@ -52,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) @@ -60,7 +99,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) @@ -164,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): @@ -175,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) @@ -199,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) @@ -224,7 +270,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') @@ -257,7 +303,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): @@ -339,7 +385,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 +406,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) @@ -392,7 +438,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 89e37879..c6619bd5 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 @@ -126,7 +127,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 @@ -157,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) @@ -197,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/concurrency.py b/qpid/concurrency.py index eefe0d44..89f8740d 100644 --- a/qpid/concurrency.py +++ b/qpid/concurrency.py @@ -17,13 +17,15 @@ # 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) scope = {} scope["meth"] = meth - exec """ + exec(""" def %s%s: %s %s._lock.acquire() @@ -35,7 +37,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/connection.py b/qpid/connection.py index 2453f38c..7d1785f6 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 delegates, socket +import qpid.delegates +import socket import sys class ChannelBusy(Exception): pass @@ -38,12 +40,12 @@ 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 +from .framer import Framer class Connection(Framer): @@ -62,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 @@ -111,8 +113,8 @@ def detach(self, name, ch): self.lock.release() def __channel(self): - for i in xrange(1, self.channel_max): - if not self.attached.has_key(i): + for i in range(1, self.channel_max): + if i not in self.attached: return i else: raise ChannelsBusy() @@ -135,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) @@ -182,7 +184,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 +197,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..ecd4eb0f 100644 --- a/qpid/connection08.py +++ b/qpid/connection08.py @@ -23,11 +23,13 @@ server, or even a proxy implementation. """ -import socket, codec, errno, qpid -from cStringIO import StringIO -from codec import EOF -from compat import SHUT_RDWR -from exceptions import VersionError +from __future__ import absolute_import +import socket, errno, qpid +from . import codec +from io import BytesIO +from .codec import EOF +from .compat import SHUT_RDWR +from .exceptions import VersionError from logging import getLogger, DEBUG log = getLogger("qpid.connection08") @@ -43,7 +45,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)) @@ -63,7 +65,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 +133,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.") @@ -174,7 +176,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): @@ -184,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() @@ -206,12 +208,12 @@ 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() if end != self.FRAME_END: - garbage = "" + garbage = b"" while end != self.FRAME_END: garbage += chr(end) end = c.decode_octet() @@ -245,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() @@ -277,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: @@ -286,7 +288,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() @@ -300,7 +302,8 @@ def read_99_0(self): return self.read_0_10() def close(self): - self.io.close(); + self.io.close() + class Frame: @@ -310,10 +313,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) @@ -335,9 +338,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 ca1466c2..69e27f15 100644 --- a/qpid/datatypes.py +++ b/qpid/datatypes.py @@ -17,9 +17,15 @@ # under the License. # +from __future__ import absolute_import import threading, struct, datetime, time -from exceptions import Timeout +from .exceptions import Timeout +from .py3compat import PY3__cmp__, cmp +try: + long +except NameError: + long = int class Struct: def __init__(self, _type, *args, **kwargs): @@ -33,10 +39,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() @@ -123,10 +129,11 @@ def serial(o): else: return Serial(o) +@PY3__cmp__ class Serial: def __init__(self, value): - self.value = value & 0xFFFFFFFFL + self.value = value & 0xFFFFFFFF def __hash__(self): return hash(self.value) @@ -137,8 +144,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: @@ -275,7 +282,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 @@ -283,16 +290,17 @@ 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 from uuid import UUID except ImportError: + @PY3__cmp__ 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: @@ -319,7 +327,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/debug.py b/qpid/debug.py index b5dbd4d9..a8d3d2d6 100644 --- a/qpid/debug.py +++ b/qpid/debug.py @@ -17,6 +17,8 @@ # under the License. # +from __future__ import absolute_import +from __future__ import print_function import threading, traceback, signal, sys, time def stackdump(sig, frm): @@ -27,7 +29,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 +41,12 @@ def __init__(self): def acquire(self, blocking=1): while not self.lock.acquire(blocking=0): time.sleep(1) - print >> sys.out, "TRYING" - traceback.print_stack(None, None, out) - print >> sys.out, "TRYING" - print >> sys.out, "ACQUIRED" - traceback.print_stack(None, None, out) - print >> sys.out, "ACQUIRED" + print("TRYING", file=sys.out) + traceback.print_stack(None, None, sys.out) + print("TRYING", file=sys.out) + print("ACQUIRED", file=sys.out) + traceback.print_stack(None, None, sys.out) + print("ACQUIRED", file=sys.out) return True def _is_owned(self): diff --git a/qpid/delegate.py b/qpid/delegate.py index b447c4aa..b8ee687a 100644 --- a/qpid/delegate.py +++ b/qpid/delegate.py @@ -21,8 +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) @@ -46,8 +48,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/delegates.py b/qpid/delegates.py index ae7ed7f9..487a3765 100644 --- a/qpid/delegates.py +++ b/qpid/delegates.py @@ -17,12 +17,15 @@ # under the License. # -import os, connection, session -from util import notify, get_client_properties_with_defaults -from datatypes import RangedSet -from exceptions import VersionError, Closed +from __future__ import absolute_import +import os +import qpid.connection +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 @@ -37,7 +40,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 +69,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): @@ -87,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 @@ -122,7 +125,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) @@ -174,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)) @@ -187,7 +190,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) @@ -196,7 +199,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/disp.py b/qpid/disp.py index d1340b8a..e655a832 100644 --- a/qpid/disp.py +++ b/qpid/disp.py @@ -19,7 +19,10 @@ # under the License. # +from __future__ import absolute_import +from __future__ import print_function from time import strftime, gmtime +from qpid.py3compat import PY3__cmp__ class Header: """ """ @@ -130,7 +133,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 +151,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 +167,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 """ @@ -193,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/framer.py b/qpid/framer.py index 08e17228..b0146b2c 100644 --- a/qpid/framer.py +++ b/qpid/framer.py @@ -17,9 +17,11 @@ # 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 .sasl import SASLError from threading import RLock from logging import getLogger @@ -35,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 @@ -53,12 +55,12 @@ 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: self._write(self.tx_buf) - self.tx_buf = "" + self.tx_buf = b"" frm.debug("FLUSHED") finally: self.sock_lock.release() @@ -96,15 +98,15 @@ 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: - if self.rx_buf != "": + except socket.error as e: + if self.rx_buf != b"": raise e else: raise Closed() @@ -122,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 389b6078..e44918b4 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 @@ -80,7 +81,7 @@ def __repr__(self): class FrameDecoder: def __init__(self): - self.input = "" + self.input = b"" self.output = [] self.parse = self.__frame_header @@ -121,7 +122,7 @@ def read(self): class FrameEncoder: def __init__(self): - self.output = "" + self.output = b"" def write(self, *frames): for frame in frames: @@ -133,7 +134,7 @@ def write(self, *frames): def read(self): result = self.output - self.output = "" + self.output = b"" return result class SegmentDecoder: @@ -149,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 @@ -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: @@ -208,11 +209,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) @@ -221,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/generator.py b/qpid/generator.py index 02d11e50..e52bb751 100644 --- a/qpid/generator.py +++ b/qpid/generator.py @@ -17,9 +17,15 @@ # under the License. # +from __future__ import absolute_import import sys -from ops import * +from .ops import * + +try: + basestring +except NameError: + basestring = str 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 3de8da9d..3cd93766 100644 --- a/qpid/management.py +++ b/qpid/management.py @@ -25,16 +25,24 @@ 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 -from cStringIO import StringIO -from codec010 import StringCodec as Codec +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO +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 """ @@ -177,12 +185,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 @@ -652,7 +660,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'] @@ -876,7 +884,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 61cb10c1..4092b5d0 100644 --- a/qpid/managementdata.py +++ b/qpid/managementdata.py @@ -24,6 +24,8 @@ ## This file is being obsoleted by qmf/console.py ############################################################################### +from __future__ import absolute_import +from __future__ import print_function import qpid import re import socket @@ -34,11 +36,16 @@ 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 +try: + long +except NameError: + long = int + class Broker: def __init__ (self, text): rex = re.compile(r""" @@ -160,10 +167,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 """ @@ -171,14 +178,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 +465,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 +513,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 +593,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 = [] @@ -645,7 +652,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 () @@ -665,7 +672,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 +681,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 = {} @@ -686,7 +693,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: @@ -723,7 +730,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 +761,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/message.py b/qpid/message.py index 4d31da28..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: @@ -43,7 +44,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 +52,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/__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/constants.py b/qpid/messaging/constants.py index f230c4de..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,10 +35,15 @@ 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 -UNLIMITED = Constant("UNLIMITED", 0xFFFFFFFFL) +UNLIMITED = Constant("UNLIMITED", 0xFFFFFFFF) REJECTED = Constant("REJECTED") RELEASED = Constant("RELEASED") diff --git a/qpid/messaging/driver.py b/qpid/messaging/driver.py index 46921444..223f0019 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 @@ -36,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") @@ -454,7 +465,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 +530,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 +562,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 +591,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) @@ -630,8 +641,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() @@ -696,7 +707,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,14 +770,14 @@ 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: _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)) @@ -820,7 +831,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 @@ -884,7 +895,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)) @@ -894,8 +905,8 @@ 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): - if not self._sessions.has_key(i): + for i in range(0, self.channel_max): + if i not in self._sessions: ch = i break else: @@ -995,9 +1006,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 +1380,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 +1439,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 885b95a8..f5f0f0f2 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 @@ -40,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 @@ -180,7 +186,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: @@ -206,7 +212,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 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) @@ -245,7 +251,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): @@ -298,7 +304,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) @@ -318,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) @@ -381,7 +387,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) @@ -671,7 +677,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 +701,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 +831,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/message.py b/qpid/messaging/message.py index b70b365c..e29fe04a 100644 --- a/qpid/messaging/message.py +++ b/qpid/messaging/message.py @@ -17,9 +17,20 @@ # under the License. # +from __future__ import absolute_import 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] @@ -43,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/messaging/transports.py b/qpid/messaging/transports.py index c4e7c683..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 @@ -149,7 +150,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 +164,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/messaging/util.py b/qpid/messaging/util.py index 726cfd51..18e58d86 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 @@ -42,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/mimetype.py b/qpid/mimetype.py index f512996b..a7b5cbc6 100644 --- a/qpid/mimetype.py +++ b/qpid/mimetype.py @@ -16,9 +16,10 @@ # specific language governing permissions and limitations # under the License. # -import re, rfc822 -from lexer import Lexicon, LexError -from parser import Parser, ParseError +from __future__ import absolute_import +import re, email.utils +from .lexer import Lexicon, LexError +from .parser import Parser, ParseError l = Lexicon() @@ -96,7 +97,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) diff --git a/qpid/ops.py b/qpid/ops.py index 390552be..a54e3524 100644 --- a/qpid/ops.py +++ b/qpid/ops.py @@ -16,8 +16,14 @@ # specific language governing permissions and limitations # under the License. # -import os, mllib, cPickle as pickle, sys -from util import fill +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 class Primitive(object): pass @@ -26,7 +32,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 @@ -225,8 +231,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: @@ -264,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..4b22d6cf 100644 --- a/qpid/packer.py +++ b/qpid/packer.py @@ -17,13 +17,14 @@ # under the License. # +from __future__ import absolute_import import struct 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/peer.py b/qpid/peer.py index 2ff25c0b..82dcac4c 100644 --- a/qpid/peer.py +++ b/qpid/peer.py @@ -24,16 +24,30 @@ 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 cStringIO import StringIO +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 +try: + basestring +except NameError: + basestring = str + +try: + buffer +except NameError: + buffer = memoryview + log = getLogger("qpid.peer") class Sequence: @@ -104,12 +118,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 +143,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,26 +164,26 @@ 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() 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); - if self.worker_thread.isAlive(): + 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); - if self.reader_thread.isAlive(): + 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); - if self.writer_thread.isAlive(): + self.writer_thread.join(timeout) + if self.writer_thread.is_alive(): log.warn("Writer thread failed to shutdown within timeout") class Requester: @@ -269,9 +283,9 @@ 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 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): @@ -339,7 +353,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 +410,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: @@ -448,13 +462,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: """ @@ -534,6 +548,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/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 diff --git a/qpid/queue.py b/qpid/queue.py index 100bb0bd..aa190ad9 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): @@ -65,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 @@ -74,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): @@ -83,7 +87,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..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 @@ -71,7 +72,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/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..00f65b90 100644 --- a/qpid/saslmech/cram_md5.py +++ b/qpid/saslmech/cram_md5.py @@ -17,11 +17,15 @@ # under the License. # -from sasl import Sasl +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) 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 1dda9ec4..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") @@ -41,7 +42,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/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..be8f2e38 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, SaslException 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 a67f0aea..ef7b4419 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 @@ -124,8 +125,8 @@ def unregister(self, selectable): def start(self): _check(self.exception) self.thread = Thread(target=self.run) - self.thread.setDaemon(True) - self.thread.start(); + self.thread.daemon = True + self.thread.start() def run(self): try: @@ -151,7 +152,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 +173,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 +199,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/session.py b/qpid/session.py index 95714a12..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") @@ -275,7 +276,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/spec08.py b/qpid/spec08.py index a0047e71..d28aa640 100644 --- a/qpid/spec08.py +++ b/qpid/spec08.py @@ -29,8 +29,10 @@ class so that the generated code can be reused in a variety of situations. """ -import re, new, mllib, qpid -from util import fill +from __future__ import absolute_import +from __future__ import print_function +import re, types, mllib, qpid +from .util import fill class SpecContainer: @@ -41,11 +43,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) @@ -100,12 +102,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) @@ -121,7 +123,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) @@ -225,12 +227,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) @@ -287,7 +289,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): @@ -351,7 +353,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, @@ -362,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"] @@ -372,7 +374,7 @@ def load(specfile, *errata): get_docs(nd)) try: spec.constants.add(const) - except ValueError, e: + except ValueError as e: pass #print "Warning:", e @@ -402,7 +404,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"], @@ -413,7 +415,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, @@ -501,4 +503,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/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 97dff14d..d3d48e83 100644 --- a/qpid/testlib.py +++ b/qpid/testlib.py @@ -21,12 +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 @@ -71,8 +76,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() @@ -93,12 +98,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 @@ -136,8 +141,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""" @@ -230,7 +235,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 +243,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 @@ -252,5 +257,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/__init__.py b/qpid/tests/__init__.py index 85ab013b..ec734da1 100644 --- a/qpid/tests/__init__.py +++ b/qpid/tests/__init__.py @@ -17,6 +17,8 @@ # under the License. # +from __future__ import absolute_import +from __future__ import print_function class Test: def __init__(self, name): @@ -43,14 +45,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 @@ -59,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/codec.py b/qpid/tests/codec.py index 8017f794..9d77b225 100644 --- a/qpid/tests/codec.py +++ b/qpid/tests/codec.py @@ -18,10 +18,12 @@ # under the License. # +from __future__ import absolute_import +from __future__ import print_function import unittest from qpid.codec import Codec from qpid.spec08 import load -from cStringIO import StringIO +from io import BytesIO from qpid.reference import ReferenceId __doc__ = """ @@ -70,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): @@ -95,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)() @@ -116,10 +118,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 # @@ -207,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...') @@ -303,35 +305,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...') # ----------------------------------- # ----------------------------------- @@ -350,28 +352,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...') # ------------------------------------------------------------- # @@ -383,21 +385,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...') # -------------------------------------- @@ -426,15 +428,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): @@ -464,28 +466,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...') # ----------------------------------- # ----------------------------------- @@ -493,21 +495,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...') # ----------------------------------- # ----------------------------------- @@ -553,7 +555,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 +563,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 +587,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 @@ -628,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 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)) +test.__test__ = False # tells pytest to not try run this as a test function + # ----------------------- def dotest(type, value): """ @@ -656,9 +660,9 @@ 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}): + 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"): @@ -666,7 +670,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) # ----------------------------------------- @@ -704,25 +708,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/codec010.py b/qpid/tests/codec010.py index 787ebc14..80d71379 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 @@ -24,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): @@ -42,10 +53,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 @@ -81,7 +92,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 6847285f..e1dc7ddb 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 @@ -84,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 @@ -102,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() @@ -124,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() @@ -140,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" @@ -158,19 +159,19 @@ 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) assert False - except Closed, e: + except Closed as e: pass def testCloseListen(self): @@ -192,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") @@ -207,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 @@ -216,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/datatypes.py b/qpid/tests/datatypes.py index 00e649d6..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 @@ -24,16 +25,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 +44,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): @@ -210,7 +211,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/framing.py b/qpid/tests/framing.py index 0b33df8b..2b39143a 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 * @@ -65,7 +66,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) @@ -102,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): @@ -167,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 * @@ -244,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/__init__.py b/qpid/tests/messaging/__init__.py index e73c0587..1753eec3 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 @@ -47,7 +48,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() @@ -125,7 +126,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) @@ -200,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): @@ -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 aa9562a7..2730e553 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 @@ -25,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 ") @@ -83,9 +89,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..a3d33859 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 @@ -55,7 +56,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 +64,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 +72,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: @@ -82,7 +83,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 +95,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 @@ -103,7 +104,7 @@ def testOpenFailResourceLeaks(self): conn._lock.release() try: conn.open() - except ConnectError, e: + except ConnectError as e: pass finally: while fds: @@ -680,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() @@ -738,9 +739,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 +762,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() @@ -818,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() @@ -971,13 +972,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 +1055,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 +1069,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 +1078,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 +1231,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 +1255,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..e8a039f3 100644 --- a/qpid/tests/messaging/implementation.py +++ b/qpid/tests/messaging/implementation.py @@ -16,13 +16,15 @@ # 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']: try: from qpid_messaging import * from qpid.datatypes import uuid4 - except ImportError, e: - print "Swigged client not found. Falling back to pure bindings, %s\n" % e + except ImportError as 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/message.py b/qpid/tests/messaging/message.py index bfdd2c79..ed6604df 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 @@ -24,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): @@ -78,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, @@ -89,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): @@ -103,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 @@ -179,7 +180,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..40236278 100644 --- a/qpid/tests/messaging/selector.py +++ b/qpid/tests/messaging/selector.py @@ -17,6 +17,8 @@ # under the License. # +from __future__ import absolute_import +from __future__ import print_function import sys, os from logging import getLogger from unittest import TestCase @@ -85,8 +87,8 @@ 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: - print >>sys.stderr, "test child process error: %s" % e + except Exception as 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/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 a4865cc9..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: @@ -33,5 +34,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/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 ac04e1ee..f662d7ba 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 @@ -27,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() @@ -40,7 +41,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) @@ -56,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/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 b17f13e6..fd5c26d0 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: @@ -76,11 +77,12 @@ def connect(host, port): try: sock.connect(sa) break - except socket.error, msg: + 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): @@ -119,7 +121,7 @@ def notify(condition, action=lambda: None): condition.acquire() try: action() - condition.notifyAll() + condition.notify_all() finally: condition.release() 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_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 2e2d5de1..02e9356d 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 @@ -41,16 +42,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 @@ -110,7 +111,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 +131,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 +151,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 +171,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") @@ -179,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 @@ -202,8 +203,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 +221,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 +316,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 +340,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..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 @@ -36,8 +37,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 +48,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 +65,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 +87,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 a9619bcd..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 @@ -162,7 +163,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 +188,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 +234,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 +354,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 +377,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 +432,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 +460,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 +487,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 +515,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 +544,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 @@ -574,7 +575,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") @@ -641,7 +642,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 +691,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): @@ -751,7 +752,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 +769,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..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 @@ -69,8 +70,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 916f9d8b..83c71f4a 100644 --- a/qpid_tests/broker_0_10/exchange.py +++ b/qpid_tests/broker_0_10/exchange.py @@ -23,7 +23,13 @@ Test classes ending in 'RuleTests' are derived from rules in amqp.xml. """ -import Queue, logging, traceback +from __future__ import absolute_import +from __future__ import print_function +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 @@ -46,8 +52,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=""): @@ -112,8 +118,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) @@ -179,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="") @@ -299,7 +305,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 +313,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 +369,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 +478,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 +487,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 +497,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 +505,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 +513,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 +529,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,26 +539,26 @@ 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) 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/extensions.py b/qpid_tests/broker_0_10/extensions.py index 50c0aa3d..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 @@ -43,7 +44,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 +57,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/lvq.py b/qpid_tests/broker_0_10/lvq.py index 07a8906f..34ea63fa 100644 --- a/qpid_tests/broker_0_10/lvq.py +++ b/qpid_tests/broker_0_10/lvq.py @@ -17,6 +17,8 @@ # 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 import math @@ -72,7 +74,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]))) @@ -82,7 +84,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/management.py b/qpid_tests/broker_0_10/management.py index 75183929..436c429a 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 @@ -24,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): @@ -229,8 +231,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) @@ -343,7 +345,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() diff --git a/qpid_tests/broker_0_10/message.py b/qpid_tests/broker_0_10/message.py index 48141682..76813e48 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 @@ -166,7 +167,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 +180,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 +192,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 +201,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 +217,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): @@ -230,8 +231,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 @@ -249,14 +250,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) @@ -282,8 +283,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 +336,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 +371,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 +385,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 +415,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 +448,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 +479,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 +520,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 +555,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 +568,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 +585,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 +610,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 +635,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 +654,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 +682,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 +704,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 +740,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 +764,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 +790,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 +811,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 +844,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 +869,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 +888,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 +903,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 +931,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 +953,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 +980,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 +1002,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,11 +1024,11 @@ 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 - messages = []; + messages = [] for i in range(1, 11): msg = a.get(timeout = 1) self.assertEquals("message-%d" % (i), msg.body) @@ -1058,8 +1059,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 +1099,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/msg_groups.py b/qpid_tests/broker_0_10/msg_groups.py index ec015e1b..ca229e69 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 @@ -70,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 @@ -95,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 @@ -115,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 @@ -133,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 @@ -147,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 @@ -193,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 @@ -221,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 @@ -336,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 @@ -1023,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 @@ -1137,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 @@ -1151,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 4e943951..48a46912 100644 --- a/qpid_tests/broker_0_10/new_api.py +++ b/qpid_tests/broker_0_10/new_api.py @@ -17,6 +17,8 @@ # 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 from qpidtoollibs import BrokerAgent @@ -33,14 +35,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): @@ -54,7 +56,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): """ @@ -154,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}}}}") @@ -179,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") @@ -283,7 +285,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/persistence.py b/qpid_tests/broker_0_10/persistence.py index e9cf9b7c..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 @@ -50,7 +51,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/priority.py b/qpid_tests/broker_0_10/priority.py index 47aae6df..ccce6ccc 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 @@ -135,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] @@ -241,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 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 132bd7b9..2416afa1 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 @@ -42,15 +43,15 @@ 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) #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) @@ -65,7 +66,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 +79,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 +98,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 +106,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 +114,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 +122,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 +130,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 +149,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 +176,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 +199,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 +219,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 +229,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): @@ -251,11 +252,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") @@ -312,7 +313,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 +325,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 +345,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: @@ -352,8 +353,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) @@ -367,7 +368,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 +389,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 +398,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 +431,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_10/stats.py b/qpid_tests/broker_0_10/stats.py index 4f3931b7..bf48371d 100644 --- a/qpid_tests/broker_0_10/stats.py +++ b/qpid_tests/broker_0_10/stats.py @@ -17,6 +17,8 @@ # 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 from time import sleep @@ -33,24 +35,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_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 8cdc539a..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 @@ -251,13 +252,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_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 9457897a..286acb0a 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 @@ -64,7 +65,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 +77,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 +134,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 +143,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 +159,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): @@ -374,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/broker.py b/qpid_tests/broker_0_8/broker.py index 1948a139..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 @@ -89,7 +90,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 +100,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/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 8d610a79..3a24784b 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 @@ -75,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): """ @@ -221,7 +226,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 +318,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 +326,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 +342,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..f7551371 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 @@ -42,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) @@ -61,7 +62,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 +71,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 +97,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 +113,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 +137,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 +148,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 +169,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 +178,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 +198,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 +219,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 +240,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 +250,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_8/testlib.py b/qpid_tests/broker_0_8/testlib.py index 4f026b15..02e7ad77 100644 --- a/qpid_tests/broker_0_8/testlib.py +++ b/qpid_tests/broker_0_8/testlib.py @@ -21,16 +21,21 @@ # 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 * def mytrace(frame, event, arg): - print_stack(frame); - print "====" + print_stack(frame) + print("====") return mytrace class TestBaseTest(TestBase): @@ -51,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 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..3cbf7648 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 @@ -32,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): @@ -45,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) 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 674895c5..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 @@ -109,7 +110,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): @@ -121,7 +122,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) 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 * diff --git a/qpid_tests/broker_1_0/general.py b/qpid_tests/broker_1_0/general.py index a5b9779a..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 @@ -59,7 +60,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/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 45817fc6..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 @@ -251,13 +252,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/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 e3b13cb1..d95b5618 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 @@ -39,8 +40,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 +61,22 @@ 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 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, (errno, errstr): - raise DistutilsFileError, \ - "could not delete '%s': %s" % (dst, 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, (errno, errstr): - raise DistutilsFileError, \ - "could not create '%s': %s" % (dst, errstr) + except os.error as e: + errno, errstr = e.args + raise DistutilsFileError("could not create '%s': %s" % (dst, errstr)) try: fdst.write(actor(fsrc.read())) @@ -129,7 +129,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 @@ -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",