From 3a06b1aa6be5e74dd3a89f313771b51b0fde277b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Mon, 8 Dec 2014 15:39:18 +0100 Subject: [PATCH] Max attempts for receive messages too --- NitroDebugger.UnitTests/PresentationTests.cs | 47 +++++++++++--------- NitroDebugger/RSP/Presentation.cs | 35 ++++++++++----- 2 files changed, 51 insertions(+), 31 deletions(-) diff --git a/NitroDebugger.UnitTests/PresentationTests.cs b/NitroDebugger.UnitTests/PresentationTests.cs index d84c46e..f3f875f 100644 --- a/NitroDebugger.UnitTests/PresentationTests.cs +++ b/NitroDebugger.UnitTests/PresentationTests.cs @@ -116,39 +116,46 @@ namespace UnitTests () => SendCommand("test2", "arg1,arg2", "f5", 11)); } - [Test] - public void ReceiveMessage() + private void ReceiveMessageBad(int attempts) { - // $ O K # 9 a - byte[] response = new byte[] { 0x24, 0x4F, 0x4B, 0x23, 0x39, 0x61 }; - connection.GetStream().Write(response, 0, response.Length); + // $ O K # 9 b + byte[] responseBad = new byte[] { 0x24, 0x4F, 0x4B, 0x23, 0x39, 0x62 }; + + // $ O K # 9 a + byte[] responseGood = new byte[] { 0x24, 0x4F, 0x4B, 0x23, 0x39, 0x61 }; + + for (int i = 0; i < attempts - 1; i++) + connection.GetStream().Write(responseBad, 0, responseBad.Length); + connection.GetStream().Write(responseGood, 0, responseGood.Length); ReplyPacket responsePacket = presentation.ReceiveReply(); Assert.IsInstanceOf(responsePacket); + for (int i = 0; i < attempts - 1; i++) { + byte nack = (byte)connection.GetStream().ReadByte(); + Assert.AreEqual(RawPacket.Nack, nack); + } + byte ack = (byte)connection.GetStream().ReadByte(); Assert.AreEqual(RawPacket.Ack, ack); } + [Test] + public void ReceiveMessage() + { + ReceiveMessageBad(1); + } + [Test] public void RequestResent() { - // $ O K # 9 b - byte[] responseBad = new byte[] { 0x24, 0x4F, 0x4B, 0x23, 0x39, 0x62 }; - connection.GetStream().Write(responseBad, 0, responseBad.Length); + ReceiveMessageBad(3); + } - // $ O K # 9 a - byte[] responseGood = new byte[] { 0x24, 0x4F, 0x4B, 0x23, 0x39, 0x61 }; - connection.GetStream().Write(responseGood, 0, responseGood.Length); - - ReplyPacket responsePacket = presentation.ReceiveReply(); - Assert.IsInstanceOf(responsePacket); - - byte firstNack = (byte)connection.GetStream().ReadByte(); - Assert.AreEqual(RawPacket.Nack, firstNack); - - byte ack = (byte)connection.GetStream().ReadByte(); - Assert.AreEqual(RawPacket.Ack, ack); + [Test] + public void ReceiveTooManyBadMessages() + { + Assert.Throws(() => ReceiveMessageBad(11)); } [Test] diff --git a/NitroDebugger/RSP/Presentation.cs b/NitroDebugger/RSP/Presentation.cs index a1c8df8..bf5f12a 100644 --- a/NitroDebugger/RSP/Presentation.cs +++ b/NitroDebugger/RSP/Presentation.cs @@ -73,19 +73,32 @@ namespace NitroDebugger.RSP public ReplyPacket ReceiveReply() { ReplyPacket response = null; + int count = 0; - while (response == null) { - try { - // Get data - byte[] packet = this.session.ReadPacket(PacketSeparator); - response = PacketBinConverter.FromBinary(packet); + do { + if (count == MaxWriteAttemps) + throw new ProtocolViolationException("[PRES] Can not receive correctly"); + count++; - // Send ACK - this.session.Write(RawPacket.Ack); - } catch (FormatException) { - // Error... send NACK - this.session.Write(RawPacket.Nack); - } + response = this.NextReply(); + } while (response == null); + + return response; + } + + private ReplyPacket NextReply() + { + ReplyPacket response = null; + try { + // Get data + byte[] packet = this.session.ReadPacket(PacketSeparator); + response = PacketBinConverter.FromBinary(packet); + + // Send ACK + this.session.Write(RawPacket.Ack); + } catch (FormatException) { + // Error... send NACK + this.session.Write(RawPacket.Nack); } return response;