You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
2.1 KiB

#include <cxxtest/TestSuite.h>
#include <unistd.h>
#include "Common.hpp"
#include "Fixture.hpp"
#include "ObjectPool.hpp"
#include "Thread.hpp"
class TestObjectPool : public CxxTest::TestSuite
{
public:
void testBasic( void )
{
TEST_HEADER;
ObjectPool<int> op;
int a(1);
op.add(a);
TS_ASSERT_EQUALS( op.acquire(), a );
}
void testPointers( void )
{
TEST_HEADER;
ObjectPool<int*> op;
int *a = new int(1);
int *b = new int(2);
op.add(a);
op.add(b);
int *tmp_a = op.acquire();
int *tmp_b = op.acquire();
TS_ASSERT_EQUALS( *tmp_a, *a );
TS_ASSERT_EQUALS( *tmp_b, *b );
// release will delete them
op.release(tmp_a);
op.release(tmp_b);
}
private:
class ObjecPoolUserThread : public Thread
{
public:
ObjecPoolUserThread( ObjectPool<int*> &objectPool
)
: m_objectPool(objectPool)
{
TRACE;
}
private:
void* run()
{
TRACE;
int *a;
try {
a = m_objectPool.acquire();
LOG( Logger::DEBUG, std::string("Acquired int: ").
append(TToStr(*a)).c_str() );
} catch ( CancelledException ex ) {
LOG( Logger::DEBUG, "Cancelled while acquiring" );
}
sleep(1);
try {
m_objectPool.release(a);
} catch ( CancelledException ex ) {
LOG( Logger::DEBUG, "Cancelled while releasing" );
}
return 0;
}
ObjectPool<int*> &m_objectPool;
};
public:
void testCompetingThreads( void )
{
TEST_HEADER;
ObjectPool<int*> op;
ObjecPoolUserThread t1(op);
ObjecPoolUserThread t2(op);
int *a = new int(27);
op.add(a);
t1.start();
t2.start();
t1.join();
t2.join();
// no need to delete "a", dtor of the ConqurrentDeque takes care of it
}
public:
void testCleanUp( void )
{
TEST_HEADER;
ObjectPool<int*> cop;
int *a = new int(12);
int *b = new int(13);
int *c = new int(14);
cop.add(a);
cop.add(b);
cop.add(c);
// ObjecPoolUserThread t1(cop);
// ObjecPoolUserThread t2(cop);
// t1.start();
// t2.start();
cop.clear();
}
};