public void DefaultPacketReader_CallsReadAsBytesInfo()
        {
            Mock <ILogger>         loggerMock         = new Mock <ILogger>();
            Mock <INetworkMessage> networkMessageMock = new Mock <INetworkMessage>();
            Mock <IBytesInfo>      bytesInfoMock      = new Mock <IBytesInfo>();

            // Setup networkMessage as mock since it's not the target of this test.
            networkMessageMock.Setup(m => m.ReadAsBytesInfo())
            .Returns(bytesInfoMock.Object);

            var reader = new DefaultPacketReader(loggerMock.Object);

            var resultInfo = reader.ReadFromMessage(networkMessageMock.Object);

            Assert.IsNotNull(resultInfo);
            Assert.AreSame(bytesInfoMock.Object, resultInfo, "The information returned doesn't match.");

            networkMessageMock.Verify(n => n.ReadAsBytesInfo(), Times.Once, $"Expected ReadAsBytesInfo to have been called once.");
        }
Esempio n. 2
0
        private void OnDataReady(IAsyncResult ar)
        {
            if (!this.CompleteRead(ar))
            {
                return;
            }

            try
            {
                if (this.stream.CanRead)
                {
                    if (this.stream.DataAvailable)
                    {
                        // Read the message size from ar.AsyncState, which is the 2 byte header
                        // initially read from the pipe after the await period.
                        var messageSize = BitConverter.ToUInt16(ar.AsyncState as byte[]);

                        this.inboundMessage.Resize(messageSize);
                        this.inboundMessage.ReadBytesFromStream(this.stream, messageSize);

                        if (this.isAuthenticated)
                        {
                            // Decrypt message using XTea
                            this.inboundMessage.XteaDecrypt(this.xteaKey);

                            // Read the packet length to advance the cursor.
                            this.inboundMessage.GetUInt16();
                        }

                        var packetType = this.protocol.ByteToIncomingPacketType(this.inboundMessage.GetByte());

                        var reader = this.protocol.SelectPacketReader(packetType);

                        if (reader == null)
                        {
                            if (Enum.IsDefined(typeof(IncomingPacketType), packetType))
                            {
                                this.logger.Warning($"No reader found that supports type '{(IncomingPacketType)packetType}' of packets. Selecting default reader...");
                            }
                            else
                            {
                                this.logger.Warning($"No reader found that supports type '{packetType}' of packets. Selecting default reader...");
                            }

                            reader = new DefaultPacketReader(this.logger);
                        }

                        var dataRead = reader.ReadFromMessage(this.inboundMessage);

                        if (dataRead == null)
                        {
                            this.logger.Error($"Could not read data using reader '{reader.GetType().Name}'.");
                        }
                        else
                        {
                            var responsePackets = this.PacketReady?.Invoke(this, dataRead);

                            if (responsePackets != null && responsePackets.Any())
                            {
                                // Send any response packets prepared.
                                this.Send(responsePackets);
                            }
                        }

                        this.inboundMessage.Reset();
                    }
                }
            }
            catch (Exception e)
            {
                // Invalid data from the client
                this.logger.Warning(e.ToString());
            }
            finally
            {
                this.PacketProcessed?.Invoke(this);
            }
        }