Exemple #1
0
        public void should_reuse_last_endpoint_port_when_available_in_current_dir()
        {
            const string peerId = "Abc.Peer.0";

            var expectedPortFilePath = PathUtil.InBaseDirectory(peerId + ".inboundport.test");
            var expectedPort         = TcpUtil.GetRandomUnusedPort();

            File.WriteAllText(expectedPortFilePath, expectedPort.ToString());

            var transport = CreateAndStartZmqTransport(peerId: peerId);
            var endpoint  = new ZmqEndPoint(transport.InboundEndPoint);

            endpoint.GetPort().ShouldEqual(expectedPort);
        }
        public void Test_Find_Tcp_Port()
        {
            int port = TcpUtil.FindFreePort(9000);

            Console.Out.WriteLine("Port found: " + port);
            Assert.IsTrue(port >= 9000);

            IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Loopback, port);
            Socket     newsock       = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            newsock.Bind(localEndPoint);
            newsock.Listen(10);
            newsock.Close();
        }
        public void RnComunicarFimExclusaoTarefaConcluidaTest()
        {
            DateUtil.CurrentDateTime = DateTime.Now;

            //inicializar o Dicionário tarefasGrid
            const string ipServidor = "127.0.0.1";
            const int    porta      = 8092;

            TcpListener servidor = new TcpListener(IPAddress.Parse(ipServidor), porta);

            servidor.Start();

            WexMultiAccessClientMock client = new WexMultiAccessClientMock();

            client.Porta         = porta;
            client.EnderecoIp    = ipServidor;
            client.Login         = "******";
            client.OidCronograma = "C1";
            client.Conectar();
            client.AoServidorDesconectar += (mensagemDto) => { };
            TcpClient conexaoClienteNoServidor = servidor.AcceptTcpClient();

            //efetuar a leitura da autenticacao do client
            TcpUtil.ReceberMensagemTcp(conexaoClienteNoServidor);
            //representar as tarefas no grid
            Dictionary <string, Int16> tarefasGrid = new Dictionary <string, short>();

            //preencher as tarefas no grid
            //representar as tarefas excluidas
            string[] tarefasExcluidas = new string[] { "T1", "T2" };

            Dictionary <string, Int16> tarefasImpactadas = new Dictionary <string, short>();

            tarefasImpactadas.Add("T3", 1);
            tarefasImpactadas.Add("T4", 2);
            client.RnComunicarFimExclusaoTarefaConcluida(tarefasExcluidas, tarefasImpactadas, new string[] { }, DateUtil.CurrentDateTime);
            string msgJson = TcpUtil.ReceberMensagemTcp(conexaoClienteNoServidor);

            msgJson = TcpUtil.RemoverStringProtecaoDeIntegridade(msgJson);
            MensagemDto mensagemRecebida = Mensagem.DeserializarMensagemDto(msgJson);

            Assert.AreEqual(CsTipoMensagem.ExclusaoTarefaFinalizada, mensagemRecebida.Tipo, string.Format("A mensagem deveria ser do tipo {0}", CsTipoMensagem.ExclusaoTarefaFinalizada));
            Assert.AreEqual("C1", (string)mensagemRecebida.Propriedades[Constantes.OIDCRONOGRAMA], "O cronograma da mensagem deveria ser C1");
            Assert.AreEqual("Joao", (string)mensagemRecebida.Propriedades[Constantes.AUTOR_ACAO], "O login do colaborador que comunicou a exclusão da mensagem deveria ser Joao");
            CollectionAssert.AreEquivalent(tarefasImpactadas, (Dictionary <string, Int16>)mensagemRecebida.Propriedades[Constantes.TAREFAS_IMPACTADAS], "Deveria possuir as " +
                                           "mesmas tarefas na ordem indicada da reordenação");

            CollectionAssert.AreEquivalent(new string[] { }, (string[])mensagemRecebida.Propriedades[Constantes.TAREFAS_NAO_EXCLUIDAS]);
        }
        public void RnProcessarEventosRecebendoMensagemDoTipoExclusaoTarefaFinalizada()
        {
            DateUtil.CurrentDateTime = DateTime.Now;
            const string ipServidor    = "127.0.0.1";
            const int    porta         = 8091;
            bool         disparoEvento = false;
            TcpListener  servidor      = new TcpListener(IPAddress.Parse(ipServidor), porta);

            servidor.Start();
            Mock <WexMultiAccessClientMock> clienteMock = new Mock <WexMultiAccessClientMock>()
            {
                CallBase = true
            };
            WexMultiAccessClientMock cliente = clienteMock.Object;

            cliente.EnderecoIp    = ipServidor;
            cliente.OidCronograma = "C1";
            cliente.Porta         = porta;
            cliente.Login         = "******";
            cliente.Conectar();
            cliente.AoSerExcluidaTarefaPorOutroUsuario += (mensagemDto) => { disparoEvento = true; };
            cliente.AoServidorDesconectar += (mensagemDto) => { };
            TcpClient tcpEmServidor = servidor.AcceptTcpClient();

            //interceptando  a mensagem de conexão
            TcpUtil.ReceberMensagemTcp(tcpEmServidor);
            Dictionary <string, Int16> tarefasImpactadas = new Dictionary <string, short>();

            tarefasImpactadas.Add("T3", 3);
            tarefasImpactadas.Add("T4", 4);
            MensagemDto mensagem     = Mensagem.RnCriarMensagemComunicarExclusaoTarefaConcluida(new string[] { "T1", "T5" }, tarefasImpactadas, "C1", "Joao", DateUtil.CurrentDateTime, new string[] { "T2" });
            string      mensagemJson = JsonConvert.SerializeObject(mensagem);

            mensagemJson = TcpUtil.AdicionarStringProtecaoDeIntegridade(mensagemJson);
            //enviando mensagem ao cliente
            TcpUtil.EnviarMensagemTcp(mensagemJson, tcpEmServidor);
            ControleDeEsperaUtil.AguardarAte(() => { return(disparoEvento); });
            Assert.IsTrue(disparoEvento, "Deveria ter sido acionado o evento AoSerExcluidaTarefaPorOutroUsuario");
            MensagemDto mensagemEsperada = cliente.MensagensRecebidas.Where(o => o.Tipo == CsTipoMensagem.ExclusaoTarefaFinalizada).FirstOrDefault();

            Assert.IsNotNull(mensagemEsperada, "Deveria ter sido recebida uma mensagem do tipo AoSerExcluidaTarefaPorOutroUsuario");
            CollectionAssert.AreEqual(tarefasImpactadas, (Dictionary <string, Int16>)mensagemEsperada.Propriedades[Constantes.TAREFAS_IMPACTADAS]);
            CollectionAssert.AreEqual(new string[] { "T1", "T5" }, (string[])mensagemEsperada.Propriedades[Constantes.TAREFAS]);
            CollectionAssert.AreEqual(new string[] { "T2" }, (string[])mensagemEsperada.Propriedades[Constantes.TAREFAS_NAO_EXCLUIDAS]);
            Assert.AreEqual("C1", (string)mensagemEsperada.Propriedades[Constantes.OIDCRONOGRAMA]);
            Assert.AreEqual("Joao", (string)mensagemEsperada.Propriedades[Constantes.AUTOR_ACAO]);
            Assert.AreEqual(DateUtil.CurrentDateTime, (DateTime)mensagemEsperada.Propriedades[Constantes.DATAHORA_ACAO]);
            cliente.RnDesconectar();
        }
Exemple #5
0
        public void should_not_reuse_a_port_used_in_another_envionment()
        {
            const string peerId = "Abc.Peer.0";

            var doNotUsePortFilePath = PathUtil.InBaseDirectory(peerId + ".inboundport.secondenv");
            var expectedPort         = TcpUtil.GetRandomUnusedPort() + 5; // scientifical method to determine what port will be used by the transport :P

            File.WriteAllText(doNotUsePortFilePath, expectedPort.ToString());

            var transport = CreateAndStartZmqTransport(peerId: peerId);
            var endpoint  = new ZmqEndPoint(transport.InboundEndPoint);

            endpoint.GetPort().ShouldNotEqual(expectedPort);
            Console.WriteLine("{0} => {1}", endpoint.GetPort(), expectedPort);
        }
Exemple #6
0
        public bool Ping(string host, int port)
        {
            var ping = new PingTest()
            {
                Address = $"{host}:{port}",
                Date    = DateTime.Now,
                Success = TcpUtil.PingHost(host, port)
            };

            if (!Pings.ContainsKey(ping.Date))
            {
                Pings.Add(ping.Date, ping);
            }
            return(ping.Success);
        }
Exemple #7
0
        public void OkNowIKnowThatMyMessagesAreNotLostAfterDisconnect()
        {
            var message       = new byte[100];
            var receiveBuffer = new byte[100];

            Console.WriteLine("ZMQ v{0}", ZmqUtil.GetVersion().ToString(3));
            Console.WriteLine(Environment.Is64BitProcess ? "x64" : "x86");

            using (var context = new ZmqContext())
                using (var receiver = new ZmqSocket(context, ZmqSocketType.PULL))
                    using (var sender = new ZmqSocket(context, ZmqSocketType.PUSH))
                    {
                        var port            = TcpUtil.GetRandomUnusedPort();
                        var receiveEndpoint = $"tcp://*:{port}";
                        var sendEndpoint    = $"tcp://localhost:{port}";

                        receiver.SetOption(ZmqSocketOption.RCVHWM, 2_000);
                        receiver.SetOption(ZmqSocketOption.RCVTIMEO, 200);
                        receiver.SetOption(ZmqSocketOption.RCVBUF, 100_000);
                        receiver.Bind(receiveEndpoint);

                        sender.SetOption(ZmqSocketOption.SNDHWM, 2_000);
                        //sender.SetOption(ZmqSocketOption.RCVHWM, 1);
                        sender.SetOption(ZmqSocketOption.SNDTIMEO, 200);
                        receiver.SetOption(ZmqSocketOption.SNDBUF, 100_000);
                        sender.Connect(sendEndpoint);

                        var sendCount = 0;
                        while (sender.TrySend(message, 0, message.Length, out _))
                        {
                            sendCount++;
                        }

                        Console.WriteLine("{0} sent messages", sendCount);

                        sender.TryDisconnect(sendEndpoint);
                        sender.Connect(sendEndpoint);

                        var receivedMessageCount = 0;
                        while (receiver.TryReadMessage(ref receiveBuffer, out _, out _))
                        {
                            receivedMessageCount++;
                        }

                        Console.WriteLine("{0} received messages", receivedMessageCount);
                    }
        }
        public void RnProcessarEventosRecebendoMensagemDoTipoExclusaoTarefaPermitida()
        {
            const string ipServidor = "127.0.0.1";
            const int    porta      = 8090;
            int          contador   = 0;
            TcpListener  servidor   = new TcpListener(IPAddress.Parse(ipServidor), porta);

            servidor.Start();
            MensagemDto mensagemEsperada = new MensagemDto();
            Mock <WexMultiAccessClientMock> clienteMock = new Mock <WexMultiAccessClientMock>()
            {
                CallBase = true
            };
            WexMultiAccessClientMock cliente = clienteMock.Object;

            cliente.EnderecoIp    = ipServidor;
            cliente.OidCronograma = "C1";
            cliente.Porta         = porta;
            cliente.Login         = "******";
            cliente.Conectar();
            cliente.ExecutarExclusaoTarefa += (mensagemDto) => { contador++; mensagemEsperada = mensagemDto; };
            cliente.AoServidorDesconectar  += (mensagemDto) => { };
            TcpClient tcpEmServidor = servidor.AcceptTcpClient();

            //interceptando  a mensagem de conexão
            TcpUtil.ReceberMensagemTcp(tcpEmServidor);
            Dictionary <string, Int16> tarefasImpactadas = new Dictionary <string, short>();

            tarefasImpactadas.Add("T3", 3);
            tarefasImpactadas.Add("T4", 4);
            //MensagemDto mensagem = Mensagem.RnCriarMensagemEdicaoTarefaAutorizada(2 ,4 ,"T2","Joao" ,"C1");
            MensagemDto mensagem     = Mensagem.RnCriarMensagemEfetuarExclusaoTarefas(new string[] { "T1", "T2" }, new string[] { }, "C1", "Joao");
            string      mensagemJson = JsonConvert.SerializeObject(mensagem);

            mensagemJson = TcpUtil.AdicionarStringProtecaoDeIntegridade(mensagemJson);
            //enviando mensagem ao cliente
            TcpUtil.EnviarMensagemTcp(mensagemJson, tcpEmServidor);
            ControleDeEsperaUtil.AguardarAte(() => { return(contador == 1); });
            Assert.AreEqual(1, contador, "Deveria ter sido acionado o evento ExecutarExclusaoTarefa");
            //MensagemDto mensagemEsperada = cliente.mensagensDtoEvento.Where(o => o.Tipo == CsTipoMensagem.ExclusaoTarefaPermitida).FirstOrDefault();
            Assert.IsNotNull(mensagemEsperada, "Deveria ter sido recebida uma mensagem do tipo ExecutarExclusaoTarefa");
            CollectionAssert.AreEqual(new string[] { "T1", "T2" }, (string[])mensagemEsperada.Propriedades[Constantes.TAREFAS]);
            Assert.AreEqual("C1", (string)mensagemEsperada.Propriedades[Constantes.OIDCRONOGRAMA]);
            Assert.AreEqual("Joao", (string)mensagemEsperada.Propriedades[Constantes.AUTOR_ACAO]);
            cliente.RnDesconectar();
        }
Exemple #9
0
        async public Task StartAsync()
        {
            NetworkStream stream;
            IPacket       received;

            byte[] receiveHeader, receiveData, decompressData;
            int    nbytes, receiveDataLength;

            // 클라이언트에서 오는 메세지를 듣기 위해 별도의 쓰레드를 돌린다.
            await Task.Factory.StartNew(async() =>
            {
                while (this.client.Connected)
                {
                    try
                    {
                        stream = this.client.GetStream();

                        // 1. 결과의 헤더를 받는다.
                        receiveHeader = new byte[Consts.SIZE_HEADER];
                        nbytes        = await stream.ReadAsync(buffer: receiveHeader, offset: 0, count: receiveHeader.Length);

                        // 2. 결과의 데이터를 받는다.
                        receiveDataLength = BitConverter.ToInt32(value: receiveHeader, startIndex: 0);
                        receiveData       = await TcpUtil.ReceiveDataAsync(networkStream: stream, dataLength: receiveDataLength);

                        await stream.FlushAsync();

                        // 3. 결과는 압축되어 있으므로 푼다.
                        decompressData = await NetUtil.DecompressAsync(data: receiveData);
                        received       = NetUtil.DeserializeObject(data: decompressData) as IPacket;

                        await Receive(this.stageID, received);
                    }
                    catch (SocketException)
                    {
                        await Disconnect(this.stageID, this.userID);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                        await Disconnect(this.stageID, this.userID);
                    }
                }
            });
        }
Exemple #10
0
        /// <summary>
        ///  Responsável por finalizar a conexão, avisando o servidor de que está se desconectando
        /// </summary>
        public void RnFinalizarConexao(bool forcarAtualizacao = false)
        {
            if (ValidarConexao())
            {
                ChamadaAssincrona metodo = () =>
                {
                    MensagemDto mensagemDesconectar = Mensagem.RnCriarMensagemUsuarioDesconectado(new string[] { Login }, OidCronograma, forcarAtualizacao);
                    string      mensagemJson        = JsonConvert.SerializeObject(mensagemDesconectar);
                    mensagemJson = TcpUtil.AdicionarStringProtecaoDeIntegridade(mensagemJson);
                    tcpAdapter.EnviarMensagem(mensagemJson);
                };

                IAsyncResult result = metodo.BeginInvoke(null, null);
                result.AsyncWaitHandle.WaitOne();
            }

            RnDesconectar();
        }
        public void RnProcessarEventosRecebendoMensagemDoTipoMovimentacaoPosicaoTarefa()
        {
            DateUtil.CurrentDateTime = DateTime.Now;
            const string ipServidor = "127.0.0.1";
            const int    porta      = 8089;
            int          contador   = 0;
            TcpListener  servidor   = new TcpListener(IPAddress.Parse(ipServidor), porta);

            servidor.Start();
            Mock <WexMultiAccessClientMock> clienteMock = new Mock <WexMultiAccessClientMock>()
            {
                CallBase = true
            };
            WexMultiAccessClientMock cliente = clienteMock.Object;

            cliente.EnderecoIp    = ipServidor;
            cliente.OidCronograma = "C1";
            cliente.Porta         = porta;
            cliente.Login         = "******";
            cliente.Conectar();
            cliente.AoOcorrerMovimentacaoPosicaoTarefa += (mensagemDto) => { contador++; };
            cliente.AoServidorDesconectar += (mensagemDto) => { };
            TcpClient tcpEmServidor = servidor.AcceptTcpClient();

            //interceptando  a mensagem de conexão
            TcpUtil.ReceberMensagemTcp(tcpEmServidor);
            Dictionary <string, Int16> tarefasImpactadas = new Dictionary <string, short>();

            tarefasImpactadas.Add("T3", 3);
            tarefasImpactadas.Add("T4", 4);
            MensagemDto mensagem     = Mensagem.RnCriarMensagemMovimentacaoTarefa(2, 4, "T2", tarefasImpactadas, "Joao", "C1", DateUtil.CurrentDateTime);
            string      mensagemJson = JsonConvert.SerializeObject(mensagem);

            mensagemJson = TcpUtil.AdicionarStringProtecaoDeIntegridade(mensagemJson);
            //enviando mensagem ao cliente
            TcpUtil.EnviarMensagemTcp(mensagemJson, tcpEmServidor);
            ControleDeEsperaUtil.AguardarAte(() => { return(contador == 1); });
            Assert.AreEqual(1, contador, "Deveria ter sido acionado o evento AoOcorrerMovimentacaoPosicaoTarefa");
            MensagemDto mensagemEsperada = cliente.MensagensRecebidas.Where(o => o.Tipo == CsTipoMensagem.MovimentacaoPosicaoTarefa).FirstOrDefault();

            Assert.IsNotNull(mensagemEsperada, "Deveria ter sido recebida uma mensagem do tipo MovimentacaoPosicaoTarefa");
            CollectionAssert.AreEqual(tarefasImpactadas, (Dictionary <string, Int16>)mensagemEsperada.Propriedades[Constantes.TAREFAS_IMPACTADAS]);
            cliente.RnDesconectar();
        }
Exemple #12
0
        public void should_support_peer_endpoint_modifications()
        {
            var senderTransport = CreateAndStartZmqTransport();

            var receivedMessages  = new ConcurrentBag <TransportMessage>();
            var receiverTransport = CreateAndStartZmqTransport(onMessageReceived: receivedMessages.Add);
            var receiver          = new Peer(receiverTransport.PeerId, receiverTransport.InboundEndPoint);

            senderTransport.Send(new FakeCommand(0).ToTransportMessage(), new[] { receiver });
            Wait.Until(() => receivedMessages.Count == 1, 2.Seconds());

            var newEndPoint = "tcp://127.0.0.1:" + TcpUtil.GetRandomUnusedPort();

            receiverTransport.Stop();
            receiverTransport = CreateAndStartZmqTransport(newEndPoint, receivedMessages.Add);
            receiver.EndPoint = receiverTransport.InboundEndPoint;

            senderTransport.Send(new FakeCommand(0).ToTransportMessage(), new[] { receiver });
            Wait.Until(() => receivedMessages.Count == 2, 2.Seconds(), "unable to receive message");
        }
        public void EnviarEReceberApenasUmaMensagemDeTextoTest()
        {
            IPAddress   ipServidor    = IPAddress.Parse("127.0.0.1");
            const int   portaServidor = 8050;
            TcpListener servidor      = new TcpListener(ipServidor, portaServidor);

            servidor.Start();
            string    m1  = "Este texto deve chegar ao destino completamente intacto";
            TcpClient tcp = new TcpClient();

            tcp.Connect(ipServidor, portaServidor);
            TcpClient tcpServidor = servidor.AcceptTcpClient();

            TcpUtil.EnviarMensagemTcp(m1, tcp);
            string m1Result = TcpUtil.ReceberMensagemTcp(tcpServidor);

            Assert.AreEqual(m1, m1Result, "A mensagem retornada deveria estar intacta portanto igual a de origem");
            servidor.Stop();
            tcp.Close();
        }
        public void EnviarEReceberUmaMensagemDtoTest()
        {
            IPAddress   ipServidor    = IPAddress.Parse("127.0.0.1");
            const int   portaServidor = 8051;
            TcpListener servidor      = new TcpListener(ipServidor, portaServidor);

            servidor.Start();
            MensagemDto mensagemDto = Mensagem.RnCriarMensagemNovoUsuarioConectado(new string[] { "Joao" }, "C1");
            string      m1          = JsonConvert.SerializeObject(mensagemDto);
            TcpClient   tcp         = new TcpClient();

            tcp.Connect(ipServidor, portaServidor);
            TcpClient tcpServidor = servidor.AcceptTcpClient();

            TcpUtil.EnviarMensagemTcp(m1, tcp);
            string m1Result = TcpUtil.ReceberMensagemTcp(tcpServidor);

            Assert.AreEqual(m1, m1Result, "A mensagem retornada deveria estar intacta portanto igual a de origem");
            servidor.Stop();
            tcp.Close();
        }
        public void RnProcessarEventosRecebendoMensagemDoTipoEdicaoTarefaAutorizada()
        {
            const string ipServidor = "127.0.0.1";
            const int    porta      = 8088;
            int          contador   = 0;
            TcpListener  servidor   = new TcpListener(IPAddress.Parse(ipServidor), porta);

            servidor.Start();
            Mock <WexMultiAccessClientMock> clienteMock = new Mock <WexMultiAccessClientMock>()
            {
                CallBase = true
            };
            WexMultiAccessClientMock cliente = clienteMock.Object;

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

            TcpClient tcpEmServidor = servidor.AcceptTcpClient();

            //interceptando  a mensagem de conexão
            TcpUtil.ReceberMensagemTcp(tcpEmServidor);

            MensagemDto mensagemEdicaoAutorizada = Mensagem.RnCriarMensagemEdicaoTarefaAutorizada("Joao", "C1", "T1");
            string      mensagemJson             = JsonConvert.SerializeObject(mensagemEdicaoAutorizada);

            mensagemJson = TcpUtil.AdicionarStringProtecaoDeIntegridade(mensagemJson);
            TcpUtil.EnviarMensagemTcp(mensagemJson, tcpEmServidor);
            ControleDeEsperaUtil.AguardarAte(() => { return(contador == 1); });
            Assert.AreEqual(1, contador, "Deveria ter siso disparado o evento AoEdicaoTarefaSerRecusada");
            MensagemDto mensagemEsperada = cliente.MensagensRecebidas.Where(o => o.Tipo == CsTipoMensagem.EdicaoTarefaAutorizada).First();

            Assert.AreEqual("C1", (string)mensagemEsperada.Propriedades[Constantes.OIDCRONOGRAMA], "A mensagem recebida deveria ser do cronograma indicado");
            Assert.AreEqual("T1", (string)mensagemEsperada.Propriedades[Constantes.OIDTAREFA], "O oid da tarefa da mensagem recebida deveria ser o passado na criação da mensagem");
            cliente.RnDesconectar();
        }
        public void ReceberMensagemQuandoHouverMaisDeUmJsonNaMensagem()
        {
            const string USUARIOS = "usuarios";
            //Configurações de Ip e porta do servidor
            IPAddress    ipServidor    = IPAddress.Parse("127.0.0.1");
            const int    portaServidor = 8002;
            const string login         = "******";
            const string oidCronograma = "C1";

            string[] usuarios = new string[1];
            //Instanciação do Servidor para escutar o cliente
            TcpListener servidor = new TcpListener(ipServidor, portaServidor);

            servidor.Start();

            //Instanciação do cliente que irá conectar no servidor
            TcpClient cliente = new TcpClient();

            cliente.Connect(ipServidor, portaServidor);
            //Servidor Aceitando a solicitação do cliente
            TcpClient conexao = servidor.AcceptTcpClient();
            //Fila de processamento
            Queue <MensagemDto> filaProcessamento = new Queue <MensagemDto>();

            usuarios[0] = login;
            ConexaoCliente conexaoCliente = new ConexaoCliente(login, conexao, filaProcessamento);
            //Configurando propriedades da mensagem
            Hashtable propriedades = new Hashtable();

            propriedades.Add(USUARIOS, usuarios);
            propriedades.Add(oidCronograma, oidCronograma);
            //Montando a Mensagem que será enviada
            MensagemDto mensagem = new MensagemDto()
            {
                Tipo = CsTipoMensagem.NovosUsuariosConectados, Propriedades = propriedades
            };
            //Serializando a Mensagem que será enviada
            string mensagemJsonEnviada = JsonConvert.SerializeObject(mensagem);

            mensagemJsonEnviada = TcpUtil.AdicionarStringProtecaoDeIntegridade(mensagemJsonEnviada);
            //Enviando a Mensagem através da conexão do cliente

            const string login2 = "Pedro";

            //Configurando propriedades da mensagem
            propriedades = new Hashtable();
            usuarios     = new string[1];
            usuarios[0]  = login2;
            propriedades.Add(Constantes.USUARIOS, usuarios);
            propriedades.Add(Constantes.OIDCRONOGRAMA, oidCronograma);
            //Montando a Mensagem que será enviada
            mensagem = new MensagemDto()
            {
                Tipo = CsTipoMensagem.NovosUsuariosConectados, Propriedades = propriedades
            };
            //Serializando a Mensagem que será enviada
            string mensagemJsonEnviada2 = JsonConvert.SerializeObject(mensagem);

            mensagemJsonEnviada2 = TcpUtil.AdicionarStringProtecaoDeIntegridade(mensagemJsonEnviada2);
            //Enviando a Mensagem através da conexão do cliente
            TcpUtil.EnviarMensagemTcp(mensagemJsonEnviada + mensagemJsonEnviada2, cliente);

            ControleDeEsperaUtil.AguardarAte(() => { return(filaProcessamento.Count == 2); });

            Assert.AreEqual(2, filaProcessamento.Count, "Deveria possuir 2 mensagens enfileiradas");
            Assert.IsTrue(conexaoCliente.Buffer == "", "Buffer deveria estar vazio pois as mensagens json eram mensagens válidas");

            conexaoCliente.Desconectar();
            servidor.Stop();
            cliente.Close();
            conexao.Close();
        }
Exemple #17
0
        public void OkNowIKnowThatMyMessagesAreLostAfterDisconnect()
        {
            var message       = new byte[50];
            var receiveBuffer = new byte[100];

            Console.WriteLine("ZMQ v{0}", ZmqUtil.GetVersion().ToString(3));
            Console.WriteLine(Environment.Is64BitProcess ? "x64" : "x86");

            using (var context = new ZmqContext())
                using (var receiver = new ZmqSocket(context, ZmqSocketType.PULL))
                    using (var sender = new ZmqSocket(context, ZmqSocketType.PUSH))
                    {
                        var sendEndpoint    = $"tcp://localhost:{TcpUtil.GetRandomUnusedPort()}";
                        var receiveEndpoint = sendEndpoint.Replace("localhost", "*");

                        receiver.SetOption(ZmqSocketOption.RCVHWM, 10);
                        receiver.SetOption(ZmqSocketOption.RCVTIMEO, 200);
                        receiver.Bind(receiveEndpoint);

                        sender.SetOption(ZmqSocketOption.SNDHWM, 10);
                        sender.Connect(sendEndpoint);

                        for (var i = 0; i < 10; ++i)
                        {
                            var sendStatus = sender.TrySend(message, 0, message.Length, out var error);
                            Console.WriteLine($"SEND: {sendStatus} - {error.ToErrorMessage()}");
                        }

                        for (var i = 0; i < 10; ++i)
                        {
                            var receiveStatus = receiver.TryReadMessage(ref receiveBuffer, out var bytes, out var error);
                            Console.WriteLine($"RECV: {receiveStatus} - {bytes} - {error.ToErrorMessage()}");
                        }

                        receiver.TryUnbind(receiver.GetOptionString(ZmqSocketOption.LAST_ENDPOINT));

                        for (var i = 0; i < 10; ++i)
                        {
                            var sendStatus = sender.TrySend(message, 0, message.Length, out var error);
                            Console.WriteLine($"SEND: {sendStatus} - {error.ToErrorMessage()}");
                        }

                        sender.TryDisconnect(sender.GetOptionString(ZmqSocketOption.LAST_ENDPOINT));
                        sender.SetOption(ZmqSocketOption.SNDTIMEO, 1000);
                        sender.Connect(sendEndpoint);

                        {
                            var sendStatus = sender.TrySend(message, 0, message.Length, out var error);
                            Console.WriteLine($"SEND: {sendStatus} - {error.ToErrorMessage()}");
                        }

                        receiver.SetOption(ZmqSocketOption.RCVTIMEO, 2000);
                        receiver.Bind(receiveEndpoint);

                        var receivedMessageCount = 0;
                        while (receiver.TryReadMessage(ref receiveBuffer, out _, out _))
                        {
                            ++receivedMessageCount;
                        }

                        Console.WriteLine("{0} received messages", receivedMessageCount);
                    }
        }
Exemple #18
0
        /// <summary>
        /// Responsável por fazer a escuta em tempo real da threadComunicaoServidor
        /// </summary>
        protected virtual void RnProcessarEventos()
        {
            String        mensagemJson = "";
            MensagemDto   m;
            List <string> mensagens;
            string        msgAtual = "";

            try
            {
                while (autenticado)
                {
                    if (tcpAdapter == null || !tcpAdapter.ValidarConexao())
                    {
                        ProcessarMensagemEvento(Mensagem.RnCriarMensagemServidorDesconectando("Você acabou se ser desconectado, verifique sua rede ou contate o administrador"));
                        continue;
                    }
                    if (!autenticado)
                    {
                        continue;
                    }
                    if (!tcpAdapter.PossuiDadosParaLeitura())
                    {
                        Thread.Sleep(15);
                        continue;
                    }
                    mensagemJson = tcpAdapter.EfetuarLeitura();
                    if (mensagemJson.Trim() == "")
                    {
                        continue;
                    }

                    if (mensagemJson.Contains("\n"))
                    {
                        mensagens = mensagemJson.Split('\n').ToList();
                        foreach (string msg in mensagens)
                        {
                            if (String.IsNullOrEmpty(msg))
                            {
                                continue;
                            }

                            msgAtual = msg.Trim();
                            if (Buffer != "")
                            {
                                msgAtual = Buffer + msgAtual;
                                Buffer   = "";
                            }
                            m = Mensagem.DeserializarMensagemDto(TcpUtil.RemoverStringProtecaoDeIntegridade(msgAtual));
                            ProcessarMensagemEvento(m);
                            msgAtual = "";
                        }
                    }
                    else
                    {
                        Buffer += mensagemJson;
                    }

                    Thread.Sleep(10);
                }
            }
            catch (JsonException excessao)
            {
                Debug.WriteLine(string.Format("MultiAccessClient do {3} (Leitura) - Mensagem Json:{2}Excessão:{0}\nCallStack{1}", excessao.Message, excessao.StackTrace, msgAtual, Login), "JsonConvert:");
                //continue;
                throw excessao;
            }
            catch (InvalidOperationException e)
            {
                Debug.WriteLine(string.Format("Ocorreu a excessão:{0}\nLocal:{1}", e.Message, e.StackTrace), Thread.CurrentThread.Name);
                ProcessarMensagemEvento(Mensagem.RnCriarMensagemServidorDesconectando(String.Format("{0}\n {1}", e.Message, e.StackTrace)));
                RnDesconectar();
                throw e;
            }
            catch (Exception e)
            {
                DumperExtension.ShowStackTrace("Exception no client.");
                Debug.WriteLine(string.Format("Ocorreu a excessão:{0}\nLocal:{1}\n Target Site:{2}", e.Message, e.StackTrace, e.TargetSite), Thread.CurrentThread.Name);
                RnDesconectar();
                throw e;
            }
        }
        public void ReceberMensagemFimEdicaoTarefaTest()
        {
            //Configurações do Servidor
            IPAddress ipServidor    = IPAddress.Parse("127.0.0.1");
            const int portaServidor = 8007;

            //Instanciar e iniciar o Servidor (Listener)
            TcpListener servidor = new TcpListener(ipServidor, portaServidor);

            servidor.Start();
            Queue <MensagemDto> filaProcessamento = new Queue <MensagemDto>();

            //Instanciar os Clientes (2x TcpClient)
            TcpClient    cliente1      = new TcpClient();
            TcpClient    cliente2      = new TcpClient();
            const string login1        = "Joao";
            const string login2        = "Pedro";
            const string oidCronograma = "C1";

            //Tentativa de conexao do cliente1
            cliente1.Connect(ipServidor, portaServidor);
            // Servidor aceitar a conexao do cliente1 e armazenar
            TcpClient cliente1EmServidor = servidor.AcceptTcpClient();

            //Tentativa de conexao do cliente2
            cliente2.Connect(ipServidor, portaServidor);
            // Servidor aceitar a conexao do cliente1 e armazenar
            TcpClient cliente2EmServidor = servidor.AcceptTcpClient();

            //Iniciar ConexaoCliente do cliente1
            ConexaoClienteMock c1 = new ConexaoClienteMock(login1, cliente1EmServidor, filaProcessamento)
            {
                PermissaoDeEscrita = false
            };

            //Iniciar ConexaoCliente do cliente2
            ConexaoClienteMock c2 = new ConexaoClienteMock(login2, cliente2EmServidor, filaProcessamento)
            {
                PermissaoDeEscrita = false
            };

            //Criar mensagemDto novoUsuarioConectado para o cliente1
            MensagemDto m1     = Mensagem.RnCriarMensagemNovoUsuarioConectado(new string[] { login1 }, oidCronograma);
            string      m1Json = JsonConvert.SerializeObject(m1);

            m1Json = TcpUtil.AdicionarStringProtecaoDeIntegridade(m1Json);

            //Criar mensagemDto novoUsuarioConectado para o cliente2
            MensagemDto m2     = Mensagem.RnCriarMensagemNovoUsuarioConectado(new string[] { login2 }, oidCronograma);
            string      m2Json = JsonConvert.SerializeObject(m2);

            m2Json = TcpUtil.AdicionarStringProtecaoDeIntegridade(m2Json);

            //Enviar a mensagem Json do primeiro cliente atráves do tcp cliente1;
            TcpUtil.EnviarMensagemTcp(m1Json, cliente1);



            ControleDeEsperaUtil.AguardarAte(() => { return(filaProcessamento.Count > 0); });

            //Enviar a  mensagem Json do segundo cliente atráves do tcp cliente2;
            TcpUtil.EnviarMensagemTcp(m2Json, cliente2);
            ControleDeEsperaUtil.AguardarAte(() => { return(filaProcessamento.Count > 1); });

            Assert.AreEqual(2, filaProcessamento.Count, "Deveria ser enfileirada 2 objetos MensagemDto");

            MensagemDto m3     = Mensagem.RnCriarMensagemFinalizarEdicaoTarefa("T1", "gabriel", "C1");
            string      m3Json = JsonConvert.SerializeObject(m3);

            m3Json = TcpUtil.AdicionarStringProtecaoDeIntegridade(m3Json);

            TcpUtil.EnviarMensagemTcp(m3Json, cliente2);
            ControleDeEsperaUtil.AguardarAte(() => { return(filaProcessamento.Count > 2); });

            c1.Desconectar();
            c2.Desconectar();
            servidor.Stop();
            cliente1.Close();
            cliente2.Close();
            cliente1EmServidor.Close();
            cliente2EmServidor.Close();
        }
        public void ReceberMensagemQuandoJsonEstiverCompleto()
        {
            #region Estimativa de Teste:

            /*
             * Estimativa Teste:
             * Receber uma mensagemDto Json e enfileirar na fila de leitura;
             * Cenário:
             *  - Instanciar um Listener (gerenciar as conexoes)
             *  - Instanciar 2 TcpClients (Efetuar a comunicação de conexão)
             *  - Montar as MensagemDTOs de NovoUsarioConectado
             *  - Serializar as Mensagens
             *  - Escrever cada mensagem no stream de seu respectivo tcp
             *  - Ler a Mensagem no stream
             *  - Processar Cada Mensagem e enfileirar na fila de leitura
             * Resultado Estimado:
             *  - Deve ter sido possivel o enfileiramento das 2 mensagens dto recebidas
             */
            #endregion

            //Configurações do Servidor
            IPAddress ipServidor    = IPAddress.Parse("127.0.0.1");
            const int portaServidor = 8000;

            //Instanciar e iniciar o Servidor (Listener)
            TcpListener servidor = new TcpListener(ipServidor, portaServidor);
            servidor.Start();
            Queue <MensagemDto> filaProcessamento = new Queue <MensagemDto>();

            //Instanciar os Clientes (2x TcpClient)
            TcpClient    cliente1      = new TcpClient();
            TcpClient    cliente2      = new TcpClient();
            const string login1        = "Joao";
            const string login2        = "Pedro";
            const string oidCronograma = "C1";

            //Tentativa de conexao do cliente1
            cliente1.Connect(ipServidor, portaServidor);
            // Servidor aceitar a conexao do cliente1 e armazenar
            TcpClient cliente1EmServidor = servidor.AcceptTcpClient();

            //Tentativa de conexao do cliente2
            cliente2.Connect(ipServidor, portaServidor);
            // Servidor aceitar a conexao do cliente1 e armazenar
            TcpClient cliente2EmServidor = servidor.AcceptTcpClient();

            //Iniciar ConexaoCliente do cliente1
            ConexaoClienteMock c1 = new ConexaoClienteMock(login1, cliente1EmServidor, filaProcessamento)
            {
                PermissaoDeEscrita = false
            };

            //Iniciar ConexaoCliente do cliente2
            ConexaoClienteMock c2 = new ConexaoClienteMock(login2, cliente2EmServidor, filaProcessamento)
            {
                PermissaoDeEscrita = false
            };

            //Criar mensagemDto novoUsuarioConectado para o cliente1
            MensagemDto m1     = Mensagem.RnCriarMensagemNovoUsuarioConectado(new string[] { login1 }, oidCronograma);
            string      m1Json = JsonConvert.SerializeObject(m1);
            m1Json = TcpUtil.AdicionarStringProtecaoDeIntegridade(m1Json);

            //Criar mensagemDto novoUsuarioConectado para o cliente2
            MensagemDto m2     = Mensagem.RnCriarMensagemNovoUsuarioConectado(new string[] { login2 }, oidCronograma);
            string      m2Json = JsonConvert.SerializeObject(m2);
            m2Json = TcpUtil.AdicionarStringProtecaoDeIntegridade(m2Json);

            //Enviar a mensagem Json do primeiro cliente atráves do tcp cliente1;
            TcpUtil.EnviarMensagemTcp(m1Json, cliente1);

            ControleDeEsperaUtil.AguardarAte(() => { return(filaProcessamento.Count > 0); });

            //Enviar a  mensagem Json do segundo cliente atráves do tcp cliente2;
            TcpUtil.EnviarMensagemTcp(m2Json, cliente2);
            ControleDeEsperaUtil.AguardarAte(() => { return(filaProcessamento.Count > 1); });

            Assert.AreEqual(2, filaProcessamento.Count, "Deveria ser enfileirada 2 objetos MensagemDto");

            #region Testes:
            //Verificar see enfileirou as mensagens recebidas
            //   Assert.AreEqual(2, filaProcessamento.Count, "Deveria possuir 2 mensagens enfileiradas");
            //Checar se não há nenhuma mensagem incompleta no buffer de mensagens das conexões
            //    Assert.IsTrue(string.IsNullOrEmpty(conexaoCliente.Buffer), "Buffer deveria estar vazio pois as mensagens json eram mensagens válidas");
            //   Assert.IsTrue(string.IsNullOrEmpty(conexaoCliente2.Buffer), "Buffer deveria estar vazio pois as mensagens json eram mensagens válidas");
            #endregion
            #region Finalização Cenário
            c1.Desconectar();
            c2.Desconectar();
            servidor.Stop();
            cliente1.Close();
            cliente2.Close();
            cliente1EmServidor.Close();
            cliente2EmServidor.Close();
            #endregion
        }
        public void ReceberMensagemQuandoJsonIncompleto()
        {
            #region Estimativa do teste:

            /*
             * Estimativa do teste:
             * - Receber uma mensagem json incompleta e armazenar no buffer e a fila deve estar vazia
             * - receber o resto da mensagem processar e enfileirar
             * Cenário:
             * - conexão instanciada e configurada
             * - filaProcessamento
             * - MensagemJson convertida
             * - MensagemJson repartida em 2
             * - enviar as 2 partes separadamente
             * Acontecimento Estimado:
             * - Armazenar no buffer a mensagem incompleta
             * - Verificar quando ela completar
             * - Enfileirar a mensagem(somente se for completa)
             * Resultado Estimado:
             * - Deve conseguir enfileirar a mensagem
             */
            #endregion

            //Configurações de Ip e porta do servidor
            IPAddress    ipServidor    = IPAddress.Parse("127.0.0.1");
            const int    portaServidor = 8001;
            const string login         = "******";
            string[]     usuarios      = new string[1];
            //Instanciação do Servidor para escutar o cliente
            TcpListener servidor = new TcpListener(ipServidor, portaServidor);
            servidor.Start();

            //Instanciação do cliente que irá conectar no servidor
            TcpClient cliente = new TcpClient();
            cliente.Connect(ipServidor, portaServidor);
            //Servidor Aceitando a solicitação do cliente
            TcpClient conexao = servidor.AcceptTcpClient();

            //Fila de processamento
            Queue <MensagemDto> filaProcessamento = new Queue <MensagemDto>();
            ConexaoCliente      conexaoCliente    = new ConexaoCliente(login, conexao, filaProcessamento);

            //Montando a Mensagem que será enviada
            MensagemDto mensagem = Mensagem.RnCriarMensagemNovoUsuarioConectado(new string[] { login }, "C1");
            //Serializando a Mensagem que será enviada
            string mensagemEnvio = JsonConvert.SerializeObject(mensagem);
            //Adicionando string de verificação de integridade
            mensagemEnvio = TcpUtil.AdicionarStringProtecaoDeIntegridade(mensagemEnvio);
            //Dividindo a mensagem em 2 partes
            string mensagemParte1 = mensagemEnvio.Substring(0, 12);
            string mensagemParte2 = mensagemEnvio.Substring(12, (mensagemEnvio.Length - 12));
            Assert.AreEqual(mensagemEnvio, mensagemParte1 + mensagemParte2, "Deveriam Ser Iguais");
            //Enviando a Mensagem através da conexão do cliente
            TcpUtil.EnviarMensagemTcp(mensagemParte1, cliente);
            TcpUtil.EnviarMensagemTcp(mensagemParte2, cliente);
            //Aguardando o enfileiramento
            ControleDeEsperaUtil.AguardarAte(() => { return(filaProcessamento.Count == 1); });
            Assert.AreEqual(1, filaProcessamento.Count, "Deveria possuir 1 mensagem enfileirada");
            Assert.IsTrue(conexaoCliente.Buffer == "", "Deveria ter resolvido o buffer e enfileirado o evento");
            conexaoCliente.Desconectar();
            servidor.Stop();
            conexao.Close();
        }
        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");
        }