]> git.siccegge.de Git - frida/frida.git/blobdiff - src/core/tests/BasicBlockTest.cxx
Add testcase for serializing / deserializing BasicBlocks
[frida/frida.git] / src / core / tests / BasicBlockTest.cxx
diff --git a/src/core/tests/BasicBlockTest.cxx b/src/core/tests/BasicBlockTest.cxx
new file mode 100644 (file)
index 0000000..0980af5
--- /dev/null
@@ -0,0 +1,62 @@
+#include <gtest/gtest.h>
+#include <algorithm>
+
+#include "gui/qt.hxx"
+#include "core/InformationManager.hxx"
+#include "core/BasicBlock.hxx"
+
+TEST(BasicBlockTest, deserializeValidInstance) {
+       QFile file("testdata/core/BasicBlock/valid.xml");
+       InformationManager manager;
+       file.open(QFile::ReadOnly | QFile::Text);
+       QXmlStreamReader reader(&file);
+
+       reader.readNextStartElement();
+       BasicBlock* block = BasicBlock::deserialize(reader, &manager);
+
+       ASSERT_NE((void*)NULL, (void*)block);
+       EXPECT_EQ(0x403e50, block->getStartAddress());
+       EXPECT_EQ(0x403e66, block->getEndAddress());
+       EXPECT_EQ(0x403e50, block->getNextBlock(0));
+       EXPECT_EQ(0x403e66, block->getNextBlock(1));
+}
+
+TEST(BasicBlockTest, deserializeInvalidInstance) {
+       QFile file("testdata/core/BasicBlock/invalid.xml");
+       InformationManager manager;
+       file.open(QFile::ReadOnly | QFile::Text);
+       QXmlStreamReader reader(&file);
+
+       reader.readNextStartElement();
+       BasicBlock* block = BasicBlock::deserialize(reader, &manager);
+
+       ASSERT_EQ((void*)NULL, (void*)block);
+}
+
+TEST(BasicBlockTest, deserializeThenSerializeIsIdentity) {
+       QFile infile("testdata/core/BasicBlock/valid.xml");
+       QTemporaryFile outfile;
+
+       InformationManager manager;
+       infile.open(QFile::ReadOnly | QFile::Text);
+       outfile.open();
+       QXmlStreamReader reader(&infile);
+       QXmlStreamWriter writer(&outfile);
+
+       reader.readNextStartElement();
+       BasicBlock* block = BasicBlock::deserialize(reader, &manager);
+       block->serialize(writer);
+
+       infile.seek(0);
+       outfile.seek(0);
+
+       std::string outtext = outfile.readAll().data();
+       outtext.erase(remove_if(outtext.begin(), outtext.end(), isspace),
+                     outtext.end());
+
+       std::string intext = infile.readAll().data();
+       intext.erase(remove_if(intext.begin(), intext.end(), isspace),
+                     intext.end());
+
+       ASSERT_STREQ(outtext.c_str(), intext.c_str());
+}