summaryrefslogtreecommitdiffhomepage
path: root/tests/test-elf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-elf.cpp')
-rw-r--r--tests/test-elf.cpp71
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);
+}