diff --git a/core/lib/Drupal/Component/Gettext/PoHeader.php b/core/lib/Drupal/Component/Gettext/PoHeader.php index 5dd13a5d5b9..96793b5e956 100644 --- a/core/lib/Drupal/Component/Gettext/PoHeader.php +++ b/core/lib/Drupal/Component/Gettext/PoHeader.php @@ -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); diff --git a/core/lib/Drupal/Component/Gettext/PoStreamReader.php b/core/lib/Drupal/Component/Gettext/PoStreamReader.php index f84d2514c0c..9548ea7ea22 100644 --- a/core/lib/Drupal/Component/Gettext/PoStreamReader.php +++ b/core/lib/Drupal/Component/Gettext/PoStreamReader.php @@ -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; } /** diff --git a/core/lib/Drupal/Component/Gettext/PoStreamWriter.php b/core/lib/Drupal/Component/Gettext/PoStreamWriter.php index 5419b210aaf..1e3f3871e39 100644 --- a/core/lib/Drupal/Component/Gettext/PoStreamWriter.php +++ b/core/lib/Drupal/Component/Gettext/PoStreamWriter.php @@ -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; } diff --git a/core/tests/Drupal/Tests/Component/Gettext/PoStreamWriterTest.php b/core/tests/Drupal/Tests/Component/Gettext/PoStreamWriterTest.php new file mode 100644 index 00000000000..7f636c10866 --- /dev/null +++ b/core/tests/Drupal/Tests/Component/Gettext/PoStreamWriterTest.php @@ -0,0 +1,118 @@ +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(); + } + +}