Author: gsim
Date: Fri Oct 24 04:33:40 2008
New Revision: 707604

URL: http://svn.apache.org/viewvc?rev=707604&view=rev
Log:
Fix for bug in encoding/decoding of floats and doubles.
Added test to verify double/float headers set by c++ are correctly read by 
python
[TODO: add wider range of header types, add bidirectional tests, add tests 
against other languages]
[Also fixed one or two SSL related files missing from distribution list]


Added:
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.cpp   (with props)
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.h   (with props)
    incubator/qpid/trunk/qpid/cpp/src/tests/header_test.cpp   (with props)
    incubator/qpid/trunk/qpid/cpp/src/tests/header_test.py   (with props)
    incubator/qpid/trunk/qpid/cpp/src/tests/run_header_test   (with props)
Modified:
    incubator/qpid/trunk/qpid/cpp/Makefile.am
    incubator/qpid/trunk/qpid/cpp/src/Makefile.am
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.h
    incubator/qpid/trunk/qpid/cpp/src/tests/   (props changed)
    incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am

Modified: incubator/qpid/trunk/qpid/cpp/Makefile.am
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/Makefile.am?rev=707604&r1=707603&r2=707604&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/Makefile.am Fri Oct 24 04:33:40 2008
@@ -2,7 +2,7 @@
 ACLOCAL_AMFLAGS = -I m4
 
 EXTRA_DIST = \
-  LICENSE NOTICE README RELEASE_NOTES DESIGN DISCLAIMER\
+  LICENSE NOTICE README SSL RELEASE_NOTES DESIGN DISCLAIMER\
   xml/cluster.xml
 
 SUBDIRS = managementgen etc src docs/api docs/man examples

Modified: incubator/qpid/trunk/qpid/cpp/src/Makefile.am
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/Makefile.am?rev=707604&r1=707603&r2=707604&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/Makefile.am Fri Oct 24 04:33:40 2008
@@ -257,6 +257,7 @@
   qpid/framing/BodyHolder.cpp \
   qpid/framing/BodyHandler.cpp \
   qpid/framing/Buffer.cpp \
+  qpid/framing/Endian.cpp \
   qpid/framing/FieldTable.cpp \
   qpid/framing/FieldValue.cpp \
   qpid/framing/FrameSet.cpp \
@@ -544,6 +545,7 @@
   qpid/framing/BodyHandler.h \
   qpid/framing/Buffer.h \
   qpid/framing/ChannelHandler.h \
+  qpid/framing/Endian.h \
   qpid/framing/FieldTable.h \
   qpid/framing/FieldValue.h \
   qpid/framing/FrameDefaultVisitor.h \

Added: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.cpp?rev=707604&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.cpp (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.cpp Fri Oct 24 
04:33:40 2008
@@ -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.
+ *
+ */
+#include "Endian.h"
+
+namespace qpid {
+namespace framing {
+
+Endian::Endian() : littleEndian(!testBigEndian()) {}
+
+bool Endian::testBigEndian()
+{
+    uint16_t a = 1;
+    uint16_t b;
+    uint8_t* p = (uint8_t*) &b;
+    p[0] = 0xFF & (a >> 8);
+    p[1] = 0xFF & (a);
+    return a == b;
+}
+
+uint8_t* const Endian::convertIfRequired(uint8_t* const octets, int width)
+{
+    if (instance.littleEndian) {
+        for (int i = 0; i < (width/2); i++) {
+            uint8_t temp = octets[i];
+            octets[i] = octets[width - (1 + i)];
+            octets[width - (1 + i)] = temp;
+        }
+    }
+    return octets;
+}
+
+const Endian Endian::instance;
+
+}} // namespace qpid::framing

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.cpp
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.h?rev=707604&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.h (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.h Fri Oct 24 04:33:40 
2008
@@ -0,0 +1,46 @@
+#ifndef QPID_FRAMING_ENDIAN_H
+#define QPID_FRAMING_ENDIAN_H
+
+/*
+ *
+ * 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.
+ *
+ */
+
+#include "qpid/sys/IntegerTypes.h"
+
+namespace qpid {
+namespace framing {
+
+/**
+ * Conversion utility for little-endian platforms that need to convert
+ * to and from network ordered octet sequences
+ */
+class Endian
+{
+  public:
+    static uint8_t* const  convertIfRequired(uint8_t* const octets, int width);
+  private:
+    const bool littleEndian;
+    Endian();
+    static const Endian instance;
+    static bool testBigEndian();
+};
+}} // namespace qpid::framing
+
+#endif  /*!QPID_FRAMING_ENDIAN_H*/

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Endian.h
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp?rev=707604&r1=707603&r2=707604&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp Fri Oct 24 
04:33:40 2008
@@ -21,6 +21,7 @@
 #include "FieldTable.h"
 #include "Array.h"
 #include "Buffer.h"
+#include "Endian.h"
 #include "FieldValue.h"
 #include "qpid/Exception.h"
 #include "qpid/framing/reply_exceptions.h"
@@ -157,7 +158,9 @@
     if (vptr && vptr->getType() == typecode) {
         FixedWidthValue<width>* fwv = dynamic_cast< FixedWidthValue<width>* 
>(&vptr->getData());
         if (fwv) {
-            fwv->copyInto(reinterpret_cast<uint8_t*>(&value));
+            uint8_t* const octets = 
Endian::convertIfRequired(fwv->rawOctets(), width);
+            uint8_t* const target = reinterpret_cast<uint8_t*>(&value);
+            for (uint i = 0; i < width; ++i) target[i] = octets[i];
             return true;
         }
     }

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp?rev=707604&r1=707603&r2=707604&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp Fri Oct 24 
04:33:40 2008
@@ -21,6 +21,7 @@
 #include "FieldValue.h"
 #include "Array.h"
 #include "Buffer.h"
+#include "Endian.h"
 #include "qpid/framing/reply_exceptions.h"
 
 namespace qpid {
@@ -138,11 +139,11 @@
 {}
 
 FloatValue::FloatValue(float v) :
-    FieldValue(0x23, new FixedWidthValue<4>(reinterpret_cast<uint8_t*>(&v)))
+    FieldValue(0x23, new 
FixedWidthValue<4>(Endian::convertIfRequired(reinterpret_cast<uint8_t*>(&v), 
4)))
 {}
 
 DoubleValue::DoubleValue(double v) :
-    FieldValue(0x33, new FixedWidthValue<8>(reinterpret_cast<uint8_t*>(&v)))
+    FieldValue(0x33, new 
FixedWidthValue<8>(Endian::convertIfRequired(reinterpret_cast<uint8_t*>(&v), 
8)))
 {}
 
 Integer64Value::Integer64Value(int64_t v) :

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.h?rev=707604&r1=707603&r2=707604&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.h Fri Oct 24 
04:33:40 2008
@@ -166,6 +166,7 @@
     {
         for (uint i = 0; i < width; ++i) data[i] = octets[i];
     }
+    uint8_t* const rawOctets() { return octets; }
 
     void print(std::ostream& o) const { o << "F" << width << ":"; };
 };
@@ -304,7 +305,6 @@
     ArrayValue(const Array&);
 };
 
-
 template <class T>
 bool getEncodedValue(FieldTable::ValuePtr vptr, T& value) 
 {

Propchange: incubator/qpid/trunk/qpid/cpp/src/tests/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Fri Oct 24 04:33:40 2008
@@ -25,3 +25,4 @@
 echotest
 cert.password
 test_cert_db
+header_test

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am?rev=707604&r1=707603&r2=707604&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am Fri Oct 24 04:33:40 2008
@@ -128,9 +128,13 @@
 consume_SOURCES=consume.cpp  TestOptions.h ConnectionOptions.h
 consume_LDADD=$(lib_client) 
 
+check_PROGRAMS+=header_test
+header_test_SOURCES=header_test.cpp TestOptions.h ConnectionOptions.h
+header_test_LDADD=$(lib_client) 
+
 TESTS_ENVIRONMENT = VALGRIND=$(VALGRIND) srcdir=$(srcdir) QPID_DATA_DIR= 
$(srcdir)/run_test 
 
-system_tests = client_test quick_perftest quick_topictest
+system_tests = client_test quick_perftest quick_topictest run_header_test
 TESTS += start_broker $(system_tests) python_tests stop_broker 
run_federation_tests run_acl_tests
 
 EXTRA_DIST +=                                                          \
@@ -139,6 +143,9 @@
   quick_topictest                                                      \
   quick_perftest                                                       \
   topictest                                                            \
+  run_header_tests                                                     \
+  header_test.py                                                       \
+  run_ssl_tests                                                                
\
   run_federation_tests                                                 \
   run_acl_tests                                                                
\
   .valgrind.supp                                                       \

Added: incubator/qpid/trunk/qpid/cpp/src/tests/header_test.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/header_test.cpp?rev=707604&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/header_test.cpp (added)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/header_test.cpp Fri Oct 24 04:33:40 
2008
@@ -0,0 +1,59 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+#include <iostream>
+
+#include "TestOptions.h"
+#include "qpid/client/Connection.h"
+#include "qpid/client/Message.h"
+#include "qpid/client/Session.h"
+#include "qpid/client/SubscriptionManager.h"
+
+using namespace qpid;
+using namespace qpid::client;
+using namespace std;
+
+int main(int argc, char** argv)
+{
+    TestOptions opts;
+    try {
+        opts.parse(argc, argv);
+        Connection connection;
+        connection.open(opts.con);
+        Session session = connection.newSession();
+        std::string q("header_interop_test_queue");
+        session.queueDeclare(arg::queue=q);
+        double pi = 3.14159265;
+        float e = 2.71828;
+        Message msg("", q);
+        msg.getMessageProperties().getApplicationHeaders().setDouble("pi", pi);
+        msg.getMessageProperties().getApplicationHeaders().setFloat("e", e);
+        session.messageTransfer(arg::content=msg);
+
+        session.close();
+        connection.close();
+
+        return 0;
+    } catch(const exception& e) {
+       cout << e.what() << endl;
+    }
+    return 1;
+}

Propchange: incubator/qpid/trunk/qpid/cpp/src/tests/header_test.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/qpid/trunk/qpid/cpp/src/tests/header_test.cpp
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/qpid/trunk/qpid/cpp/src/tests/header_test.py
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/header_test.py?rev=707604&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/header_test.py (added)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/header_test.py Fri Oct 24 04:33:40 
2008
@@ -0,0 +1,86 @@
+#!/usr/bin/env python
+#
+# 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.
+#
+
+import qpid
+import sys
+import os
+from qpid.util import connect
+from qpid.connection import Connection
+from qpid.datatypes import Message, RangedSet, uuid4
+from qpid.queue import Empty
+from math import fabs
+
+def getApplicationHeaders(msg):
+    for h in msg.headers:
+        if hasattr(h, 'application_headers'): return getattr(h, 
'application_headers')
+    return None            
+
+#  Set parameters for login
+
+host="127.0.0.1"
+port=5672
+user="guest"
+password="guest"
+
+if len(sys.argv) > 1 :
+    host=sys.argv[1]
+if len(sys.argv) > 2 :
+    port=int(sys.argv[2])
+
+#  Create a connection.
+socket = connect(host, port)
+connection = Connection (sock=socket)
+connection.start()
+session = connection.session(str(uuid4()))
+
+q = "header_interop_test_queue"
+session.queue_declare(queue=q)
+
+session.message_subscribe(queue=q, destination="received")
+queue = session.incoming("received")
+queue.start()
+
+msg = queue.get(timeout=10)
+pi = 3.14159265
+e = 2.71828
+
+headers = getApplicationHeaders(msg)
+pi_ = headers["pi"]
+e_ = headers["e"]
+session.close(timeout=10)
+
+failed = False
+
+if pi != pi_:
+    print "got incorrect value for pi: ", pi_, " expected:", pi
+    failed = True
+
+if fabs(e - e_) > 0.0001:
+    print "got incorrect value for e: ", e_, " expected:", e
+    failed = True
+
+if failed:
+    sys.exit(1)
+else:
+    print "Correct header values received."
+    sys.exit(0)
+    
+
+

Propchange: incubator/qpid/trunk/qpid/cpp/src/tests/header_test.py
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/qpid/trunk/qpid/cpp/src/tests/header_test.py
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/qpid/trunk/qpid/cpp/src/tests/run_header_test
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/run_header_test?rev=707604&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/run_header_test (added)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/run_header_test Fri Oct 24 04:33:40 
2008
@@ -0,0 +1,13 @@
+#!/bin/sh
+# Simple test of encode/decode of a double in application headers
+# TODO: this should be expanded to cover a wider set of types and go
+# in both directions
+
+srcdir=`dirname $0`
+PYTHON_DIR=$srcdir/../../../python
+test -f qpidd.port && QPID_PORT=`cat qpidd.port`
+
+./header_test -p $QPID_PORT
+export PYTHONPATH=$PYTHON_DIR:$PYTHONPATH
+$srcdir/header_test.py "localhost" $QPID_PORT
+

Propchange: incubator/qpid/trunk/qpid/cpp/src/tests/run_header_test
------------------------------------------------------------------------------
    svn:executable = *


Reply via email to