mirror of
https://github.com/pleonex/NitroDebugger.git
synced 2025-06-18 21:25:42 -04:00
328 lines
9.9 KiB
C#
328 lines
9.9 KiB
C#
//
|
|
// PacketTypesTest.cs
|
|
//
|
|
// Author:
|
|
// Benito Palacios Sánchez <benito356@gmail.com>
|
|
//
|
|
// Copyright (c) 2014 Benito Palacios Sánchez
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
using System;
|
|
using NUnit.Framework;
|
|
using NitroDebugger.RSP;
|
|
using NitroDebugger.RSP.Packets;
|
|
using NitroDebugger;
|
|
|
|
namespace UnitTests
|
|
{
|
|
[TestFixture]
|
|
public class PacketTypesTest
|
|
{
|
|
[Test]
|
|
public void CreateOkReply()
|
|
{
|
|
new OkReply();
|
|
Assert.Pass();
|
|
}
|
|
|
|
[Test]
|
|
public void FactoryCreateOkReply()
|
|
{
|
|
Assert.IsInstanceOf<OkReply>(ReplyPacketFactory.CreateReplyPacket("OK"));
|
|
}
|
|
|
|
[Test]
|
|
public void CreateStopSignalReplyHostBreak()
|
|
{
|
|
StopSignalReply reply = new StopSignalReply(2);
|
|
Assert.IsTrue(reply.Signal.HasFlag(StopSignal.HostBreak));
|
|
}
|
|
|
|
[Test]
|
|
public void FactoryStopSignalReplyHostBreak()
|
|
{
|
|
ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket("S02");
|
|
Assert.IsInstanceOf<StopSignalReply>(reply);
|
|
Assert.IsTrue(((StopSignalReply)reply).Signal.HasFlag(StopSignal.HostBreak));
|
|
}
|
|
|
|
[Test]
|
|
public void CreateStopSignalReplyBreakpoint()
|
|
{
|
|
StopSignalReply reply = new StopSignalReply(5);
|
|
Assert.IsTrue(reply.Signal.HasFlag(StopSignal.Breakpoint));
|
|
}
|
|
|
|
[Test]
|
|
public void FactoryStopSignalReplyBreakpoint()
|
|
{
|
|
ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket("S05");
|
|
Assert.IsInstanceOf<StopSignalReply>(reply);
|
|
Assert.IsTrue(((StopSignalReply)reply).Signal.HasFlag(StopSignal.Breakpoint));
|
|
}
|
|
|
|
[Test]
|
|
public void CreateStopSignalReplyStepBreak()
|
|
{
|
|
StopSignalReply reply = new StopSignalReply(5);
|
|
Assert.IsTrue(reply.Signal.HasFlag(StopSignal.StepBreak));
|
|
}
|
|
|
|
[Test]
|
|
public void FactoryStopSignalReplyStepBreak()
|
|
{
|
|
ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket("S05");
|
|
Assert.IsInstanceOf<StopSignalReply>(reply);
|
|
Assert.IsTrue(((StopSignalReply)reply).Signal.HasFlag(StopSignal.StepBreak));
|
|
}
|
|
|
|
[Test]
|
|
public void CreateStopSignalReplyWatchpoint()
|
|
{
|
|
StopSignalReply reply = new StopSignalReply(6);
|
|
Assert.IsTrue(reply.Signal.HasFlag(StopSignal.Watchpoint));
|
|
}
|
|
|
|
[Test]
|
|
public void FactoryStopSignalReplyWatchpoint()
|
|
{
|
|
ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket("S06");
|
|
Assert.IsInstanceOf<StopSignalReply>(reply);
|
|
Assert.IsTrue(((StopSignalReply)reply).Signal.HasFlag(StopSignal.Watchpoint));
|
|
}
|
|
|
|
[Test]
|
|
public void CreateStopSignalReplyAccessWatchpoint()
|
|
{
|
|
StopSignalReply reply = new StopSignalReply(6);
|
|
Assert.IsTrue(reply.Signal.HasFlag(StopSignal.AccessWatchpoint));
|
|
}
|
|
|
|
[Test]
|
|
public void FactoryStopSignalReplyAccessWatchpoint()
|
|
{
|
|
ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket("S06");
|
|
Assert.IsInstanceOf<StopSignalReply>(reply);
|
|
Assert.IsTrue(((StopSignalReply)reply).Signal.HasFlag(StopSignal.AccessWatchpoint));
|
|
}
|
|
|
|
[Test]
|
|
public void CreateStopSignalReplyReadWatchpoint()
|
|
{
|
|
StopSignalReply reply = new StopSignalReply(6);
|
|
Assert.IsTrue(reply.Signal.HasFlag(StopSignal.ReadWatchpoint));
|
|
}
|
|
|
|
[Test]
|
|
public void FactoryStopSignalReplyReadWatchpoint()
|
|
{
|
|
ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket("S06");
|
|
Assert.IsInstanceOf<StopSignalReply>(reply);
|
|
Assert.IsTrue(((StopSignalReply)reply).Signal.HasFlag(StopSignal.ReadWatchpoint));
|
|
}
|
|
|
|
[Test]
|
|
public void CreateHaltedReasonCommand()
|
|
{
|
|
HaltedReasonCommand cmd = new HaltedReasonCommand();
|
|
Assert.AreEqual("?", cmd.Command);
|
|
Assert.AreEqual("?", cmd.Pack());
|
|
}
|
|
|
|
[Test]
|
|
public void CreateContinueCommand()
|
|
{
|
|
ContinueCommand cmd = new ContinueCommand();
|
|
Assert.AreEqual("c", cmd.Command);
|
|
Assert.AreEqual("c", cmd.Pack());
|
|
}
|
|
|
|
[Test]
|
|
public void CreateSingleStepCommand()
|
|
{
|
|
SingleStep cmd = new SingleStep();
|
|
Assert.AreEqual("s", cmd.Command);
|
|
Assert.AreEqual("s", cmd.Pack());
|
|
}
|
|
|
|
[Test]
|
|
public void CreateReadMemoryCommand()
|
|
{
|
|
uint address = 0x02000800;
|
|
int size = 8;
|
|
ReadMemoryCommand cmd = new ReadMemoryCommand(address, size);
|
|
Assert.AreEqual(address, cmd.Address);
|
|
Assert.AreEqual(size, cmd.Size);
|
|
Assert.AreEqual("m", cmd.Command);
|
|
Assert.AreEqual("m2000800,8", cmd.Pack());
|
|
}
|
|
|
|
[Test]
|
|
public void CreateDataReply()
|
|
{
|
|
byte[] expected = new byte[] { 0xCA, 0xFE, 0xBE, 0xBE, 0x00, 0x10, 0x20 };
|
|
DataReply reply = new DataReply(expected);
|
|
Assert.AreEqual(expected, reply.GetData());
|
|
}
|
|
|
|
[Test]
|
|
public void FactoryDataReply()
|
|
{
|
|
byte[] expected = new byte[] { 0xCA, 0xFE, 0xBE, 0xBE, 0x00, 0x10, 0x20 };
|
|
string dataString = BitConverter.ToString(expected).Replace("-", "");
|
|
|
|
ReadMemoryCommand readMemory = new ReadMemoryCommand(0x00, 0x00);
|
|
ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket(dataString, readMemory);
|
|
|
|
Assert.IsInstanceOf<DataReply>(reply);
|
|
Assert.AreEqual(expected, ((DataReply)reply).GetData());
|
|
}
|
|
|
|
[Test]
|
|
public void CreateErrorReply()
|
|
{
|
|
int expected = 3;
|
|
ErrorReply reply = new ErrorReply(expected);
|
|
Assert.AreEqual(ErrorCode.ReadMemoryError, reply.Error);
|
|
}
|
|
|
|
[Test]
|
|
public void FactoryErrorReply()
|
|
{
|
|
ErrorCode expected = ErrorCode.ReadMemoryError;
|
|
ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket("E03");
|
|
|
|
Assert.IsInstanceOf<ErrorReply>(reply);
|
|
Assert.AreEqual(expected, ((ErrorReply)reply).Error);
|
|
}
|
|
|
|
[Test]
|
|
public void CreateWriteMemoryCommand()
|
|
{
|
|
uint address = 0x02000800;
|
|
int size = 8;
|
|
byte[] expected = new byte[] { 0xCA, 0xFE, 0xBE, 0xBE, 0x00, 0x10, 0x20, 0x39 };
|
|
string dataString = BitConverter.ToString(expected).Replace("-", "");
|
|
|
|
WriteMemoryCommand cmd = new WriteMemoryCommand(address, size, expected);
|
|
Assert.AreEqual(address, cmd.Address);
|
|
Assert.AreEqual(size, cmd.Size);
|
|
Assert.AreEqual(expected, cmd.GetData());
|
|
Assert.AreEqual("M", cmd.Command);
|
|
Assert.AreEqual("M2000800,8:" + dataString, cmd.Pack());
|
|
}
|
|
|
|
[Test]
|
|
public void CreateReadRegistersCommand()
|
|
{
|
|
ReadRegisters cmd = new ReadRegisters();
|
|
Assert.AreEqual("g", cmd.Command);
|
|
Assert.AreEqual("g", cmd.Pack());
|
|
}
|
|
|
|
[Test]
|
|
public void CreateRegistersReply()
|
|
{
|
|
Register[] registers = new Register[] {
|
|
new Register((RegisterType)0, 0x1423),
|
|
new Register((RegisterType)1, 0x3412)};
|
|
RegistersReply reply = new RegistersReply(registers);
|
|
Assert.AreEqual(registers, reply.GetRegisters());
|
|
}
|
|
|
|
[Test]
|
|
public void FactoryRegistersReply()
|
|
{
|
|
Register[] expected = CreateRegisters();
|
|
byte[] binRegisters = CreateNetworkRegisters();
|
|
string regString = BitConverter.ToString(binRegisters).Replace("-", "");
|
|
|
|
ReadRegisters readRegisters = new ReadRegisters();
|
|
ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket(regString, readRegisters);
|
|
|
|
Assert.IsInstanceOf<RegistersReply>(reply);
|
|
Assert.AreEqual(expected, ((RegistersReply)reply).GetRegisters());
|
|
}
|
|
|
|
private Register[] CreateRegisters()
|
|
{
|
|
return new Register[] {
|
|
new Register(RegisterType.R0, 0), new Register(RegisterType.R1, 1),
|
|
new Register(RegisterType.R2, 2), new Register(RegisterType.R3, 3),
|
|
new Register(RegisterType.R4, 4), new Register(RegisterType.R5, 5),
|
|
new Register(RegisterType.R6, 6), new Register(RegisterType.R7, 7),
|
|
new Register(RegisterType.R8, 8), new Register(RegisterType.R9, 9),
|
|
new Register(RegisterType.R10, 10), new Register(RegisterType.R11, 11),
|
|
new Register(RegisterType.R12, 12), new Register(RegisterType.LR, 13),
|
|
new Register(RegisterType.SP, 14), new Register(RegisterType.PC, 15),
|
|
new Register(RegisterType.CPSR, 255)
|
|
};
|
|
}
|
|
|
|
private byte[] CreateNetworkRegisters()
|
|
{
|
|
return new byte[] {
|
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
|
0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
|
|
0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
|
|
0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
|
|
0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
|
|
0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
|
|
0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00,
|
|
0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00,
|
|
|
|
// Floating point registers, not used but sent as 0x00
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
// Floating point status register, not used but send as 0x00
|
|
0x00, 0x00, 0x00, 0x00,
|
|
|
|
// CPSR
|
|
0xFF, 0x0, 0x0, 0x00
|
|
};
|
|
}
|
|
|
|
[Test]
|
|
public void CreateWriteRegistersCommand()
|
|
{
|
|
Register[] registers = CreateRegisters();
|
|
string networkRegisters = BitConverter.ToString(CreateNetworkRegisters());
|
|
networkRegisters = networkRegisters.Replace("-", "");
|
|
|
|
WriteRegisters cmd = null;
|
|
Assert.DoesNotThrow(() => cmd = new WriteRegisters(registers));
|
|
Assert.AreEqual("G", cmd.Command);
|
|
Assert.AreEqual("G" + networkRegisters, cmd.Pack());
|
|
}
|
|
|
|
[Test]
|
|
public void CreateWriteSingleRegisterCommand()
|
|
{
|
|
Register register = new Register(RegisterType.R12, 0x5040);
|
|
|
|
WriteSingleRegister cmd = new WriteSingleRegister(register);
|
|
Assert.AreEqual("P", cmd.Command);
|
|
Assert.AreEqual("P0C000000=40500000", cmd.Pack());
|
|
}
|
|
}
|
|
}
|
|
|