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."); }
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); } }