Websocket PHP autentica usuário em um teste (passa cookie de sessão)

Estou tentando testar um cenário em que, por um lado, usuários anônimos devem desconectar imediatamente de uma conexão Websocket e, por outro lado, usuários autenticados devem permanecer na conexão Websocket. O primeiro caso é fácil de testar usando o código abaixo. O processo de autenticação não está funcionando.

Para armazenamento de sessão, estou usando a autenticação de Cookies em combinação com um banco de dados:Armazenamento de Sessão PDO do Symfony. Está tudo funcionando bem, mas quando se trata de testar o comportamento descrito usando autenticação, não sei como autenticar o usuário em um teste. Como cliente, estou usandoPawl cliente Websocket assíncrono. Parece o seguinte:

\Ratchet\Client\connect('ws://127.0.0.1:8080')->then(function($conn) {
    $conn->on('message', function($msg) use ($conn) {
        echo "Received: {$msg}\n";
    });

    $conn->send('Hello World!');
}, function ($e) {
    echo "Could not connect: {$e->getMessage()}\n";
});

Sei que, como terceiro parâmetro, posso passar informações de cabeçalho para o método "connect", mas não consigo encontrar uma maneira de conectar o cliente e o cookie ser passado corretamente durante o handshake ws. Eu pensei em algo como:

Autentique um cliente criando umtoken de autenticaçãoCrio uma nova entrada na tabela de sessão no banco de dados com usuário serializadoEu passo o cookie criado como um terceiro argumento para o método connect

Essa é a teoria que pensei que funcionaria, mas o usuário sempre permanece anônimo no lado do websocket. Aqui está o código da teoria até agora:

// ...
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class WebsocketTest extends WebTestCase
{

    static $closed;

    protected function setUp()
    {
      self::$closed = null;
    }


    public function testWebsocketConnection()
    {
      $loop = Factory::create();
      $connector = new Connector($loop);

      // This user exists in database user tbl
      $symfClient = $this->createSession("[email protected]");

      $connector('ws://127.0.0.1:80', [], ['Origin' => 'http://127.0.0.1', 'Cookie' => 
                 $symfClient->getContainer()->get('session')->getName() . '=' 
                . $symfClient->getContainer()->get('session')->getId()])
        ->then(function(WebSocket $conn) use($loop){

            $conn->on('close', function($code = null, $reason = null) use($loop) {
                self::$closed = true;
                $loop->stop();
            });
            self::$closed = false;

        }, function(\Exception $e) use ($loop) {
            $this->fail("Websocket connection failed");
            $loop->stop();
        });

      $loop->run();

      // Check, that user stayed logged
      $this->assertFalse(self::$closed);
    }

    private function createSession($email)
    {
      $client = static::createClient();
      $container = $client->getContainer();

      $session = $container->get('session');
      $session->set('logged', true);

      $userManager = $container->get('fos_user.user_manager');
      $em = $container->get('doctrine.orm.entity_manager');
      $loginManager = $container->get('fos_user.security.login_manager');
      $firewallName = 'main';

      $user = $userManager->findUserByEmail($email);

      $loginManager->loginUser($firewallName, $user);

      // save the login token into the session and put it in a cookie
      $container->get('session')->set('_security_' . $firewallName,
        serialize($container->get('security.token_storage')->getToken()));
      $container->get('session')->save();
      $client->getCookieJar()->set(new Cookie($session->getName(), $session->getId()));


      // Create session in database
      $pdo = new PDOSessionStorage();
      $pdo->setSessId($session->getId());
      $pdo->setSessTime(time());
      $pdo->setSessData(serialize($container->get('security.token_storage')->getToken()));
      $pdo->setSessLifetime(1440);

      $em->persist($pdo);
      $em->flush();

      return $client;
  }

}

Como config_test.yml, configurei a sessão da seguinte maneira:

session:
    storage_id:     session.storage.mock_file
    handler_id:     session.handler.pdo

Para a implementação do websocket no servidor, estou usando o Ratchet, que está sendo agrupado pelo seguinte pacote Symfony:Pacote Gos Websocket

Como autenticar o usuário ao testar websockets? No servidor websocket, o usuário sempre é algo como "anon-15468850625756b3b424c94871115670", mas quando eu testo manualmente, ele se conecta corretamente.

Pergunta adicional (secundária): como testar a assinatura de tópicos? (pubsub) Não há entradas de blog ou qualquer outra coisa sobre isso na internet.

Atualização: nunca ninguém funcional testou seus websockets? Isso é sem importância, inútil ou por que alguém não pode ajudar nesse importante tópico?

questionAnswers(1)

yourAnswerToTheQuestion