1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-01-26 10:03:37 +03:00
one/include/test/PoolTest.h
2012-01-12 12:29:18 +01:00

261 lines
6.4 KiB
C++

/* -------------------------------------------------------------------------- */
/* Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) */
/* */
/* Licensed 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 POOL_TEST_H_
#define POOL_TEST_H_
#include <string>
#include "PoolSQL.h"
#include "Nebula.h"
#include "OneUnitTest.h"
// Use this macro in sub-classes to add all the tests defined here
#define ALL_POOLTEST_CPPUNIT_TESTS() \
CPPUNIT_TEST (oid_assignment); \
CPPUNIT_TEST (get_from_cache); \
CPPUNIT_TEST (get_from_db); \
CPPUNIT_TEST (wrong_get); \
CPPUNIT_TEST (drop_and_get); \
using namespace std;
/* ************************************************************************* */
/* ************************************************************************* */
class PoolTest : public OneUnitTest
{
protected:
PoolSQL * pool;
PoolObjectSQL * obj;
/*
* Bootstrap the DB with the neccessary tables for the test
*/
virtual void bootstrap(SqlDB* db) = 0;
/*
* Create the appropiate pool
*/
virtual PoolSQL* create_pool(SqlDB* db) = 0;
/*
* Allocate the indexth sample pool object
*/
virtual int allocate(int index) = 0;
/*
* Check if the indexth sample object is equal to this one
*/
virtual void check(int index, PoolObjectSQL* obj) = 0;
PoolTest():pool(0){};
virtual ~PoolTest(){};
/**
* Replaces all <REGTIME> elements, padding them with 0
*/
string fix_regtimes(string& xml)
{
return fix_time(xml, "REGTIME");
}
string fix_stimes(string& xml)
{
return fix_time(xml, "STIME");
}
string fix_time(string& xml, string elem_name)
{
string start = "<" + elem_name + ">";
string replacement = "0000000000";
size_t pos = 0;
while( (pos = xml.find(start, pos)) != string::npos )
{
if ( xml[pos+start.size()] != '0' )
{
xml.replace( pos+start.size(), replacement.size(), replacement);
}
pos++;
}
return xml;
}
public:
void setUp()
{
create_db();
bootstrap(db);
pool = create_pool(db);
};
void tearDown()
{
delete_db();
if ( pool != 0 )
{
delete pool;
}
};
// *****************************************************************************
void oid_assignment()
{
int oid;
oid = allocate(0);
// first element in the pool should have oid=0
CPPUNIT_ASSERT(oid == 0);
oid = allocate(1);
// second element in the pool should have oid=1
CPPUNIT_ASSERT(oid == 1);
}
// Try to allocate two objects, and retrieve them
void get_from_cache()
{
int oid_0, oid_1;
// Allocate two objects
oid_0 = allocate(0);
oid_1 = allocate(1);
CPPUNIT_ASSERT(oid_0 != -1);
CPPUNIT_ASSERT(oid_1 != -1);
// ---------------------------------
// Get first object and check its integrity
obj = pool->get(oid_0, false);
check(0, obj);
// Same for the second, but ask it to be locked
obj = pool->get(oid_1, true);
if(obj != 0)
{
obj->unlock();
}
check(1, obj);
};
// Try to allocate two objects, and retrieve them
void get_from_db()
{
int oid_0, oid_1;
// Allocate two objects
oid_0 = allocate(0);
oid_1 = allocate(1);
CPPUNIT_ASSERT(oid_0 != -1);
CPPUNIT_ASSERT(oid_1 != -1);
// Clean the cache, forcing the pool to read the objects from the DB
pool->clean();
// ---------------------------------
// Get first object and check its integrity
obj = pool->get(oid_0, false);
check(0, obj);
// Same for the second one, but ask it to be locked
obj = pool->get(oid_1, true);
if(obj != 0)
{
obj->unlock();
}
check(1, obj);
};
void wrong_get()
{
// The pool is empty
// Non existing oid
obj = pool->get(13, false);
CPPUNIT_ASSERT( obj == 0 );
// Allocate an object
allocate(0);
// Ask again for a non-existing oid
obj = pool->get(213, false);
CPPUNIT_ASSERT( obj == 0 );
}
void drop_and_get()
{
int oid_0, oid_1;
string error_str;
// Allocate two objects
oid_0 = allocate(0);
oid_1 = allocate(1);
CPPUNIT_ASSERT(oid_0 != -1);
CPPUNIT_ASSERT(oid_1 != -1);
// Get the first object
obj = pool->get(oid_0, true);
if(obj != 0)
{
obj->unlock();
}
CPPUNIT_ASSERT(obj != 0);
obj->lock();
// Delete it
pool->drop(obj, error_str);
if(obj != 0)
{
obj->unlock();
}
// It should be gone now
obj = pool->get(oid_0, false);
CPPUNIT_ASSERT(obj == 0);
// The cache is cleaned, the object should be also gone from the DB
pool->clean();
obj = pool->get(oid_0, true);
CPPUNIT_ASSERT(obj == 0);
// But the other object must be accessible
obj = pool->get(oid_1, false);
check(1, obj);
};
};
// -----------------------------------------------------------------------------
#endif // POOL_TEST_H_