Skip to content
Snippets Groups Projects
ExampleTest.php 8.25 KiB
Newer Older
Bilal Talhaoui's avatar
Bilal Talhaoui committed
<?php

namespace Tests\Unit;

Tibo's avatar
Tibo committed
use App\User;
use App\Notification;
Tibo's avatar
Tibo committed
use App\Organization;
Tibo's avatar
Tibo committed
use App\Server;
Tibo's avatar
Tibo committed
use App\Sensor\Disks;
Tibo's avatar
Tibo committed
use App\Sensor\Ifconfig;
use App\Sensor\Partition;
use App\Sensor\DiskEvolution;
Bilal Talhaoui's avatar
Bilal Talhaoui committed
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ExampleTest extends TestCase
{
Tibo's avatar
Tibo committed

    use RefreshDatabase;

Bilal Talhaoui's avatar
Bilal Talhaoui committed
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $this->assertTrue(true);
    }
Tibo's avatar
Tibo committed
    public function testRelations()
    {
Tibo's avatar
Tibo committed
        $user = new User();
        $user->name = "test";
        $user->email = "test@example.com";
        $user->password = "abc123";
        $user->save();

        $organization = new Organization();
        $organization->name = "Org";
        $organization->save();

        $organization->users()->save($user);

Tibo's avatar
Tibo committed
        $this->assertEquals(
            "Org",
            $user->organizations()->first()->name
        );
Tibo's avatar
Tibo committed
    }
Tibo's avatar
Tibo committed

Tibo's avatar
Tibo committed
    /**
     * @group ifconfig
     * @group sensors
     */
Tibo's avatar
Tibo committed
    public function testIfconfig()
    {
Tibo's avatar
Tibo committed
        $string = file_get_contents(__DIR__ . "/ifconfig");
        $sensor = new Ifconfig(new \App\Server());
        $interfaces = $sensor->parseIfconfig($string);
Tibo's avatar
Tibo committed
        $this->assertEquals(2, count($interfaces));
        $this->assertEquals("enp0s31f6", $interfaces[0]->name);
        $this->assertEquals("10.67.1.32", $interfaces[1]->address);
        $this->assertEquals(1074590056, $interfaces[1]->rx);
        $this->assertEquals(2074977132, $interfaces[1]->tx);
Tibo's avatar
Tibo committed
    }
Tibo's avatar
Tibo committed

    public function testDiskEvolution()
    {
        $p = new Partition();
        $p->filesystem = "test";
        $p->blocks = 20;
        $p->used = 10;
Tibo's avatar
Tibo committed

        $p2 = new Partition();
        $p2->filesystem = "test";
        $p2->blocks = 15;
        $p2->used = 5;
Tibo's avatar
Tibo committed

        $oldPartitions = array($p, $p2);
Tibo's avatar
Tibo committed

        $p = new Partition();
        $p->filesystem = "test";
        $p->blocks = 20;
        $p->used = 15;
Tibo's avatar
Tibo committed

        $p2 = new Partition();
        $p2->filesystem = "test";
        $p2->blocks = 15;
        $p2->used = 10;
Tibo's avatar
Tibo committed

        $newPartitions = array($p, $p2);
        $newAndOld = array($newPartitions, $oldPartitions);
Tibo's avatar
Tibo committed


        $sensor = new DiskEvolution(new \App\Server());
        $result = $sensor->computeEvolution($newAndOld);
Tibo's avatar
Tibo committed

        // test the result is correct...
        $this->assertequals(5, $result[0]->delta);
        $this->assertequals(5, $result[1]->delta);
        $this->assertequals("test", $result[0]->filesystem);
        $this->assertequals("test", $result[1]->filesystem);
        $this->assertequals(((20-15)/5), $result[0]->timeUntillFull);
        $this->assertequals(((15-10)/5), $result[1]->timeUntillFull);
    }
Tibo's avatar
Tibo committed

Tibo's avatar
Tibo committed
    public function testDisksSensor()
    {
Tibo's avatar
Tibo committed
        $string = file_get_contents(__DIR__ . "/df");
Tibo's avatar
Tibo committed
        $sensor = new Disks(new Server());
Tibo's avatar
Tibo committed
        $disks = $sensor->parse($string);
Tibo's avatar
Tibo committed
        $this->assertEquals(3, count($disks));
        $this->assertEquals("/dev/sda1", $disks[1]->filesystem);
        $this->assertEquals(1128926648, $disks[1]->blocks);
Tibo's avatar
Tibo committed
    }

Tibo's avatar
Tibo committed
    public function testNetstatListening()
    {
        $string = file_get_contents(__DIR__ . "/netstat-tcp");
        $sensor = new \App\Sensor\ListeningPorts(new Server());
        $ports = $sensor->parse($string);
        $this->assertEquals(16, count($ports));
        $this->assertEquals("31933/cloud-backup-", $ports[4]->process);
        $this->assertEquals(1024, $ports[4]->port);
        $this->assertEquals("127.0.0.1", $ports[4]->bind);
    }

Tibo's avatar
Tibo committed
    public function testSsacli()
    {
Tibo's avatar
Tibo committed
        $string = file_get_contents(__DIR__ . "/ssacli");
Tibo's avatar
Tibo committed
        $sensor = new \App\Sensor\Ssacli(new Server());
Tibo's avatar
Tibo committed
        $disks = $sensor->parse($string);
        $this->assertEquals("OK", $disks[0]->status);
    }

Tibo's avatar
Tibo committed
    public function testUpdates()
    {
Tibo's avatar
Tibo committed
        $sensor = new \App\Sensor\Updates(new \App\Server());

        $string1 = "6 packages can be updated.
2 updates are security updates.";
        $status = $sensor->parse($string1);
Tibo's avatar
Tibo committed
        $this->assertEquals(2, $status["security"]);

        $string2 = "1 package can be updated.
1 update is a security update.
";
        $status2 = $sensor->parse($string2);
        $this->assertEquals(1, $status2["security"]);
Tibo's avatar
Tibo committed
    public function testMeminfo()
    {
Tibo's avatar
Tibo committed
        $string = file_get_contents(__DIR__ . "/meminfo");
        $server = new \App\Server();
        $mem_total = $server->parseMeminfo($string);
        $this->assertEquals("15954328", $mem_total);
    }

Tibo's avatar
Tibo committed
    /**
     * @group cpuinfo
     */
Tibo's avatar
Tibo committed
    public function testCpuinfo()
    {
Tibo's avatar
Tibo committed
        $string = file_get_contents(__DIR__ . "/cpuinfo");
        $server = new \App\Server();
        $cpuinfo = $server->parseCpuinfo($string);
        $this->assertEquals(8, $cpuinfo["threads"]);
        $this->assertEquals("Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz", $cpuinfo["cpu"]);
Tibo's avatar
Tibo committed

    /**
     * @group uptime
     */
    public function testUptime()
    {
        $string = "24439.45 190434.65";
Tibo's avatar
Tibo committed
        $server = new Server();
Tibo's avatar
Tibo committed
        $uptime = $server->parseUptime($string);
        $this->assertEquals("6 hours", $uptime);
    }
Tibo's avatar
Tibo committed

    public function testUUID()
    {
        $server = new Server();
        $uuid = $server->parseUUID(file_get_contents(__DIR__ . "/system"));
        $this->assertEquals("74F7C34C-2924-11B2-A85C-DC427DCA7109", $uuid);
    }
Tibo's avatar
Tibo committed

Tibo's avatar
Tibo committed
    /**
     * @group cpuinfo
     */
Tibo's avatar
Tibo committed
    public function testCpuinfoSingleCPU()
    {
Tibo's avatar
Tibo committed
        $string = file_get_contents(__DIR__ . "/cpuinfo_1cpu");
        $server = new \App\Server();
        $cpuinfo = $server->parseCpuinfo($string);
        $this->assertEquals(1, $cpuinfo["threads"]);
        $this->assertEquals("Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz", $cpuinfo["cpu"]);
    }

Tibo's avatar
Tibo committed
    public function testManufacturer()
    {
        $string = file_get_contents(__DIR__ . "/system");
        $server = new \App\Server();
        $manufacturer = $server->parseManufacturer($string);
        $this->assertEquals("LENOVO", $manufacturer);
    }

Tibo's avatar
Tibo committed
    public function testProductName()
    {
        $string = file_get_contents(__DIR__ . "/system");
        $server = new \App\Server();
        $manufacturer = $server->parseProductName($string);
        $this->assertEquals("20J60018MB", $manufacturer);
Tibo's avatar
Tibo committed
    public function testClientVersion()
    {
        $server = new \App\Server();
        $client_version = new \App\Sensor\ClientVersion($server);
Tibo's avatar
Tibo committed
        $this->assertStringMatchesFormat('%d.%d.%d', $client_version->latestVersion());
Tibo's avatar
Tibo committed
    }
Tibo's avatar
Tibo committed

    /**
     * @group status-change
     */
Tibo's avatar
Tibo committed
    public function testStatusChangeDetection()
    {
Tibo's avatar
Tibo committed
        $organization = new Organization();
        $organization->name = "ACME";
        $organization->save();

Tibo's avatar
Tibo committed
        $server = new \App\Server();
Tibo's avatar
Tibo committed
        $server->name = "My test server";
        $server->organization()->associate($organization);
        $server->save();

        $server_id = $server->id;

        $user = new User();
        $user->name = "Test";
        $user->email = "thibault.debatty@gmail.com";
        $user->password = "qmlskdj";
        $user->save();
        $organization->users()->attach($user->id);
Tibo's avatar
Tibo committed

Tibo's avatar
Tibo committed
        $this->assertEquals($server_id, \App\StatusChange::getLastChangeForServer(1)->server_id);
Tibo's avatar
Tibo committed

        // Insert a fake status change
        $change = new \App\StatusChange();
        $change->status = 155;
Tibo's avatar
Tibo committed
        $change->server_id = $server_id;
Tibo's avatar
Tibo committed

        // Run change detection
        $change_detection_job = new \App\Jobs\StatusChangeDetection();
        $change_detection_job->detectChangeForServer($server);

        // Check if a new StatusChange was inserted in Mongo
Tibo's avatar
Tibo committed
        $last_change = \App\StatusChange::getLastChangeForServer($server_id);
Tibo's avatar
Tibo committed
        $this->assertEquals(
Tibo's avatar
Tibo committed
            $server->status(),
            $last_change->status
        );

        // Check if a notification were inserted
        $this->assertTrue(Notification::findForServer($server_id)->count() > 0);

        // Insert multiple status changes to simulate bouncing

        for ($i = 0; $i < 4; $i++) {
            $change = new \App\StatusChange();
            $change->status = 155;
            $change->server_id = $server_id;
            $change->save();

            // Run change detection
            $change_detection_job = new \App\Jobs\StatusChangeDetection();
            $change_detection_job->detectChangeForServer($server);
        }
Tibo's avatar
Tibo committed
    }