You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2007/06/10 16:57:36 UTC
svn commit: r545883 - in /activemq/activemq-cpp/trunk/src/decaf/src: main/
main/decaf/net/ test/ test/decaf/net/
Author: tabish
Date: Sun Jun 10 07:57:34 2007
New Revision: 545883
URL: http://svn.apache.org/viewvc?view=rev&rev=545883
Log:
https://issues.apache.org/activemq/browse/AMQCPP-103
Building up the Decaf Library
Added:
activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/net/SocketFactory.cpp
activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/net/SocketFactory.h
activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketFactoryTest.cpp
activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketFactoryTest.h
activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketTest.cpp
activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketTest.h
Modified:
activemq/activemq-cpp/trunk/src/decaf/src/main/Makefile.am
activemq/activemq-cpp/trunk/src/decaf/src/test/Makefile.am
Modified: activemq/activemq-cpp/trunk/src/decaf/src/main/Makefile.am
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/Makefile.am?view=diff&rev=545883&r1=545882&r2=545883
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/Makefile.am (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/Makefile.am Sun Jun 10 07:57:34 2007
@@ -22,6 +22,7 @@
decaf/net/SocketInputStream.cpp \
decaf/net/SocketError.cpp \
decaf/net/TcpSocket.cpp \
+ decaf/net/SocketFactory.cpp \
decaf/lang/Exception.cpp \
decaf/lang/Thread.cpp \
decaf/io/BufferedOutputStream.cpp \
@@ -53,6 +54,7 @@
decaf/net/Socket.h \
decaf/net/SocketInputStream.h \
decaf/net/ServerSocket.h \
+ decaf/net/SocketFactory.h \
decaf/lang/Boolean.h \
decaf/lang/Throwable.h \
decaf/lang/Exception.h \
Added: activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/net/SocketFactory.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/net/SocketFactory.cpp?view=auto&rev=545883
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/net/SocketFactory.cpp (added)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/net/SocketFactory.cpp Sun Jun 10 07:57:34 2007
@@ -0,0 +1,137 @@
+/*
+ * 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 <decaf/net/SocketFactory.h>
+#include <decaf/net/BufferedSocket.h>
+#include <decaf/net/TcpSocket.h>
+#include <decaf/util/Properties.h>
+#include <stdio.h>
+
+using namespace std;
+using namespace decaf;
+using namespace decaf::util;
+using namespace decaf::net;
+using namespace decaf::lang;
+using namespace decaf::lang::exceptions;
+
+////////////////////////////////////////////////////////////////////////////////
+Socket* SocketFactory::createSocket(
+ const std::string& uri,
+ const Properties& properties)
+ throw ( SocketException )
+{
+ try
+ {
+ // Ensure something is actually passed in for the URI
+ if( uri == "" )
+ {
+ throw SocketException( __FILE__, __LINE__,
+ "SocketTransport::start() - uri not provided" );
+ }
+
+ string dummy = uri;
+
+ // Extract the port.
+ std::size_t portIx = dummy.find( ':' );
+ if( portIx == string::npos )
+ {
+ throw SocketException( __FILE__, __LINE__,
+ "SocketTransport::start() - uri malformed - port not specified: %s", uri.c_str() );
+ }
+ string host = dummy.substr( 0, portIx );
+ string portString = dummy.substr( portIx + 1 );
+ int port;
+ if( sscanf( portString.c_str(), "%d", &port) != 1 )
+ {
+ throw SocketException( __FILE__, __LINE__,
+ "SocketTransport::start() - unable to extract port from uri: %s", uri.c_str() );
+ }
+
+ // Get the read buffer size.
+ int inputBufferSize = 10000;
+ dummy = properties.getProperty( "inputBufferSize", "10000" );
+ sscanf( dummy.c_str(), "%d", &inputBufferSize );
+
+ // Get the write buffer size.
+ int outputBufferSize = 10000;
+ dummy = properties.getProperty( "outputBufferSize", "10000" );
+ sscanf( dummy.c_str(), "%d", &outputBufferSize );
+
+ // Get the linger flag.
+ int soLinger = 0;
+ dummy = properties.getProperty( "soLinger", "0" );
+ sscanf( dummy.c_str(), "%d", &soLinger );
+
+ // Get the keepAlive flag.
+ bool soKeepAlive =
+ properties.getProperty( "soKeepAlive", "false" ) == "true";
+
+ // Get the socket receive buffer size.
+ int soReceiveBufferSize = -1;
+ dummy = properties.getProperty( "soReceiveBufferSize", "-1" );
+ sscanf( dummy.c_str(), "%d", &soReceiveBufferSize );
+
+ // Get the socket send buffer size.
+ int soSendBufferSize = -1;
+ dummy = properties.getProperty( "soSendBufferSize", "-1" );
+ sscanf( dummy.c_str(), "%d", &soSendBufferSize );
+
+ // Get the socket TCP_NODELAY flag.
+ bool tcpNoDelay =
+ properties.getProperty( "tcpNoDelay", "true" ) == "true";
+
+ // Now that we have all the elements that we wanted - let's do it!
+ // Create a TCP Socket and then Wrap it in a buffered socket
+ // so that users get the benefit of buffered reads and writes.
+ // The buffered socket will own the TcpSocket instance, and will
+ // clean it up when it is cleaned up.
+ TcpSocket* tcpSocket = new TcpSocket();
+
+ try
+ {
+ // Connect the socket.
+ tcpSocket->connect( host.c_str(), port );
+
+ // Set the socket options.
+ tcpSocket->setSoLinger( soLinger );
+ tcpSocket->setKeepAlive( soKeepAlive );
+ tcpSocket->setTcpNoDelay( tcpNoDelay );
+
+ if( soReceiveBufferSize > 0 ){
+ tcpSocket->setReceiveBufferSize( soReceiveBufferSize );
+ }
+
+ if( soSendBufferSize > 0 ){
+ tcpSocket->setSendBufferSize( soSendBufferSize );
+ }
+
+ }
+ catch ( SocketException& ex )
+ {
+ ex.setMark( __FILE__, __LINE__ );
+ try{
+ delete tcpSocket;
+ } catch( SocketException& ex2 ){ /* Absorb */ }
+
+ throw ex;
+ }
+
+ return tcpSocket;
+ }
+ DECAF_CATCH_RETHROW( SocketException )
+ DECAF_CATCH_EXCEPTION_CONVERT( Exception, SocketException )
+ DECAF_CATCHALL_THROW( SocketException )
+}
Added: activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/net/SocketFactory.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/net/SocketFactory.h?view=auto&rev=545883
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/net/SocketFactory.h (added)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/net/SocketFactory.h Sun Jun 10 07:57:34 2007
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ */
+#ifndef _DECAF_NET_SOCKETFACTORY_H_
+#define _DECAF_NET_SOCKETFACTORY_H_
+
+#include <decaf/net/SocketException.h>
+#include <decaf/util/Properties.h>
+#include <decaf/util/Config.h>
+
+namespace decaf{
+namespace net{
+
+ class Socket;
+
+ /**
+ * Socket Factory implementation for use in Creating Sockets
+ * <p>
+ * <p>
+ * Property Options: <p>
+ * Name Value <p>
+ * ------------------------------------- <p>
+ * inputBufferSize size in bytes of the buffered input stream buffer. Defaults to 10000.<p>
+ * outputBufferSize size in bytes of the buffered output stream buffer. Defaults to 10000.<p>
+ * soLinger linger time for the socket (in microseconds). Defaults to 0.<p>
+ * soKeepAlive keep alive flag for the socket (true/false). Defaults to false.<p>
+ * soReceiveBufferSize The size of the socket receive buffer (in bytes). Defaults to 2MB.<p>
+ * soSendBufferSize The size of the socket send buffer (in bytes). Defaults to 2MB.<p>
+ * soTimeout The timeout of socket IO operations (in microseconds). Defaults to 10000<p>
+ *
+ * @see <code>Socket</code>
+ */
+ class DECAF_API SocketFactory
+ {
+ public:
+
+ virtual ~SocketFactory();
+
+ /**
+ * Creates and returns a Socket dervied Object based on the values
+ * defined in the Properties Object that is passed in.
+ * @param the URI for the Socket Connection.
+ * @param properties a IProperties pointer.
+ * @throws SocketException.
+ */
+ static Socket* createSocket( const std::string& uri,
+ const util::Properties& properties )
+ throw ( SocketException );
+
+ };
+
+}}
+
+#endif /*_DECAF_NET_SOCKETFACTORY_H_*/
Modified: activemq/activemq-cpp/trunk/src/decaf/src/test/Makefile.am
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/test/Makefile.am?view=diff&rev=545883&r1=545882&r2=545883
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/test/Makefile.am (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/test/Makefile.am Sun Jun 10 07:57:34 2007
@@ -26,6 +26,8 @@
decaf/io/ByteArrayOutputStreamTest.cpp \
decaf/io/DataInputStreamTest.cpp \
decaf/io/DataOutputStreamTest.cpp \
+ decaf/net/SocketFactoryTest.cpp \
+ decaf/net/SocketTest.cpp \
decaf/util/StringTokenizerTest.cpp \
decaf/util/Endian.cpp \
decaf/util/DateTest.cpp \
@@ -46,6 +48,8 @@
decaf/io/ByteArrayOutputStreamTest.h \
decaf/io/DataInputStreamTest.h \
decaf/io/DataOutputStreamTest.h \
+ decaf/net/SocketFactoryTest.h \
+ decaf/net/SocketTest.h \
decaf/util/StringTokenizerTest.h \
decaf/util/Endian.h \
decaf/util/DateTest.h \
Added: activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketFactoryTest.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketFactoryTest.cpp?view=auto&rev=545883
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketFactoryTest.cpp (added)
+++ activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketFactoryTest.cpp Sun Jun 10 07:57:34 2007
@@ -0,0 +1,149 @@
+/*
+ * 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 "SocketFactoryTest.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION( decaf::net::SocketFactoryTest );
+
+#include <decaf/util/Properties.h>
+#include <decaf/net/SocketFactory.h>
+#include <decaf/net/TcpSocket.h>
+
+using namespace decaf;
+using namespace decaf::net;
+using namespace decaf::util;
+using namespace decaf::lang;
+using namespace decaf::util::concurrent;
+
+////////////////////////////////////////////////////////////////////////////////
+void SocketFactoryTest::test()
+{
+ try
+ {
+ MyServerThread serverThread;
+ serverThread.start();
+
+ Thread::sleep( 500 );
+
+ util::Properties properties;
+
+ std::ostringstream ostream;
+
+ ostream << "127.0.0.1:" << port;
+
+ properties.setProperty("soLinger", "false");
+
+ Socket* client = SocketFactory::createSocket(
+ ostream.str(), properties );
+
+ synchronized(&serverThread.mutex)
+ {
+ if(serverThread.getNumClients() != 1)
+ {
+ serverThread.mutex.wait(1000);
+ }
+ }
+
+ CPPUNIT_ASSERT( client->isConnected() );
+
+ CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
+
+ client->close();
+
+ synchronized(&serverThread.mutex)
+ {
+ if(serverThread.getNumClients() != 0)
+ {
+ serverThread.mutex.wait(1000);
+ }
+ }
+
+ CPPUNIT_ASSERT( serverThread.getNumClients() == 0 );
+
+ serverThread.stop();
+ serverThread.join();
+
+ delete client;
+ }
+ catch(lang::Exception ex)
+ {
+ std::cout << "SocketFactoryTest::test - Caught Exception." << std::endl;
+ ex.printStackTrace();
+ CPPUNIT_ASSERT( false );
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void SocketFactoryTest::testNoDelay()
+{
+ try
+ {
+ MyServerThread serverThread;
+ serverThread.start();
+
+ Thread::sleep( 40 );
+
+ util::Properties properties;
+
+ std::ostringstream ostream;
+
+ ostream << "127.0.0.1:" << port;
+
+ properties.setProperty( "soLinger", "false" );
+ properties.setProperty( "tcpNoDelay", "true" );
+
+ Socket* client = SocketFactory::createSocket(
+ ostream.str(), properties );
+
+ TcpSocket* tcpSock = dynamic_cast<TcpSocket*>( client );
+ CPPUNIT_ASSERT( tcpSock != NULL );
+ CPPUNIT_ASSERT( tcpSock->getTcpNoDelay() == true );
+
+ synchronized(&serverThread.mutex)
+ {
+ if(serverThread.getNumClients() != 1)
+ {
+ serverThread.mutex.wait(1000);
+ }
+ }
+
+ CPPUNIT_ASSERT( client->isConnected() );
+
+ CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
+
+ client->close();
+
+ synchronized(&serverThread.mutex)
+ {
+ if(serverThread.getNumClients() != 0)
+ {
+ serverThread.mutex.wait(1000);
+ }
+ }
+
+ CPPUNIT_ASSERT( serverThread.getNumClients() == 0 );
+
+ serverThread.stop();
+ serverThread.join();
+
+ delete client;
+ }
+ catch(lang::Exception ex)
+ {
+ CPPUNIT_ASSERT( false );
+ }
+}
Added: activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketFactoryTest.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketFactoryTest.h?view=auto&rev=545883
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketFactoryTest.h (added)
+++ activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketFactoryTest.h Sun Jun 10 07:57:34 2007
@@ -0,0 +1,145 @@
+/*
+ * 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.
+ */
+
+#ifndef _DECAF_NET_SOCKETFACTORYTEST_H_
+#define _DECAF_NET_SOCKETFACTORYTEST_H_
+
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <decaf/net/Socket.h>
+#include <decaf/net/ServerSocket.h>
+#include <decaf/util/concurrent/Concurrent.h>
+#include <decaf/util/concurrent/Mutex.h>
+#include <decaf/lang/Thread.h>
+
+#include <sstream>
+
+namespace decaf{
+namespace net{
+
+ class SocketFactoryTest : public CppUnit::TestFixture
+ {
+ CPPUNIT_TEST_SUITE( SocketFactoryTest );
+ CPPUNIT_TEST( test );
+ CPPUNIT_TEST( testNoDelay );
+ CPPUNIT_TEST_SUITE_END();
+
+ static const int port = 23232;
+
+ class MyServerThread : public lang::Thread{
+ private:
+
+ bool done;
+ int numClients;
+ std::string lastMessage;
+
+ public:
+
+ util::concurrent::Mutex mutex;
+
+ public:
+
+ MyServerThread(){
+ done = false;
+ numClients = 0;
+ }
+ virtual ~MyServerThread(){
+ stop();
+ }
+
+ std::string getLastMessage(){
+ return lastMessage;
+ }
+
+ int getNumClients(){
+ return numClients;
+ }
+
+ virtual void stop(){
+ done = true;
+ }
+
+ virtual void run(){
+ try{
+ unsigned char buf[1000];
+
+ ServerSocket server;
+ server.bind( "127.0.0.1", port );
+
+ net::Socket* socket = server.accept();
+ server.close();
+
+ socket->setSoLinger( false );
+
+ synchronized(&mutex)
+ {
+ numClients++;
+ mutex.notifyAll();
+ }
+
+ while( !done && socket != NULL ){
+
+ io::InputStream* stream = socket->getInputStream();
+ memset( buf, 0, 1000 );
+ try{
+ stream->read( buf, 1000 );
+
+ lastMessage = (char*)buf;
+
+ if( strcmp( (char*)buf, "reply" ) == 0 ){
+ io::OutputStream* output = socket->getOutputStream();
+ output->write( (unsigned char*)"hello", strlen("hello" ) );
+ }
+
+ }catch( io::IOException& ex ){
+ done = true;
+ }
+ }
+
+ socket->close();
+ delete socket;
+
+ numClients--;
+
+ synchronized(&mutex)
+ {
+ mutex.notifyAll();
+ }
+
+ }catch( io::IOException& ex ){
+ printf("%s\n", ex.getMessage().c_str() );
+ CPPUNIT_ASSERT( false );
+ }catch( ... ){
+ CPPUNIT_ASSERT( false );
+ }
+ }
+ };
+
+ public:
+
+ SocketFactoryTest() {}
+ virtual ~SocketFactoryTest() {}
+
+ void test();
+ void testNoDelay();
+
+ };
+
+}}
+
+#endif /*_DECAF_NET_SOCKETFACTORYTEST_H_*/
Added: activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketTest.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketTest.cpp?view=auto&rev=545883
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketTest.cpp (added)
+++ activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketTest.cpp Sun Jun 10 07:57:34 2007
@@ -0,0 +1,234 @@
+/*
+ * 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 "SocketTest.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION( decaf::net::SocketTest );
+
+#include <decaf/net/TcpSocket.h>
+
+using namespace std;
+using namespace decaf;
+using namespace decaf::net;
+using namespace decaf::util;
+using namespace decaf::lang;
+
+////////////////////////////////////////////////////////////////////////////////
+void SocketTest::testConnect() {
+
+ try{
+
+ MyServerThread serverThread;
+ serverThread.start();
+
+ Thread::sleep( 40 );
+
+ TcpSocket client;
+
+ client.connect("127.0.0.1", port);
+ client.setSoLinger( false );
+
+ synchronized(&serverThread.mutex)
+ {
+ if(serverThread.getNumClients() != 1)
+ {
+ serverThread.mutex.wait(1000);
+ }
+ }
+
+ CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
+
+ client.close();
+
+ synchronized(&serverThread.mutex)
+ {
+ if(serverThread.getNumClients() != 0)
+ {
+ serverThread.mutex.wait(1000);
+ }
+ }
+
+ CPPUNIT_ASSERT( serverThread.getNumClients() == 0 );
+
+ serverThread.stop();
+ serverThread.join();
+
+ }catch( io::IOException& ex ){
+ printf( "%s\n", ex.getMessage().c_str() );
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void SocketTest::testTx() {
+
+ try{
+
+ MyServerThread serverThread;
+ serverThread.start();
+
+ Thread::sleep( 10 );
+
+ TcpSocket client;
+
+ client.connect("127.0.0.1", port);
+ client.setSoLinger( false );
+
+ synchronized(&serverThread.mutex)
+ {
+ if(serverThread.getNumClients() != 1)
+ {
+ serverThread.mutex.wait(1000);
+ }
+ }
+
+ CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
+
+ io::OutputStream* stream = client.getOutputStream();
+
+ std::string msg = "don't reply";
+ stream->write( (unsigned char*)msg.c_str(), msg.length() );
+
+ Thread::sleep( 10 );
+
+ CPPUNIT_ASSERT( serverThread.getLastMessage() == msg );
+
+ client.close();
+
+ synchronized(&serverThread.mutex)
+ {
+ if(serverThread.getNumClients() != 0)
+ {
+ serverThread.mutex.wait(1000);
+ }
+ }
+
+ CPPUNIT_ASSERT( serverThread.getNumClients() == 0 );
+
+ serverThread.stop();
+ serverThread.join();
+
+ }catch( io::IOException& ex ){
+ printf( "%s\n", ex.getMessage().c_str() );
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void SocketTest::testTrx() {
+
+ try{
+
+ MyServerThread serverThread;
+ serverThread.start();
+
+ Thread::sleep( 10 );
+
+ TcpSocket client;
+
+ client.connect("127.0.0.1", port);
+ client.setSoLinger(false);
+
+ synchronized(&serverThread.mutex)
+ {
+ if(serverThread.getNumClients() != 1)
+ {
+ serverThread.mutex.wait(1000);
+ }
+ }
+
+ CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
+
+ io::OutputStream* stream = client.getOutputStream();
+
+ std::string msg = "reply";
+ stream->write( (unsigned char*)msg.c_str(), msg.length() );
+
+ synchronized(&serverThread.mutex)
+ {
+ serverThread.mutex.wait(300);
+ }
+
+ unsigned char buf[500];
+ memset( buf, 0, 500 );
+ io::InputStream* istream = client.getInputStream();
+ std::size_t numRead = istream->read( buf, 500 );
+ CPPUNIT_ASSERT( numRead == 5 );
+ CPPUNIT_ASSERT( strcmp( (char*)buf, "hello" ) == 0 );
+
+ client.close();
+
+ serverThread.stop();
+ serverThread.join();
+
+ }catch( io::IOException& ex ){
+ printf( "%s\n", ex.getMessage().c_str() );
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void SocketTest::testTrxNoDelay() {
+
+ try{
+
+ MyServerThread serverThread;
+ serverThread.start();
+
+ Thread::sleep( 10 );
+
+ TcpSocket client;
+
+ client.connect("127.0.0.1", port);
+ client.setSoLinger(false);
+ client.setTcpNoDelay(true);
+
+ CPPUNIT_ASSERT( client.getTcpNoDelay() == true );
+
+ synchronized(&serverThread.mutex)
+ {
+ if(serverThread.getNumClients() != 1)
+ {
+ serverThread.mutex.wait(1000);
+ }
+ }
+
+ CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
+
+ io::OutputStream* stream = client.getOutputStream();
+
+ std::string msg = "reply";
+ stream->write( (unsigned char*)msg.c_str(), msg.length() );
+
+ synchronized(&serverThread.mutex)
+ {
+ serverThread.mutex.wait(300);
+ }
+
+ unsigned char buf[500];
+ memset( buf, 0, 500 );
+ io::InputStream* istream = client.getInputStream();
+ std::size_t numRead = istream->read( buf, 500 );
+ CPPUNIT_ASSERT( numRead == 5 );
+ CPPUNIT_ASSERT( strcmp( (char*)buf, "hello" ) == 0 );
+
+ client.close();
+
+ serverThread.stop();
+ serverThread.join();
+
+ }catch( io::IOException& ex ){
+ printf( "%s\n", ex.getMessage().c_str() );
+ }
+}
Added: activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketTest.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketTest.h?view=auto&rev=545883
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketTest.h (added)
+++ activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/net/SocketTest.h Sun Jun 10 07:57:34 2007
@@ -0,0 +1,158 @@
+/*
+ * 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.
+ */
+
+#ifndef _DECAF_IO_SOCKETTEST_H_
+#define _DECAF_IO_SOCKETTEST_H_
+
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <decaf/net/ServerSocket.h>
+#include <decaf/util/concurrent/Concurrent.h>
+#include <decaf/util/concurrent/Mutex.h>
+#include <decaf/lang/Thread.h>
+#include <list>
+#include <string.h>
+
+namespace decaf{
+namespace net{
+
+ class SocketTest : public CppUnit::TestFixture {
+
+ CPPUNIT_TEST_SUITE( SocketTest );
+ CPPUNIT_TEST( testConnect );
+ CPPUNIT_TEST( testTx );
+ CPPUNIT_TEST( testTrx );
+ CPPUNIT_TEST( testTrxNoDelay );
+ CPPUNIT_TEST_SUITE_END();
+
+ public:
+
+ static const int port = 23232;
+
+ class MyServerThread : public lang::Thread{
+ private:
+
+ bool done;
+ int numClients;
+ std::string lastMessage;
+
+ public:
+
+ util::concurrent::Mutex mutex;
+
+ public:
+
+ MyServerThread(){
+ done = false;
+ numClients = 0;
+ }
+
+ virtual ~MyServerThread(){
+ stop();
+ }
+
+ std::string getLastMessage(){
+ return lastMessage;
+ }
+
+ int getNumClients(){
+ return numClients;
+ }
+
+ virtual void stop(){
+ done = true;
+ }
+
+ virtual void run(){
+ try{
+ unsigned char buf[1000];
+
+ ServerSocket server;
+ server.bind( "127.0.0.1", port );
+
+ Socket* socket = server.accept();
+ server.close();
+
+ //socket->setSoTimeout( 10 );
+ socket->setSoLinger( false );
+ numClients++;
+
+ synchronized(&mutex)
+ {
+ mutex.notifyAll();
+ }
+
+ while( !done && socket != NULL ){
+
+ io::InputStream* stream = socket->getInputStream();
+
+ memset( buf, 0, 1000 );
+ try{
+ stream->read( buf, 1000 );
+
+ lastMessage = (char*)buf;
+
+ if( strcmp( (char*)buf, "reply" ) == 0 ){
+ io::OutputStream* output = socket->getOutputStream();
+ output->write( (unsigned char*)"hello", strlen("hello" ) );
+
+ synchronized(&mutex)
+ {
+ mutex.notifyAll();
+ }
+ }
+
+ }catch( io::IOException& ex ){
+ done = true;
+ }
+ }
+
+ socket->close();
+ delete socket;
+
+ numClients--;
+
+ synchronized(&mutex)
+ {
+ mutex.notifyAll();
+ }
+
+ }catch( io::IOException& ex ){
+ printf("%s\n", ex.getMessage().c_str() );
+ CPPUNIT_ASSERT( false );
+ }catch( ... ){
+ CPPUNIT_ASSERT( false );
+ }
+ }
+
+ };
+
+ public:
+
+ virtual ~SocketTest() {}
+
+ void testConnect();
+ void testTx();
+ void testTrx();
+ void testTrxNoDelay();
+
+ };
+
+}}
+
+#endif /*_DECAF_IO_SOCKETTEST_H_*/