icingaweb2/modules/monitoring/test/php/testlib/MonitoringControllerTest.php

284 lines
9.4 KiB
PHP
Raw Normal View History

<?php
2013-07-18 17:15:32 +02:00
// {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Web\Controller
{
2013-07-18 17:15:32 +02:00
/**
* Mocked controller base class to avoid the complete
* Bootstrap dependency of the normally used ModuleActionController
*/
class ModuleActionController
{
2013-07-18 17:15:32 +02:00
/**
* The view this controller would create
* @var stdClass
*/
public $view;
2013-07-18 17:15:32 +02:00
public $headers = array();
2013-07-18 17:15:32 +02:00
/**
* Parameters provided on call
* @var array
*/
public $params = array();
2013-07-18 17:15:32 +02:00
/**
* _getParam method that normally retrieves GET/POST parameters
*
* @param string $param The parameter name to retrieve
* @return mixed|bool The parameter $param or false if it doesn't exist
*/
public function _getParam($param, $default = null)
{
if (!isset($this->params[$param])) {
return $default;
}
return $this->params[$param];
}
2013-07-18 17:15:32 +02:00
public function getParam($param, $default = null)
{
return $this->_getParam($param, $default);
}
public function preserve()
{
return $this;
}
public function getParams()
{
return $this->params;
}
2013-07-18 17:15:32 +02:00
/**
* Sets the backend for this controller which will be used in the action
*
* @param $backend
*/
public function setBackend($backend)
{
$this->backend = $backend;
}
public function __get($param) {
return $this;
}
public function getHeader($header) {
if (isset($this->headers[$header])) {
return $this->headers[$header];
}
return null;
}
}
}
namespace Test\Monitoring\Testlib
{
2013-07-23 12:18:27 +02:00
require_once 'Zend/View.php';
use Icinga\Protocol\Statusdat\Reader;
use Icinga\Web\Controller\ActionController;
use Test\Monitoring\Testlib\DataSource\TestFixture;
use Test\Monitoring\Testlib\DataSource\DataSourceTestSetup;
use Monitoring\Backend\Ido;
2013-07-18 14:53:47 +02:00
use Monitoring\Backend\Statusdat;
2013-07-23 12:18:27 +02:00
use \Zend_View;
2013-07-18 17:15:32 +02:00
/**
* Base class for monitoring controllers that loads required dependencies
* and allows easier setup of tests
*
* Example:
* <code>
*
* class MyControllerTest extends MonitoringControllerTest
* {
* public function testSomething()
* {
* // Create a test fixture
* $fixture = new TestFixture()
* $fixture->addHost('host', 0)->addService(...)->..->;
*
* $this->setupFixture($fixture, "mysql"); // setup the fixture
* $controller = $this->requireController('MyController', 'mysql');
* // controller is now the Zend controller instance, perform an action
* $controller->myAction();
* $result = $controller->view->hosts->fetchAll();
* // assert stuff
* }
* }
*/
abstract class MonitoringControllerTest extends \PHPUnit_Framework_TestCase
{
2013-07-18 17:15:32 +02:00
/**
* The module directory for requiring modules (is relative to the source file)
* @var string
*/
private $moduleDir = "";
2013-07-18 17:15:32 +02:00
/**
* The application directory for requirying library files (is relative to the source file)
* @var string
*/
private $appDir = "";
2013-07-18 17:15:32 +02:00
/**
* Require necessary libraries on test creation
*
* This is called for every test and assures that all required libraries for the controllers
* are loaded. If you need additional dependencies you should overwrite this method, call the parent
* and then require your classes
*/
public function setUp()
{
$this->moduleDir = dirname(__FILE__) . '/../../../';
$this->appDir = $this->moduleDir.'../../library/Icinga/';
$module = $this->moduleDir;
$app = $this->appDir;
set_include_path(get_include_path().':'.$module);
set_include_path(get_include_path().':'.$app);
require_once('Zend/Config.php');
require_once('Zend/Db.php');
require_once(dirname(__FILE__) . '/datasource/DataSourceTestSetup.php');
$this->requireBase();
$this->requireViews();
}
2013-07-18 17:15:32 +02:00
/**
* Require base application and data retrieval classes from the Icinga Library
*
*/
private function requireBase()
{
require_once('Application/Benchmark.php');
require_once('Data/AbstractQuery.php');
require_once('Data/DatasourceInterface.php');
require_once('Data/Db/Connection.php');
require_once('Data/Db/Query.php');
require_once('Exception/ProgrammingError.php');
require_once('library/Monitoring/Backend/AbstractBackend.php');
2013-07-18 14:53:47 +02:00
}
2013-07-18 17:15:32 +02:00
/**
* Require all defined IDO queries in this module
*
*/
2013-07-18 14:53:47 +02:00
private function requireIDOQueries()
{
require_once('library/Monitoring/Backend/Ido.php');
2013-07-18 14:53:47 +02:00
$this->requireFolder('library/Monitoring/Backend/Ido/Query');
}
2013-07-18 17:15:32 +02:00
/**
* Require all php files in the folder $folder
*
* @param $folder The path to the folder containing PHP files
*/
2013-07-18 14:53:47 +02:00
private function requireFolder($folder)
{
$module = $this->moduleDir;
2013-07-18 14:53:47 +02:00
$views = scandir($module.$folder);
foreach ($views as $view) {
if (!preg_match('/php$/', $view)) {
continue;
}
require_once(realpath($module.$folder."/".$view));
}
}
2013-07-18 17:15:32 +02:00
/**
* Require all views and queries from the statusdat backen
*
*/
2013-07-18 14:53:47 +02:00
private function requireStatusDatQueries()
{
require_once(realpath($this->moduleDir.'/library/Monitoring/Backend/Statusdat.php'));
require_once(realpath($this->moduleDir.'/library/Monitoring/Backend/Statusdat/Query/Query.php'));
2013-07-18 14:53:47 +02:00
$this->requireFolder('library/Monitoring/Backend/Statusdat');
$this->requireFolder('library/Monitoring/Backend/Statusdat/Criteria');
$this->requireFolder('library/Monitoring/Backend/Statusdat/Query');
$this->requireFolder('library/Monitoring/Backend/Statusdat/DataView');
$this->requireFolder('library/Monitoring/Backend/Statusdat/DataView');
}
2013-07-18 17:15:32 +02:00
/**
* Require all (generic) view classes from the monitoring module
*/
private function requireViews()
{
$module = $this->moduleDir;
require_once($module.'library/Monitoring/View/MonitoringView.php');
2013-07-18 14:53:47 +02:00
$this->requireFolder('library/Monitoring/View/');
}
2013-07-18 17:15:32 +02:00
/**
* Require and set up a controller $controller using the backend type specified at $backend
*
* @param string $controller The name of the controller tu use (must be under monitoring/application/controllers)
* @param string $backend The backend to use ('mysql', 'pgsql' or 'statusdat')
* @return ModuleActionController The newly created controller
*/
public function requireController($controller, $backend)
{
require_once($this->moduleDir.'/application/controllers/'.$controller.'.php');
$controllerName = '\Monitoring_'.ucfirst($controller);
2013-07-23 12:18:27 +02:00
/** @var ActionController $controller */
$controller = new $controllerName;
$controller->setBackend($this->getBackendFor($backend));
2013-07-23 12:18:27 +02:00
// Many controllers need a view to work properly
$controller->view = new Zend_View();
return $controller;
}
2013-07-18 17:15:32 +02:00
/**
* Create a new backend and insert the given fixture into it
*
* @param TestFixture $fixture The TestFixture to create
* @param string $type The type of the backend ('mysql', 'pgsql' or 'statusdat')
*/
public function setupFixture(TestFixture $fixture, $type)
{
$dbInstance = new DataSourceTestSetup($type);
$dbInstance->setup();
$dbInstance->insert($fixture);
}
2013-07-18 17:15:32 +02:00
/**
* Set up and configure a new testbackend for the given type
*
* @param string $type The type of the backend 'mysql', 'pgsql' or 'statusdat'
* @return Ido|Statusdat The newly created backend
*/
public function getBackendFor($type) {
if ($type == "mysql" || $type == "pgsql") {
2013-07-18 14:53:47 +02:00
$this->requireIDOQueries();
return new Ido(new \Zend_Config(array(
"dbtype"=> $type,
'host' => "localhost",
'user' => "icinga_unittest",
'pass' => "icinga_unittest",
'db' => "icinga_unittest"
)));
} else if ($type == "statusdat") {
2013-07-18 14:53:47 +02:00
$this->requireStatusDatQueries();
return new Statusdat(new \Zend_Config(array(
'status_file' => '/tmp/teststatus.dat',
2013-07-18 14:53:47 +02:00
'objects_file' => '/tmp/testobjects.cache',
'no_cache' => true
)));
}
}
}
}