Skip to content

Commit

Permalink
added new unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
dktapps committed May 9, 2022
1 parent ef64b8a commit fa93d1e
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 0 deletions.
29 changes: 29 additions & 0 deletions tests/LightArray/invalid-coordinates.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
--TEST--
Test that LightArray handles invalid coordinates appropriately
--DESCRIPTION--
We don't want to throw exceptions in hot paths, so we truncate invalid coordinates to 4 bits.
This intentionally produces overflow behaviour, as the least impactful way to avoid memory corruption issues.
--EXTENSIONS--
chunkutils2
--FILE--
<?php

namespace pocketmine\world\format;

$p = LightArray::fill(0);

$p->set(0, 0, 0, 15);

var_dump($p->get(0, 0, 0));
var_dump($p->get(16, 16, 16));
var_dump($p->get(32, 32, 32));

$p->set(16, 16, 16, 8);
var_dump($p->get(0, 0, 0));

?>
--EXPECT--
int(15)
int(15)
int(15)
int(8)
28 changes: 28 additions & 0 deletions tests/PalettedBlockArray/invalid-coordinates.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
Test PalettedBlockArray::get() and set() overflow behaviour on invalid coordinates
--DESCRIPTION--
To avoid throwing costly exceptions in hot paths, we truncate invalid coordinates to 4 bits, so they will overflow.
We can't do nothing about it because it would allow invalid coordinates to cause memory corruption.
This is the least impactful solution.
--EXTENSIONS--
chunkutils2
--FILE--
<?php

namespace pocketmine\world\format;

$p = new PalettedBlockArray(1);
$p->set(0, 0, 0, 2);

var_dump($p->get(0, 0, 0));
var_dump($p->get(16, 16, 16));
var_dump($p->get(32, 32, 32));

$p->set(16, 16, 16, 3);
var_dump($p->get(0, 0, 0));
?>
--EXPECT--
int(2)
int(2)
int(2)
int(3)
32 changes: 32 additions & 0 deletions tests/PalettedBlockArray/validate.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
--TEST--
Test that validating palette offsets works correctly in PalettedBlockArray::fromData()
--DESCRIPTION--
In certain cases (when the palette is not full) it's possible for offsets in the array to point at indices in the palette which aren't set.
For example, a 3 bpb palette can hold up to 8 unique blocks, but if only 7 are used, an `8` appearing in the offset table is bogus and should be reported as corruption.
This test verifies some known valid and invalid cases to ensure that corruption is detected only where expected.
--EXTENSIONS--
chunkutils2
--FILE--
<?php

namespace pocketmine\world\format;

$samples = [
[
3,
base64_decode('AAAAEQIAAAAAEAkAAAAAAJEAAAAAAERCAAAAQEAkAAAAAABRAgAAAAAQCQAAAAAAkQAAAAAARMIAAADAQCQAAAAAABECAAAAABAJAAAAAACRAAAAAABEAgAAAABAJAAAAAAAEQIAAAAAEAkAAAAAAJEAAAAAAEQCAAAAAEAkAAAAAAARAgAAAAAQCQAAAAAAkQAAAAAARAIAAAAAQCQAAAAAABECAAAAABAJAAAAAECRAAAAAABEggAAAABAJABAAAAAEQIAAAAAEAkAAAAAAJEAAAAAAEQCAAAAAEAkAAAAAAARAgAAAAAQCQAAAAAAkQAAAAAARAIAAAAAQCQAAAAAABECAAAAABAJAAAAAACRAAAAAABEAgAAAABAJAAAAAAAEQIAAAAAEAkAAAAAQJEAAAAAAESCAAAAAEAkAEAAAAARAgAAAAAQCQAAAAAAkQAAAAAARAIAAAAAQCQAAAAAABECAAAAABAJAAAAAACRAAAAAABEAgAAAABAJAAAAAAAEQIAAAAAEAkAAAAAAJEAAAAAAEQCAAAAAEAkAAAAAAARAgAAAAAQCQAAAABAkQAAAAAARIIAAAAAQCQAQAAAABECAAAAABAJAAAAAACRAAAAAABEAgAAAABAJAAAAAAAEQIAAAAAEAkAAAAAAJEAAAAAAEQCAAAAAEAkAAAAAAARAgAAAAAQCQAAAAAAkQAAAAAARAIAAAAAQCQAAAAAABECAAAAABAJAAAAAACRAABAAABEAgAAAEBAJABAAAAAUQIAAAAAEAlAAAAAAJEAAAAAAEQCAAAAAEAkAAAAAABRAgAAQAAQCUAAAAAAkQAAQAAAREIAAAAAQCQAQAAAABECAAAAABAJQAAAAACRAAAAAABEQgAAAEBAJABAAAAAUQIAAEAAEAlAAAAAQJEAAAAAAERCAAAAAEAkAAAAAAARAgAAAAAQCQAAAABAkQAAQAAAREIAAAAAQCQAQAAAABECAABAABAJAAAAAACRAAAAAABEAgAAAABAJABAAAAAUQIAAEAAEAkAAAAAQJEAAEAAAERCAAAAAEAkAEAAAAARAgAAAAAQCUAAAAAAkQAAQAAAREIAAABAQCQAQAAAAFECAAAAABAJQAAAAACRAAAAAABEQgAAAABAJAAAAAAAUQIAAEAAEAlAAAAAQJEAAEAAAERCAAAAQEAkAEAAAAARAgAAQAAQCQAAAAAAkQAAQAAARAIAAAAAQCQAQAAAAFECAABAABAJQAAAAECRAABAAABEAgAAAEBAJAAAAAAAEQIAAEAAEAkAAAAAAJEAAEAAAERCAAAAQEAkAEAAAABRAgAAQAAQCUAAAAAAkQAAQAAARAIAAAAAQCQAAAAAABECAAAAABAJQAAAAECRAABAAABEAgAAAEBAJABAAAAAUQIAAEAAEAlAAAAAAJEAAEAAAEQCAAAAAEAkAEAAAAARAgAAQAAQCUAAAABAkQAAQAAAREIAAAAAQCQAQAAAABECAAAAABAJAAAAAACRAAAAAABEQgAAAEBAJABAAAAAEQIAAEAAEAkAAAAAQJEAAAAAAEQCAAAAAEAkAAAAAAARAgAAQAAQCUAAAABAkQAAAAAAREIAAABAQCQAQAAAAFECAAAAABAJQAAAAADACAAAAAAAYwAAAAAAMAIAAAAAQCMAAEAAAIxAAAAAQMAIAEAAAABjAAAAQAAwAkAAAAAAIwAAQAAAjEAAAAAAwAgAQAAAACMAAAAAADACQAAAAAAjAABAAACMQAAAAEDACABAAAAAYwAAAEAAMAJAAAAAQCMAAEAAAIwAAAAAQMAIAAAAAAAjAAAAQAAwAgAAAABAIwAAQAAAjEAAAABAwAgAQAAAAGMAAABAADACAAAAAEAjAAAAAACMAAAAAADACAAAAAAAIwAAAEAAMAJAAAAAQCMAAAAAAIwAAAAAQMAIAEAAAAAjAAAAQAAwAgAAAAAAIwAAQAAAjAAAAABAwAgAQAAAAGMAAAAAADACQAAAAAAjAAAAAACMQAAAAADACAAAAAAAYwAAAAAAMAJAAAAAQCMAAEAAAIxAAAAAAMAIAEAAAAAjAAAAAAAwAkAAAAAAIwAAAAAAjEAAAAAAwAgAQAAAAGMAAABAADACQAAAAAAjAABAAACMAAAAAADACABAAAAAIwAAAAAAMAJAAAAAACMAbGU=', true),
[0, 1, 2, 3, 4]
]
];

foreach($samples as $k => $values){
try{
PalettedBlockArray::fromData($values[0], $values[1], $values[2]);
echo "$k not corrupted\n";
}catch(\Exception $e){
echo "$k " . $e->getMessage() . "\n";
}
}
?>
--EXPECT--
0 not corrupted

0 comments on commit fa93d1e

Please sign in to comment.