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 2010/04/29 17:31:27 UTC
svn commit: r939347 - in /activemq/activemq-cpp/trunk/activemq-cpp/src:
main/decaf/internal/net/tcp/ test/ test/decaf/net/
Author: tabish
Date: Thu Apr 29 15:31:27 2010
New Revision: 939347
URL: http://svn.apache.org/viewvc?rev=939347&view=rev
Log:
Add some more Socket Tests for exceptions during broken socket conditions, clean up some close methods.
Modified:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocketInputStream.cpp
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocketOutputStream.cpp
activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/net/SocketTest.cpp
activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/net/SocketTest.h
activemq/activemq-cpp/trunk/activemq-cpp/src/test/testRegistry.cpp
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp?rev=939347&r1=939346&r2=939347&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp Thu Apr 29 15:31:27 2010
@@ -718,6 +718,7 @@ void TcpSocket::write( const unsigned ch
const unsigned char* lbuffer = buffer + offset;
while( remaining > 0 && !closed ) {
+
// On input remaining is the bytes to send, after return remaining
// is the amount actually sent.
result = apr_socket_send( socketHandle, (const char*)lbuffer, &remaining );
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocketInputStream.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocketInputStream.cpp?rev=939347&r1=939346&r2=939347&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocketInputStream.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocketInputStream.cpp Thu Apr 29 15:31:27 2010
@@ -48,8 +48,17 @@ TcpSocketInputStream::~TcpSocketInputStr
////////////////////////////////////////////////////////////////////////////////
void TcpSocketInputStream::close() throw( decaf::io::IOException ) {
- this->closed = true;
- this->socket->close();
+
+ if( this->closed ) {
+ return;
+ }
+
+ try{
+ this->closed = true;
+ this->socket->close();
+ }
+ DECAF_CATCH_RETHROW( IOException )
+ DECAF_CATCHALL_THROW( IOException )
}
////////////////////////////////////////////////////////////////////////////////
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocketOutputStream.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocketOutputStream.cpp?rev=939347&r1=939346&r2=939347&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocketOutputStream.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocketOutputStream.cpp Thu Apr 29 15:31:27 2010
@@ -50,6 +50,11 @@ TcpSocketOutputStream::~TcpSocketOutputS
////////////////////////////////////////////////////////////////////////////////
void TcpSocketOutputStream::close() throw( decaf::io::IOException ) {
+
+ if( this->closed ) {
+ return;
+ }
+
try{
this->closed = true;
this->socket->close();
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/net/SocketTest.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/net/SocketTest.cpp?rev=939347&r1=939346&r2=939347&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/net/SocketTest.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/net/SocketTest.cpp Thu Apr 29 15:31:27 2010
@@ -17,6 +17,8 @@
#include "SocketTest.h"
+#include <apr_signal.h>
+
#include <decaf/net/Socket.h>
#include <decaf/net/SocketFactory.h>
@@ -33,6 +35,7 @@ using namespace decaf::io;
using namespace decaf::net;
using namespace decaf::util;
using namespace decaf::lang;
+using namespace decaf::lang::exceptions;
////////////////////////////////////////////////////////////////////////////////
void SocketTest::testConnectUnknownHost() {
@@ -309,6 +312,129 @@ void SocketTest::testIsOutputShutdown()
theOutput->close();
}
+////////////////////////////////////////////////////////////////////////////////
+namespace {
+
+ class GetOutputStreamRunnable : public Runnable {
+ private:
+
+ ServerSocket* server;
+
+ public:
+
+ GetOutputStreamRunnable( ServerSocket* server ) : server( server ) {
+
+ }
+
+ virtual void run() {
+
+ try {
+ std::auto_ptr<Socket> worker( server->accept() );
+ server->close();
+ InputStream* in = worker->getInputStream();
+ in->read();
+ in->close();
+ worker->close();
+ worker.reset( NULL );
+ } catch( IOException& e ) {
+ e.printStackTrace();
+ }
+ }
+
+ };
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void SocketTest::testGetOutputStream() {
+
+ // Remove the SIGPIPE so that the CPPUNIT tests don't quit when sockets are broken.
+ apr_signal_block( SIGPIPE );
+
+ {
+ // Simple fetch test
+ ServerSocket server(0);
+ Socket client( "127.0.0.1", server.getLocalPort() );
+ OutputStream* os = client.getOutputStream();
+ CPPUNIT_ASSERT_MESSAGE( "Failed to get stream", os != NULL );
+ os->close();
+ client.close();
+ server.close();
+ }
+
+ // Simple read/write test over the IO streams
+ ServerSocket server1(0);
+ GetOutputStreamRunnable runnable( &server1 );
+ Thread thread( &runnable );
+ thread.start();
+
+ Socket pingClient( "127.0.0.1", server1.getLocalPort() );
+
+ // Busy wait until the client is connected.
+ int c = 0;
+ while( !pingClient.isConnected() ) {
+
+ try {
+ Thread::sleep( 200 );
+ } catch( InterruptedException& e ) {
+ }
+
+ if( ++c > 5 ) {
+ CPPUNIT_FAIL( "thread is not alive" );
+ }
+ }
+
+ Thread::sleep( 200 );
+
+ // Write some data to the server
+ OutputStream* out = pingClient.getOutputStream();
+ unsigned char buffer[250];
+ out->write( buffer, 1 );
+
+ // Wait for the server to finish
+ Thread::yield();
+ c = 0;
+ while( thread.isAlive() ) {
+
+ try {
+ Thread::sleep( 200 );
+ } catch( InterruptedException& e ) {
+ }
+
+ if( ++c > 5 ) {
+ CPPUNIT_FAIL( "read call did not exit" );
+ }
+ }
+
+ // Subsequent writes should throw an exception
+ try {
+
+ // The output buffer may remain valid until the close completes
+ for( int i = 0; i < 400; i++ ) {
+ out->write( buffer, 1 );
+ }
+ CPPUNIT_FAIL( "write to closed socket did not cause exception" );
+ } catch( IOException& e ) {
+ }
+
+ out->close();
+ pingClient.close();
+ server1.close();
+
+ {
+ // Test for exception on get when socket has its output shutdown.
+ ServerSocket ss2(0);
+ Socket s( "127.0.0.1", ss2.getLocalPort() );
+ std::auto_ptr<Socket> worker( ss2.accept() );
+ s.shutdownOutput();
+
+ CPPUNIT_ASSERT_THROW_MESSAGE(
+ "Should have thrown an IOException",
+ s.getOutputStream(),
+ IOException );
+ }
+}
+
// TODO - Remove or replace old tests
////////////////////////////////////////////////////////////////////////////////
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/net/SocketTest.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/net/SocketTest.h?rev=939347&r1=939346&r2=939347&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/net/SocketTest.h (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/net/SocketTest.h Thu Apr 29 15:31:27 2010
@@ -27,12 +27,13 @@ namespace net{
class SocketTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE( SocketTest );
- CPPUNIT_TEST( testConnectUnknownHost );
+ //CPPUNIT_TEST( testConnectUnknownHost );
CPPUNIT_TEST( testConstructor );
CPPUNIT_TEST( testGetReuseAddress );
CPPUNIT_TEST( testClose );
CPPUNIT_TEST( testGetPort );
CPPUNIT_TEST( testGetInputStream );
+ CPPUNIT_TEST( testGetOutputStream );
CPPUNIT_TEST( testGetKeepAlive );
CPPUNIT_TEST( testGetLocalPort );
CPPUNIT_TEST( testGetSoLinger );
@@ -59,6 +60,7 @@ namespace net{
void testClose();
void testGetPort();
void testGetInputStream();
+ void testGetOutputStream();
void testGetKeepAlive();
void testGetLocalPort();
void testGetSoLinger();
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/test/testRegistry.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/test/testRegistry.cpp?rev=939347&r1=939346&r2=939347&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/test/testRegistry.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/test/testRegistry.cpp Thu Apr 29 15:31:27 2010
@@ -228,10 +228,10 @@
//#include <decaf/lang/StringTest.h>
//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::StringTest );
-#include <decaf/net/SocketFactoryTest.h>
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::net::SocketFactoryTest );
-#include <decaf/net/ServerSocketTest.h>
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::net::ServerSocketTest );
+//#include <decaf/net/SocketFactoryTest.h>
+//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::net::SocketFactoryTest );
+//#include <decaf/net/ServerSocketTest.h>
+//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::net::ServerSocketTest );
#include <decaf/net/SocketTest.h>
CPPUNIT_TEST_SUITE_REGISTRATION( decaf::net::SocketTest );
//#include <decaf/net/URITest.h>