summaryrefslogtreecommitdiffstats
path: root/test/php/library/Director/Resolver/TemplateTreeTest.php
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--test/php/library/Director/Resolver/TemplateTreeTest.php259
1 files changed, 259 insertions, 0 deletions
diff --git a/test/php/library/Director/Resolver/TemplateTreeTest.php b/test/php/library/Director/Resolver/TemplateTreeTest.php
new file mode 100644
index 0000000..f44d081
--- /dev/null
+++ b/test/php/library/Director/Resolver/TemplateTreeTest.php
@@ -0,0 +1,259 @@
+<?php
+
+namespace Tests\Icinga\Module\Director\Objects;
+
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\Resolver\TemplateTree;
+use Icinga\Module\Director\Test\BaseTestCase;
+
+class TemplateTreeTest extends BaseTestCase
+{
+ protected $applyId;
+
+ protected function prepareHosts(Db $db)
+ {
+ $o1 = IcingaHost::create([
+ 'object_name' => 'o1',
+ 'object_type' => 'template'
+ ], $db);
+ $o2 = IcingaHost::create([
+ 'object_name' => 'o2',
+ 'object_type' => 'template'
+ ], $db);
+ $o3 = IcingaHost::create([
+ 'object_name' => 'o3',
+ 'object_type' => 'template'
+ ], $db);
+ $o4 = IcingaHost::create([
+ 'object_name' => 'o4',
+ 'object_type' => 'template',
+ 'imports' => ['o2', 'o1'],
+ ], $db);
+ $o5 = IcingaHost::create([
+ 'object_name' => 'o5',
+ 'object_type' => 'template',
+ 'imports' => ['o4'],
+ ], $db);
+ $o6 = IcingaHost::create([
+ 'object_name' => 'o6',
+ 'object_type' => 'template',
+ 'imports' => ['o4', 'o2'],
+ ], $db);
+ $o7 = IcingaHost::create([
+ 'object_name' => 'o7',
+ 'object_type' => 'object',
+ 'imports' => ['o4', 'o2'],
+ ], $db);
+
+ $o1->store();
+ $o2->store();
+ $o3->store();
+ $o4->store();
+ $o5->store();
+ $o6->store();
+ $o7->store();
+
+ return (object) [
+ 'o1' => $o1,
+ 'o2' => $o2,
+ 'o3' => $o3,
+ 'o4' => $o4,
+ 'o5' => $o5,
+ 'o6' => $o6,
+ 'o7' => $o7,
+ ];
+ }
+
+ public function testHostWithoutParentGivesAnEmptyArray()
+ {
+ $db = $this->getDb();
+ $hosts = $this->prepareHosts($db);
+ $tree = new TemplateTree('host', $db);
+ $this->assertEquals([], $tree->getParentsFor($hosts->o2));
+ $this->assertEquals([], $tree->getAncestorsFor($hosts->o2));
+ $this->assertEquals([], $tree->listAncestorIdsFor($hosts->o2));
+ }
+
+ public function testSimpleInheritanceWithMultipleParentsGivesOrderedResult()
+ {
+ $db = $this->getDb();
+ $hosts = $this->prepareHosts($db);
+ $tree = new TemplateTree('host', $db);
+ $this->assertArrayEqualsWithKeys([
+ $hosts->o2->id => 'o2',
+ $hosts->o1->id => 'o1',
+ ], $tree->getParentsFor($hosts->o4));
+ $this->assertArrayEqualsWithKeys([
+ (int) $hosts->o2->id,
+ (int) $hosts->o1->id,
+ ], $tree->listParentIdsFor($hosts->o4));
+ }
+
+ public function testMultiInheritanceIsResolved()
+ {
+ $db = $this->getDb();
+ $hosts = $this->prepareHosts($db);
+ $tree = new TemplateTree('host', $db);
+ $this->assertArrayEqualsWithKeys([
+ $hosts->o2->id => 'o2',
+ $hosts->o1->id => 'o1',
+ $hosts->o4->id => 'o4'
+ ], $tree->getAncestorsFor($hosts->o5));
+ $this->assertArrayEqualsWithKeys([
+ (int) $hosts->o2->get('id'),
+ (int) $hosts->o1->getProperty('id'),
+ $hosts->o4->getAutoincId(),
+ ], $tree->listAncestorIdsFor($hosts->o5));
+ }
+
+ public function testTemplateOrderIsCorrectWhenInheritingSameTemplateMultipleTimes()
+ {
+ $db = $this->getDb();
+ $hosts = $this->prepareHosts($db);
+ $tree = new TemplateTree('host', $db);
+ $this->assertArrayEqualsWithKeys([
+ $hosts->o1->id => 'o1',
+ $hosts->o4->id => 'o4',
+ $hosts->o2->id => 'o2'
+ ], $tree->getAncestorsFor($hosts->o6));
+ $this->assertArrayEqualsWithKeys([
+ $hosts->o1->getAutoincId(),
+ $hosts->o4->getAutoincId(),
+ $hosts->o2->getAutoincId(),
+ ], $tree->listAncestorIdsFor($hosts->o6));
+ }
+
+ protected function assertArrayEqualsWithKeys($expected, $actual)
+ {
+ $message = sprintf(
+ 'Failed asserting that %s equals %s',
+ json_encode($actual),
+ json_encode($expected)
+ );
+
+ $this->assertTrue(
+ $expected === $actual,
+ $message
+ );
+ }
+
+ protected function assertSameArrayValues($expected, $actual)
+ {
+ $message = sprintf(
+ 'Failed asserting that %s has the same values as %s',
+ json_encode($actual),
+ json_encode($expected)
+ );
+
+ sort($expected);
+ sort($actual);
+ $this->assertTrue(
+ $expected === $actual,
+ $message
+ );
+ }
+
+ public function testChildrenAreResolvedCorrectlyOverMultipleLevels()
+ {
+ $db = $this->getDb();
+ $o1 = IcingaService::create([
+ 'object_name' => 'o1',
+ 'object_type' => 'template'
+ ], $db);
+ $o2 = IcingaService::create([
+ 'object_name' => 'o2',
+ 'object_type' => 'template'
+ ], $db);
+ $o3 = IcingaService::create([
+ 'object_name' => 'o3',
+ 'object_type' => 'template'
+ ], $db);
+ $o4 = IcingaService::create([
+ 'object_name' => 'o4',
+ 'object_type' => 'template',
+ 'imports' => ['o2', 'o1'],
+ ], $db);
+ $o5 = IcingaService::create([
+ 'object_name' => 'o5',
+ 'object_type' => 'template',
+ 'imports' => ['o4'],
+ ], $db);
+ $o6 = IcingaService::create([
+ 'object_name' => 'o6',
+ 'object_type' => 'template',
+ 'imports' => ['o4', 'o2'],
+ ], $db);
+ $o7 = IcingaService::create([
+ 'object_name' => 'o7',
+ 'object_type' => 'apply',
+ 'imports' => ['o4', 'o2'],
+ ], $db);
+ $o1->store();
+ $o2->store();
+ $o3->store();
+ $o4->store();
+ $o5->store();
+ $o6->store();
+ $o7->store();
+ $this->applyId = (int) $o7->get('id');
+
+ $tree = new TemplateTree('service', $db);
+ $this->assertEquals([
+ $o4->id => 'o4',
+ $o5->id => 'o5',
+ $o6->id => 'o6',
+ ], $tree->getDescendantsFor($o2));
+ $this->assertSameArrayValues([
+ $o4->getAutoincId(),
+ (int) $o5->id,
+ (int) $o6->getProperty('id'),
+ ], $tree->listDescendantIdsFor($o2));
+ $this->assertEquals([
+ $o5->id => 'o5',
+ $o6->id => 'o6',
+ ], $tree->getChildrenFor($o4));
+ $this->assertEquals([], $tree->getChildrenFor($o5));
+ }
+
+ protected function removeHosts(Db $db)
+ {
+ $kill = array('o7', 'o6', 'o5', 'o4', 'o3', 'o2', 'o1');
+ foreach ($kill as $name) {
+ if (IcingaHost::exists($name, $db)) {
+ IcingaHost::load($name, $db)->delete();
+ }
+ }
+ }
+
+ protected function removeServices(Db $db)
+ {
+ if ($this->applyId) {
+ $key = ['id' => $this->applyId];
+ if (IcingaService::exists($key, $db)) {
+ IcingaService::load($key, $db)->delete();
+ }
+ }
+
+ $kill = array('o6', 'o5', 'o4', 'o3', 'o2', 'o1');
+ foreach ($kill as $name) {
+ $key = [
+ 'object_name' => $name,
+ 'object_type' => 'template',
+ ];
+ if (IcingaService::exists($key, $db)) {
+ IcingaService::load($key, $db)->delete();
+ }
+ }
+ }
+
+ public function tearDown()
+ {
+ if ($this->hasDb()) {
+ $db = $this->getDb();
+ $this->removeHosts($db);
+ $this->removeServices($db);
+ }
+ }
+}