| Index: experimental/windows_debugger/debugger/rsp/rsp_packet_test.cc
|
| diff --git a/experimental/windows_debugger/debugger/rsp/rsp_packet_test.cc b/experimental/windows_debugger/debugger/rsp/rsp_packet_test.cc
|
| deleted file mode 100644
|
| index ddc154737ebd44a0da7a29ee66c8c1296ecd5827..0000000000000000000000000000000000000000
|
| --- a/experimental/windows_debugger/debugger/rsp/rsp_packet_test.cc
|
| +++ /dev/null
|
| @@ -1,452 +0,0 @@
|
| -// Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -#include "debugger/rsp/rsp_packet.h"
|
| -#include <deque>
|
| -#include <map>
|
| -#include "debugger/base/debug_blob.h"
|
| -#include "gtest/gtest.h"
|
| -
|
| -namespace {
|
| -rsp::Packet* kNullPacketPtr = NULL;
|
| -
|
| -// RspPacket test fixture.
|
| -class RspPacketTest : public ::testing::Test {
|
| - public:
|
| - rsp::Packet* ParseMsg(const char* msg_str, const char* hint=NULL) {
|
| - debug::Blob msg(msg_str);
|
| - return rsp::Packet::CreateFromBlob(&msg, hint);
|
| - }
|
| -
|
| -template <class T>
|
| - bool TestParseAndPrintout(T* dummy, const char* message) {
|
| - delete dummy;
|
| - rsp::Packet* obj = ParseMsg(message);
|
| - if (NULL == obj)
|
| - return false;
|
| -
|
| - T* pack = rsp::packet_cast<T>(obj);
|
| - if (pack != obj) {
|
| - delete obj;
|
| - return false;
|
| - }
|
| -
|
| - debug::Blob blob;
|
| - pack->ToBlob(&blob);
|
| - delete pack;
|
| - std::string s = blob.ToString();
|
| - return (s == message);
|
| - }
|
| -};
|
| -
|
| -//#define TestParseAndPrintout(message)
|
| -
|
| -
|
| -
|
| -// Unit tests start here.
|
| -TEST_F(RspPacketTest, EmptyPacket) {
|
| - rsp::Packet* obj = ParseMsg("");
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| -
|
| - rsp::EmptyPacket* ep = rsp::packet_cast<rsp::EmptyPacket>(obj);
|
| - EXPECT_EQ(obj, ep);
|
| - ASSERT_NE(kNullPacketPtr, ep);
|
| -
|
| - debug::Blob blob;
|
| - ep->ToBlob(&blob);
|
| - EXPECT_EQ(0, blob.size());
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, TypingPacketVisitor) {
|
| - std::deque<rsp::Packet*> packs;
|
| - packs.push_back(new rsp::Packet);
|
| - packs.push_back(new rsp::EmptyPacket);
|
| - packs.push_back(new rsp::QuerySupportedCommand);
|
| - packs.push_back(new rsp::QuerySupportedReply);
|
| - packs.push_back(new rsp::GetStopReasonCommand);
|
| - packs.push_back(new rsp::StopReply);
|
| - packs.push_back(new rsp::ReadMemoryCommand);
|
| - packs.push_back(new rsp::WriteMemoryCommand);
|
| - packs.push_back(new rsp::BlobReply);
|
| - packs.push_back(new rsp::ReadRegistersCommand);
|
| - packs.push_back(new rsp::WriteRegistersCommand);
|
| - packs.push_back(new rsp::ErrorReply);
|
| - packs.push_back(new rsp::OkReply);
|
| - packs.push_back(new rsp::SetCurrentThread);
|
| - packs.push_back(new rsp::GetCurrentThreadCommand);
|
| - packs.push_back(new rsp::GetCurrentThreadReply);
|
| - packs.push_back(new rsp::ContinueCommand);
|
| - packs.push_back(new rsp::StepCommand);
|
| - packs.push_back(new rsp::IsThreadAliveCommand);
|
| - packs.push_back(new rsp::QXferFeaturesReadCommand);
|
| - packs.push_back(new rsp::QXferReply);
|
| - packs.push_back(new rsp::GetThreadInfoCommand);
|
| - packs.push_back(new rsp::GetThreadInfoReply);
|
| -
|
| - std::map<int, int> type_ids;
|
| - for (size_t i = 0; i < packs.size(); i++) {
|
| - rsp::TypingPacketVisitor vis;
|
| - rsp::Packet* packet = packs[i];
|
| - packet->AcceptVisitor(&vis);
|
| -
|
| - bool found = type_ids.end() != type_ids.find(vis.type_);
|
| - EXPECT_FALSE(found);
|
| -
|
| - int type0 = vis.type_;
|
| - rsp::Packet* packet2 = packet->Create();
|
| - packet2->AcceptVisitor(&vis);
|
| - EXPECT_EQ(type0, vis.type_);
|
| -
|
| - type_ids[type0] = 1;
|
| - delete packet;
|
| - delete packet2;
|
| - }
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, QuerySupportedCommand) {
|
| - const char* kMsg = "qSupported:xmlRegisters=i386;qRelocInsn+";
|
| - rsp::Packet* obj = ParseMsg(kMsg);
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| -
|
| - rsp::QuerySupportedCommand* pack =
|
| - rsp::packet_cast<rsp::QuerySupportedCommand>(obj);
|
| - EXPECT_EQ(obj, pack);
|
| - ASSERT_NE(kNullPacketPtr, pack);
|
| -
|
| - EXPECT_EQ(2, pack->GetFeaturesNum());
|
| - EXPECT_STREQ("i386", pack->GetFeature("xmlRegisters").c_str());
|
| - EXPECT_STREQ("+", pack->GetFeature("qRelocInsn").c_str());
|
| - EXPECT_STREQ("xmlRegisters", pack->GetFeatureName(0).c_str());
|
| - EXPECT_STREQ("qRelocInsn", pack->GetFeatureName(1).c_str());
|
| - EXPECT_STREQ("", pack->GetFeatureName(2).c_str());
|
| -
|
| - debug::Blob blob;
|
| - pack->ToBlob(&blob);
|
| - EXPECT_STREQ(kMsg, blob.ToString().c_str());
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, QuerySupportedReply) {
|
| - const char* kMsg = "PacketSize=7cf;qXfer:libraries:read+;qXfer:features:read+";
|
| - rsp::Packet* obj = ParseMsg(kMsg, "qSupported$Reply");
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| -
|
| - rsp::QuerySupportedReply* pack =
|
| - rsp::packet_cast<rsp::QuerySupportedReply>(obj);
|
| - EXPECT_EQ(obj, pack);
|
| - ASSERT_NE(kNullPacketPtr, pack);
|
| -
|
| - EXPECT_EQ(3, pack->GetFeaturesNum());
|
| - EXPECT_STREQ("PacketSize", pack->GetFeatureName(0).c_str());
|
| - EXPECT_STREQ("qXfer:libraries:read", pack->GetFeatureName(1).c_str());
|
| - EXPECT_STREQ("qXfer:features:read", pack->GetFeatureName(2).c_str());
|
| -
|
| - EXPECT_STREQ("7cf", pack->GetFeature("PacketSize").c_str());
|
| - EXPECT_STREQ("+", pack->GetFeature("qXfer:libraries:read").c_str());
|
| - EXPECT_STREQ("+", pack->GetFeature("qXfer:features:read").c_str());
|
| -
|
| - debug::Blob blob;
|
| - pack->ToBlob(&blob);
|
| - EXPECT_STREQ(kMsg, blob.ToString().c_str());
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, StopReply1) {
|
| - const char* kMsg = "S15";
|
| - rsp::Packet* obj = ParseMsg(kMsg);
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| -
|
| - rsp::StopReply* pack = rsp::packet_cast<rsp::StopReply>(obj);
|
| - EXPECT_EQ(obj, pack);
|
| - ASSERT_NE(kNullPacketPtr, pack);
|
| -
|
| - EXPECT_EQ(21, pack->signal_number());
|
| - EXPECT_EQ(rsp::StopReply::SIGNALED, pack->stop_reason());
|
| - EXPECT_EQ(0, pack->pid());
|
| -
|
| - debug::Blob blob;
|
| - pack->ToBlob(&blob);
|
| - EXPECT_STREQ(kMsg, blob.ToString().c_str());
|
| -
|
| - pack->set_signal_number(5);
|
| - pack->ToBlob(&blob);
|
| - EXPECT_STREQ("S05", blob.ToString().c_str());
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, StopReply2) {
|
| - const char* kMsg = "W21;process:138c";
|
| - rsp::Packet* obj = ParseMsg(kMsg);
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| -
|
| - rsp::StopReply* pack = rsp::packet_cast<rsp::StopReply>(obj);
|
| - EXPECT_EQ(obj, pack);
|
| - ASSERT_NE(kNullPacketPtr, pack);
|
| -
|
| - EXPECT_EQ(33, pack->exit_code());
|
| - EXPECT_EQ(rsp::StopReply::EXITED, pack->stop_reason());
|
| - EXPECT_EQ(0x138c, pack->pid());
|
| -
|
| - debug::Blob blob;
|
| - pack->ToBlob(&blob);
|
| - EXPECT_STREQ(kMsg, blob.ToString().c_str());
|
| -
|
| - pack->set_exit_code(5);
|
| - pack->ToBlob(&blob);
|
| - EXPECT_STREQ("W05;process:138c", blob.ToString().c_str());
|
| -
|
| - pack->set_pid(10);
|
| - pack->ToBlob(&blob);
|
| - EXPECT_STREQ("W05;process:a", blob.ToString().c_str());
|
| -
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, StopReply3) {
|
| - const char* kMsg = "X21;process:138c";
|
| - rsp::Packet* obj = ParseMsg(kMsg);
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| -
|
| - rsp::StopReply* pack = rsp::packet_cast<rsp::StopReply>(obj);
|
| - EXPECT_EQ(obj, pack);
|
| - ASSERT_NE(kNullPacketPtr, pack);
|
| -
|
| - EXPECT_EQ(33, pack->signal_number());
|
| - EXPECT_EQ(rsp::StopReply::TERMINATED, pack->stop_reason());
|
| - EXPECT_EQ(0x138c, pack->pid());
|
| -
|
| - debug::Blob blob;
|
| - pack->ToBlob(&blob);
|
| - EXPECT_STREQ(kMsg, blob.ToString().c_str());
|
| -
|
| - pack->set_signal_number(5);
|
| - pack->ToBlob(&blob);
|
| - EXPECT_STREQ("X05;process:138c", blob.ToString().c_str());
|
| -
|
| - pack->set_pid(10);
|
| - pack->ToBlob(&blob);
|
| - EXPECT_STREQ("X05;process:a", blob.ToString().c_str());
|
| -
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, ReadMemoryCommand) {
|
| - const char* kMsg = "mcffffff80,40";
|
| - rsp::Packet* obj = ParseMsg(kMsg);
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| -
|
| - rsp::ReadMemoryCommand* pack = rsp::packet_cast<rsp::ReadMemoryCommand>(obj);
|
| - EXPECT_EQ(obj, pack);
|
| - ASSERT_NE(kNullPacketPtr, pack);
|
| -
|
| - u_int64_t kAddr = 0xcffffff80LL;
|
| - u_int64_t addr = pack->addr();
|
| -
|
| - EXPECT_EQ(kAddr, addr);
|
| - EXPECT_EQ(64, pack->num_of_bytes());
|
| -
|
| - debug::Blob blob;
|
| - pack->ToBlob(&blob);
|
| - std::string s = blob.ToString();
|
| - EXPECT_STREQ(kMsg, blob.ToString().c_str());
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, WriteMemoryCommand) {
|
| - const char* kMsg = "Mcffffff80,1:cc";
|
| - rsp::Packet* obj = ParseMsg(kMsg);
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| -
|
| - rsp::WriteMemoryCommand* pack =
|
| - rsp::packet_cast<rsp::WriteMemoryCommand>(obj);
|
| - EXPECT_EQ(obj, pack);
|
| - ASSERT_NE(kNullPacketPtr, pack);
|
| -
|
| - u_int64_t kAddr = 0xcffffff80LL;
|
| - u_int64_t addr = pack->addr();
|
| - EXPECT_EQ(kAddr, addr);
|
| - EXPECT_EQ(1, pack->data().size());
|
| - EXPECT_STREQ("cc", pack->data().ToHexString().c_str());
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, BlobReply) {
|
| - const char* kMsgs[] = {
|
| - "",
|
| - "0b00cdcd2b00cdcd5300cdcd2b00cdcd",
|
| - "cc",
|
| - "00000000",
|
| - "123456789abcdeff" };
|
| -
|
| - size_t num = sizeof(kMsgs) / sizeof(kMsgs[0]);
|
| - for (size_t i = 0; i < num; i++) {
|
| - const char* kMsg = kMsgs[i];
|
| - rsp::Packet* obj = ParseMsg(kMsg, "blob$Reply");
|
| - ASSERT_NE(kNullPacketPtr, obj) << "msg=[" << kMsg << "]";
|
| -
|
| - rsp::BlobReply* pack =
|
| - rsp::packet_cast<rsp::BlobReply>(obj);
|
| - EXPECT_EQ(obj, pack) << "msg=[" << kMsg << "]";
|
| - ASSERT_NE(kNullPacketPtr, pack) << "msg=[" << kMsg << "]";
|
| -
|
| - size_t expected_bytes = strlen(kMsg) / 2;
|
| - EXPECT_EQ(expected_bytes, pack->data().size()) << "msg=[" << kMsg << "]";
|
| -
|
| - debug::Blob blob;
|
| - pack->ToBlob(&blob);
|
| - std::string s = blob.ToString();
|
| - EXPECT_STREQ(kMsg, blob.ToString().c_str());
|
| - delete obj;
|
| - }
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, SingleWordCommands) {
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::ReadRegistersCommand, "g"));
|
| - EXPECT_TRUE(TestParseAndPrintout(
|
| - new rsp::WriteRegistersCommand,
|
| - "G00a500000000000c0ffffff00000000d85123020"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::WriteMemoryCommand,
|
| - "Mcffffff80,1:cc"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::GetStopReasonCommand, "?"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::ErrorReply, "E02"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::ErrorReply, "E15"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::OkReply, "OK"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::SetCurrentThread, "Hc-1"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::SetCurrentThread, "Hc0"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::SetCurrentThread, "Hg-1"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::SetCurrentThread, "Hg0"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::SetCurrentThread, "Hg138c"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::SetCurrentThread, "Hc138c"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::GetCurrentThreadCommand, "qC"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::GetCurrentThreadReply, "QC138c"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::ContinueCommand, "c"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::StepCommand, "s"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::IsThreadAliveCommand, "T138c"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::QXferFeaturesReadCommand,
|
| - "qXfer:features:read:target.xml:0,7ca"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::GetThreadInfoCommand,
|
| - "qfThreadInfo"));
|
| - EXPECT_TRUE(TestParseAndPrintout(new rsp::GetThreadInfoCommand,
|
| - "qsThreadInfo"));
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, WriteRegistersCommand) {
|
| - rsp::Packet* obj = ParseMsg("G00a500000000000c0ffffff00000000d85123020");
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| -
|
| - rsp::WriteRegistersCommand* pack =
|
| - rsp::packet_cast<rsp::WriteRegistersCommand>(obj);
|
| - ASSERT_NE(kNullPacketPtr, pack);
|
| -
|
| - EXPECT_EQ(20, pack->data().size());
|
| - EXPECT_EQ(0x00, pack->data().GetAt(0));
|
| - EXPECT_EQ(0xa5, pack->data().GetAt(1));
|
| - EXPECT_EQ(0x20, pack->data().GetAt(19));
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, SetCurrentThread) {
|
| - rsp::SetCurrentThread* obj =
|
| - rsp::packet_cast<rsp::SetCurrentThread>(ParseMsg("Hc-1"));
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| - EXPECT_EQ(rsp::SetCurrentThread::FOR_CONTINUE, obj->subtype());
|
| - EXPECT_EQ(-1, obj->thread_id());
|
| - delete obj;
|
| -
|
| - obj = rsp::packet_cast<rsp::SetCurrentThread>(ParseMsg("Hc0"));
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| - EXPECT_EQ(rsp::SetCurrentThread::FOR_CONTINUE, obj->subtype());
|
| - EXPECT_EQ(0, obj->thread_id());
|
| - delete obj;
|
| -
|
| - obj = rsp::packet_cast<rsp::SetCurrentThread>(ParseMsg("Hg-1"));
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| - EXPECT_EQ(rsp::SetCurrentThread::FOR_READ, obj->subtype());
|
| - EXPECT_EQ(-1, obj->thread_id());
|
| - delete obj;
|
| -
|
| - obj = rsp::packet_cast<rsp::SetCurrentThread>(ParseMsg("Hg0"));
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| - EXPECT_EQ(rsp::SetCurrentThread::FOR_READ, obj->subtype());
|
| - EXPECT_EQ(0, obj->thread_id());
|
| - delete obj;
|
| -
|
| - obj = rsp::packet_cast<rsp::SetCurrentThread>(ParseMsg("Hg138c"));
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| - EXPECT_EQ(rsp::SetCurrentThread::FOR_READ, obj->subtype());
|
| - EXPECT_EQ(0x138c, obj->thread_id());
|
| - delete obj;
|
| -
|
| - obj = rsp::packet_cast<rsp::SetCurrentThread>(ParseMsg("Hc138c"));
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| - EXPECT_EQ(rsp::SetCurrentThread::FOR_CONTINUE, obj->subtype());
|
| - EXPECT_EQ(0x138c, obj->thread_id());
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, IsThreadAliveCommand) {
|
| - rsp::IsThreadAliveCommand* obj =
|
| - rsp::packet_cast<rsp::IsThreadAliveCommand>(ParseMsg("T2e0"));
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| - EXPECT_EQ(0x2e0, obj->value());
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, QXferFeaturesReadCommand) {
|
| - rsp::QXferFeaturesReadCommand* obj =
|
| - rsp::packet_cast<rsp::QXferFeaturesReadCommand>(
|
| - ParseMsg("qXfer:features:read:target.xml:0,7ca"));
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| - EXPECT_STREQ("target.xml", obj->file_name().c_str());
|
| - EXPECT_EQ(0, obj->offset());
|
| - EXPECT_EQ(0x7ca, obj->length());
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, QXferReply) {
|
| - const char* kMsg =
|
| - "l<target><architecture>i386:x86-64</architecture></target>";
|
| - rsp::QXferReply* obj =
|
| - rsp::packet_cast<rsp::QXferReply>(ParseMsg(kMsg, "qXfer$Reply"));
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| - EXPECT_STREQ("<target><architecture>i386:x86-64</architecture></target>",
|
| - obj->body().c_str());
|
| - EXPECT_TRUE(obj->eom());
|
| -
|
| - debug::Blob blob;
|
| - obj->ToBlob(&blob);
|
| - EXPECT_STREQ(kMsg, blob.ToString().c_str());
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, GetThreadInfoReply) {
|
| - const char* kMsg = "m1598,138c";
|
| - rsp::GetThreadInfoReply* obj =
|
| - rsp::packet_cast<rsp::GetThreadInfoReply>(ParseMsg(kMsg, "GetThreadInfo$Reply"));
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| - EXPECT_FALSE(obj->eom());
|
| - EXPECT_EQ(2, obj->threads_ids().size());
|
| - EXPECT_EQ(0x1598, obj->threads_ids()[0]);
|
| - EXPECT_EQ(0x138c, obj->threads_ids()[1]);
|
| -
|
| - debug::Blob blob;
|
| - obj->ToBlob(&blob);
|
| - EXPECT_STREQ(kMsg, blob.ToString().c_str());
|
| - delete obj;
|
| -}
|
| -
|
| -TEST_F(RspPacketTest, GetThreadInfoReply2) {
|
| - const char* kMsg = "l138c";
|
| - rsp::GetThreadInfoReply* obj =
|
| - rsp::packet_cast<rsp::GetThreadInfoReply>(ParseMsg(kMsg, "GetThreadInfo$Reply"));
|
| - ASSERT_NE(kNullPacketPtr, obj);
|
| - EXPECT_TRUE(obj->eom());
|
| - EXPECT_EQ(1, obj->threads_ids().size());
|
| - EXPECT_EQ(0x138c, obj->threads_ids()[0]);
|
| -
|
| - debug::Blob blob;
|
| - obj->ToBlob(&blob);
|
| - EXPECT_STREQ(kMsg, blob.ToString().c_str());
|
| - delete obj;
|
| -}
|
| -
|
| -} // namespace
|
|
|