14
14
use PHPUnit \Framework \TestCase ;
15
15
use Psr \Cache \CacheItemInterface ;
16
16
use Psr \Cache \CacheItemPoolInterface ;
17
+ use Symfony \Component \Cache \DependencyInjection \CachePoolPass ;
17
18
use Symfony \Component \Messenger \Event \WorkerRunningEvent ;
19
+ use Symfony \Component \Messenger \Event \WorkerStartedEvent ;
18
20
use Symfony \Component \Messenger \EventListener \StopWorkerOnRestartSignalListener ;
19
21
use Symfony \Component \Messenger \Worker ;
20
22
@@ -26,44 +28,87 @@ class StopWorkerOnRestartSignalListenerTest extends TestCase
26
28
/**
27
29
* @dataProvider restartTimeProvider
28
30
*/
29
- public function testWorkerStopsWhenMemoryLimitExceeded (?int $ lastRestartTimeOffset , bool $ shouldStop )
31
+ public function testWorkerStopsOnStartIfRestartInCache (?int $ lastRestartTimeOffset , bool $ shouldStop )
30
32
{
31
- $ cachePool = $ this ->createMock (CacheItemPoolInterface::class);
32
- $ cacheItem = $ this ->createMock (CacheItemInterface::class);
33
- $ cacheItem ->expects ($ this ->once ())->method ('isHit ' )->willReturn (true );
34
- $ cacheItem ->expects ($ this ->once ())->method ('get ' )->willReturn (null === $ lastRestartTimeOffset ? null : time () + $ lastRestartTimeOffset );
35
- $ cachePool ->expects ($ this ->once ())->method ('getItem ' )->willReturn ($ cacheItem );
33
+ $ cachePool = $ this ->createRestartInCachePool ($ lastRestartTimeOffset );
36
34
37
35
$ worker = $ this ->createMock (Worker::class);
38
36
$ worker ->expects ($ shouldStop ? $ this ->once () : $ this ->never ())->method ('stop ' );
39
- $ event = new WorkerRunningEvent ($ worker, false );
37
+ $ workerStartedEvent = new WorkerStartedEvent ($ worker );
40
38
41
39
$ stopOnSignalListener = new StopWorkerOnRestartSignalListener ($ cachePool );
42
- $ stopOnSignalListener ->onWorkerStarted ();
43
- $ stopOnSignalListener ->onWorkerRunning ($ event );
40
+ $ stopOnSignalListener ->onWorkerStarted ($ workerStartedEvent );
44
41
}
45
42
46
- public static function restartTimeProvider ()
43
+ /**
44
+ * @dataProvider restartTimeProvider
45
+ */
46
+ public function testWorkerStopsIfRestartInCache (?int $ lastRestartTimeOffset , bool $ shouldStop )
47
+ {
48
+ $ cachePool = $ this ->createRestartInCachePool ($ lastRestartTimeOffset );
49
+
50
+ $ worker = $ this ->createMock (Worker::class);
51
+ $ worker ->expects ($ shouldStop ? $ this ->atLeast (1 ) : $ this ->never ())->method ('stop ' );
52
+ $ workerStartedEvent = new WorkerStartedEvent ($ worker );
53
+ $ workerRunningEvent = new WorkerRunningEvent ($ worker , false );
54
+
55
+ $ stopOnSignalListener = new StopWorkerOnRestartSignalListener ($ cachePool );
56
+ $ stopOnSignalListener ->onWorkerStarted ($ workerStartedEvent );
57
+ $ stopOnSignalListener ->onWorkerRunning ($ workerRunningEvent );
58
+ }
59
+
60
+ public static function restartTimeProvider (): iterable
47
61
{
48
62
yield [null , false ]; // no cached restart time, do not restart
49
63
yield [+10 , true ]; // 10 seconds after starting, a restart was requested
50
64
yield [-10 , false ]; // a restart was requested, but 10 seconds before we started
51
65
}
52
66
67
+ public function testWorkerDoesNotStopOnStartIfRestartNotInCache ()
68
+ {
69
+ $ cachePool = $ this ->createRestartNotInCachePool ();
70
+
71
+ $ worker = $ this ->createMock (Worker::class);
72
+ $ worker ->expects ($ this ->never ())->method ('stop ' );
73
+ $ workerStartedEvent = new WorkerStartedEvent ($ worker );
74
+
75
+ $ stopOnSignalListener = new StopWorkerOnRestartSignalListener ($ cachePool );
76
+ $ stopOnSignalListener ->onWorkerStarted ($ workerStartedEvent );
77
+ }
78
+
53
79
public function testWorkerDoesNotStopIfRestartNotInCache ()
54
80
{
55
- $ cachePool = $ this ->createMock (CacheItemPoolInterface::class);
56
- $ cacheItem = $ this ->createMock (CacheItemInterface::class);
57
- $ cacheItem ->expects ($ this ->once ())->method ('isHit ' )->willReturn (false );
58
- $ cacheItem ->expects ($ this ->never ())->method ('get ' );
59
- $ cachePool ->expects ($ this ->once ())->method ('getItem ' )->willReturn ($ cacheItem );
81
+ $ cachePool = $ this ->createRestartNotInCachePool ();
60
82
61
83
$ worker = $ this ->createMock (Worker::class);
62
84
$ worker ->expects ($ this ->never ())->method ('stop ' );
63
- $ event = new WorkerRunningEvent ($ worker , false );
85
+ $ workerStartedEvent = new WorkerStartedEvent ($ worker );
86
+ $ workerRunningEvent = new WorkerRunningEvent ($ worker , false );
64
87
65
88
$ stopOnSignalListener = new StopWorkerOnRestartSignalListener ($ cachePool );
66
- $ stopOnSignalListener ->onWorkerStarted ();
67
- $ stopOnSignalListener ->onWorkerRunning ($ event );
89
+ $ stopOnSignalListener ->onWorkerStarted ($ workerStartedEvent );
90
+ $ stopOnSignalListener ->onWorkerRunning ($ workerRunningEvent );
91
+ }
92
+
93
+ private function createRestartInCachePool (?int $ value ): CacheItemPoolInterface
94
+ {
95
+ $ cachePool = $ this ->createMock (CacheItemPoolInterface::class);
96
+ $ cacheItem = $ this ->createMock (CacheItemInterface::class);
97
+ $ cacheItem ->method ('isHit ' )->willReturn (true );
98
+ $ cacheItem ->method ('get ' )->willReturn (null === $ value ? null : time () + $ value );
99
+ $ cachePool ->method ('getItem ' )->willReturn ($ cacheItem );
100
+
101
+ return $ cachePool ;
102
+ }
103
+
104
+ private function createRestartNotInCachePool (): CacheItemPoolInterface
105
+ {
106
+ $ cachePool = $ this ->createMock (CacheItemPoolInterface::class);
107
+ $ cacheItem = $ this ->createMock (CacheItemInterface::class);
108
+ $ cacheItem ->method ('isHit ' )->willReturn (false );
109
+ $ cacheItem ->method ('get ' );
110
+ $ cachePool ->method ('getItem ' )->willReturn ($ cacheItem );
111
+
112
+ return $ cachePool ;
68
113
}
69
114
}
0 commit comments