blob: e3171775ee17e934d27f7edcd3163974b648b8e4 [file] [log] [blame]
/*
* 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 "ActiveMQMapMessageTest.h"
#include <activemq/commands/ActiveMQMapMessage.h>
#include <algorithm>
using namespace cms;
using namespace std;
using namespace activemq;
using namespace activemq::util;
using namespace activemq::commands;
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::test() {
ActiveMQMapMessage myMessage;
CPPUNIT_ASSERT( myMessage.getDataStructureType() == ActiveMQMapMessage::ID_ACTIVEMQMAPMESSAGE );
CPPUNIT_ASSERT( myMessage.getMapNames().size() == 0 );
CPPUNIT_ASSERT( myMessage.itemExists( "Something" ) == false );
std::vector<unsigned char> data;
data.push_back( 2 );
data.push_back( 4 );
data.push_back( 8 );
data.push_back( 16 );
data.push_back( 32 );
myMessage.setBoolean( "boolean", false );
myMessage.setByte( "byte", 127 );
myMessage.setChar( "char", 'a' );
myMessage.setShort( "short", 32000 );
myMessage.setInt( "int", 6789999 );
myMessage.setLong( "long", 0xFFFAAA33345LL );
myMessage.setFloat( "float", 0.000012f );
myMessage.setDouble( "double", 64.54654 );
myMessage.setBytes( "bytes", data );
CPPUNIT_ASSERT( myMessage.getBoolean( "boolean" ) == false );
CPPUNIT_ASSERT( myMessage.getByte( "byte" ) == 127 );
CPPUNIT_ASSERT( myMessage.getChar( "char" ) == 'a' );
CPPUNIT_ASSERT( myMessage.getShort( "short" ) == 32000 );
CPPUNIT_ASSERT( myMessage.getInt( "int" ) == 6789999 );
CPPUNIT_ASSERT( myMessage.getLong( "long" ) == 0xFFFAAA33345LL );
CPPUNIT_ASSERT( myMessage.getFloat( "float" ) == 0.000012f );
CPPUNIT_ASSERT( myMessage.getDouble( "double" ) == 64.54654 );
CPPUNIT_ASSERT( myMessage.getBytes( "bytes" ) == data );
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testBytesConversion() {
ActiveMQMapMessage msg;
std::vector<unsigned char> buffer( 1 );
msg.setBoolean( "boolean", true );
msg.setByte( "byte", (unsigned char)1 );
msg.setBytes( "bytes", buffer );
msg.setChar( "char", 'a' );
msg.setDouble( "double", 1.5 );
msg.setFloat( "float", 1.5f );
msg.setInt( "int", 1 );
msg.setLong( "long", 1 );
msg.setShort( "short", (short)1 );
msg.setString( "string", "string" );
// Test with a 1Meg String
std::string bigString;
bigString.reserve( 1024 * 1024 );
for( int i = 0; i < 1024 * 1024; i++ ) {
bigString += (char)( (int)'a' + i % 26 );
}
msg.setString( "bigString", bigString );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
CPPUNIT_ASSERT_EQUAL( msg2.getBoolean("boolean"), true);
CPPUNIT_ASSERT_EQUAL( msg2.getByte( "byte" ), (unsigned char)1 );
CPPUNIT_ASSERT_EQUAL( msg2.getBytes( "bytes" ).size(), (std::size_t)1 );
CPPUNIT_ASSERT_EQUAL( msg2.getChar( "char" ), 'a' );
CPPUNIT_ASSERT_DOUBLES_EQUAL( msg2.getDouble( "double" ), 1.5, 0.01 );
CPPUNIT_ASSERT_DOUBLES_EQUAL( msg2.getFloat( "float" ), 1.5f, 0.01 );
CPPUNIT_ASSERT_EQUAL( msg2.getInt( "int" ), 1 );
CPPUNIT_ASSERT_EQUAL( msg2.getLong( "long" ), 1LL );
CPPUNIT_ASSERT_EQUAL( msg2.getShort( "short" ), (short)1 );
CPPUNIT_ASSERT_EQUAL( msg2.getString( "string" ), std::string( "string" ) );
CPPUNIT_ASSERT_EQUAL( msg2.getString( "bigString" ), bigString );
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testGetBoolean() {
ActiveMQMapMessage msg;
msg.setBoolean( name, true );
msg.setReadOnlyBody( true );
CPPUNIT_ASSERT( msg.getBoolean( name ) );
msg.clearBody();
msg.setString( name, "true" );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
CPPUNIT_ASSERT( msg2.getBoolean( name ) );
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testGetByte() {
ActiveMQMapMessage msg;
msg.setByte( name, (unsigned char)1 );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
CPPUNIT_ASSERT( msg2.getByte( name ) == (unsigned char)1 );
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testGetShort() {
ActiveMQMapMessage msg;
try {
msg.setShort( name, (short)1 );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
CPPUNIT_ASSERT( msg2.getShort( name ) == (short)1 );
} catch( CMSException& ex ) {
ex.printStackTrace();
CPPUNIT_ASSERT( false );
}
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testGetChar() {
ActiveMQMapMessage msg;
try {
msg.setChar( name, 'a' );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
CPPUNIT_ASSERT( msg2.getChar( name ) == 'a' );
} catch( CMSException& ex ) {
ex.printStackTrace();
CPPUNIT_ASSERT( false );
}
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testGetInt() {
ActiveMQMapMessage msg;
try {
msg.setInt( name, 1 );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
CPPUNIT_ASSERT( msg2.getInt( name ) == 1 );
} catch( CMSException& ex ) {
ex.printStackTrace();
CPPUNIT_ASSERT( false );
}
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testGetLong() {
ActiveMQMapMessage msg;
try {
msg.setLong( name, 1 );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
CPPUNIT_ASSERT( msg2.getLong( name ) == 1 );
} catch( CMSException& ex ) {
ex.printStackTrace();
CPPUNIT_ASSERT( false );
}
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testGetFloat() {
ActiveMQMapMessage msg;
try {
msg.setFloat( name, 1.5f );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
CPPUNIT_ASSERT( msg2.getFloat( name ) == 1.5f );
} catch( CMSException& ex ) {
ex.printStackTrace();
CPPUNIT_ASSERT( false );
}
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testGetDouble() {
ActiveMQMapMessage msg;
try {
msg.setDouble( name, 1.5 );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
CPPUNIT_ASSERT( msg2.getDouble( name ) == 1.5 );
} catch( CMSException& ex ) {
ex.printStackTrace();
CPPUNIT_ASSERT( false );
}
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testGetString() {
ActiveMQMapMessage msg;
try {
std::string str = "test";
msg.setString( name, str );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
CPPUNIT_ASSERT( msg2.getString( name ) == str );
} catch( CMSException& ex ) {
ex.printStackTrace();
CPPUNIT_ASSERT( false );
}
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testGetBytes() {
ActiveMQMapMessage msg;
try {
std::vector<unsigned char> bytes1( 3, 'a' );
std::vector<unsigned char> bytes2( 2, 'b' );
msg.setBytes( name, bytes1 );
msg.setBytes( name + "2", bytes2 );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
CPPUNIT_ASSERT( msg2.getBytes( name ) == bytes1 );
CPPUNIT_ASSERT_EQUAL( msg2.getBytes( name + "2" ).size(), bytes2.size() );
} catch( CMSException& ex ) {
ex.printStackTrace();
CPPUNIT_ASSERT( false );
}
ActiveMQMapMessage msg3;
msg3.setBytes( "empty", std::vector<unsigned char>() );
CPPUNIT_ASSERT_NO_THROW( msg3.getBytes( "empty" ) );
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testGetMapNames() {
ActiveMQMapMessage msg;
std::vector<unsigned char> bytes1( 3, 'a' );
std::vector<unsigned char> bytes2( 2, 'b' );
msg.setBoolean( "boolean", true );
msg.setByte( "byte", (unsigned char)1 );
msg.setBytes( "bytes1", bytes1 );
msg.setBytes( "bytes2", bytes2 );
msg.setChar( "char", 'a' );
msg.setDouble( "double", 1.5 );
msg.setFloat( "float", 1.5f );
msg.setInt( "int", 1 );
msg.setLong( "long", 1 );
msg.setShort( "short", (short)1 );
msg.setString( "string", "string" );
ActiveMQMapMessage msg2;
msg2.copyDataStructure( &msg );
std::vector<std::string> mapNamesList = msg2.getMapNames();
CPPUNIT_ASSERT_EQUAL( (std::size_t)11, mapNamesList.size() );
CPPUNIT_ASSERT( std::find( mapNamesList.begin(), mapNamesList.end(), "boolean" ) != mapNamesList.end() );
CPPUNIT_ASSERT( std::find( mapNamesList.begin(), mapNamesList.end(), "byte" ) != mapNamesList.end() );
CPPUNIT_ASSERT( std::find( mapNamesList.begin(), mapNamesList.end(), "bytes1" ) != mapNamesList.end() );
CPPUNIT_ASSERT( std::find( mapNamesList.begin(), mapNamesList.end(), "bytes2" ) != mapNamesList.end() );
CPPUNIT_ASSERT( std::find( mapNamesList.begin(), mapNamesList.end(), "char" ) != mapNamesList.end() );
CPPUNIT_ASSERT( std::find( mapNamesList.begin(), mapNamesList.end(), "double" ) != mapNamesList.end() );
CPPUNIT_ASSERT( std::find( mapNamesList.begin(), mapNamesList.end(), "float" ) != mapNamesList.end() );
CPPUNIT_ASSERT( std::find( mapNamesList.begin(), mapNamesList.end(), "int" ) != mapNamesList.end() );
CPPUNIT_ASSERT( std::find( mapNamesList.begin(), mapNamesList.end(), "long" ) != mapNamesList.end() );
CPPUNIT_ASSERT( std::find( mapNamesList.begin(), mapNamesList.end(), "short" ) != mapNamesList.end() );
CPPUNIT_ASSERT( std::find( mapNamesList.begin(), mapNamesList.end(), "string" ) != mapNamesList.end() );
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testItemExists() {
ActiveMQMapMessage mapMessage;
mapMessage.setString( "exists", "test" );
ActiveMQMapMessage mapMessage2;
mapMessage2.copyDataStructure( &mapMessage );
CPPUNIT_ASSERT( mapMessage2.itemExists( "exists" ) );
CPPUNIT_ASSERT( !mapMessage2.itemExists( "doesntExist" ) );
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testClearBody() {
ActiveMQMapMessage mapMessage;
mapMessage.setString( "String", "String" );
mapMessage.clearBody();
CPPUNIT_ASSERT( !mapMessage.isReadOnlyBody() );
mapMessage.onSend();
mapMessage.setContent( mapMessage.getContent() );
CPPUNIT_ASSERT( mapMessage.itemExists( "String" ) == false );
mapMessage.clearBody();
mapMessage.setString( "String", "String" );
ActiveMQMapMessage mapMessage2;
mapMessage2.copyDataStructure( &mapMessage );
CPPUNIT_ASSERT( mapMessage2.itemExists( "String" ) );
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testReadOnlyBody() {
ActiveMQMapMessage msg;
std::vector<unsigned char> buffer(2);
msg.setBoolean( "boolean", true );
msg.setByte( "byte", (unsigned char)1 );
msg.setBytes( "bytes", buffer );
msg.setChar( "char", 'a' );
msg.setDouble( "double", 1.5 );
msg.setFloat( "float", 1.5f );
msg.setInt( "int", 1 );
msg.setLong( "long", 1 );
msg.setShort( "short", (short)1 );
msg.setString( "string", "string" );
msg.setReadOnlyBody( true );
try {
msg.getBoolean( "boolean" );
msg.getByte( "byte" );
msg.getBytes( "bytes" );
msg.getChar( "char" );
msg.getDouble( "double" );
msg.getFloat( "float" );
msg.getInt( "int" );
msg.getLong( "long" );
msg.getShort( "short" );
msg.getString( "string" );
} catch( MessageNotReadableException& mnre ) {
CPPUNIT_FAIL( "should be readable" );
}
try {
msg.setBoolean( "boolean", true );
CPPUNIT_FAIL( "should throw exception" );
} catch( MessageNotWriteableException& mnwe ) {
}
try {
msg.setByte( "byte", (unsigned char)1 );
CPPUNIT_FAIL( "should throw exception" );
} catch( MessageNotWriteableException& mnwe ) {
}
try {
msg.setBytes( "bytes", buffer );
CPPUNIT_FAIL( "should throw exception" );
} catch( MessageNotWriteableException& mnwe ) {
}
try {
msg.setChar( "char", 'a' );
CPPUNIT_FAIL( "should throw exception" );
} catch( MessageNotWriteableException& mnwe ) {
}
try {
msg.setDouble( "double", 1.5 );
CPPUNIT_FAIL( "should throw exception" );
} catch( MessageNotWriteableException& mnwe ) {
}
try {
msg.setFloat( "float", 1.5f );
CPPUNIT_FAIL( "should throw exception" );
} catch( MessageNotWriteableException& mnwe ) {
}
try {
msg.setInt( "int", 1 );
CPPUNIT_FAIL( "should throw exception" );
} catch( MessageNotWriteableException& mnwe ) {
}
try {
msg.setLong( "long", 1 );
CPPUNIT_FAIL( "should throw exception" );
} catch( MessageNotWriteableException& mnwe ) {
}
try {
msg.setShort( "short", (short)1 );
CPPUNIT_FAIL( "should throw exception" );
} catch( MessageNotWriteableException& mnwe ) {
}
try {
msg.setString( "string", "string" );
CPPUNIT_FAIL( "should throw exception" );
} catch( MessageNotWriteableException& mnwe ) {
}
}
////////////////////////////////////////////////////////////////////////////////
void ActiveMQMapMessageTest::testWriteOnlyBody() {
ActiveMQMapMessage msg;
std::vector<unsigned char> buffer1(1);
std::vector<unsigned char> buffer2(2);
msg.setReadOnlyBody( false );
msg.setBoolean( "boolean", true );
msg.setByte( "byte", (unsigned char)1 );
msg.setBytes( "bytes", buffer1 );
msg.setBytes( "bytes2", buffer2 );
msg.setChar( "char", 'a' );
msg.setDouble( "double", 1.5 );
msg.setFloat( "float", 1.5f );
msg.setInt( "int", 1 );
msg.setLong( "long", 1 );
msg.setShort( "short", (short)1 );
msg.setString( "string", "string" );
msg.setReadOnlyBody( true );
msg.getBoolean( "boolean" );
msg.getByte( "byte" );
msg.getBytes( "bytes" );
msg.getChar( "char" );
msg.getDouble( "double" );
msg.getFloat( "float" );
msg.getInt( "int" );
msg.getLong( "long" );
msg.getShort( "short" );
msg.getString( "string" );
}