Browse Source

Add fuzz test for backwards seeking

Test data is 1025 random bytes; gb18030 still fails
multi-byte
J. King 4 years ago
parent
commit
14d67ad49f
  1. 8
      tests/cases/Encoding/TestBig5.php
  2. 8
      tests/cases/Encoding/TestEUCKR.php
  3. 8
      tests/cases/Encoding/TestGB18030.php
  4. 10
      tests/cases/Encoding/TestSingleByte.php
  5. 8
      tests/cases/Encoding/TestUTF8.php
  6. 17
      tests/lib/DecoderTest.php

8
tests/cases/Encoding/TestBig5.php

@ -136,6 +136,14 @@ class TestBig5 extends \MensBeam\Intl\Test\CoderDecoderTest {
return parent::testIterateThroughAStringAllowingSurrogates($input, $strictExp, $relaxedExp);
}
/**
* @covers MensBeam\Intl\Encoding\Big5::seekBack
*/
public function testSeekBackOverRandomData() {
return parent::testSeekBackOverRandomData();
}
public function provideCodePoints() {
return [
'U+0064 (HTML)' => [false, 0x64, "64"],

8
tests/cases/Encoding/TestEUCKR.php

@ -136,6 +136,14 @@ class TestEUCKR extends \MensBeam\Intl\Test\CoderDecoderTest {
return parent::testIterateThroughAStringAllowingSurrogates($input, $strictExp, $relaxedExp);
}
/**
* @covers MensBeam\Intl\Encoding\EUCKR::seekBack
*/
public function testSeekBackOverRandomData() {
return parent::testSeekBackOverRandomData();
}
public function provideCodePoints() {
return [
'U+0064 (HTML)' => [false, 0x64, "64"],

8
tests/cases/Encoding/TestGB18030.php

@ -196,6 +196,14 @@ class TestGB18030 extends \MensBeam\Intl\Test\CoderDecoderTest {
}
}
/**
* @covers MensBeam\Intl\Encoding\GB18030::seekBack
*/
public function testSeekBackOverRandomData() {
return parent::testSeekBackOverRandomData();
}
public function provideStrings() {
return [
'empty string' => ["", []],

10
tests/cases/Encoding/TestSingleByte.php

@ -214,6 +214,16 @@ class TestSingleByte extends \MensBeam\Intl\Test\CoderDecoderTest {
return parent::testIterateThroughAStringAllowingSurrogates($input, $exp, $exp);
}
/**
* @dataProvider provideClasses
* @coversNothing
*/
public function testSeekBackOverRandomData($class = null) {
$this->testedClass = $class;
return parent::testSeekBackOverRandomData();
}
public function provideClasses() {
foreach (self::$classes as $name => $class) {
yield $name => [$class];

8
tests/cases/Encoding/TestUTF8.php

@ -136,6 +136,14 @@ class TestUTF8 extends \MensBeam\Intl\Test\CoderDecoderTest {
return parent::testIterateThroughAStringAllowingSurrogates($input, $strictExp, $relaxedExp);
}
/**
* @covers MensBeam\Intl\Encoding\UTF8::seekBack
*/
public function testSeekBackOverRandomData() {
return parent::testSeekBackOverRandomData();
}
public function provideCodePoints() {
return [
'U+007A (HTML)' => [false, 0x7A, "7A"],

17
tests/lib/DecoderTest.php

@ -9,6 +9,7 @@ namespace MensBeam\Intl\Test;
use MensBeam\Intl\Encoding\DecoderException;
abstract class DecoderTest extends \PHPUnit\Framework\TestCase {
protected $random = "L51yGwEFuatjbZi7wgNC80qYncvauVm1Lh8vCSK/KJs6QxoynMU8TCamx5TNhbjeh5VpWqQ0Q1j/W6u4O/InxBDxk8g83azJFQHzU+L7Npk0bkdofFv2AHDI2SUlXotYeEOnkKa/c6eQiDk8NapS0LGnb64ypKASacAMp6s2wSUU03l6iVVapHsNBgYs0cD++vnG8ckgbGsV3KkE3Lh601u6jviDyeRwbTxLZcUfSS2uIzrvvGWFfw6D4/FOa3uTR1k2Ya6jT+T/F+OdMgWlUPouuAVgLuvFxj9v9ZBnI+FAFc0kX4aT/JoTuBGMm8YS4xPVvczdrPXCUijML5TZrU201uFqeB9LDDWULp1Ai9d41fcD/8GBFrzlpXPIV+hsSJ4HvWswXdDeVKWgSMrQ78pf+zwvD66TA4FjMiEsLLpf9bb+mPiS2Aa3BP0JpjPwi0gdBu8QipLXNGFUUGW/15jGlj3eNynELRAtvyYZnoYIYShsN1TIU+buw8hHOp9iKsKT+fqPaEuuLLtlJ/cqhcxaZhbaWRB6vCQW9mO7f8whl7cpbBOO+NwDDCJZCsULh7rINF2omkexfOZzQSt/LC3yw+Pzqrf5Pmp5YgpMvoNgHcY1FkpsHc48IHMsJ+gex2zltIG51TQBAhy/fWF0KIqd+IPT+qngVGYIw/WuXj0LaK7XIVp33tc6fzuXNv+GUzYwpv4k9ry8R/DW8EX572FXFA49HHxbytSIJLD/+KpE2CE1WOr3ONwOXm6WduUBmFi4bwlRrCKnHqnFtLztVdLwMOauFa8N822XoAnWvHs+8R1DLHtgUyZas3ktp/qjMp5oVsb2PO+VpPFHIighHySgljrPl+sKaPULh7P/rAHXOuS9p9zTZKHrQ4nccl8SnYZlHKdioWo1NK5LRZB0PXYH8Ytu8aWVBmb4lAlpAFbSTqtOhydUJ/lyM29STG5mTV3rbG6tWMsUXBpaX4PrGCnhj40RVdz0BzsgvzLu4PNI+s3TJ6ZKV4hGS5on040xMDC2423DpKHPNa7mbl7J036dFt0JcYeGu07maGxssJnwLbebg5cm36Ecea7cTBWEGFMqiFjLoBEu0Y2CfF/GEbwqOf55/p1ewaZMrunFKd/Mj89qyYU5bp6mwmXSwj10psAA+qtXYm3XzRrLHKfCuiukyPEtvI+RdjbQDtMP1vF5qkmjlQLHXvEDpviJMaqvIPkjGrZkvAej1JX5yka50z0od9LLz8TIernjLLoVZ+cWtpd3kchO6w+zTpIOups4HdD66zaiPJrXIrJwi5bIgwTOWLhVs3ufZ0loFjlWWUh5FlTW+oWl1AD4h/yPBHWglqfMaTTqH75B4XEriy+Bw9k=";
protected $lowerA = "a";
public function testDecodeMultipleCharactersAsCodePoints(string $input, array $exp) {
@ -289,6 +290,22 @@ abstract class DecoderTest extends \PHPUnit\Framework\TestCase {
$this->iterateThroughAString($input, $exp, true);
}
public function testSeekBackOverRandomData() {
$class = $this->testedClass;
$bytes = base64_decode($this->random);
$i = new $class($bytes);
$fwd = [];
do {
$fwd[] = [$i->posByte(), $i->nextCode()];
} while ($i->posByte() < strlen($bytes));
while (sizeof($fwd)) {
list($expPos, $expCode) = array_pop($fwd);
$this->assertSame(0, $i->seek(-1), "Start of string reached prematureley");
$this->assertSame($expPos, $i->posByte(), "Position desynchronized");
$this->assertSame($expCode, $i->peekCode(1)[0], "Incorrect character decoded at byte position $expPos");
}
}
protected function iterateThroughAString(string $input, array $exp, bool $allowSurrogates) {
$class = $this->testedClass;
$input = $this->prepString($input);

Loading…
Cancel
Save