diff options
Diffstat (limited to 'tests/test-elf.cpp')
-rw-r--r-- | tests/test-elf.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/tests/test-elf.cpp b/tests/test-elf.cpp new file mode 100644 index 0000000..0bf1d42 --- /dev/null +++ b/tests/test-elf.cpp @@ -0,0 +1,71 @@ +#include "elf.h" +#include "minicc.h" + +#include <boost/algorithm/string.hpp> + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +#include <algorithm> +#include <cctype> +#include <deque> +#include <map> +#include <memory> +#include <string> +#include <system_error> +#include <utility> +#include <vector> + +using namespace std::string_literals; +namespace fs = std::filesystem; + +class ElfTest: public ::testing::Test +{ +protected: + ElfTest() { + //debug = true; + } + ~ElfTest() { + } + fs::path TempFilename(){return "tempfile.txt";} + + void SetUp(){ + std::error_code ec; + fs::remove(TempFilename(), ec); + } + void TearDown(){ + std::error_code ec; + fs::remove(TempFilename(), ec); + } +}; + +#if 0 +TEST_F(ElfTest, read) { +} +#endif + +TEST_F(ElfTest, write_code) { + Elf::Write(TempFilename(), + { + 0x48, 0xc7, 0xc0, 0x3c, 0x00, 0x00, 0x00, // mov $0x3c,%rax # syscall 60 + 0x48, 0x31, 0xff, // xor %rdi,%rdi # exit code 0 + 0x0f, 0x05, // syscall + }, {}); + + ASSERT_TRUE(fs::exists(TempFilename())); + ASSERT_GT(fs::file_size(TempFilename()), 0); +} + +TEST_F(ElfTest, write_code_data) { + Elf::Write(TempFilename(), + { + 0x48, 0xc7, 0xc0, 0x3c, 0x00, 0x00, 0x00, // mov $0x3c,%rax # syscall 60 + 0x48, 0x8b, 0x3c, 0x25, 0x00, 0x20, 0x40, // mov 0x402000,%rdi # use value from data segment as exit code + 0, + 0x0f, 0x05, // syscall + }, + {1, 0, 0, 0, 0, 0, 0, 0}); + + ASSERT_TRUE(fs::exists(TempFilename())); + ASSERT_GT(fs::file_size(TempFilename()), 0); +} |