Skip to content

Commit e261065

Browse files
authored
Merge pull request #108 from pekhota/udp_transport_exceptions_fix
replaced thrown exceptions logic with logger->warning calls for Thrif…
2 parents 98b3af3 + 1f1462a commit e261065

File tree

3 files changed

+81
-19
lines changed

3 files changed

+81
-19
lines changed

src/Jaeger/ThriftUdpTransport.php

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Psr\Log\LoggerInterface;
66
use Psr\Log\NullLogger;
7-
use Thrift\Exception\TTransportException;
87
use Thrift\Transport\TTransport;
98

109
class ThriftUdpTransport extends TTransport
@@ -38,7 +37,7 @@ public function __construct(string $host, int $port, LoggerInterface $logger = n
3837
$this->port = $port;
3938
$this->socket = @socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
4039
if ($this->socket === false) {
41-
$this->handleError("socket_create failed");
40+
$this->handleSocketError("socket_create failed");
4241
}
4342
$this->logger = $logger ?? new NullLogger();
4443
}
@@ -55,14 +54,12 @@ public function isOpen()
5554

5655
/**
5756
* Open the transport for reading/writing
58-
*
59-
* @throws TTransportException if cannot open
6057
*/
6158
public function open()
6259
{
6360
$ok = @socket_connect($this->socket, $this->host, $this->port);
6461
if ($ok === false) {
65-
$this->handleError('socket_connect failed');
62+
$this->handleSocketError('socket_connect failed');
6663
}
6764
}
6865

@@ -71,6 +68,11 @@ public function open()
7168
*/
7269
public function close()
7370
{
71+
if (is_null($this->socket)) {
72+
$this->logger->warning("can't close empty socket");
73+
return ;
74+
}
75+
7476
@socket_close($this->socket);
7577
$this->socket = null;
7678
}
@@ -91,25 +93,25 @@ public function read($len)
9193
* Writes the given data out.
9294
*
9395
* @param string $buf The data to write
94-
* @throws TTransportException if writing fails
9596
*/
9697
public function write($buf)
9798
{
9899
if (!$this->isOpen()) {
99-
throw new TTransportException('transport is closed');
100+
$this->logger->warning('transport is closed');
101+
return ;
100102
}
101103

102104
$ok = @socket_write($this->socket, $buf);
103105
if ($ok === false) {
104-
$this->handleError("socket_write failed");
106+
$this->handleSocketError("socket_write failed");
105107
}
106108
}
107109

108-
public function handleError($msg)
110+
public function handleSocketError($msg)
109111
{
110112
$errorCode = socket_last_error($this->socket);
111113
$errorMsg = socket_strerror($errorCode);
112114

113-
throw new TTransportException(sprintf('%s: [code - %d] %s', $msg, $errorCode, $errorMsg));
115+
$this->logger->warning(sprintf('%s: [code - %d] %s', $msg, $errorCode, $errorMsg));
114116
}
115117
}

tests/Jaeger/Logger/StackLogger.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Jaeger\Tests\Logger;
4+
5+
use Psr\Log\LoggerTrait;
6+
7+
class StackLogger implements \Psr\Log\LoggerInterface
8+
{
9+
/** @var array */
10+
protected $messagesStack = [];
11+
12+
use LoggerTrait;
13+
14+
public function log($level, $message, array $context = array())
15+
{
16+
$this->messagesStack[] = $message;
17+
}
18+
19+
public function getLastMessage() {
20+
return array_pop($this->messagesStack);
21+
}
22+
23+
public function getMessagesCount() {
24+
return count($this->messagesStack);
25+
}
26+
27+
public function clear() {
28+
$this->messagesStack = [];
29+
}
30+
}

tests/Jaeger/ThriftUdpTransportTest.php

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Jaeger\Tests;
44

5+
use Jaeger\Tests\Logger\StackLogger;
56
use Jaeger\ThriftUdpTransport;
67
use PHPUnit\Framework\TestCase;
78
use Thrift\Exception\TTransportException;
@@ -13,43 +14,72 @@ class ThriftUdpTransportTest extends TestCase
1314
*/
1415
private $transport;
1516

17+
/**
18+
* @var StackLogger
19+
*/
20+
private $logger;
21+
1622
public function setUp(): void
1723
{
18-
$this->transport = new ThriftUdpTransport('127.0.0.1', 12345);
24+
$this->logger = new StackLogger();
25+
$this->transport = new ThriftUdpTransport('127.0.0.1', 12345, $this->logger);
1926
}
2027

2128
public function testisOpenWhenOpen()
2229
{
30+
$this->assertEquals($this->logger->getMessagesCount(), 0);
2331
$this->assertTrue($this->transport->isOpen());
32+
$this->assertEquals($this->logger->getMessagesCount(), 0);
2433
}
2534

2635
public function testisOpenWhenClosed()
2736
{
37+
$this->assertEquals($this->logger->getMessagesCount(), 0);
2838
$this->transport->close();
2939
$this->assertFalse($this->transport->isOpen());
40+
$this->assertEquals($this->logger->getMessagesCount(), 0);
3041
}
3142

3243
public function testClose()
3344
{
45+
$this->assertEquals($this->logger->getMessagesCount(), 0);
3446
$this->transport->close();
3547

36-
$this->expectException(TTransportException::class);
37-
$this->expectExceptionMessage('transport is closed');
48+
$this->assertEquals($this->logger->getMessagesCount(), 0);
3849
$this->transport->write('hello');
50+
$this->assertEquals($this->logger->getMessagesCount(), 1);
51+
$this->assertEquals($this->logger->getLastMessage(), 'transport is closed');
52+
$this->assertEquals($this->logger->getMessagesCount(), 0);
53+
}
54+
55+
public function testDoubleClose() {
56+
$this->assertEquals($this->logger->getMessagesCount(), 0);
57+
$this->transport->close();
58+
$this->assertEquals($this->logger->getMessagesCount(), 0);
59+
$this->transport->close();
60+
$this->assertEquals($this->logger->getMessagesCount(), 1);
61+
$this->assertEquals(
62+
$this->logger->getLastMessage(),
63+
"can't close empty socket"
64+
);
3965
}
4066

4167
public function testException() {
68+
$this->assertEquals($this->logger->getMessagesCount(), 0);
4269
$this->transport->open();
70+
$this->assertEquals($this->logger->getMessagesCount(), 0);
4371

44-
$this->expectException(TTransportException::class);
72+
$this->transport->write(str_repeat("some string", 10000));
4573

46-
$msgRegEx = "/socket_write failed: \[code - \d+\] Message too long/";
47-
if (method_exists($this, "expectExceptionMessageRegExp")) {
48-
$this->expectExceptionMessageRegExp($msgRegEx);
74+
$this->assertEquals($this->logger->getMessagesCount(), 1);
75+
$msg = $this->logger->getLastMessage();
76+
$pattern = "/socket_write failed: \[code - \d+\] Message too long/";
77+
78+
if (method_exists($this, "assertMatchesRegularExpression")) {
79+
$this->assertMatchesRegularExpression($pattern, $msg);
4980
} else {
50-
$this->expectExceptionMessageMatches($msgRegEx);
81+
$this->assertRegExp($pattern, $msg);
5182
}
5283

53-
$this->transport->write(str_repeat("some string", 10000));
5484
}
5585
}

0 commit comments

Comments
 (0)