summaryrefslogtreecommitdiff
path: root/tests/sys_uio_test.cpp
diff options
context:
space:
mode:
authorPavel Labath <labath@google.com>2017-01-12 11:56:39 +0000
committerPavel Labath <labath@google.com>2017-01-13 10:21:19 +0000
commitcc441001c085f64bd94c32981842135f9a9652cd (patch)
treee6b8eb13ee7343507e214fbaf647e9d4d636dc55 /tests/sys_uio_test.cpp
parent1b2975d54b9c17ced29883aef24490773a4a9fe6 (diff)
Beef up process_vm_readv/writev tests
LLDB uses process_vm_readv quite extensively (it's an order of magnitude faster than PTRACE_PEEKDATA). Add a bit more tests of the function to make sure it stays working. Change-Id: I64e17e6d56842f118a9485e3a18f42ca5e1b7577 Test: run the new test
Diffstat (limited to 'tests/sys_uio_test.cpp')
-rw-r--r--tests/sys_uio_test.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/tests/sys_uio_test.cpp b/tests/sys_uio_test.cpp
index 569d4fbad..60bd22470 100644
--- a/tests/sys_uio_test.cpp
+++ b/tests/sys_uio_test.cpp
@@ -70,8 +70,38 @@ TEST(sys_uio, preadv64_pwritev64) {
TEST(sys_uio, process_vm_readv) {
ASSERT_EQ(0, process_vm_readv(0, nullptr, 0, nullptr, 0, 0));
+
+ // Test that we can read memory from our own process
+ char src[1024] = "This is the source buffer containing some data";
+ char dst[1024] = "";
+ iovec remote = { src, sizeof src };
+ iovec local = { dst, sizeof dst };
+ ASSERT_EQ(ssize_t(sizeof src), process_vm_readv(getpid(), &local, 1, &remote, 1, 0));
+ // Check whether data was copied (in the correct direction)
+ ASSERT_EQ('T', dst[0]);
+ ASSERT_EQ(0, memcmp(src, dst, sizeof src));
+
+ // Reading from non-allocated memory should return an error
+ remote = { nullptr, sizeof dst };
+ ASSERT_EQ(-1, process_vm_readv(getpid(), &local, 1, &remote, 1, 0));
+ ASSERT_EQ(EFAULT, errno);
}
TEST(sys_uio, process_vm_writev) {
ASSERT_EQ(0, process_vm_writev(0, nullptr, 0, nullptr, 0, 0));
+
+ // Test that we can read memory from our own process
+ char src[1024] = "This is the source buffer containing some data";
+ char dst[1024] = "";
+ iovec remote = { dst, sizeof dst };
+ iovec local = { src, sizeof src };
+ ASSERT_EQ(ssize_t(sizeof src), process_vm_writev(getpid(), &local, 1, &remote, 1, 0));
+ // Check whether data was copied (in the correct direction)
+ ASSERT_EQ('T', dst[0]);
+ ASSERT_EQ(0, memcmp(src, dst, sizeof src));
+
+ // Writing to non-allocated memory should return an error
+ remote = { nullptr, sizeof dst };
+ ASSERT_EQ(-1, process_vm_writev(getpid(), &local, 1, &remote, 1, 0));
+ ASSERT_EQ(EFAULT, errno);
}