1
0
mirror of https://github.com/OpenNebula/one.git synced 2024-12-24 21:34:01 +03:00
one/include/test/OneUnitTest.h

245 lines
7.0 KiB
C++

/* -------------------------------------------------------------------------- */
/* Copyright 2002-2011, 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 ONE_UNIT_TEST_H_
#define ONE_UNIT_TEST_H_
#include <string>
#include <iostream>
#include <stdlib.h>
#include <getopt.h>
#include <TestFixture.h>
#include <TestAssert.h>
#include <TestSuite.h>
#include <TestCaller.h>
#include <ui/text/TestRunner.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/XmlOutputter.h>
#include <unistd.h>
#include "SqlDB.h"
#include "SqliteDB.h"
#include "MySqlDB.h"
using namespace std;
/* ************************************************************************* */
/* ************************************************************************* */
class OneUnitTest : public CppUnit::TestFixture
{
protected:
// Global flag to use either Sqlite or MySQL
static bool mysql;
static SqlDB * db;
static string db_name;
static string xml_name;
public:
void create_db()
{
if (mysql)
{
db = new MySqlDB( "localhost",0,
"oneadmin","oneadmin",db_name);
ostringstream oss1;
oss1 << "DROP DATABASE IF EXISTS " << db_name;
db->exec(oss1);
ostringstream oss;
oss << "CREATE DATABASE " << db_name;
db->exec(oss);
ostringstream oss2;
oss2 << "use " << db_name;
db->exec(oss2);
}
else
{
unlink(db_name.c_str());
db = new SqliteDB(db_name);
}
};
void delete_db()
{
if (mysql)
{
ostringstream oss;
oss << "DROP DATABASE IF EXISTS " << db_name;
db->exec(oss);
}
else
{
unlink(db_name.c_str());
}
if ( db != 0 )
{
delete db;
}
};
static SqlDB * get_db()
{
return db;
}
static void set_one_auth(string path = "../../test/one_auth")
{
// The UserPool constructor checks if the DB contains at least
// one user, and adds one automatically from the ONE_AUTH file.
// So the ONE_AUTH environment is forced to point to a test one_auth
// file.
ostringstream oss;
oss << getenv("PWD") << "/" << path;
setenv("ONE_AUTH", oss.str().c_str(), 1);
}
// *****************************************************************************
// *****************************************************************************
static void show_options ()
{
cout << "Options:\n";
cout << " -h --help Show this help\n"
" -s --sqlite Run Sqlite tests (default)\n"
" -m --mysql Run MySQL tests\n"
" -l --log Keep the log file, test.log\n"
" -x --xml Create xml output files, for Hudson\n";
}
/*
* Not a true main, but a static method that can be called from the
* child classes' true main.
* Options:
* s: run sqlite tests
* m: run mysql tests
*/
static int main(int argc,
char ** argv,
CPPUNIT_NS::TestSuite* suite,
string xml_name = "output.xml")
{
// Option flags
bool sqlite_flag = true;
bool log_flag = false;
bool xml_flag = false;
// Long options
const struct option long_opt[] =
{
{ "sqlite", 0, NULL, 's'},
{ "mysql", 0, NULL, 'm'},
{ "log", 0, NULL, 'l'},
{ "help", 0, NULL, 'h'},
{ "xml", 0, NULL, 'x'}
};
int c;
while ((c = getopt_long (argc, argv, "smlhx", long_opt, NULL)) != -1)
switch (c)
{
case 'm':
sqlite_flag = false;
break;
case 'l':
log_flag = true;
break;
case 'x':
xml_flag = true;
break;
case 'h':
show_options();
return 0;
}
// When a DB query fails, it tries to log the error.
// We need to set the log file, otherwise it will end in a dead-lock
NebulaLog::init_log_system(NebulaLog::FILE, Log::DEBUG, "test.log");
NebulaLog::log("Test", Log::INFO, "Test started");
// Set the opennebula install location to be the current dir.
// This will prevent some of the tests from writing the individual
// VM log files in an existing OpenNebula installation
setenv("ONE_LOCATION", ".", 1);
CppUnit::TextUi::TestRunner runner;
ofstream outputFile;
if( xml_flag )
{
outputFile.open(xml_name.c_str());
CppUnit::XmlOutputter* outputter =
new CppUnit::XmlOutputter(&runner.result(), outputFile);
runner.setOutputter(outputter);
}
runner.addTest( suite );
if (sqlite_flag)
{
OneUnitTest::mysql = false;
NebulaLog::log("Test", Log::INFO, "Running Sqlite tests...");
cout << "\nRunning Sqlite tests...\n";
}
else
{
OneUnitTest::mysql = true;
NebulaLog::log("Test", Log::INFO, "Running MySQL tests...");
cout << "\nRunning MySQL tests...\n";
}
runner.run();
if( xml_flag )
{
outputFile.close();
}
if (!log_flag)
remove("test.log");
NebulaLog::finalize_log_system();
return 0;
}
};
/* -----------------------------------------------------------------------------
int main(int argc, char ** argv)
{
return OneUnitTest::main(argc, argv, TestClass::suite());
}
----------------------------------------------------------------------------- */
#endif // ONE_UNIT_TEST_H_