2005/5/9

     
 

acdk_net_TcpTimeout_Test.cpp

artefaktur
// -*- mode:C++; tab-width:2; c-basic-offset:2; indent-tabs-mode:nil -*-
//
// Copyright (C) 2000-2005 by Roger Rene Kommer / artefaktur, Kassel, Germany.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public License (LGPL).
// 
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
// License ACDK-FreeLicense document enclosed in the distribution
// for more for more details.
// This file is part of the Artefaktur Component Development Kit:
//                         ACDK
//
// Please refer to
// - http://www.acdk.de
// - http://www.artefaktur.com
// - http://acdk.sourceforge.net
// for more information.
//
// $Header: /cvsroot/acdk/acdk/acdk_net/tests/acdk/net/acdk_net_TcpTimeout_Test.cpp,v 1.2 2005/04/30 18:57:16 kommer Exp $
#include <acdk/tools/aunit/TestRunner.h>
#include <acdk/lang/Throwable.h>
#include <acdk/lang/System.h>
#include <acdk/lang/Thread.h>
#include <acdk/net/Socket.h>
#include <acdk/net/SocketException.h>
#include <acdk/net/ServerSocket.h>
#include <acdk/util/Arrays.h>

namespace tests {
namespace acdk {
namespace net {

BEGIN_DECLARE_TEST( TcpTimeout_Test )
  DECLARE_TEST( acceptTimeOut )
  DECLARE_TEST( connectTimeOut )
  DECLARE_TEST( acceptTimeOut2 )
END_DECLARE_TEST( TcpTimeout_Test  )

BEGIN_DEFINE_TEST( TcpTimeout_Test )
  ADD_TEST( TcpTimeout_Test, acceptTimeOut )
  ADD_TEST( TcpTimeout_Test, connectTimeOut )
  ADD_TEST( TcpTimeout_Test, acceptTimeOut2 )
  
END_DEFINE_TEST( TcpTimeout_Test )

using namespace ::acdk::lang;
using namespace ::acdk::net;

/*

int serverPortBase = 1234;

int getNextServerPort()
{
  return ++serverPortBase;
}
int getServerPort()
{
  return serverPortBase;
}

class ReceiveThread
: public ::acdk::lang::Thread
{
  int _port;
  RbyteArray _expect;

public:
  ReceiveThread(int port, RbyteArray exp)
    : Thread()
  , _port(port)
  , _expect(exp)
  {
  }
	void run()
	{
    try {
      Thread::sleep(200);
      //std::cout << "client starting " << std::endl;
      //std::cout << "client connecting" << std::endl;
 #if defined(ACDK_OS_BSD)
      RString localHost = "127.0.0.0";
#else
      RString localHost = InetAddress::getLocalHost()->toString();
#endif
      Socket socket(localHost, _port);
      //socket.setTcpNoDelay(true);
      //socket.setSoLinger(true, MYSOTIME); // wait for completion at close 5 seconds
      RReader in = socket.getInputStream();
      RWriter out = socket.getOutputStream();
      //std::cout << "client start reading" << std::endl;
      byteArray readed(_expect->length());

      int readcount = in->read(&readed);
      if (::acdk::util::Arrays::equals(RbyteArray(&readed), _expect) == false)
        {
        System::out->println(RString("read:\nexpected: ")
                             + _expect->toString()
                             + "\nreaded: "
                             + readed.toString());
        } else {
        System::out->println(RString("client: readed OK: ") + _expect->length());
      }
      out->write(&readed);
      Thread::sleep(100);
      //in->close();
      //out->close();
      //socket.close();
    } catch (RIOException ex) {
      System::out->println("Client IOException: " + ex->getMessage());
    } catch (RThrowable ex) {
      ex->printStackTrace();
      System::out->println("Client throwable: " + ex->getMessage());
    }


	}
};

class ServerHandleThread
: public ::acdk::lang::Thread
{
  RSocket socket;
  ServerHandleThread(IN(RSocket) socket_)
    : socket(socket_)
  {
  }
  void run()
  {
  }
};

*/

ACDK_DECL_CLASS(EchoThread);

class EchoThread
: public ::acdk::lang::Thread
{
  int _port;
  RbyteArray _expect;
  
public:
  bool shutdown;
  EchoThread(int port, IN(RbyteArray) exp = Nil)
  : _port(port)
  , _expect(exp)
  , shutdown(false)
  {
  }
	void run()
	{
    try {
      ServerSocket server(_port, 1, InetAddress::getLocalHost()/*InetAddress::getWildcardHost()*/);
      RSocket client;
      do {
        System::out->println("server.accept(300);");
        client = server.accept(300);
        if (shutdown == true)
          return;
      } while (client == Nil);
      System::out->println("server accepted!");
      RReader in = client->getInputStream();
      RWriter out = client->getOutputStream();
      int r = in->read();
      System::out->println(RString("readed: ") + (char)r);
      out->write(r);
      return;
    } catch (RIOException ex) {
      System::out->println("Server IOException: " + ex->getMessage());
   } catch (RThrowable ex) {
      ex->printStackTrace();
      System::out->println("Server throwable: " + ex->getMessage());
    }
  }
};



void 
TcpTimeout_Test::acceptTimeOut()
{
  ServerSocket ss(1246);
  RSocket s = ss.accept(1000);
  testAssert(s == Nil);
}

void
TcpTimeout_Test::connectTimeOut()
{
  {
    Socket socket(true);
    bool c = socket.connect("123.123.123.123", 1234, 300);
    testAssert(c == false);
  }
  {
    Socket socket(true);
    bool c = socket.connect("212.227.224.238", 80, 3000);
    testAssert(c == true);
  }

}

void
TcpTimeout_Test::acceptTimeOut2()
{
#if defined(ACDK_OS_BSD)
  RString localHost = "127.0.0.1";
#else
/FONT>
  RString localHost = InetAddress::getLocalHost()->toString();
#endif
/FONT>
  System::out->println("LocalHost: " + InetAddress::getDefaultHostName() + ": " + localHost);
  int acceptPort = 1235;
  REchoThread t = new EchoThread(acceptPort);
  t->start();
  Thread::sleep(1000);
  Socket socket(true);
  bool c = socket.connect(localHost, acceptPort, -1);
  testAssert(c == true);
  RReader reader = socket.getReader();
  RWriter writer = socket.getWriter();
  writer->write('A');
  int r = reader->read();
  testAssert(r == 'A');
  t->shutdown = true;
  t->join(1000);
  Thread::sleep(200);
  bool liv = t->isAlive();
  testAssert(t->isAlive() == false);
}

} // namespace net
} // namespace acdk
} // namespace tests