Skip to content
Snippets Groups Projects
Commit 33157a84 authored by Nick Draper's avatar Nick Draper
Browse files

logging and configuration added inc tests re #21

parent 4199dba5
No related merge requests found
#ifndef MANTID_CONFIGSVC_H_
#define MANTID_CONFIGSVC_H_
//----------------------------------------------------------------------
// Includes
//----------------------------------------------------------------------
#include <string>
//forward declaration
namespace Poco
{
namespace Util
{
class PropertyFileConfiguration;
class SystemConfiguration;
}
}
namespace Mantid
{
/** @class ConfigSvc ConfigSvc.h Kernel/ConfigSvc.h
The ConfigSvc class provides a simple facade to access the Configuration functionality of the Mantid Framework.
The class gathers information from config files and the system varaibles.
This information is available to all the objects within the framework as well as being used to configure the logging framework.
This class currently uses the Logging functionality provided through the POCO (portable components library).
@author Nicholas Draper, Tessella Support Services plc
@date 15/10/2007
Copyright ? 2007 ???RAL???
This file is part of Mantid.
Mantid is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
Mantid is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
File change history is stored at: <https://svn.mantidproject.org/mantid/trunk/Code/Mantid>
*/
class ConfigSvc
{
/// Inner templated class to wrap the poco library objects that have protected desctructors and expose them as public
template<typename T >
class WrappedObject : public T
{
public:
typedef T element_type;
WrappedObject()
{
m_pPtr = static_cast<T*>(this);
}
template<typename Field>
WrappedObject(const Field& F) : T(F)
{
m_pPtr = static_cast<T*>(this);
}
WrappedObject(const WrappedObject<T>& A) : T(A)
{
m_pPtr = static_cast<T*>(this);
}
virtual ~WrappedObject()
{}
const T& operator*() const { return *m_pPtr; }
T& operator*() { return m_pPtr; }
const T* operator->() const{ return m_pPtr; }
T* operator->() { return m_pPtr; }
private:
T* m_pPtr;
};
public:
/// A static method which retrieves the single instance of the ConfigSvc
///
/// @returns A pointer to the instance
static ConfigSvc* Instance()
{
if (!m_instance) m_instance = new ConfigSvc;
return m_instance;
}
/// Loads the config file provided, any previous configuration is discarded.
/// If the file contains logging setup instructions then these will be used to setup the logging framework.
///
/// @param filename The filename and optionally path of the file to load
void loadConfig(const std::string& filename);
/// Searches for the string within the currently loaded configuaration values and returns to value as a string.
///
/// @param keyName The case sensitive name of the property that you need the value of.
/// @returns the string value of the property
std::string getString(const std::string& keyName);
/// Searches for the string within the currently loaded configuaration values and returns to value as an integer.
///
/// @param keyName The case sensitive name of the property that you need the value of.
/// @returns the integer value of the property
int getInt(const std::string& keyName);
/// Searches for the string within the currently loaded configuaration values and returns to value as a double.
///
/// @param keyName The case sensitive name of the property that you need the value of.
/// @returns the double value of the property
double getDouble(const std::string& keyName);
/// Searches for the string within the environment variables and returns to value as a string.
///
/// @param keyName The name of the environment variable that you need the value of.
/// @returns the string value of the property
std::string getEnvironment(const std::string& keyName);
/// Gets the name of the operation system
///
/// @returns the string value of the operation system version
std::string getOSName();
/// Gets the name of the computer running Mantid
///
/// @returns the string value of the name of the computer
std::string getComputerName();
/// Gets the name of the operation system Architecture
///
/// @returns the string value of the operation system Architecture
std::string getOSArchitecture();
/* Removed as the use of these throughs a debug assertion about an invlid heap pointer
File dbgheap.c
Expression _CrtIsValidHeapPointer(pUserData)
/// Gets the name of the operation system version
///
/// @returns the string value of the operation system version
std::string getOSVersion();
/// Gets the path of the current directory
///
/// @returns the string value of the path of the current directory
std::string getCurrentDir();
/// Gets the path of the home directory
///
/// @returns the string value of the path of the home directory
std::string getHomeDir();
/// Gets the path of the temp directory
///
/// @returns the string value of the path of the temp directory
std::string getTempDir();
*/
/// Destructor
/// Prevents client from calling 'delete' on the pointer handed
/// out by Instance
virtual ~ConfigSvc();
private:
/// Private Constructor for singleton class
ConfigSvc();
/// Private copy constructor
/// Prevents singleton being copied
ConfigSvc(const ConfigSvc&) {}
/// the POCO file config object
WrappedObject<Poco::Util::PropertyFileConfiguration>* m_pConf;
/// the POCO system Config Object
WrappedObject<Poco::Util::SystemConfiguration>* m_pSysConfig;
/// Pointer to the factory instance
static ConfigSvc* m_instance;
};
}
#endif /*MANTID_CONFIGSVC_H_*/
......@@ -112,7 +112,7 @@ namespace Mantid
//void dump(const std::string& msg, const void* buffer, std::size_t length, Message::Priority prio = Message::PRIO_DEBUG);
/// Returns true if at least the given log level is set.
/// @param level The logging level 0=trace, 1=debug, 2=information, 3=notice, 4=warning, 5=error, 6=critical, 7=fatal
/// @param level The logging level 8=trace, 7=debug, 6=information, 5=notice, 4=warning, 3=error, 2=critical, 1=fatal
bool is(int level) const;
/// Returns a reference to the Logger with the given name.
......@@ -125,12 +125,13 @@ namespace Mantid
/// Loggers.
static void shutdown();
protected:
///Protecxted Conctractor called by static get method
Logger(const std::string& name);
///protected destructor
/// destructor
~Logger();
protected:
///Protected Constructor called by static get method
Logger(const std::string& name);
private:
///no arg constructor
Logger();
......@@ -142,8 +143,6 @@ namespace Mantid
std::string _name;
};
}
#endif /*MANTID_LOGGINGSERVICE_H_*/
#include "../inc/ConfigSvc.h"
#include "Poco/Util/LoggingConfigurator.h"
#include "Poco/Util/SystemConfiguration.h"
#include "Poco/Util/PropertyFileConfiguration.h"
namespace Mantid
{
// Initialise the instance pointer to zero
ConfigSvc* ConfigSvc::m_instance=0;
//private constructor
ConfigSvc::ConfigSvc()
{
//getting at system details
m_pSysConfig = new WrappedObject<Poco::Util::SystemConfiguration>;
m_pConf = 0;
}
//destructor
ConfigSvc::~ConfigSvc()
{
delete m_pSysConfig;
delete m_pConf;
}
void ConfigSvc::loadConfig(const std::string& filename)
{
delete m_pConf;
m_pConf = new WrappedObject<Poco::Util::PropertyFileConfiguration>(filename);
//configure the logging framework
Poco::Util::LoggingConfigurator configurator;
configurator.configure(m_pConf);
}
std::string ConfigSvc::getString(const std::string& keyName)
{
return m_pConf->getString(keyName);
}
int ConfigSvc::getInt(const std::string& keyName)
{
return 1;
}
double ConfigSvc::getDouble(const std::string& keyName)
{
return 1.0;
}
std::string ConfigSvc::getEnvironment(const std::string& keyName)
{
return m_pSysConfig->getString("system.env." + keyName);
}
std::string ConfigSvc::getOSName()
{
return m_pSysConfig->getString("system.osName");
}
std::string ConfigSvc::getOSArchitecture()
{
return m_pSysConfig->getString("system.osArchitecture");
}
std::string ConfigSvc::getComputerName()
{
return m_pSysConfig->getString("system.nodeName");
}
/* Removed as the use of these throughs a debug assertion about an invlid heap pointer
File dbgheap.c
Expression _CrtIsValidHeapPointer(pUserData)
std::string ConfigSvc::getOSVersion()
{
return m_pSysConfig->getString("system.osVersion");
}
std::string ConfigSvc::getCurrentDir()
{
return m_pSysConfig->getString("system.currentDir");
}
std::string ConfigSvc::getHomeDir()
{
return m_pSysConfig->getString("system.homeDir");
}
std::string ConfigSvc::getTempDir()
{
return m_pSysConfig->getString("system.tempDir");
}
*/
}
\ No newline at end of file
......@@ -3,8 +3,8 @@
namespace Mantid
{
Logger::Logger(const std::string& name): _log(Poco::Logger::get(_name))
{
Logger::Logger(const std::string& name): _log(Poco::Logger::get(name))
{
_name = name;
}
......
#ifndef MANTID_CONFIGSVCTEST_H_
#define MANTID_CONFIGSVCTEST_H_
#include <cxxtest/TestSuite.h>
#include "../inc/ConfigSvc.h"
#include "../inc/Logger.h"
#include <string>
using namespace Mantid;
class ConfigSvcTest : public CxxTest::TestSuite
{
public:
ConfigSvcTest()
{
configSvc = Mantid::ConfigSvc::Instance();
configSvc->loadConfig("MantidTest.properties");
}
void testLogging()
{
//attempt some logging
Logger& log1 = Logger::get("logTest");
TS_ASSERT_THROWS_NOTHING(log1.trace("a trace string"));
TS_ASSERT_THROWS_NOTHING(log1.debug("a debug string"));
TS_ASSERT_THROWS_NOTHING(log1.information("an information string"));
TS_ASSERT_THROWS_NOTHING(log1.notice("a notice string"));
TS_ASSERT_THROWS_NOTHING(log1.warning("a warning string"));
TS_ASSERT_THROWS_NOTHING(log1.error("an error string"));
TS_ASSERT_THROWS_NOTHING(log1.critical("a critical string"));
TS_ASSERT_THROWS_NOTHING(log1.fatal("a fatal string"));
//checking the level - this should be set to debug in the config file
//therefore this should only return false for trace
TS_ASSERT(log1.is(8) == false); //trace
TS_ASSERT(log1.is(7)); //debug
TS_ASSERT(log1.is(6)); //information
TS_ASSERT(log1.is(5)); //notice
TS_ASSERT(log1.is(4)); //warning
TS_ASSERT(log1.is(3)); //error
TS_ASSERT(log1.is(2)); //critical
TS_ASSERT(log1.is(1)); //fatal
}
void TestSystemValues()
{
//we cannot test the return values here as they will differ based on the environment.
//therfore we will just check they return a non empty string.
std::string osName = configSvc->getOSName();
TS_ASSERT_LESS_THAN(0, osName.length()); //check that the string is not empty
std::string osArch = configSvc->getOSArchitecture();
TS_ASSERT_LESS_THAN(0, osArch.length()); //check that the string is not empty
std::string osCompName = configSvc->getComputerName();
TS_ASSERT_LESS_THAN(0, osCompName.length()); //check that the string is not empty
}
void TestCustomProperty()
{
//Mantid.legs is defined in the properties script as 6
std::string legCountString = configSvc->getString("mantid.legs");
TS_ASSERT_EQUALS(legCountString, "6");
}
void TestMissingProperty()
{
//Mantid.noses is not defined in the properties script
TS_ASSERT_THROWS_ANYTHING( std::string legCountString = configSvc->getString("mantid.noses"));
}
private:
ConfigSvc *configSvc;
};
#endif /*MANTID_CONFIGSVCTEST_H_*/
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="CxxTest_2_Build"
ProjectGUID="{F6369538-0E60-4728-B192-32CB7266D1EF}"
RootNamespace="CxxTest_2_Build"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="."
IntermediateDirectory="."
ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
TypeLibraryName=".\Debug/CxxTest_2_Build.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\..\Third_Party\include;..\.."
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
PrecompiledHeaderFile=".\CxxTest_2_Build.pch"
AssemblerListingLocation=".\"
ObjectFile=".\"
ProgramDataBaseFileName=".\"
WarningLevel="3"
SuppressStartupBanner="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1037"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="kernel.lib PocoFoundationd.lib PocoUtild.lib"
OutputFile="runner.exe"
LinkIncremental="2"
SuppressStartupBanner="true"
AdditionalLibraryDirectories="../../Debug; ../../../Third_Party/lib/win32"
GenerateDebugInformation="true"
ProgramDatabaseFile=".\runner.pdb"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
SuppressStartupBanner="true"
OutputFile=".\Debug/CxxTest_2_Build.bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
TypeLibraryName=".\Release/CxxTest_2_Build.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\.."
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
PrecompiledHeaderFile=".\Release/CxxTest_2_Build.pch"
AssemblerListingLocation=".\Release/"
ObjectFile=".\Release/"
ProgramDataBaseFileName=".\Release/"
WarningLevel="3"
SuppressStartupBanner="true"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1037"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="Release/runner.exe"
LinkIncremental="1"
SuppressStartupBanner="true"
ProgramDatabaseFile=".\Release/runner.pdb"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
SuppressStartupBanner="true"
OutputFile=".\Release/CxxTest_2_Build.bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath="runner.cpp"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
#framework configuration
mantid.legs = 6
#logging configuartion
logging.loggers.root.level = debug
logging.loggers.root.channel = fileChannel
logging.channels.fileChannel.class = FileChannel
logging.channels.fileChannel.path = sample.log
logging.channels.fileChannel.formatter.class = PatternFormatter
logging.channels.fileChannel.formatter.pattern = %s: {%p} %t
@echo off
REM IF "%VCINSTALLDIR%"=="" SET PATH=%path%;C:\Mantid\Code\Third_Party\lib\win32
IF "%VCINSTALLDIR%"=="" CALL "C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"
REM Simple script to build and run the tests.
REM Have kept separate from the makefile since that's automatically generated
REM by Eclipse.
REM
REM Author: Nick Draper, 19/10/07
REM
echo "Generating the source from the test header files..."
python ..\..\..\Third_Party\src\cxxtest\cxxtestgen.py --error-printer -o runner.cpp *.h
echo "Compiling the test executable..."
devenv CxxTest_2_Build.vcproj /BUILD "Debug|Win32"
copy ..\..\..\Third_Party\lib\win32\*.dll .
REM echo "Running the tests..."
runner.exe
REM Remove the generated files to ensure that they're not inadvertently run
REM when something in the chain has failed.
devenv CxxTest_2_Build.vcproj /CLEAN
del runner.cpp
del BuildLog.htm
del *.dll
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment