1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-22 18:50:08 +03:00

feature #192: Tests for the UserPool

This commit is contained in:
Carlos Martin and Ruben S. Montero 2010-04-07 17:56:44 +02:00 committed by Ruben S. Montero
parent a190d11e14
commit b99d4a5d66
3 changed files with 394 additions and 0 deletions

71
src/um/test/SConstruct Executable file
View File

@ -0,0 +1,71 @@
# --------------------------------------------------------------------------
# Copyright 2002-2010, 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.
# --------------------------------------------------------------------------
import os
import sys
import shutil
sys.path.append("../../../share/scons")
from lex_bison import *
# This is the absolute path where the project is located
cwd="../../../"
# Environment that will be applied to each scons child
main_env=Environment()
main_env['ENV']['PATH']=os.environ['PATH']
# Add builders for flex and bison
add_lex(main_env)
add_bison(main_env)
# Include dirs
main_env.Append(CPPPATH=[
cwd + '/include',
'/usr/include/cppunit/',
])
# Library dirs
main_env.Append(LIBPATH=[
cwd + '/src/common',
cwd + '/src/nebula',
cwd + '/src/pool',
cwd + '/src/um',
'/usr/include/openssl/',
])
main_env.Append(LIBS=[
'nebula_um',
'nebula_pool',
'nebula_common',
'nebula_core',
'cppunit',
'dl',
'pthread',
'sqlite3',
'crypto'
])
# Compile flags
main_env.Append(CPPFLAGS=[
"-g",
"-Wall"
])
# Linking flags
main_env.Append(LDFLAGS=["-g "])
main_env.Program('UserPoolTest.cc')

322
src/um/test/UserPoolTest.cc Executable file
View File

@ -0,0 +1,322 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2010, 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. */
/* -------------------------------------------------------------------------- */
#include <string>
#include <iostream>
#include <stdlib.h>
#include <TestFixture.h>
#include <TestAssert.h>
#include <TestSuite.h>
#include <TestCaller.h>
#include <ui/text/TestRunner.h>
#include <cppunit/extensions/HelperMacros.h>
#include <unistd.h>
#include "UserPool.h"
using namespace std;
/* ************************************************************************* */
/* ************************************************************************* */
class UserPoolTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE (UserPoolTest);
CPPUNIT_TEST (sha1_digest);
CPPUNIT_TEST (initial_user);
CPPUNIT_TEST (authenticate);
CPPUNIT_TEST (get_from_cache);
CPPUNIT_TEST (get_from_db);
CPPUNIT_TEST (drop_and_get);
CPPUNIT_TEST (update);
CPPUNIT_TEST_SUITE_END ();
private:
UserPool * pool;
SqliteDB * db;
User* user;
public:
UserPoolTest(){};
~UserPoolTest(){};
void setUp()
{
string db_name = "test.db";
unlink("test.db");
db = new SqliteDB(db_name);
UserPool::bootstrap(db);
// 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.
string pwd = getenv("PWD");
const char * auth = (pwd + "/one_auth").c_str();
setenv("ONE_AUTH", auth, 1);
pool = new UserPool(db);
};
void tearDown()
{
delete db;
delete pool;
remove ("test.db");
};
/* ********************************************************************* */
/* ********************************************************************* */
void sha1_digest()
{
string st = "top_secret_string";
string sha1 = "773260f433f7fd6f89c1f1bfc32e080fc0748478";
CPPUNIT_ASSERT( sha1 == User::sha1_digest(st) );
}
void initial_user()
{
// When creating a new pool, the constructor will check if the DB
// contains at least one user.
// If it doesn't, it adds one automatically from:
// * The $ONE_AUTH file.
// * The ~/.one/one_auth file.
// The ONE_AUTH environment variable was forced to point to a prepared
// one_auth file at set-up, so the pool should contain the user
// one_user_test:password
user = pool->get(0, false);
CPPUNIT_ASSERT(user != 0);
CPPUNIT_ASSERT( user->get_uid() == 0 );
CPPUNIT_ASSERT( user->get_username() == "one_user_test" );
CPPUNIT_ASSERT( user->get_password() == User::sha1_digest("password") );
}
void authenticate()
{
// There is an initial user, created with the one_auth file:
// one_user_test:password
string session =
"one_user_test:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8";
int oid = pool->authenticate( session );
CPPUNIT_ASSERT( oid == 0 );
session = "one_user_test:wrong_password";
oid = pool->authenticate( session );
CPPUNIT_ASSERT( oid == -1 );
session =
"unknown_user:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8";
oid = pool->authenticate( session );
CPPUNIT_ASSERT( oid == -1 );
}
// Try to allocate two objects, and retrieve them
void get_from_cache()
{
string username_1 = "A user";
string username_2 = "B user";
string pass_1 = "A pass";
string pass_2 = "B pass";
int oid_1, oid_2;
pool->allocate(&oid_1, username_1, pass_1, true);
// first element in the pool should have oid=1 (the 0th one is created
// by the UserPool constructor)
CPPUNIT_ASSERT(oid_1 == 1);
pool->allocate(&oid_2, username_2, pass_2, true);
// second element in the pool should have oid=2
CPPUNIT_ASSERT(oid_2 == 2);
// ---------------------------------
user = pool->get(oid_1, false);
CPPUNIT_ASSERT(user != 0);
CPPUNIT_ASSERT( user->get_uid() == 1 );
CPPUNIT_ASSERT( user->get_username() == username_1 );
CPPUNIT_ASSERT( user->get_password() == pass_1 );
// ---------------------------------
user = pool->get(oid_2, true);
CPPUNIT_ASSERT(user != 0);
CPPUNIT_ASSERT( user->get_uid() == 2 );
CPPUNIT_ASSERT( user->get_username() == username_2 );
CPPUNIT_ASSERT( user->get_password() == pass_2 );
user->unlock();
};
// Try to allocate two objects, and retrieve them
void get_from_db()
{
string username_1 = "A user";
string username_2 = "B user";
string pass_1 = "A pass";
string pass_2 = "B pass";
int oid_1, oid_2;
pool->allocate(&oid_1, username_1, pass_1, true);
pool->allocate(&oid_2, username_2, pass_2, true);
string str;
// Get the xml representation of the two users
string xml_1 = pool->get(oid_1, false)->to_xml(str);
string xml_2 = pool->get(oid_2, false)->to_xml(str);
// Clean the users from the cache, forcing the pool to read them from
// the DB when we retrieve them
pool->clean();
// ---------------------------------
user = pool->get(oid_1, false);
CPPUNIT_ASSERT(user != 0);
// The user objects constructed from the data in the DB should be the
// same as the previous ones
CPPUNIT_ASSERT(user->to_xml(str) == xml_1);
CPPUNIT_ASSERT(user->get_uid() == oid_1);
CPPUNIT_ASSERT(user->get_username() == username_1);
CPPUNIT_ASSERT(user->get_password() == pass_1);
// ---------------------------------
user = pool->get(oid_2, true);
CPPUNIT_ASSERT(user != 0);
CPPUNIT_ASSERT(user->to_xml(str) == xml_2);
CPPUNIT_ASSERT(user->get_uid() == oid_2);
CPPUNIT_ASSERT(user->get_username() == username_2);
CPPUNIT_ASSERT(user->get_password() == pass_2);
user->unlock();
};
void drop_and_get()
{
string username_1 = "A user";
string username_2 = "B user";
string pass_1 = "A pass";
string pass_2 = "B pass";
int oid_1, oid_2;
pool->allocate(&oid_1, username_1, pass_1, true);
pool->allocate(&oid_2, username_2, pass_2, true);
// Get the first user (A)
user = pool->get(oid_1,true);
CPPUNIT_ASSERT(user != 0);
// Delete it
pool->drop(user);
user->unlock();
// It should be gone now
user = pool->get(oid_1,true);
CPPUNIT_ASSERT(user == 0);
// The cache is cleaned, the user should be also gone from the DB
pool->clean();
user = pool->get(oid_1,true);
CPPUNIT_ASSERT(user == 0);
// But the other user must be accessible
user = pool->get(oid_2,false);
CPPUNIT_ASSERT(user != 0);
};
void update()
{
string username_1 = "A user";
string pass_1 = "A pass";
int oid_1, oid_2;
// Allocate some users, to popullate the DB
pool->allocate(&oid_2, "someone", pass_1, true);
pool->allocate(&oid_2, "some_user", pass_1, true);
// The user we are interested in
pool->allocate(&oid_1, username_1, pass_1, true);
// Some more users...
pool->allocate(&oid_2, "not_used", pass_1, true);
pool->allocate(&oid_2, "no_name", pass_1, true);
user = pool->get(oid_1, true);
// User object should be cached. Let's update its status
user->disable();
pool->update(user);
user->unlock();
// When the user is updated, there should be only one entry at the DB
vector<int> results;
int rc;
ostringstream oss;
oss << "oid = " << oid_1;
rc = pool->search(results,"user_pool", oss.str());
CPPUNIT_ASSERT(rc == 0);
CPPUNIT_ASSERT(results.size() == 1);
CPPUNIT_ASSERT(results.at(0) == oid_1);
user = pool->get(oid_1,false);
CPPUNIT_ASSERT( user->isEnabled() == false );
//Now force access to DB
pool->clean();
user = pool->get(oid_1,false);
CPPUNIT_ASSERT( user->isEnabled() == false );
};
};
/* ************************************************************************* */
/* ************************************************************************* */
/* ************************************************************************* */
int main(int argc, char ** argv)
{
CppUnit::TextUi::TestRunner runner;
runner.addTest( UserPoolTest::suite() );
runner.run();
return 0;
}

1
src/um/test/one_auth Normal file
View File

@ -0,0 +1 @@
one_user_test:password