diff options
author | Rafael H. Schloming <rhs@apache.org> | 2008-05-23 20:22:13 +0000 |
---|---|---|
committer | Rafael H. Schloming <rhs@apache.org> | 2008-05-23 20:22:13 +0000 |
commit | f09f774813043aa1abc696c4fc21a49928334978 (patch) | |
tree | 24a9de794070640492dc3aa5f1a418c035c23bf6 /python | |
parent | 51db72d6d1fdbaebfc2f91fec611cf26d35ea8f5 (diff) | |
download | qpid-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.py | 6 | ||||
-rw-r--r-- | python/qpid/datatypes.py | 47 | ||||
-rw-r--r-- | python/qpid/session.py | 4 | ||||
-rw-r--r-- | python/tests/datatypes.py | 33 |
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): |