summaryrefslogtreecommitdiffstats
path: root/test/php/library/Director/Objects/IcingaServiceTest.php
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--test/php/library/Director/Objects/IcingaServiceTest.php293
1 files changed, 293 insertions, 0 deletions
diff --git a/test/php/library/Director/Objects/IcingaServiceTest.php b/test/php/library/Director/Objects/IcingaServiceTest.php
new file mode 100644
index 0000000..468db67
--- /dev/null
+++ b/test/php/library/Director/Objects/IcingaServiceTest.php
@@ -0,0 +1,293 @@
+<?php
+
+namespace Tests\Icinga\Module\Director\Objects;
+
+use Icinga\Module\Director\IcingaConfig\IcingaConfig;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\Test\BaseTestCase;
+
+class IcingaServiceTest extends BaseTestCase
+{
+ protected $testHostName = '___TEST___host';
+
+ protected $testServiceName = '___TEST___service';
+
+ protected $createdServices = array();
+
+ public function testUnstoredHostCanBeLazySet()
+ {
+ $service = $this->service();
+ $service->display_name = 'Something else';
+ $service->host = 'not yet';
+ $this->assertEquals(
+ 'not yet',
+ $service->host
+ );
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testFailsToStoreWithMissingLazyRelations()
+ {
+ if ($this->skipForMissingDb()) {
+ return;
+ }
+
+ $db = $this->getDb();
+ $service = $this->service();
+ $service->display_name = 'Something else';
+ $service->host = 'not yet';
+ $service->store($db);
+ $service->delete();
+ }
+
+ public function testAcceptsAssignRules()
+ {
+ $service = $this->service();
+ $service->object_type = 'apply';
+ $service->assign_filter = 'host.address="127.*"';
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testRefusesAssignRulesWhenNotBeingAnApply()
+ {
+ $service = $this->service();
+ $service->assign_filter = 'host.address=127.*';
+ }
+
+ public function testAcceptsAndRendersFlatAssignRules()
+ {
+ if ($this->skipForMissingDb()) {
+ return;
+ }
+
+ $db = $this->getDb();
+
+ $service = $this->service();
+
+ // Service apply rule rendering requires access to settings:
+ $service->setConnection($db);
+ $service->object_type = 'apply';
+ $service->assign_filter = 'host.address="127.*"|host.vars.env="test"';
+
+ $this->assertEquals(
+ $this->loadRendered('service1'),
+ (string) $service
+ );
+
+ $this->assertEquals(
+ 'host.address="127.*"|host.vars.env="test"',
+ $service->assign_filter
+ );
+ }
+
+ public function testAcceptsAndRendersStructuredAssignRules()
+ {
+ if ($this->skipForMissingDb()) {
+ return;
+ }
+
+ $db = $this->getDb();
+
+ $service = $this->service();
+ // Service apply rule rendering requires access to settings:
+ $service->setConnection($db);
+ $service->object_type = 'apply';
+ $service->assign_filter = 'host.address="127.*"|host.vars.env="test"';
+
+ $this->assertEquals(
+ $this->loadRendered('service1'),
+ (string) $service
+ );
+
+ $this->assertEquals(
+ 'host.address="127.*"|host.vars.env="test"',
+ $service->assign_filter = 'host.address="127.*"|host.vars.env="test"'
+ );
+ }
+
+ public function testPersistsAssignRules()
+ {
+ if ($this->skipForMissingDb()) {
+ return;
+ }
+
+ $db = $this->getDb();
+
+ $service = $this->service();
+ $service->object_type = 'apply';
+ $service->assign_filter = 'host.address="127.*"|host.vars.env="test"';
+
+ $service->store($db);
+
+ $service = IcingaService::loadWithAutoIncId($service->id, $db);
+ $this->assertEquals(
+ $this->loadRendered('service1'),
+ (string) $service
+ );
+
+ $this->assertEquals(
+ 'host.address="127.*"|host.vars.env="test"',
+ $service->assign_filter
+ );
+
+ $service->delete();
+ }
+
+ public function testRendersToTheCorrectZone()
+ {
+ if ($this->skipForMissingDb()) {
+ return;
+ }
+
+ $db = $this->getDb();
+ $service = $this->service()->setConnection($db);
+
+ $config = new IcingaConfig($db);
+ $service->renderToConfig($config);
+ $masterzone = $db->getMasterZoneName();
+ $this->assertEquals(
+ array('zones.d/' . $masterzone . '/services.conf'),
+ $config->getFileNames()
+ );
+ }
+
+ public function testVariablesInPropertiesAndCustomVariables()
+ {
+ if ($this->skipForMissingDb()) {
+ return;
+ }
+
+ $db = $this->getDb();
+
+ $service = $this->service('___TEST___service_$not_replaced$');
+ $service->setConnection($db);
+ $service->object_type = 'apply';
+ $service->display_name = 'Service: $host.vars.replaced$';
+ $service->assign_filter = 'host.address="127.*"';
+ $service->{'vars.custom_var'} = '$host.vars.replaced$';
+
+ $this->assertEquals(
+ $this->loadRendered('service3'),
+ (string) $service
+ );
+ }
+
+ public function testVariablesAreNotReplacedForNonApplyObjects()
+ {
+ if ($this->skipForMissingDb()) {
+ return;
+ }
+
+ $db = $this->getDb();
+
+ $host = $this->host();
+ $host->store($db);
+
+ $service = $this->service('___TEST___service_$not_replaced$');
+ $service->object_type = 'object';
+ $service->host_id = $host->get('id');
+ $service->display_name = 'Service: $host.vars.not_replaced$';
+ $service->{'vars.custom_var'} = '$host.vars.not_replaced$';
+ $service->store($db);
+
+ $service = IcingaService::loadWithAutoIncId($service->id, $db);
+ $this->assertEquals(
+ $this->loadRendered('service4'),
+ (string) $service
+ );
+ }
+
+ public function testApplyForRendersInVariousModes()
+ {
+ if ($this->skipForMissingDb()) {
+ return;
+ }
+
+ $db = $this->getDb();
+
+ $service = $this->service()->setConnection($db);
+ $service->object_type = 'apply';
+ $service->apply_for = 'host.vars.test1';
+ $service->assign_filter = 'host.vars.env="test"';
+ $this->assertEquals(
+ $this->loadRendered('service5'),
+ (string) $service
+ );
+
+ $service->object_name = '___TEST$config$___service $host.var.bla$';
+ $this->assertEquals(
+ $this->loadRendered('service6'),
+ (string) $service
+ );
+
+ $service->object_name = '';
+ $this->assertEquals(
+ $this->loadRendered('service7'),
+ (string) $service
+ );
+ }
+
+ protected function host()
+ {
+ return IcingaHost::create(array(
+ 'object_name' => $this->testHostName,
+ 'object_type' => 'object',
+ 'address' => '127.0.0.1',
+ ));
+ }
+
+ protected function service($objectName = null)
+ {
+ if ($objectName === null) {
+ $objectName = $this->testServiceName;
+ }
+ $this->createdServices[] = $objectName;
+ return IcingaService::create(array(
+ 'object_name' => $objectName,
+ 'object_type' => 'object',
+ 'display_name' => 'Whatever service',
+ 'vars' => array(
+ 'test1' => 'string',
+ 'test2' => 17,
+ 'test3' => false,
+ 'test4' => (object) array(
+ 'this' => 'is',
+ 'a' => array(
+ 'dict',
+ 'ionary'
+ )
+ )
+ )
+ ));
+ }
+
+ protected function loadRendered($name)
+ {
+ return file_get_contents(__DIR__ . '/rendered/' . $name . '.out');
+ }
+
+ public function tearDown()
+ {
+ if ($this->hasDb()) {
+ $db = $this->getDb();
+ $kill = array($this->testHostName);
+ foreach ($kill as $name) {
+ if (IcingaHost::exists($name, $db)) {
+ IcingaHost::load($name, $db)->delete();
+ }
+ }
+
+ $kill = $this->createdServices;
+ foreach ($kill as $name) {
+ if (IcingaService::exists(array($name), $db)) {
+ IcingaService::load($name, $db)->delete();
+ }
+ }
+ }
+ }
+}