icingadb-web/test/php/library/Icingadb/Util/ThresholdRangeTest.php
Alexander A. Klimov 3c8ed68cc6 Upgrade license from GPLv2 to GPLv2+
This was easy because only README.md and doc/01-About.md were redacted manually, everything else via:
git ls-files -z |xargs -0 perl -pi -e 's/Icinga GmbH \| GPLv2/Icinga GmbH | GPLv2+/'

This is legal because we have only merged PRs with label:cla/signed or made by Icinga staff:
https://github.com/Icinga/icingadb-web/pulls?page=1&q=is%3Apr+is%3Aclosed+-label%3Acla%2Fsigned+-author%3Anilmerg

This has no risk for us in people distributing their own version under GPLv3 only.
After all, we won't take their patches anyway, unless they sign our CLA.

This is the cleanest solution for having e.g. these in one address space:

* Icinga Web, GPLv2+
* K8s Web, AGPLv3
* Thirdparty, some LGPLv3 and Apache-2.0

Apropos, K8s Web is even v3-licensed on purpose, to have a stronger protection against cloud ops.
2025-11-21 13:31:24 +01:00

343 lines
13 KiB
PHP

<?php
/* Icinga DB Web | (c) 2023 Icinga GmbH | GPLv2+ */
namespace Tests\Icinga\Module\Icingadb\Util;
use Icinga\Module\Icingadb\Util\ThresholdRange;
use PHPUnit\Framework\TestCase;
class ThresholdRangeTest extends TestCase
{
public function testFromStringProperlyParsesDoubleExclusiveRanges()
{
$outside0And10 = ThresholdRange::fromString('10');
$this->assertSame(
0.0,
$outside0And10->getMin(),
'ThresholdRange::fromString() does not identify zero as default minimum for double exclusive ranges'
);
$this->assertSame(
10.0,
$outside0And10->getMax(),
'ThresholdRange::fromString() does not identify ten as explicit maximum for double exclusive ranges'
);
$this->assertFalse(
$outside0And10->isInverted(),
'ThresholdRange::fromString() identifies double exclusive ranges as inclusive'
);
$outside10And20 = ThresholdRange::fromString('10:20');
$this->assertSame(
10.0,
$outside10And20->getMin(),
'ThresholdRange::fromString() does not identify ten as explicit minimum for double exclusive ranges'
);
$this->assertSame(
20.0,
$outside10And20->getMax(),
'ThresholdRange::fromString() does not identify twenty as explicit maximum for double exclusive ranges'
);
$this->assertFalse(
$outside10And20->isInverted(),
'ThresholdRange::fromString() identifies double exclusive ranges as inclusive'
);
}
/**
* @depends testFromStringProperlyParsesDoubleExclusiveRanges
*/
public function testContainsCorrectlyEvaluatesDoubleExclusiveRanges()
{
$outside0And10 = ThresholdRange::fromString('10');
$this->assertFalse(
$outside0And10->contains(-1),
'ThresholdRange::contains() identifies negative values as greater than or equal to zero'
);
$this->assertFalse(
$outside0And10->contains(11),
'ThresholdRange::contains() identifies eleven as smaller than or equal to ten'
);
$this->assertTrue(
$outside0And10->contains(10),
'ThresholdRange::contains() identifies 10 as outside the range 0..10'
);
$outside10And20 = ThresholdRange::fromString('10:20');
$this->assertFalse(
$outside10And20->contains(9),
'ThresholdRange::contains() identifies nine as greater than or equal to 10'
);
$this->assertFalse(
$outside10And20->contains(21),
'ThresholdRange::contains() identifies twenty-one as smaller than or equal to twenty'
);
$this->assertTrue(
$outside10And20->contains(20),
'ThresholdRange::contains() identifies 20 as outside the range 10..20'
);
}
public function testFromStringProperlyParsesSingleExclusiveRanges()
{
$smallerThan10 = ThresholdRange::fromString('10:');
$this->assertSame(
10.0,
$smallerThan10->getMin(),
'ThresholdRange::fromString() does not identify ten as explicit minimum for single exclusive ranges'
);
$this->assertNull(
$smallerThan10->getMax(),
'ThresholdRange::fromString() does not identify infinity as default maximum for single exclusive ranges'
);
$this->assertFalse(
$smallerThan10->isInverted(),
'ThresholdRange::fromString() identifies single exclusive ranges as inclusive'
);
$greaterThan10 = ThresholdRange::fromString('~:10');
$this->assertNull(
$greaterThan10->getMin(),
'ThresholdRange::fromString() does not identify infinity as explicit minimum for single exclusive ranges'
);
$this->assertSame(
10.0,
$greaterThan10->getMax(),
'ThresholdRange::fromString() does not identify ten as explicit maximum for single exclusive ranges'
);
$this->assertFalse(
$greaterThan10->isInverted(),
'ThresholdRange::fromString() identifies single exclusive ranges as inclusive'
);
}
/**
* @depends testFromStringProperlyParsesSingleExclusiveRanges
*/
public function testContainsCorrectlyEvaluatesSingleExclusiveRanges()
{
$smallerThan10 = ThresholdRange::fromString('10:');
$this->assertFalse(
$smallerThan10->contains(9),
'ThresholdRange::contains() identifies nine as greater than or equal to ten'
);
$this->assertTrue(
$smallerThan10->contains(PHP_INT_MAX),
'ThresholdRange::contains() identifies infinity as outside the range 10..~'
);
$greaterThan10 = ThresholdRange::fromString('~:10');
$this->assertFalse(
$greaterThan10->contains(11),
'ThresholdRange::contains() identifies eleven as smaller than or equal to ten'
);
$this->assertTrue(
$greaterThan10->contains(~PHP_INT_MAX),
'ThresholdRange::contains() identifies negative infinity as outside the range ~..10'
);
}
public function testFromStringProperlyParsesInclusiveRanges()
{
$inside0And10 = ThresholdRange::fromString('@10');
$this->assertSame(
0.0,
$inside0And10->getMin(),
'ThresholdRange::fromString() does not identify zero as default minimum for inclusive ranges'
);
$this->assertSame(
10.0,
$inside0And10->getMax(),
'ThresholdRange::fromString() does not identify ten as explicit maximum for inclusive ranges'
);
$this->assertTrue(
$inside0And10->isInverted(),
'ThresholdRange::fromString() identifies inclusive ranges as double exclusive'
);
$inside10And20 = ThresholdRange::fromString('@10:20');
$this->assertSame(
10.0,
$inside10And20->getMin(),
'ThresholdRange::fromString() does not identify ten as explicit minimum for inclusive ranges'
);
$this->assertSame(
20.0,
$inside10And20->getMax(),
'ThresholdRange::fromString() does not identify twenty as explicit maximum for inclusive ranges'
);
$this->assertTrue(
$inside10And20->isInverted(),
'ThresholdRange::fromString() identifies inclusive ranges as double exclusive'
);
$greaterThan10 = ThresholdRange::fromString('@10:');
$this->assertSame(
10.0,
$greaterThan10->getMin(),
'ThresholdRange::fromString() does not identify ten as explicit minimum for inclusive ranges'
);
$this->assertNull(
$greaterThan10->getMax(),
'ThresholdRange::fromString() does not identify infinity as default maximum for inclusive ranges'
);
$this->assertTrue(
$greaterThan10->isInverted(),
'ThresholdRange::fromString() identifies inclusive ranges as single exclusive'
);
$smallerThan10 = ThresholdRange::fromString('@~:10');
$this->assertNull(
$smallerThan10->getMin(),
'ThresholdRange::fromString() does not identify infinity as explicit minimum for inclusive ranges'
);
$this->assertSame(
10.0,
$smallerThan10->getMax(),
'ThresholdRange::fromString() does not identify ten as explicit maximum for inclusive ranges'
);
$this->assertTrue(
$smallerThan10->isInverted(),
'ThresholdRange::fromString() identifies inclusive ranges as single exclusive'
);
}
/**
* @depends testFromStringProperlyParsesInclusiveRanges
*/
public function testContainsCorrectlyEvaluatesInclusiveRanges()
{
$inside0And10 = ThresholdRange::fromString('@10');
$this->assertFalse(
$inside0And10->contains(10),
'ThresholdRange::contains() identifies ten as greater than ten'
);
$this->assertTrue(
$inside0And10->contains(11),
'ThresholdRange::contains() identifies eleven as smaller than or equal to ten'
);
$this->assertTrue(
$inside0And10->contains(-1),
'ThresholdRange::contains() identifies negative values as greater than or equal to zero'
);
$inside10And20 = ThresholdRange::fromString('@10:20');
$this->assertFalse(
$inside10And20->contains(20),
'ThresholdRange::contains() identifies twenty as greater than twenty'
);
$this->assertTrue(
$inside10And20->contains(21),
'ThresholdRange::contains() identifies twenty-one as smaller than or equal to twenty'
);
$this->assertTrue(
$inside10And20->contains(9),
'ThresholdRange::contains() identifies nine as greater than or equal to ten'
);
$greaterThan10 = ThresholdRange::fromString('@10:');
$this->assertFalse(
$greaterThan10->contains(PHP_INT_MAX),
'ThresholdRange::contains() identifies infinity as smaller than ten'
);
$this->assertTrue(
$greaterThan10->contains(9),
'ThresholdRange::contains() identifies nine as greater than or equal to ten'
);
$smallerThan10 = ThresholdRange::fromString('@~:10');
$this->assertFalse(
$smallerThan10->contains(~PHP_INT_MAX),
'ThresholdRange::contains() identifies negative infinity as greater than ten'
);
$this->assertTrue(
$smallerThan10->contains(11),
'ThresholdRange::contains() identifies eleven as smaller than or equal to ten'
);
}
public function testFromStringProperlyParsesEmptyThresholds()
{
$emptyThreshold = ThresholdRange::fromString('');
$this->assertNull(
$emptyThreshold->getMin(),
'ThresholdRange::fromString() does not identify negative infinity as implicit minimum for empty strings'
);
$this->assertNull(
$emptyThreshold->getMax(),
'ThresholdRange::fromString() does not identify infinity as implicit maximum for empty strings'
);
$this->assertFalse(
$emptyThreshold->isInverted(),
'ThresholdRange::fromString() identifies empty strings as inclusive ranges rather than exclusive'
);
}
/**
* @depends testFromStringProperlyParsesEmptyThresholds
*/
public function testContainsEvaluatesEverythingToTrueForEmptyThresholds()
{
$emptyThreshold = ThresholdRange::fromString('');
$this->assertTrue(
$emptyThreshold->contains(0),
'ThresholdRange::contains() does not identify zero as valid without any threshold'
);
$this->assertTrue(
$emptyThreshold->contains(10),
'ThresholdRange::contains() does not identify ten as valid without any threshold'
);
$this->assertTrue(
$emptyThreshold->contains(PHP_INT_MAX),
'ThresholdRange::contains() does not identify infinity as valid without any threshold'
);
$this->assertTrue(
$emptyThreshold->contains(~PHP_INT_MAX),
'ThresholdRange::contains() does not identify negative infinity as valid without any threshold'
);
}
public function testInvalidThresholdNotationsAreRenderedAsIs()
{
$this->assertSame(
':',
(string) ThresholdRange::fromString(':')
);
$this->assertSame(
'~:',
(string) ThresholdRange::fromString('~:')
);
$this->assertSame(
'20:10',
(string) ThresholdRange::fromString('20:10')
);
$this->assertSame(
'10@',
(string) ThresholdRange::fromString('10@')
);
$this->assertSame(
'foo',
(string) ThresholdRange::fromString('foo')
);
$this->assertSame(
'4,4:2,2',
(string) ThresholdRange::fromString('4,4:2,2')
);
}
public function testInvalidThresholdNotationsConsideredInValid()
{
$this->assertFalse(
ThresholdRange::fromString('10@')->isValid(),
'Invalid threshold notation 10@ considered as valid'
);
$this->assertFalse(
ThresholdRange::fromString('foo')->isValid(),
'Invalid threshold notation foo considered as valid'
);
$this->assertFalse(
ThresholdRange::fromString('4,4:2,2')->isValid(),
'Invalid threshold notation 4,4:2,2 considered as valid'
);
}
}