Erro de Blazeds Ao executar testes FlexUnit: Detectado duplicado FlexSessions baseados em HTTP
-
26-09-2019 - |
Pergunta
Estou usando o plug-in do Maven FlexMOJOS para executar alguns testes de integração FlexUnit4 na linha de comando contra um back-end de segurança/java/spring security/Blazeds. Esses testes de integração são executados em uma versão independente do flash player. Um desses testes tenta alguns cenários de login diferentes da seguinte forma:
[Test(async)]
public function userLogin_badCredentials_FailedLogin():void {
var username:String = "guest";
var password:String = "not_the_right_password";
var token:AsyncToken = authenticationService.userLogin(username, password);
token.addResponder(Async.asyncResponder(this, new TestResponder(handleRemoteObjectNoExpectedResult, handleRemoteObjectExpectedFaultBadCredentials), TIMEOUT, username, handleTestTimeout));
}
[Test(async)]
public function userLoginLogout_UserLoggedIn_SuccessfulLoginLogout():void {
var username:String = "admin";
var password:String = "admin";
var token:AsyncToken = authenticationService.userLogin(username, password);;
token.addResponder(Async.asyncResponder(this, new TestResponder(userLoginLogout2_UserLoggedIn_SuccessfulLoginLogout, handleUnexpectedFault), TIMEOUT, username, handleTestTimeout));
}
public function userLoginLogout2_UserLoggedIn_SuccessfulLoginLogout(event:ResultEvent, passThroughData:Object):void {
// Must have logged in correctly
assertTrue(serviceManager.channelSet.authenticated);
// Now lets test logout
var token:AsyncToken = authenticationService.userLogout();
token.addResponder(Async.asyncResponder(this, new TestResponder(handleExpectedResult, handleUnexpectedFault), TIMEOUT, null, handleTestTimeout));
}
Qualquer um desses testes passa 100% por si só, mas executando os dois após o outro, sou intermitentemente (cerca de 75% das vezes) recebendo um erro:
Channel.Ping.Failed error Detected duplicate HTTP-based FlexSessions, generally
due to the remote host disabling session cookies. Session cookies must be enabled
to manage the client connection correctly.
Isso também acontece se eu tentar fazer login/logout duas vezes. Todos os métodos de login e logout são baseados em um canalleset.login e canalleset.logout que estão usando um amfChannelset.
Atualizar: Acredito que encontrei a fonte do problema. O jogador independente não faz uso de cookies e, portanto, está confundindo o back -end dos Blazeds. Veja aqui: http://www.webappsolution.com/wordpress/2009/11/25/flexunit-4-testing-services-in-flash-player-issue/
Solução
A natureza intermitente do problema me levou a adivinhar que uma condição de corrida estava acontecendo. Usando o utilitário de depuração do proxy Charles Proxy, pude ver as mensagens de solicitação/resposta AMF. Eu não tinha (e ainda não tenho) certeza, mas meu melhor palpite era que a segunda tentativa de login estava acontecendo antes que o servidor tivesse a chance de desativar completamente a flexão anterior.
Então, para "comprar tempo" entre as tentativas de login, separei os métodos de teste em diferentes classes de teste e viola ... tudo funcionou.
Talvez um sono/atraso pós-teste também tenha feito o truque, mas não consegui encontrar uma função de sono do ActionScript.