Skip to content
This repository was archived by the owner on Mar 24, 2025. It is now read-only.
Merged
Prev Previous commit
Next Next commit
add missing test for emitInTaskWorker
  • Loading branch information
albertcht committed Aug 25, 2019
commit d7e47aa4be7bb60fc9b3fccb8c19491291481aa6
14 changes: 5 additions & 9 deletions src/Server/Manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,10 @@ protected function initialize()
{
$this->createTables();
$this->prepareWebsocket();
$this->setSwooleServerListeners();

if (! $this->container->make(Server::class)->taskworker) {
$this->setSwooleServerListeners();
}
}

/**
Expand All @@ -123,10 +126,6 @@ protected function initialize()
protected function setSwooleServerListeners()
{
$server = $this->container->make(Server::class);
if ($server->taskworker){
return;
}

foreach ($this->events as $event) {
$listener = Str::camel("on_$event");
$callback = method_exists($this, $listener) ? [$this, $listener] : function () use ($event) {
Expand Down Expand Up @@ -175,10 +174,7 @@ public function onWorkerStart($server)

$this->container->make('events')->dispatch('swoole.workerStart', func_get_args());

if ($server->taskworker) {
$this->setProcessName('task process');
}
$this->setProcessName('worker process');
$this->setProcessName($server->taskworker ? 'task process' : 'worker process');

// clear events instance in case of repeated listeners in worker process
Facade::clearResolvedInstance('events');
Expand Down
36 changes: 13 additions & 23 deletions src/Websocket/Websocket.php
Original file line number Diff line number Diff line change
Expand Up @@ -173,33 +173,23 @@ public function emit(string $event, $data): bool
return false;
}

/** @var Server $server */
$payload = [
'sender' => $this->sender,
'fds' => $fds,
'broadcast' => $this->isBroadcast,
'assigned' => $assigned,
'event' => $event,
'message' => $data,
];

$result = true;
$server = App::make(Server::class);

if (!empty($server->taskworker)) {
/** @var Manager $manager */
$manager = App::make(Manager::class);
$manager->pushMessage($server, [
'sender' => $this->sender,
'fds' => $fds,
'broadcast' => $this->isBroadcast,
'assigned' => $assigned,
'event' => $event,
'message' => $data,
]);

$result = true;
if ($server->taskworker) {
App::make(Manager::class)->pushMessage($server, $payload);
} else {
$result = $server->task([
'action' => static::PUSH_ACTION,
'data' => [
'sender' => $this->sender,
'fds' => $fds,
'broadcast' => $this->isBroadcast,
'assigned' => $assigned,
'event' => $event,
'message' => $data,
],
'data' => $payload
]);
}

Expand Down
68 changes: 60 additions & 8 deletions tests/Websocket/WebsocketTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,19 @@

namespace SwooleTW\Http\Tests\Websocket;

use Illuminate\Container\Container;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Mockery as m;
use Illuminate\Http\Request;
use InvalidArgumentException;
use Illuminate\Pipeline\Pipeline;
use SwooleTW\Http\Server\Manager;
use SwooleTW\Http\Tests\TestCase;
use Illuminate\Container\Container;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;
use InvalidArgumentException;
use Mockery as m;
use SwooleTW\Http\Websocket\Websocket;
use SwooleTW\Http\Server\Facades\Server;
use SwooleTW\Http\Tests\TestCase;
use SwooleTW\Http\Websocket\Rooms\RoomContract;
use SwooleTW\Http\Websocket\Websocket;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;

class WebsocketTest extends TestCase
{
Expand Down Expand Up @@ -326,12 +327,15 @@ public function testEmit()
->times(3)
->andReturn([3, 4, 5]);

$server = m::mock('server');
$server->taskworker = false;

App::shouldReceive('make')
->with(Server::class)
->once()
->andReturnSelf();
->andReturn($server);

App::shouldReceive('task')
$server->shouldReceive('task')
->with([
'action' => 'push',
'data' => [
Expand All @@ -355,6 +359,54 @@ public function testEmit()
$this->assertFalse($websocket->getIsBroadcast());
}

public function testEmitInTaskWorker()
{
$sender = 1;
$to = [1, 2, 'a', 'b', 'c'];
$broadcast = true;
$room = m::mock(RoomContract::class);
$room->shouldReceive('getClients')
->with(m::type('string'))
->times(3)
->andReturn([3, 4, 5]);

$payload = [
'sender' => $sender,
'fds' => [1, 2, 3, 4, 5],
'broadcast' => $broadcast,
'assigned' => true,
'event' => $event = 'event',
'message' => $data = 'data',
];

$server = m::mock('server');
$server->taskworker = true;

$manager = m::mock(Manager::class);
$manager->shouldReceive('pushMessage')
->with($server, $payload)
->once();

App::shouldReceive('make')
->with(Server::class)
->once()
->andReturn($server);

App::shouldReceive('make')
->with(Manager::class)
->once()
->andReturn($manager);

$websocket = $this->getWebsocket($room);
$websocket->setSender($sender)
->to($to)
->broadcast()
->emit($event, $data);

$this->assertSame([], $websocket->getTo());
$this->assertFalse($websocket->getIsBroadcast());
}

public function testClose()
{
$fd = 1;
Expand Down