Issue #2935193 by Sutharsan, alexpott: Fix broken exceptions in Gettext component

8.6.x
Alex Pott 2018-03-03 13:47:09 +00:00
parent 93f932037a
commit adc95eec56
4 changed files with 131 additions and 11 deletions

View File

@ -188,7 +188,7 @@ class PoHeader {
* - 'nplurals': The number of plural forms defined by the plural formula.
* - 'plurals': Array of plural positions keyed by plural value.
*
* @throws Exception
* @throws \Exception
*/
public function parsePluralForms($pluralforms) {
$plurals = [];
@ -473,7 +473,7 @@ class PoHeader {
* Number of the plural string to be used for the given plural value.
*
* @see parseArithmetic()
* @throws Exception
* @throws \Exception
*/
protected function evaluatePlural($element_stack, $n) {
$count = count($element_stack);

View File

@ -146,7 +146,7 @@ class PoStreamReader implements PoStreamInterface, PoReaderInterface {
* Opens the stream and reads the header. The stream is ready for reading
* items after.
*
* @throws Exception
* @throws \Exception
* If the URI is not yet set.
*/
public function open() {
@ -162,7 +162,7 @@ class PoStreamReader implements PoStreamInterface, PoReaderInterface {
/**
* Implements Drupal\Component\Gettext\PoStreamInterface::close().
*
* @throws Exception
* @throws \Exception
* If the stream is not open.
*/
public function close() {
@ -506,6 +506,8 @@ class PoStreamReader implements PoStreamInterface, PoReaderInterface {
$this->_errors[] = SafeMarkup::format('The translation stream %uri ended unexpectedly at line %line.', $log_vars);
return FALSE;
}
return;
}
/**

View File

@ -81,7 +81,7 @@ class PoStreamWriter implements PoWriterInterface, PoStreamInterface {
/**
* Implements Drupal\Component\Gettext\PoStreamInterface::close().
*
* @throws Exception
* @throws \Exception
* If the stream is not open.
*/
public function close() {
@ -89,7 +89,7 @@ class PoStreamWriter implements PoWriterInterface, PoStreamInterface {
fclose($this->_fd);
}
else {
throw new Exception('Cannot close stream that is not open.');
throw new \Exception('Cannot close stream that is not open.');
}
}
@ -100,13 +100,13 @@ class PoStreamWriter implements PoWriterInterface, PoStreamInterface {
* Piece of string to write to the stream. If the value is not directly a
* string, casting will happen in writing.
*
* @throws Exception
* @throws \Exception
* If writing the data is not possible.
*/
private function write($data) {
$result = fwrite($this->_fd, $data);
if ($result === FALSE) {
throw new Exception('Unable to write data: ' . substr($data, 0, 20));
if ($result === FALSE || $result != strlen($data)) {
throw new \Exception('Unable to write data: ' . substr($data, 0, 20));
}
}
@ -137,12 +137,12 @@ class PoStreamWriter implements PoWriterInterface, PoStreamInterface {
/**
* Implements Drupal\Component\Gettext\PoStreamInterface::getURI().
*
* @throws Exception
* @throws \Exception
* If the URI is not set.
*/
public function getURI() {
if (empty($this->_uri)) {
throw new Exception('No URI set.');
throw new \Exception('No URI set.');
}
return $this->_uri;
}

View File

@ -0,0 +1,118 @@
<?php
namespace Drupal\Tests\Component\Gettext;
use Drupal\Component\Gettext\PoItem;
use Drupal\Component\Gettext\PoStreamWriter;
use org\bovigo\vfs\vfsStream;
use org\bovigo\vfs\vfsStreamFile;
use PHPUnit\Framework\TestCase;
/**
* @coversDefaultClass \Drupal\Component\Gettext\PoStreamWriter
* @group Gettext
*/
class PoStreamWriterTest extends TestCase {
/**
* The PO writer object under test.
*
* @var \Drupal\Component\Gettext\PoStreamWriter
*/
protected $poWriter;
/**
* The mock po file.
*
* @var \org\bovigo\vfs\vfsStreamFile
*/
protected $poFile;
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
$this->poWriter = new PoStreamWriter();
$root = vfsStream::setup();
$this->poFile = new vfsStreamFile('powriter.po');
$root->addChild($this->poFile);
}
/**
* @covers ::getURI
*/
public function testGetUriException() {
if (method_exists($this, 'expectException')) {
$this->expectException(\Exception::class, 'No URI set.');
}
else {
$this->setExpectedException(\Exception::class, 'No URI set.');
}
$this->poWriter->getURI();
}
/**
* @covers ::writeItem
* @dataProvider providerWriteData
*/
public function testWriteItem($poContent, $expected, $long) {
if ($long) {
if (method_exists($this, 'expectException')) {
$this->expectException(\Exception::class, 'Unable to write data:');
}
else {
$this->setExpectedException(\Exception::class, 'Unable to write data:');
}
}
// Limit the file system quota to make the write fail on long strings.
vfsStream::setQuota(10);
$this->poWriter->setURI($this->poFile->url());
$this->poWriter->open();
$poItem = $this->prophesize(PoItem::class);
$poItem->__toString()->willReturn($poContent);
$this->poWriter->writeItem($poItem->reveal());
$this->poWriter->close();
$this->assertEquals(file_get_contents($this->poFile->url()), $expected);
}
/**
* @return array
* - Content to write.
* - Written content.
* - Content longer than 10 bytes.
*/
public function providerWriteData() {
return [
['', '', FALSE],
["\r\n", "\r\n", FALSE],
['write this if you can', 'write this', TRUE],
['éáíó>&', 'éáíó>&', FALSE],
['éáíó>&<', 'éáíó>&', TRUE],
['中文 890', '中文 890', FALSE],
['中文 89012', '中文 890', TRUE],
];
}
/**
* @covers ::close
*/
public function testCloseException() {
if (method_exists($this, 'expectException')) {
$this->expectException(\Exception::class, 'Cannot close stream that is not open.');
}
else {
$this->setExpectedException(\Exception::class, 'Cannot close stream that is not open.');
}
$this->poWriter->close();
}
}