summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Robie <jonathan@apache.org>2010-10-28 15:21:06 +0000
committerJonathan Robie <jonathan@apache.org>2010-10-28 15:21:06 +0000
commita9e479dc761a75bf0f89fd77e19d36760701c00a (patch)
tree9e93c054b51a1fd891706cbe1a23ad6c60dc35c9
parent5d4cc8ea1391e5836304ca48ec761a90b63f0d84 (diff)
downloadqpid-python-a9e479dc761a75bf0f89fd77e19d36760701c00a.tar.gz
Fixes broker issues when max_count or max_size are invalid.
Accepts non-negative integer values, or strings containing the lexical representation of such values. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1028346 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/cpp/src/qpid/broker/QueuePolicy.cpp25
-rw-r--r--qpid/cpp/src/qpid/broker/QueuePolicy.h2
-rw-r--r--qpid/tests/src/py/qpid_tests/broker_0_10/queue.py76
3 files changed, 95 insertions, 8 deletions
diff --git a/qpid/cpp/src/qpid/broker/QueuePolicy.cpp b/qpid/cpp/src/qpid/broker/QueuePolicy.cpp
index 4b185ef025..c1d979ac33 100644
--- a/qpid/cpp/src/qpid/broker/QueuePolicy.cpp
+++ b/qpid/cpp/src/qpid/broker/QueuePolicy.cpp
@@ -24,6 +24,7 @@
#include "qpid/framing/FieldValue.h"
#include "qpid/framing/reply_exceptions.h"
#include "qpid/log/Statement.h"
+#include <sstream>
using namespace qpid::broker;
using namespace qpid::framing;
@@ -115,12 +116,24 @@ void QueuePolicy::update(FieldTable& settings)
settings.setString(typeKey, type);
}
-
-int QueuePolicy::getInt(const FieldTable& settings, const std::string& key, int defaultValue)
+uint32_t QueuePolicy::getCapacity(const FieldTable& settings, const std::string& key, uint32_t defaultValue)
{
FieldTable::ValuePtr v = settings.get(key);
- if (v && v->convertsTo<int>()) return v->get<int>();
- else return defaultValue;
+
+ int32_t result = 0;
+
+ if (!v) return defaultValue;
+ if (v->convertsTo<int>()) {
+ result = v->get<int>();
+ if (result >= 0) return result;
+ }
+ else {
+ string s(v->get<string>()); // I assume anything can be converted to a string
+ std::istringstream convert(s);
+ if (convert >> result && result >= 0) return result;
+ }
+
+ throw InvalidArgumentException(QPID_MSG("Cannot convert " << key << " to unsigned integer"));
}
std::string QueuePolicy::getType(const FieldTable& settings)
@@ -297,8 +310,8 @@ std::auto_ptr<QueuePolicy> QueuePolicy::createQueuePolicy(const qpid::framing::F
std::auto_ptr<QueuePolicy> QueuePolicy::createQueuePolicy(const std::string& name, const qpid::framing::FieldTable& settings)
{
- uint32_t maxCount = getInt(settings, maxCountKey, 0);
- uint32_t maxSize = getInt(settings, maxSizeKey, defaultMaxSize);
+ uint32_t maxCount = getCapacity(settings, maxCountKey, 0);
+ uint32_t maxSize = getCapacity(settings, maxSizeKey, defaultMaxSize);
if (maxCount || maxSize) {
return createQueuePolicy(name, maxCount, maxSize, getType(settings));
} else {
diff --git a/qpid/cpp/src/qpid/broker/QueuePolicy.h b/qpid/cpp/src/qpid/broker/QueuePolicy.h
index 7006b617a1..3cdd63784d 100644
--- a/qpid/cpp/src/qpid/broker/QueuePolicy.h
+++ b/qpid/cpp/src/qpid/broker/QueuePolicy.h
@@ -44,7 +44,7 @@ class QueuePolicy
uint64_t size;
bool policyExceeded;
- static int getInt(const qpid::framing::FieldTable& settings, const std::string& key, int defaultValue);
+ static uint32_t getCapacity(const qpid::framing::FieldTable& settings, const std::string& key, uint32_t defaultValue);
protected:
uint64_t getCurrentQueueSize() const { return size; }
diff --git a/qpid/tests/src/py/qpid_tests/broker_0_10/queue.py b/qpid/tests/src/py/qpid_tests/broker_0_10/queue.py
index eb38965190..294155ee8c 100644
--- a/qpid/tests/src/py/qpid_tests/broker_0_10/queue.py
+++ b/qpid/tests/src/py/qpid_tests/broker_0_10/queue.py
@@ -115,6 +115,80 @@ class QueueTests(TestBase010):
except SessionException, e:
self.assertEquals(405, e.args[0].error_code)
+ def test_declare_capacity_valid(self):
+ session = self.session
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 0
+ queue_options["qpid.max_size"] = 0
+ session.queue_declare(queue="queue_capacity1", exclusive=True, arguments=queue_options)
+ except SessionException, e:
+ self.fail("Should accept queue create request with name=queue_capacity1, qpid.max_count=0 and qpid.max_size=0")
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 3
+ queue_options["qpid.max_size"] = 0
+ session.queue_declare(queue="queue_capacity2", exclusive=True, arguments=queue_options)
+ except SessionException, e:
+ self.fail("Should accept queue create request with name=queue_capacity2, qpid.max_count=3 and qpid.max_size=0")
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 0
+ queue_options["qpid.max_size"] = 300
+ session.queue_declare(queue="queue_capacity3", exclusive=True, arguments=queue_options)
+ except SessionException, e:
+ self.fail("Should accept queue create request with name=queue_capacity3, qpid.max_count=0 and qpid.max_size=300")
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 0
+ queue_options["qpid.max_size"] = "3"
+ session.queue_declare(queue="queue_capacity6", exclusive=True, arguments=queue_options)
+ except SessionException, e:
+ self.fail("Should allow queue create request with qpid.max_size='3'")
+
+
+ def test_declare_capacity_invalid(self):
+ session = self.session
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = -1
+ queue_options["qpid.max_size"] = 0
+ session.queue_declare(queue="queue_capacity4", exclusive=True, arguments=queue_options)
+ self.fail("Should reject queue create request with name=queue_capacity4, qpid.max_count=-1 and qpid.max_size=0")
+ except SessionException, e:
+ pass
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 0
+ queue_options["qpid.max_size"] = -1
+ session.queue_declare(queue="queue_capacity5", exclusive=True, arguments=queue_options)
+ self.fail("Should reject queue create request with name=queue_capacity5, qpid.max_count=0 and qpid.max_size=-1")
+ except SessionException, e:
+ pass
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 0
+ queue_options["qpid.max_size"] = "flummery"
+ session.queue_declare(queue="queue_capacity7", exclusive=True, arguments=queue_options)
+ self.fail("Should deny queue create request with name=queue_capacity7, qpid.max_count=0 and qpid.max_size='flummery'")
+ except SessionException, e:
+ pass
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 0
+ queue_options["qpid.max_size"] = 3.14159
+ session.queue_declare(queue="queue_capacity8", exclusive=True, arguments=queue_options)
+ self.fail("Should deny queue create request with name=queue_capacity4, qpid.max_count=0 and qpid.max_size=3.14159");
+ except SessionException, e:
+ pass
+
def test_declare_passive(self):
"""
@@ -134,7 +208,7 @@ class QueueTests(TestBase010):
def test_bind(self):
"""
- Test various permutations of the queue.bind method
+ Test various permutations of the queue.bind method+
"""
session = self.session
session.queue_declare(queue="queue-1", exclusive=True, auto_delete=True)