summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorRafael H. Schloming <rhs@apache.org>2008-05-23 20:22:13 +0000
committerRafael H. Schloming <rhs@apache.org>2008-05-23 20:22:13 +0000
commitf09f774813043aa1abc696c4fc21a49928334978 (patch)
tree24a9de794070640492dc3aa5f1a418c035c23bf6 /python
parent51db72d6d1fdbaebfc2f91fec611cf26d35ea8f5 (diff)
downloadqpid-python-f09f774813043aa1abc696c4fc21a49928334978.tar.gz
QPID-947: Switched over to using proper RFC 1982 serial numbers.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@659647 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'python')
-rw-r--r--python/qpid/codec010.py6
-rw-r--r--python/qpid/datatypes.py47
-rw-r--r--python/qpid/session.py4
-rw-r--r--python/tests/datatypes.py33
4 files changed, 82 insertions, 8 deletions
diff --git a/python/qpid/codec010.py b/python/qpid/codec010.py
index 68573921d7..3d67d42d43 100644
--- a/python/qpid/codec010.py
+++ b/python/qpid/codec010.py
@@ -18,7 +18,7 @@
#
from packer import Packer
-from datatypes import RangedSet, Struct
+from datatypes import serial, RangedSet, Struct
class CodecException(Exception): pass
@@ -87,9 +87,9 @@ class Codec(Packer):
self.pack("!f", f)
def read_sequence_no(self):
- return self.read_uint32()
+ return serial(self.read_uint32())
def write_sequence_no(self, n):
- self.write_uint32(n)
+ self.write_uint32(n.value)
def read_uint64(self):
diff --git a/python/qpid/datatypes.py b/python/qpid/datatypes.py
index 7bea1ccc19..7249d5621b 100644
--- a/python/qpid/datatypes.py
+++ b/python/qpid/datatypes.py
@@ -116,14 +116,55 @@ class Message:
args.append("id=%s" % self.id)
return "Message(%s)" % ", ".join(args)
+def serial(o):
+ if isinstance(o, Serial):
+ return o
+ else:
+ return Serial(o)
+
+class Serial:
+
+ def __init__(self, value):
+ self.value = value & 0xFFFFFFFF
+
+ def __hash__(self):
+ return hash(self.value)
+
+ def __cmp__(self, other):
+ if other is None:
+ return 1
+
+ other = serial(other)
+
+ delta = (self.value - other.value) & 0xFFFFFFFF
+ neg = delta & 0x80000000
+ mag = delta & 0x7FFFFFFF
+
+ if neg:
+ return -mag
+ else:
+ return mag
+
+ def __add__(self, other):
+ return Serial(self.value + other)
+
+ def __sub__(self, other):
+ return Serial(self.value - other)
+
+ def __repr__(self):
+ return "serial(%s)" % self.value
+
+ def __str__(self):
+ return str(self.value)
+
class Range:
def __init__(self, lower, upper = None):
- self.lower = lower
+ self.lower = serial(lower)
if upper is None:
- self.upper = lower
+ self.upper = self.lower
else:
- self.upper = upper
+ self.upper = serial(upper)
def __contains__(self, n):
return self.lower <= n and n <= self.upper
diff --git a/python/qpid/session.py b/python/qpid/session.py
index 1b33a4a795..3d8c0aa7fd 100644
--- a/python/qpid/session.py
+++ b/python/qpid/session.py
@@ -23,7 +23,7 @@ from datatypes import RangedSet, Struct, Future
from codec010 import StringCodec
from assembler import Segment
from queue import Queue
-from datatypes import Message
+from datatypes import Message, serial
from util import wait, notify
from exceptions import *
from logging import getLogger
@@ -304,7 +304,7 @@ class Sender:
def __init__(self, session):
self.session = session
- self.next_id = 0
+ self.next_id = serial(0)
self.next_offset = 0
self.segments = []
self._completed = RangedSet()
diff --git a/python/tests/datatypes.py b/python/tests/datatypes.py
index 6d8703ed4f..ef98e81da0 100644
--- a/python/tests/datatypes.py
+++ b/python/tests/datatypes.py
@@ -22,6 +22,39 @@ from qpid.testlib import testrunner
from qpid.spec010 import load
from qpid.datatypes import *
+class SerialTest(TestCase):
+
+ def test(self):
+ 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(0xFFFFFFFF) + 1 == serial(0)
+
+ assert min(serial(0xFFFFFFFF), serial(0x0)) == serial(0xFFFFFFFF)
+ assert max(serial(0xFFFFFFFF), serial(0x0)) == serial(0x0)
+
+ def testIncr(self):
+ s = serial(0)
+ s += 1
+ assert s == serial(1)
+
+ def testIn(self):
+ l = [serial(1), serial(2), serial(3), serial(4)]
+ assert serial(1) in l
+ assert serial(0xFFFFFFFF + 2) in l
+ assert 4 in l
+
+ def testNone(self):
+ assert serial(0) != None
+
+ def testHash(self):
+ d = {}
+ d[serial(0)] = "zero"
+ assert d[0] == "zero"
+
class RangedSetTest(TestCase):
def check(self, ranges):