public void RnProcessarEventosFinalizarEdicaoTarefa()
        {
            int contador = 0;
            WexMultiAccessClientMock cliente = new WexMultiAccessClientMock()
            {
                TcpAdapterStubAtivo = true
            };
            TcpAdapterPool pool = new TcpAdapterPool();

            #region Preenchendo informações do cliente
            cliente.EnderecoIp    = ipServidor;
            cliente.OidCronograma = "C1";
            cliente.Porta         = porta;
            cliente.Login         = "******";
            cliente.Conectar();
            pool.AceitarConexao(cliente);
            cliente.AoSerFinalizadaEdicaoTarefaPorOutroUsuario += (mensagem) => { contador++; };
            cliente.AoServidorDesconectar += (mensagemDto) => { };
            #endregion

            //Criando a mensagem de fim de edição de uma tarefa por outro colaborador
            MensagemDto mensagemFimDeEdicao = Mensagem.RnCriarMensagemFinalizarEdicaoTarefa("T1", "Marcos", "C1");
            string      mensagemJson        = JsonConvert.SerializeObject(mensagemFimDeEdicao);
            mensagemJson = TcpUtil.AdicionarStringProtecaoDeIntegridade(mensagemJson);

            pool.EnviarMensagemPara(cliente, mensagemJson);

            ControleDeEsperaUtil.AguardarAte(() => { return(contador == 1); });
            Assert.AreEqual(1, contador, "Deveria ter sido disparado o evento AoEdicaoTarefaSerRecusada");
            cliente.RnDesconectar();
        }
        public void RnProcessarEventosDispararEventoAoReceberMensagemDeServidorDesconectando()
        {
            int            contador      = 0;
            string         oidCronograma = Guid.NewGuid().ToString();
            TcpAdapterPool poolTcp       = new TcpAdapterPool();

            //Criando a mensagem de desconexão do servidor
            MensagemDto mensagemTemporaria = Mensagem.RnCriarMensagemServidorDesconectando("Servidor Efetuando Processo de Desligamento!");
            string      mensagemJson       = JsonConvert.SerializeObject(mensagemTemporaria);

            mensagemJson = TcpUtil.AdicionarStringProtecaoDeIntegridade(mensagemJson);
            WexMultiAccessClientMock client = new WexMultiAccessClientMock()
            {
                EnderecoIp          = ipServidor,
                Porta               = porta,
                Login               = "******",
                OidCronograma       = oidCronograma,
                TcpAdapterStubAtivo = true
            };

            client.Conectar();
            poolTcp.AceitarConexao(client);
            client.AoServidorDesconectar += (mensagem) => { contador++; };

            poolTcp.ServerBroadCast(mensagemJson);

            ControleDeEsperaUtil.AguardarAte(() => { return(contador > 0); });
            Assert.AreEqual(1, contador, "O contador adicionado ao Evento AoServidorDesconectar deveria ter sido contado 1 vez");
            client.RnDesconectar();
        }
        public void RnComunicarCriacaoNovaTarefaQuandoEnviarMensagemNovaTarefaTest()
        {
            int                      contador = 0;
            TcpAdapterPool           poolTcp  = new TcpAdapterPool();
            WexMultiAccessClientMock cliente  = new WexMultiAccessClientMock()
            {
                EnderecoIp          = ipServidor,
                OidCronograma       = "C1",
                Porta               = porta,
                Login               = "******",
                TcpAdapterStubAtivo = true
            };

            WexMultiAccessClientMock cliente2 = new WexMultiAccessClientMock()
            {
                EnderecoIp          = ipServidor,
                OidCronograma       = "C1",
                Porta               = porta,
                Login               = "******",
                TcpAdapterStubAtivo = true
            };

            cliente.Conectar();
            poolTcp.AceitarConexao(cliente);

            cliente2.Conectar();
            poolTcp.AceitarConexao(cliente2);

            cliente.AoServidorDesconectar  += (mensagemDto) => { };
            cliente2.AoServidorDesconectar += (mensagemDto) => { };
            Dictionary <string, Int16> tarefasImpactadas = new Dictionary <string, short>();

            tarefasImpactadas.Add("T2", 3);
            tarefasImpactadas.Add("T3", 4);
            tarefasImpactadas.Add("T4", 5);
            tarefasImpactadas.Add("T5", 6);
            tarefasImpactadas.Add("T6", 7);
            tarefasImpactadas.Add("T7", 8);



            DateUtil.CurrentDateTime = DateTime.Now;
            cliente.RnComunicarNovaTarefaCriada("T1", "C1", null, DateUtil.CurrentDateTime);
            int codigoTipoMensagem = (int)CsTipoMensagem.NovaTarefaCriada;

            ControleDeEsperaUtil.AguardarAte(() => { return(cliente2.contagemTiposMensagemDtoRecebidas.ContainsKey(codigoTipoMensagem) && cliente2.contagemTiposMensagemDtoRecebidas[codigoTipoMensagem] > 0); });

            MensagemDto mensagemRecebida = cliente2.MensagensRecebidas.FirstOrDefault(o => o.Tipo.Equals(CsTipoMensagem.NovaTarefaCriada));

            MensagemDto objetoMensagemEsperado = Mensagem.RnCriarMensagemNovaTarefaCriada("T1", cliente.Login, "C1", null, DateUtil.CurrentDateTime);

            Assert.AreEqual(objetoMensagemEsperado.Propriedades[OIDTAREFA], mensagemRecebida.Propriedades[OIDTAREFA]);
            Assert.AreEqual(objetoMensagemEsperado.Propriedades[LOGIN], mensagemRecebida.Propriedades[LOGIN]);
            Assert.AreEqual(objetoMensagemEsperado.Propriedades[OIDCRONOGRAMA], mensagemRecebida.Propriedades[OIDCRONOGRAMA]);
            Assert.AreEqual(objetoMensagemEsperado.Propriedades[DATAHORA_ACAO], mensagemRecebida.Propriedades[DATAHORA_ACAO]);
        }
        public void RnProcessarEventosProcessarMensagemInicioEdicaoTarefaTest()
        {
            bool           mensagemRecebida = false;
            TcpAdapterPool pool             = new TcpAdapterPool();

            WexMultiAccessClientMock cliente = new WexMultiAccessClientMock()
            {
                TcpAdapterStubAtivo = true
            };

            #region Preenchendo informações do cliente
            cliente.EnderecoIp    = ipServidor;
            cliente.OidCronograma = "C1";
            cliente.Porta         = porta;
            cliente.Login         = "******";
            cliente.Conectar();
            pool.AceitarConexao(cliente);
            cliente.AoServidorDesconectar += (mensagemDto) => { };
            #endregion

            WexMultiAccessClientMock cliente2 = new WexMultiAccessClientMock()
            {
                TcpAdapterStubAtivo = true
            };
            #region Preenchendo informações cliente2
            cliente2.EnderecoIp    = ipServidor;
            cliente2.OidCronograma = "C1";
            cliente2.Porta         = porta;
            cliente2.Login         = "******";
            cliente2.Conectar();
            pool.AceitarConexao(cliente2);
            cliente2.AoServidorDesconectar += (mensagemDto) => { };
            cliente2.AoIniciarEdicaoTarefa += (mensagemDto) =>
            {
                if (mensagemDto != null && mensagemDto.Tipo.Equals(CsTipoMensagem.InicioEdicaoTarefa))
                {
                    mensagemRecebida = true;
                }
            };
            #endregion

            cliente.RnComunicarInicioEdicaoTarefa("T1");
            ControleDeEsperaUtil.AguardarAte(() => { return(mensagemRecebida); });

            //Criando uma réplica do que deverá ser recebido pelo cliente2
            MensagemDto objetoMensagemEsperado = Mensagem.RnCriarMensagemInicioEdicaoTarefa("T1", cliente.Login, "C1");
            objetoMensagemEsperado.Propriedades.Add(Constantes.LOGIN_WEX_CLIENT, cliente2.Login);


            MensagemDto objetoMensagem = cliente2.MensagensRecebidas.FirstOrDefault(o => o.Tipo.Equals(CsTipoMensagem.InicioEdicaoTarefa));
            Assert.IsNotNull(objetoMensagem, string.Format("{0} deveria ser avisado que uma tarefa entrou em edição.", cliente2.Login));
            CollectionAssert.AreEquivalent(objetoMensagemEsperado.Propriedades, objetoMensagem.Propriedades, "Deveria ter recebido as informações esperadas.");
            cliente.RnDesconectar();
        }
        public void RnComunicarInicioEdicaoTarefaTest()
        {
            bool foiInformado = false;

            WexMultiAccessClientMock cliente = new WexMultiAccessClientMock()
            {
                TcpAdapterStubAtivo = true
            };
            TcpAdapterPool pool = new TcpAdapterPool();

            cliente.EnderecoIp    = ipServidor;
            cliente.OidCronograma = "C1";
            cliente.Porta         = porta;
            cliente.Login         = "******";
            cliente.Conectar();
            pool.AceitarConexao(cliente);
            cliente.AoServidorDesconectar += (mensagemDto) => { };

            WexMultiAccessClientMock cliente2 = new WexMultiAccessClientMock()
            {
                TcpAdapterStubAtivo = true
            };

            cliente2.EnderecoIp    = ipServidor;
            cliente2.OidCronograma = "C1";
            cliente2.Porta         = porta;
            cliente2.Login         = "******";
            cliente2.Conectar();
            pool.AceitarConexao(cliente2);
            cliente2.AoServidorDesconectar += (mensagemDto) => { };
            cliente2.AoIniciarEdicaoTarefa += (mensagemDto) =>
            {
                if (mensagemDto != null && mensagemDto.Tipo.Equals(CsTipoMensagem.InicioEdicaoTarefa))
                {
                    foiInformado = true;
                }
            };

            cliente.RnComunicarInicioEdicaoTarefa("T1");
            ControleDeEsperaUtil.AguardarAte(() => { return(foiInformado); });

            //Recebendo a mensagem de que iniciou edição de uma tarefa
            MensagemDto objetoMensagemEsperado = Mensagem.RnCriarMensagemInicioEdicaoTarefa("T1", cliente.Login, "C1");

            objetoMensagemEsperado.Propriedades.Add(Constantes.LOGIN_WEX_CLIENT, cliente2.Login);
            MensagemDto objetoMensagem = cliente2.MensagensRecebidas.FirstOrDefault(o => o.Tipo.Equals(CsTipoMensagem.InicioEdicaoTarefa));

            Assert.IsNotNull(objetoMensagem, "Deveria ter recebido a mensagem esperada");
            CollectionAssert.AreEquivalent(objetoMensagemEsperado.Propriedades, objetoMensagem.Propriedades);
            cliente.RnDesconectar();
        }
        public void RnComunicarFimEdicaoTarefaTest()
        {
            int                      contador = 0;
            TcpAdapterPool           pool     = new TcpAdapterPool();
            WexMultiAccessClientMock cliente  = new WexMultiAccessClientMock()
            {
                EnderecoIp          = ipServidor,
                OidCronograma       = "C1",
                Porta               = porta,
                Login               = "******",
                TcpAdapterStubAtivo = true
            };

            WexMultiAccessClientMock cliente2 = new WexMultiAccessClientMock()
            {
                EnderecoIp          = ipServidor,
                OidCronograma       = "C1",
                Porta               = porta,
                Login               = "******",
                TcpAdapterStubAtivo = true
            };

            cliente.Conectar();
            pool.AceitarConexao(cliente);

            cliente2.Conectar();
            pool.AceitarConexao(cliente2);

            cliente2.AoServidorDesconectar += (mensagem) => { };
            cliente2.AoSerFinalizadaEdicaoTarefaPorOutroUsuario += (mensagem) => { contador++; };
            cliente.AoServidorDesconectar += (mensagem) => { };



            cliente.RnComunicarFimEdicaoTarefa("T1");
            ControleDeEsperaUtil.AguardarAte(() => { return(contador == 1); });

            MensagemDto mensagemDto = cliente2.MensagensRecebidas.FirstOrDefault(o => o.Tipo.Equals(CsTipoMensagem.EdicaoTarefaFinalizada));

            Assert.AreEqual(CsTipoMensagem.EdicaoTarefaFinalizada, mensagemDto.Tipo, "A mensagem recebida veio com tipo diferente do original");
            Assert.IsTrue(mensagemDto.Propriedades.ContainsKey(Constantes.AUTOR_ACAO), "Deveria possuir joao na sua lista de propriedades");
            Assert.AreEqual("T1", (string)mensagemDto.Propriedades[Constantes.OIDTAREFA]);
            Assert.AreEqual("C1", (string)mensagemDto.Propriedades[OIDCRONOGRAMA]);
        }
        public void RnProcessarEventosReceberMensagensComStringDeProtecao()
        {
            int contador = 0;
            WexMultiAccessClientMock cliente = new WexMultiAccessClientMock()
            {
                Porta = porta, EnderecoIp = ipServidor, Login = "******", OidCronograma = "C1", TcpAdapterStubAtivo = true
            };
            TcpAdapterPool pool = new TcpAdapterPool();
            // mensagemDto que serão preenchidas no disparo dos eventos do client
            MensagemDto mensagemAutenticacaoEsperada     = new MensagemDto();
            MensagemDto mensagemNovaTarefaCriadaEsperada = new MensagemDto();
            MensagemDto mensagemInicioEdicaoTarefaCriada = new MensagemDto();

            //eventos que deverão preencher as mensagensDto anteriores para comparação posterior
            cliente.AoSerAutenticadoComSucesso += (mensagem) => { contador++; mensagemAutenticacaoEsperada = mensagem; };
            cliente.AoSerCriadaNovaTarefa      += (mensagem) => { contador++; mensagemNovaTarefaCriadaEsperada = mensagem; };
            cliente.AoIniciarEdicaoTarefa      += (mensagem) => { contador++; mensagemInicioEdicaoTarefaCriada = mensagem; };
            cliente.AoServidorDesconectar      += (mensagemDto) => { };
            cliente.Conectar();
            pool.AceitarConexao(cliente);

            //dicionário de tarefas impactadas
            Dictionary <string, Int16> tarefasImpactadas = new Dictionary <string, short>();

            tarefasImpactadas.Add("T2", 1);
            tarefasImpactadas.Add("T3", 2);
            tarefasImpactadas.Add("T4", 3);
            tarefasImpactadas.Add("T5", 4);

            //mensagens que serão comunicadas ao client e deverão ser recebidas com sucesso no client
            MensagemDto autenticacaoEnviada, novaTarefaCriadaEnviada, inicioEdicaoTarefaEnviada;

            //criando mensagem de conexão aceita e retornando a mensagem ao client
            autenticacaoEnviada = Mensagem.RnCriarMensagemConexaoEfetuadaComSucesso(new string[] { "Joao", "Pedro" }, "C1", null);
            string json = JsonConvert.SerializeObject(autenticacaoEnviada);

            json = TcpUtil.AdicionarStringProtecaoDeIntegridade(json);

            //criando mensagem de  inicio de edição de uma tarefa e comunicando ao client
            inicioEdicaoTarefaEnviada = Mensagem.RnCriarMensagemInicioEdicaoTarefa("T1", "Joao", "C1");
            string json2 = JsonConvert.SerializeObject(inicioEdicaoTarefaEnviada);

            json2 = TcpUtil.AdicionarStringProtecaoDeIntegridade(json2);

            DateUtil.CurrentDateTime = DateTime.Now;

            //criando mensagem de criação de uma nova tarefa
            novaTarefaCriadaEnviada = Mensagem.RnCriarMensagemNovaTarefaCriada("T2", "Gabriel", "C2", tarefasImpactadas, DateUtil.CurrentDateTime);
            string json3 = JsonConvert.SerializeObject(novaTarefaCriadaEnviada);

            json3 = TcpUtil.AdicionarStringProtecaoDeIntegridade(json3);

            //unindo as mensagens em uma unica para testar o envio e o recebimento de mensagens coladas
            json = json + json2 + json3;

            pool.EnviarMensagemPara(cliente, json);
            //aguardar até que os 3 eventos do client sejam disparados ao receber e tratar as mensagens enviadas
            ControleDeEsperaUtil.AguardarAte(() => { return(contador == 3); });
            Assert.AreEqual(3, contador, "Deveria ter contado 3 pois foram é a quantidade de mensagens acumuladas no tcp");

            //asserts para a mensagem de autenticação

            Assert.AreEqual(mensagemAutenticacaoEsperada.Tipo, autenticacaoEnviada.Tipo, "A mensagem recebida de autenticação deveria ser do mesmo tipo");
            Assert.AreEqual((string)mensagemAutenticacaoEsperada.Propriedades[Constantes.OIDCRONOGRAMA], (string)autenticacaoEnviada.Propriedades["oidCronograma"], "Deveria possuir o mesmo" +
                            " cronograma nas mensagens de autenticação");
            CollectionAssert.AreEquivalent((string[])mensagemAutenticacaoEsperada.Propriedades[Constantes.USUARIOS], (string[])autenticacaoEnviada.Propriedades[Constantes.USUARIOS], "Deveria possuir a mesma lista de usuários online");

            //asserts para mensagem de criação de nova tarefa

            Assert.AreEqual(mensagemNovaTarefaCriadaEsperada.Tipo, novaTarefaCriadaEnviada.Tipo, "A mensagem recebida de nova tarefa criada deveria ser do mesmo tipo");
            Assert.AreEqual((string)mensagemNovaTarefaCriadaEsperada.Propriedades[Constantes.OIDCRONOGRAMA], (string)novaTarefaCriadaEnviada.Propriedades[Constantes.OIDCRONOGRAMA], "A mensagem recebida de nova tarefa criada deveria ser do mesmo tipo");
            CollectionAssert.AreEquivalent((Dictionary <string, Int16>)mensagemNovaTarefaCriadaEsperada.Propriedades[Constantes.TAREFAS_IMPACTADAS], (Dictionary <string, Int16>)novaTarefaCriadaEnviada.Propriedades[Constantes.TAREFAS_IMPACTADAS], "Deveria possuir as tarefas impactadas com a mesma ordenacao");
        }