Completed
Push — master ( f7e2e6...df6590 )
by Tomasz
03:07
created

ZmqServerTest::testGenerateAfterTimeout()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 30
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 30
rs 8.8571
cc 1
eloc 22
nc 1
nop 0
1
<?php
2
3
namespace Gendoria\CruftFlake;
4
5
use Exception;
6
use Gendoria\CruftFlake\Generator\GeneratorStatus;
7
use Gendoria\CruftFlake\Zmq\ZmqServer;
8
use PHPUnit_Framework_TestCase;
9
use Psr\Log\NullLogger;
10
use ReflectionObject;
11
12
/**
13
 * Test the ZMQ server.
14
 *
15
 * @author Tomasz Struczyński <[email protected]>
16
 */
17
class ZmqServerTest extends PHPUnit_Framework_TestCase
18
{
19
    public function testGenerate()
20
    {
21
        $generator = $this->getMock('\Gendoria\CruftFlake\Generator\Generator', array('generate', 'heartbeat'), array(), '', false);
22
        $generator->expects($this->once())
23
            ->method('generate')
24
            ->will($this->returnValue(10));
25
26
        $socket = $this->getMock('ZMQSocket', array('recv', 'send'), array(), '', false);
27
        $socket->expects($this->once())
28
            ->method('recv')
29
            ->willReturn('GEN');
30
        $socket->expects($this->once())
31
            ->method('send')
32
            ->with('{"code":200,"message":10}');
33
        
34
        $server = $this->getMock('\Gendoria\CruftFlake\Zmq\ZmqServer', array('getZmqSocket'), array($generator, 5599, true));
35
        
36
        $server->expects($this->once())
37
            ->method('getZmqSocket')
38
            ->with(5599)
39
            ->will($this->returnValue($socket));        
40
        
41
        /* @var $server ZmqServer */
42
        $server->run();
43
    }
44
    
45
    /**
46
     * Test ticket generation after some sleep - to allow heartbeat operation to be called.
47
     */
48
    public function testGenerateAfterTimeout()
49
    {
50
        $generator = $this->getMock('\Gendoria\CruftFlake\Generator\Generator', array('generate', 'heartbeat'), array(), '', false);
51
        $generator->expects($this->once())
52
            ->method('generate')
53
            ->will($this->returnValue(10));
54
        $generator->expects($this->once())
55
            ->method('heartbeat');
56
57
        $socket = $this->getMock('ZMQSocket', array('recv', 'send'), array(), '', false);
58
        $socket->expects($this->once())
59
            ->method('recv')
60
            ->willReturnCallback(function() {
61
                sleep(6);
62
                return 'GEN';
63
        });
64
        $socket->expects($this->once())
65
            ->method('send')
66
            ->with('{"code":200,"message":10}');
67
        
68
        $server = $this->getMock('\Gendoria\CruftFlake\Zmq\ZmqServer', array('getZmqSocket'), array($generator, 5599, true));
69
        
70
        $server->expects($this->once())
71
            ->method('getZmqSocket')
72
            ->with(5599)
73
            ->will($this->returnValue($socket));        
74
        
75
        /* @var $server ZmqServer */
76
        $server->run();
77
    }    
78
    
79
    public function testGenerateException()
80
    {
81
        $generator = $this->getMock('\Gendoria\CruftFlake\Generator\Generator', array('generate', 'heartbeat'), array(), '', false);
82
        $generator->expects($this->once())
83
            ->method('generate')
84
            ->will($this->throwException(new Exception()));
85
86
        $socket = $this->getMock('ZMQSocket', array('recv', 'send'), array(), '', false);
87
        $socket->expects($this->once())
88
            ->method('recv')
89
            ->willReturn('GEN');
90
        $socket->expects($this->once())
91
            ->method('send')
92
            ->with('{"code":500,"message":"ERROR"}');
93
        
94
        $server = $this->getMock('\Gendoria\CruftFlake\Zmq\ZmqServer', array('getZmqSocket'), array($generator, 5599, true));
95
        
96
        $server->expects($this->once())
97
            ->method('getZmqSocket')
98
            ->with(5599)
99
            ->will($this->returnValue($socket));        
100
        
101
        /* @var $server ZmqServer */
102
        $server->run();
103
    }
104
    
105
    public function testStatus()
106
    {
107
        $generator = $this->getMock('\Gendoria\CruftFlake\Generator\Generator', array('status', 'heartbeat'), array(), '', false);
108
        $generatorStatus = new GeneratorStatus(1, 1, 1, true);
109
        $generator->expects($this->once())
110
            ->method('status')
111
            ->will($this->returnValue($generatorStatus));
112
113
        $socket = $this->getMock('ZMQSocket', array('recv', 'send'), array(), '', false);
114
        $socket->expects($this->once())
115
            ->method('recv')
116
            ->willReturn('STATUS');
117
        $socket->expects($this->once())
118
            ->method('send')
119
            ->with('{"code":200,"message":{"machine":1,"lastTime":1,"sequence":1,"is32Bit":true}}');
120
        
121
        $server = $this->getMock('\Gendoria\CruftFlake\Zmq\ZmqServer', array('getZmqSocket'), array($generator, 5599, true));
122
        
123
        $server->expects($this->once())
124
            ->method('getZmqSocket')
125
            ->with(5599)
126
            ->will($this->returnValue($socket));        
127
        
128
        /* @var $server ZmqServer */
129
        $server->run();
130
    }
131
    
132
    public function testUnknownCommand()
133
    {
134
        $generator = $this->getMock('\Gendoria\CruftFlake\Generator\Generator', array('status', 'heartbeat'), array(), '', false);
135
136
        $socket = $this->getMock('ZMQSocket', array('recv', 'send'), array(), '', false);
137
        $socket->expects($this->once())
138
            ->method('recv')
139
            ->willReturn('DUMMY_UNKNOWN_COMMAND');
140
        $socket->expects($this->once())
141
            ->method('send')
142
            ->with('{"code":404,"message":"UNKNOWN COMMAND"}');
143
        
144
        $server = $this->getMock('\Gendoria\CruftFlake\Zmq\ZmqServer', array('getZmqSocket'), array($generator, 5599, true));
145
        
146
        $server->expects($this->once())
147
            ->method('getZmqSocket')
148
            ->with(5599)
149
            ->will($this->returnValue($socket));        
150
        
151
        /* @var $server ZmqServer */
152
        $server->run();
153
    }
154
    
155
    public function testHeartBeat()
156
    {
157
        $generator = $this->getMock('\Gendoria\CruftFlake\Generator\Generator', array('status', 'heartbeat'), array(), '', false);
158
        $generator->expects($this->once())
159
            ->method('heartbeat');
160
161
        $socket = $this->getMock('ZMQSocket', array('recv', 'send'), array(), '', false);
162
        $socket->expects($this->once())
163
            ->method('recv')
164
            ->willReturn(false);
165
        $socket->expects($this->never())
166
            ->method('send');
167
        
168
        $server = $this->getMock('\Gendoria\CruftFlake\Zmq\ZmqServer', array('getZmqSocket'), array($generator, 5599, true));
169
        
170
        $server->expects($this->once())
171
            ->method('getZmqSocket')
172
            ->with(5599)
173
            ->will($this->returnValue($socket));        
174
        
175
        /* @var $server ZmqServer */
176
        $server->run();
177
    }
178
    
179
    public function testSetLogger()
180
    {
181
        $generator = $this->getMock('\Gendoria\CruftFlake\Generator\Generator', array('status', 'heartbeat'), array(), '', false);
182
        $server = new ZmqServer($generator, 5599, true);
183
        $logger = new NullLogger();
184
        $server->setLogger($logger);
185
        $refl = new ReflectionObject($server);
186
        $loggerProp = $refl->getProperty('logger');
187
        $loggerProp->setAccessible(true);
188
        $this->assertSame($logger, $loggerProp->getValue($server));
189
    }
190
    
191
    public function testGetSmqSocket()
192
    {
193
        $generator = $this->getMock('\Gendoria\CruftFlake\Generator\Generator', array('status', 'heartbeat'), array(), '', false);
194
        $server = new ZmqServer($generator, 5599, true);
195
        $refl = new ReflectionObject($server);
196
        $socketMethod = $refl->getMethod('getZmqSocket');
197
        $socketMethod->setAccessible(true);
198
        $socket = $socketMethod->invoke($server, 'tcp://*:5599');
199
        $this->assertInstanceOf('\ZmqSocket', $socket);
200
        $this->assertEquals(array('connect' => array(), 'bind' => array('tcp://*:5599')), $socket->getEndpoints());
201
    }
202
}
203