2005-06-02
boost::test
레이옷은 종전까지 CppUnit를 애용해왔다. 그러나 이넘은 VC7 에서는 컴파일조차 되지 않았다. 그리하여, 새로운 UnitTest 툴을 찾다가 발견한 것이 바로 이 Boost Library 에 포함된 BoostTest 이다. 이하 설명은 모두 VC7 을 사용한다고 가정하고 설명하겠다.
사용법
BoostTest 에는 아래와 같은 모듈이 포함되어 있다.
모듈 | 설명 |
---|---|
Execution Monitor | 실행 모니터, 아래 프로그램 실행 모니터 및 테스트 실행 모니터의 베이스 모듈 |
Program Execution Mointor | 배포되는 실행 프로그램의 테스트를 위해 |
Test Execution Mointor | 개발중인 실행 프로그램의 테스트를 위해 |
Unit Test Framework | 유닛 테스트.. 우리가 사용할 것이 이거다 |
Test Tools | 위에 4개 모듈에서 사용하는 각종 테스트 루틴 및 매크로들 |
이 중에서 레이옷이 사용하는 것은 Unit Test Framework ( + Test Tools ) 이다. 우선 상세한 내용은 같이 배포되는 문서를 참고하기 바란다. 여기서는 실제 프로젝트와 어떻게 연관지을 것인가만을 고민한다.
- 테스트할 모듈의 프로젝트 이름이 XXX 라고 하자.
- 그러면 이 프로젝트를 테스트할 프로젝트인 test_XXX 를 솔루션에 새로 추가한다.
- 이 프로젝트를 LibXXX 프로젝트에 종속되도록 설정한다.
- Build Event 의 '''Custom Build''' 에 다음과 같은 내용을 추가하라.
- "$(TargetPath)" --report_level=detailed --log_level=all
- 참고로 --log_level 은 BOOST_MESSAGE, BOOST_WARN_MESSAGE, BOOST_CHECKPOINT 등의 매크로들의 출력을 화면에 나타낸다.
- 나중에 메시지들이 귀찮아지면 모두 끄도록 한다. 이에 대한 내용 역시 문서를 참고할 것
BoostTest with wstring
UniCode 기반의 어플리케이션을 테스트할 때, BOOST_XXX 매크로에서 wide string 이 포함될 경우, 변환할 수 없다는 에러가 발생한다. 그럴 경우 아래의 코드를 해당 테스트 상단에 넣어주면 임시방편으로 수정이 가능하다. 물론 wstring string 컨버팅 함수는 직접 작성해야 한다. :)
namespace boost { namespace test_tools { namespace tt_detail {
template
struct print_log_value
{
void operator()( std::ostream& ostr, std::wstring t )
{
std::string s = convert_wstring_to_string(t);
ostr
// testLibCore.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
#include "stdafx.h"
#include
using namespace boost::unit_test_framework;
#include "MMSocket.h"
void test_winsock()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
MMSocket::EndWinsock();
}
void test_socket_ctor()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
MMSocket client;
BOOST_CHECK( !client.IsAlive() );
BOOST_CHECK( client.GetErrorCode() == 0 );
BOOST_CHECK( client.GetHost() == MMString(TEXT("Unknown")) );
BOOST_CHECK( client.GetPort() == 0 );
BOOST_CHECK( client.Create() );
BOOST_CHECK( client.IsAlive() );
client.Close();
BOOST_CHECK( !client.IsAlive() );
MMSocket::EndWinsock();
}
void test_serversocket_create_with_port()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
WORD wPort = 8888;
MMServerSocket server;
BOOST_CHECK( server.IsAlive() );
BOOST_CHECK( server.GetErrorCode() == 0 );
BOOST_CHECK( server.GetHost() == MMString(TEXT("Unknown")) );
BOOST_CHECK( server.GetPort() == 0 );
BOOST_CHECK( server.Bind(wPort) );
BOOST_CHECK( server.GetHost() == MMString(TEXT("localhost")) );
// default host = localhost
BOOST_CHECK( server.GetPort() == wPort );
server.Close();
BOOST_CHECK( !server.IsAlive() );
MMSocket::EndWinsock();
}
void test_serversocket_create_with_addr()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
MMString strHost = TEXT("localhost");
WORD wPort = 8888;
MMServerSocket server;
BOOST_CHECK( server.IsAlive() );
BOOST_CHECK( server.Bind(wPort) );
BOOST_CHECK( server.GetHost() == MMString(TEXT("localhost")) );
BOOST_CHECK( server.GetPort() == wPort );
server.Close();
MMSocket::EndWinsock();
}
void test_serversocket_create_with_public_ip()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
MMString strHost = TEXT("61.74.134.38");
WORD wPort = 8888;
MMServerSocket server;
BOOST_CHECK( server.IsAlive() );
BOOST_CHECK( server.Bind(strHost,wPort) );
BOOST_CHECK( server.GetHost() == MMString(TEXT("61.74.134.38")) );
BOOST_CHECK( server.GetPort() == wPort );
server.Close();
MMSocket::EndWinsock();
}
void test_serversocket_create_with_private_ip()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
MMString strHost = TEXT("192.168.0.1");
WORD wPort = 8888;
MMServerSocket server;
BOOST_CHECK( server.IsAlive() );
BOOST_CHECK( server.Bind(strHost,wPort) );
BOOST_CHECK( server.GetHost() == MMString(TEXT("192.168.0.1")) );
BOOST_CHECK( server.GetPort() == wPort );
server.Close();
MMSocket::EndWinsock();
}
void test_serversocket_listen()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
PTCHAR szHost = TEXT("192.168.0.1");
WORD wPort = 8888;
MMServerSocket server;
BOOST_CHECK( server.Bind(szHost,wPort) );
BOOST_CHECK( server.Listen() );
MMSocket::EndWinsock();
}
void test_socket_connect()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
PTCHAR szHost = TEXT("61.74.134.38");
WORD wPort = 8888;
MMServerSocket server;
BOOST_CHECK( server.Bind(szHost,wPort) );
BOOST_CHECK( server.Listen() );
BOOST_CHECK( server.IsAlive() );
MMSocket client;
client.Create();
BOOST_CHECK( client.IsAlive() );
BOOST_CHECK( client.Connect(szHost,wPort) );
client.Close();
server.Close();
MMSocket::EndWinsock();
}
void test_socket_connect_fail()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
PTCHAR szHost = TEXT("61.74.134.38");
WORD wPort = 8888;
MMServerSocket server;
BOOST_CHECK( server.Bind(szHost,wPort) );
BOOST_CHECK( server.Listen() );
BOOST_CHECK( server.IsAlive() );
MMSocket client;
client.Create();
BOOST_CHECK( client.IsAlive() );
BOOST_CHECK( !client.Connect(szHost,wPort-1) ); // must be failed
client.Close();
server.Close();
MMSocket::EndWinsock();
}
void test_serversocket_accept()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
PTCHAR szHost = TEXT("61.74.134.38");
WORD wPort = 8888;
MMServerSocket server;
BOOST_CHECK( server.Bind(szHost,wPort) );
BOOST_CHECK( server.Listen() );
BOOST_CHECK( server.IsAlive() );
MMSocket client;
client.Create();
BOOST_CHECK( client.IsAlive() );
BOOST_CHECK( client.Connect(szHost,wPort) );
MMSocket * pClient = server.Accept();
BOOST_CHECK( pClient != NULL );
BOOST_CHECK( pClient->IsAlive() );
//BOOST_CHECK( pClient->GetHost() == client.GetHost() );
//BOOST_CHECK( pClient->GetPort() == client.GetPort() );
client.Close();
server.Close();
MMSocket::EndWinsock();
}
/*
* accept 전에 닫아도 accept 된다.. 음냐..
*/
void test_serversocket_accept_failed()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
PTCHAR szHost = TEXT("61.74.134.38");
WORD wPort = 8888;
MMServerSocket server;
BOOST_CHECK( server.Bind(szHost,wPort) );
BOOST_CHECK( server.Listen() );
BOOST_CHECK( server.IsAlive() );
MMSocket client;
client.Create();
BOOST_CHECK( client.IsAlive() );
BOOST_CHECK( client.Connect(szHost,wPort) );
client.Close(); // close before accept
Sleep(100);
MMSocket * pClient = server.Accept();
BOOST_WARN_MESSAGE( pClient == NULL, "헹.. 널이어야 할텐데.." );
server.Close();
MMSocket::EndWinsock();
}
/*
* 정말 nonblocking 인지 확인해봐야 하지 않나?? 그걸 알아내는 방법은?
*/
void test_socket_blocking()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
MMSocket client;
client.Create();
BOOST_CHECK( client.EnableNonblock() );
BOOST_CHECK( client.DisableNonblock() );
client.Close();
MMSocket::EndWinsock();
}
void test_socket_linger()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
MMSocket client;
client.Create();
BOOST_CHECK( !client.IsEnabledLinger() ); // no linger at default
BOOST_CHECK( client.GetLingerTime() == 0 );
BOOST_CHECK( client.EnableLinger(100) );
BOOST_CHECK( client.IsEnabledLinger() );
BOOST_CHECK( client.GetLingerTime() == 100 );
BOOST_CHECK( client.DisableLinger() );
BOOST_CHECK( !client.IsEnabledLinger() );
BOOST_CHECK( client.GetLingerTime() == 100 ); // do not cleared
client.Close();
MMSocket::EndWinsock();
}
void test_socket_recv_buffer()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
MMSocket client;
client.Create();
BOOST_CHECK( client.GetRecvBufferSize() == 8192 ); // default buffer size
BOOST_CHECK( client.SetRecvBufferSize(10000) );
BOOST_CHECK( client.GetRecvBufferSize() == 10000 );
BOOST_CHECK( client.SetRecvBufferSize(65535) );
BOOST_CHECK( client.GetRecvBufferSize() == 65535 );
BOOST_CHECK( client.SetRecvBufferSize(65535*2) );
BOOST_CHECK( client.GetRecvBufferSize() == 65535*2 );
client.Close();
MMSocket::EndWinsock();
}
void test_socket_send_buffer()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
MMSocket client;
client.Create();
BOOST_CHECK( client.GetSendBufferSize() == 8192 ); // default buffer size
BOOST_CHECK( client.SetSendBufferSize(10000) );
BOOST_CHECK( client.GetSendBufferSize() == 10000 );
BOOST_CHECK( client.SetSendBufferSize(65535) );
BOOST_CHECK( client.GetSendBufferSize() == 65535 );
BOOST_CHECK( client.SetSendBufferSize(65535*2) );
BOOST_CHECK( client.GetSendBufferSize() == 65535*2 );
BOOST_CHECK( client.SetSendBufferSize(-1) );
BOOST_CHECK( client.GetSendBufferSize() == -1 );
client.Close();
MMSocket::EndWinsock();
}
void test_socket_nagle()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
MMSocket client;
client.Create();
BOOST_CHECK( client.IsEnabledNagle() ); // enabled at default
BOOST_CHECK( client.DisableNagle() );
BOOST_CHECK( !client.IsEnabledNagle() );
BOOST_CHECK( client.EnableNagle() );
BOOST_CHECK( client.IsEnabledNagle() );
client.Close();
MMSocket::EndWinsock();
}
void test_serversocket_reuseaddr()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
MMServerSocket server;
BOOST_CHECK( server.Bind( TEXT("61.74.134.38") ,9999) );
MMServerSocket server2;
BOOST_CHECK( !server2.Bind( TEXT("61.74.134.38") ,9999) );
server2.Close();
MMServerSocket server3;
BOOST_CHECK( server3.EnableReuseAddr() );
BOOST_CHECK( server3.Bind( TEXT("61.74.134.38") ,9999) );
server3.Close();
MMServerSocket server4;
BOOST_CHECK( server4.EnableReuseAddr() );
BOOST_CHECK( server4.DisableReuseAddr() );
BOOST_CHECK( !server4.Bind( TEXT("61.74.134.38") ,9999) );
server4.Close();
server.Close();
MMSocket::EndWinsock();
}
void test_socket_gethostbyname()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
PTCHAR szHost = TEXT("comeng.ce.knu.ac.kr");
BOOST_CHECK( MMSocket::GetHostByName(szHost) == MMString(TEXT("155.230.29.10")) );
szHost = TEXT("mudmania.org");
BOOST_CHECK( MMSocket::GetHostByName(szHost) == MMString(TEXT("61.74.134.38")) );
//szHost = TEXT("reiot.cafe24.com");
//BOOST_CHECK( MMSocket::GetHostByName(szHost) == MMString(TEXT("61.74.134.38")) );
szHost = TEXT("mudmania2.org");
BOOST_CHECK( MMSocket::GetHostByName(szHost) == MMString("") );
MMSocket::EndWinsock();
}
void test_socket_send()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
PTCHAR szHost = TEXT("61.74.134.38");
WORD wPort = 9999;
MMServerSocket server;
BOOST_CHECK( server.Bind(szHost,wPort) );
BOOST_CHECK( server.Listen() );
MMSocket client;
client.Create();
BOOST_CHECK( client.Connect(szHost,wPort) );
MMSocket * pClient = server.Accept();
BOOST_CHECK( pClient != NULL );
PTCHAR szSendMsg = TEXT("Hello World!");
int iSendMsgLen = lstrlen(szSendMsg);
BOOST_CHECK( iSendMsgLen == client.Send(szSendMsg,iSendMsgLen) );
TCHAR szRecvMsg[1024];
int iRecvMsgLen = pClient->Receive(szRecvMsg,1024);
if ( iRecvMsgLen > 0 )
{
szRecvMsg[iRecvMsgLen] = 0;
}
BOOST_CHECK_MESSAGE( iRecvMsgLen == iSendMsgLen, "Received Msg : " Receive(szRecvMsg,1024);
BOOST_CHECK_MESSAGE( iRecvMsgLen == 0 ,
"second recv = " GetErrorCode() );
pClient->Close();
SAFE_DELETE(pClient);
server.Close();
MMSocket::EndWinsock();
}
/* just receive (guess socket is nonblocking) */
void test_socket_nonblocked_recv()
{
BOOST_CHECK( MMSocket::BeginWinsock() );
PTCHAR szHost = TEXT("61.74.134.38");
WORD wPort = 80;
MMSocket client;
client.Create(true);
BOOST_CHECK( client.Connect(szHost,wPort) );
client.EnableNonblock();
TCHAR szRecvMsg[1024];
int iRecvMsgLen = client.Receive(szRecvMsg,1024);
BOOST_CHECK( iRecvMsgLen == -1 );
BOOST_CHECK( client.GetErrorCode() == WSAEWOULDBLOCK );
client.Close();
MMSocket::EndWinsock();
}
/*
*TODO*
- connect
- socket constructor
- error code checking
- invalid address
- socket buffer
- socket blocking
- 연결 실패
*/
test_suite * test_MMSocket()
{
test_suite * test = BOOST_TEST_SUITE( "MMSocket Test" );
test->add( BOOST_TEST_CASE( &test_winsock ) , 0 );
test->add( BOOST_TEST_CASE( &test_socket_ctor ) , 0 );
test->add( BOOST_TEST_CASE( &test_serversocket_create_with_port ) , 0 );
test->add( BOOST_TEST_CASE( &test_serversocket_create_with_addr ) , 0 );
test->add( BOOST_TEST_CASE( &test_serversocket_create_with_public_ip ) , 0 );
test->add( BOOST_TEST_CASE( &test_serversocket_create_with_private_ip ) , 0 );
test->add( BOOST_TEST_CASE( &test_serversocket_listen ) , 0 );
test->add( BOOST_TEST_CASE( &test_socket_gethostbyname ) , 0 );
test->add( BOOST_TEST_CASE( &test_socket_connect ) , 0 );
test->add( BOOST_TEST_CASE( &test_socket_connect_fail ) , 0 );
test->add( BOOST_TEST_CASE( &test_serversocket_accept ) , 0 );
test->add( BOOST_TEST_CASE( &test_serversocket_accept_failed ) , 0 );
test->add( BOOST_TEST_CASE( &test_socket_blocking ) , 0 );
test->add( BOOST_TEST_CASE( &test_socket_linger ) , 0 );
test->add( BOOST_TEST_CASE( &test_socket_recv_buffer ) , 0 );
test->add( BOOST_TEST_CASE( &test_socket_send_buffer ) , 0 );
test->add( BOOST_TEST_CASE( &test_socket_nagle ) , 0 );
test->add( BOOST_TEST_CASE( &test_serversocket_reuseaddr ) , 0 );
test->add( BOOST_TEST_CASE( &test_socket_send ) , 0 );
test->add( BOOST_TEST_CASE( &test_socket_nonblocked_recv ) , 0 );
return test;
}
Source: http://boxcatstudio.wordpress.com/2005/06/02/boosttest/
Category:programming
Tags:testboostTDD
Category:programming
Tags:testboostTDD