summaryrefslogtreecommitdiffstats
path: root/tests/Modules/RebootControl/RebootControlIncTest.php
diff options
context:
space:
mode:
authorSimon Rettberg2025-11-26 10:46:51 +0100
committerSimon Rettberg2025-12-12 15:16:59 +0100
commit7c173411785f959d250d3dfbd7d4cfcb0e20f0e0 (patch)
tree242157791a76afb7af23ec2cd3d22b599e54ce9d /tests/Modules/RebootControl/RebootControlIncTest.php
parent[exams] Fix incorrect count() clause (diff)
downloadslx-admin-7c173411785f959d250d3dfbd7d4cfcb0e20f0e0.tar.gz
slx-admin-7c173411785f959d250d3dfbd7d4cfcb0e20f0e0.tar.xz
slx-admin-7c173411785f959d250d3dfbd7d4cfcb0e20f0e0.zip
Add tests using PHPUnit
Tests generated by Junie AI. Might not have the best possible quality but at least we got something, and if it turns out to be complete rubbish, we can just throw it out again without any issues, as this is independent of the actual code base.
Diffstat (limited to 'tests/Modules/RebootControl/RebootControlIncTest.php')
-rw-r--r--tests/Modules/RebootControl/RebootControlIncTest.php155
1 files changed, 155 insertions, 0 deletions
diff --git a/tests/Modules/RebootControl/RebootControlIncTest.php b/tests/Modules/RebootControl/RebootControlIncTest.php
new file mode 100644
index 00000000..bb70aea7
--- /dev/null
+++ b/tests/Modules/RebootControl/RebootControlIncTest.php
@@ -0,0 +1,155 @@
+<?php
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Tests for modules-available/rebootcontrol/inc/rebootcontrol.inc.php
+ * Uses SQLite-backed Database where needed and shared stubs for Taskmanager etc.
+ *
+ */
+class RebootControlIncTest extends TestCase
+{
+ protected function setUp(): void
+ {
+ Database::resetSchema();
+ Taskmanager::reset();
+ TaskmanagerCallback::reset();
+ EventLog::reset();
+ Property::reset();
+ $_GET = $_POST = $_REQUEST = [];
+
+ require_once __DIR__ . '/../../../modules-available/rebootcontrol/inc/rebootutils.inc.php';
+ require_once __DIR__ . '/../../../modules-available/rebootcontrol/inc/sshkey.inc.php';
+
+ // Load SUT
+ require_once __DIR__ . '/../../../modules-available/rebootcontrol/inc/rebootcontrol.inc.php';
+ }
+
+ public function testExecuteAddsTaskAndAppliesEventFilter(): void
+ {
+ // Arrange: two clients
+ $list = [
+ ['machineuuid' => 'u1', 'clientip' => '10.0.0.10', 'locationid' => 2],
+ ['machineuuid' => 'u2', 'clientip' => '10.0.0.11', 'locationid' => 2],
+ ];
+
+ $task = RebootControl::execute($list, RebootControl::REBOOT, 0);
+ $this->assertIsArray($task);
+ $this->assertArrayHasKey('id', $task);
+
+ // Property list should contain a JSON object with our task id and clients
+ $listEntries = Property::getList(RebootControl::KEY_TASKLIST);
+ $this->assertNotEmpty($listEntries);
+ $found = false;
+ foreach ($listEntries as $entry) {
+ $p = json_decode($entry, true);
+ if (is_array($p) && ($p['id'] ?? '') === $task['id']) {
+ $found = true;
+ $this->assertSame(RebootControl::TASK_REBOOTCTL, $p['type']);
+ $this->assertSame([2], $p['locations']);
+ break;
+ }
+ }
+ $this->assertTrue($found, 'Expected task to be recorded via Property::addToList');
+
+ // EventLog::applyFilterRules should have been called for each client
+ $this->assertCount(2, EventLog::$applied);
+ $this->assertSame('#action-power', EventLog::$applied[0]['category']);
+ }
+
+ public function testRebootDelegatesToExecuteUsingRebootUtils(): void
+ {
+ $task = RebootControl::reboot(['m2'], false);
+ $this->assertIsArray($task);
+ $this->assertArrayHasKey('id', $task);
+ // Ensure Taskmanager recorded a RemoteReboot submission
+ $this->assertNotEmpty(Taskmanager::$submissions);
+ $this->assertSame('RemoteReboot', Taskmanager::$submissions[0]['task']);
+ }
+
+ public function testRunScriptResolvesUuidToClientAndSubmitsRemoteExec(): void
+ {
+ // Seed a machine in DB (no extra tables needed)
+ Database::exec("INSERT INTO machine (machineuuid, subnetlocationid, locationid, hostname, clientip, state)
+ VALUES (:u, 1, 1, 'h', '10.0.0.55', 'IDLE')", ['u' => 'RES-1']);
+ $clients = [
+ ['machineuuid' => 'RES-1'], // missing clientip -> should be looked up
+ ['clientip' => '192.168.1.22'],
+ ];
+ $task = RebootControl::runScript($clients, 'echo hi', 3, 'KEY');
+ $this->assertIsArray($task);
+ $this->assertArrayHasKey('id', $task);
+ // Verify Taskmanager submission name and arguments
+ $this->assertNotEmpty(Taskmanager::$submissions);
+ $sub = end(Taskmanager::$submissions);
+ $this->assertSame('RemoteExec', $sub['task']);
+ $this->assertArrayHasKey('clients', $sub['data']);
+ $optClients = $sub['data']['clients'];
+ $this->assertContains('10.0.0.55', array_column($optClients, 'clientip'));
+ }
+
+ public function testWakeDirectlySubmitsDirectClients(): void
+ {
+ $task = RebootControl::wakeDirectly(['aa:bb:cc:dd:ee:ff', '11:22:33:44:55:66'], '10.0.0.255', null);
+ $this->assertIsArray($task);
+ $sub = end(Taskmanager::$submissions);
+ $this->assertSame('WakeOnLan', $sub['task']);
+ $this->assertArrayHasKey('clients', $sub['data']);
+ $this->assertCount(2, $sub['data']['clients']);
+ $this->assertSame('DIRECT', $sub['data']['clients'][0]['methods'][0]);
+ }
+
+ public function testWakeViaClientBuildsJawolLoop(): void
+ {
+ $clients = [['clientip' => '10.0.0.50']];
+ $task = RebootControl::wakeViaClient($clients, 'aa-bb-cc-dd-ee-ff', '10.0.0.255', 'ffff');
+ $this->assertIsArray($task);
+ $sub = end(Taskmanager::$submissions);
+ $this->assertSame('RemoteExec', $sub['task']);
+ $cmd = $sub['data']['command'] ?? '';
+ $this->assertStringContainsString('jawol', $cmd);
+ $this->assertStringContainsString("-d '10.0.0.255'", $cmd);
+ $this->assertStringContainsString("-p 'ffff'", $cmd);
+ }
+
+ public function testWakeViaJumpHostAddsCallback(): void
+ {
+ $jh = ['hostid' => 7,
+ 'host' => '10.0.0.77',
+ 'port' => 9922,
+ 'username' => 'root',
+ 'sshkey' => 'KEY',
+ 'script' => 'echo wake %MACS% %IP%'];
+ $task = RebootControl::wakeViaJumpHost($jh, '10.0.0.255', [['macaddr' => 'aa:bb:cc:dd:ee:ff']]);
+ $this->assertIsArray($task);
+ $this->assertNotEmpty(TaskmanagerCallback::$callbacks);
+ $cb = end(TaskmanagerCallback::$callbacks);
+ $this->assertSame('rbcConnCheck', $cb['name']);
+ $this->assertSame(7, $cb['arg']);
+ $sub = end(Taskmanager::$submissions);
+ $this->assertSame('RemoteExec', $sub['task']);
+ $cmd = $sub['data']['command'] ?? '';
+ $this->assertStringContainsString('aa:bb:cc:dd:ee:ff', $cmd);
+ }
+
+ public function testGetActiveTasksFiltersByLocationsAndId(): void
+ {
+ // Create two dummy task entries
+ $entry1 = json_encode(['id' => 'A', 'locations' => [1, 2], 'tasks' => ['t1']]);
+ $entry2 = json_encode(['id' => 'B', 'locations' => [5], 'tasks' => ['t2']]);
+ Property::addToList(RebootControl::KEY_TASKLIST, $entry1, 20);
+ Property::addToList(RebootControl::KEY_TASKLIST, $entry2, 20);
+ // Mark t1 as valid and t2 as invalid
+ Taskmanager::$statusById['t1'] = ['id' => 't1', 'statusCode' => 'RUNNING'];
+ Taskmanager::$statusById['t2'] = ['id' => 't2', 'statusCode' => 'UNKNOWN']; // treated as invalid by isTask()
+
+ // Filter by locations
+ $out = RebootControl::getActiveTasks([1], null);
+ $this->assertNotEmpty($out);
+ $this->assertSame('A', $out[0]['id']);
+ // Query by id returns the item
+ $one = RebootControl::getActiveTasks(null, 'A');
+ $this->assertIsArray($one);
+ $this->assertSame('A', $one['id']);
+ }
+}