aboutsummaryrefslogtreecommitdiff
path: root/gdb/unittests/scoped_mmap-selftests.c
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@ericsson.com>2018-08-07 18:10:29 -0400
committerSimon Marchi <simon.marchi@ericsson.com>2018-08-07 18:10:29 -0400
commit5c831bb1eb6b22cd1705b98188b7d1b0633e7c54 (patch)
tree4c8000b9288db41ff690633006361b0f69a370a7 /gdb/unittests/scoped_mmap-selftests.c
parent4485a1c1d8d2b4a20fca2e2b7d1aabcff383b222 (diff)
downloadgdb-5c831bb1eb6b22cd1705b98188b7d1b0633e7c54.zip
gdb-5c831bb1eb6b22cd1705b98188b7d1b0633e7c54.tar.gz
gdb-5c831bb1eb6b22cd1705b98188b7d1b0633e7c54.tar.bz2
Introduce mmap_file function
New in v2: - As Tom pointed out, we don't need to keep the fd around after mmapping. This simplifies things quite a bit, since we don't need a new class. It's now just a function that returns a scoped_mmap. We already have scoped_mmap, which is a thin RAII layer over mmap. If one simply wants to mmap an entire file for reading, it takes a bit of boilerplate. This patch introduces the mmap_file function to make this easier. gdb/ChangeLog: * Makefile.in (COMMON_SFILES): Add common/scoped_mmap.c. * common/scoped_mmap.c: New file. * common/scoped_mmap.h (destroy): New method. (~scoped_mmap, reset): Use destroy. (scoped_mmap): New move constructor. (mmap_file): New declaration. * unittests/scoped_mmap-selftests.c (test_normal, test_invalid_filename, run_tests): New functions. (_initialize_scoped_mmap_selftests): Register selftest.
Diffstat (limited to 'gdb/unittests/scoped_mmap-selftests.c')
-rw-r--r--gdb/unittests/scoped_mmap-selftests.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/gdb/unittests/scoped_mmap-selftests.c b/gdb/unittests/scoped_mmap-selftests.c
index ece3d7a..d70a56a 100644
--- a/gdb/unittests/scoped_mmap-selftests.c
+++ b/gdb/unittests/scoped_mmap-selftests.c
@@ -25,6 +25,7 @@
#if defined(HAVE_SYS_MMAN_H) && defined(HAVE_UNISTD_H)
#include "selftest.h"
+#include "common/gdb_unlinker.h"
#include <unistd.h>
@@ -78,6 +79,57 @@ run_tests ()
}
} /* namespace scoped_mmap */
+
+namespace mmap_file
+{
+
+/* Test the standard usage of mmap_file. */
+static void
+test_normal ()
+{
+ char filename[] = "scoped_mmapped_file-selftest-XXXXXX";
+ int fd = mkstemp (filename);
+ SELF_CHECK (fd >= 0);
+
+ write (fd, "Hello!", 7);
+ close (fd);
+
+ gdb::unlinker unlink_test_file (filename);
+
+ {
+ ::scoped_mmap m = ::mmap_file (filename);
+
+ SELF_CHECK (m.get () != MAP_FAILED);
+ SELF_CHECK (m.size () == 7);
+ SELF_CHECK (0 == strcmp ((char *) m.get (), "Hello!"));
+ }
+}
+
+/* Calling mmap_file with a non-existent file should throw an exception. */
+static void
+test_invalid_filename ()
+{
+ bool threw = false;
+
+ try {
+ ::scoped_mmap m = ::mmap_file ("/this/file/should/not/exist");
+ } catch (gdb_exception &e) {
+ threw = true;
+ }
+
+ SELF_CHECK (threw);
+}
+
+
+/* Run selftests. */
+static void
+run_tests ()
+{
+ test_normal ();
+ test_invalid_filename ();
+}
+
+} /* namespace mmap_file */
} /* namespace selftests */
#endif /* !defined(HAVE_SYS_MMAN_H) || !defined(HAVE_UNISTD_H) */
@@ -88,5 +140,7 @@ _initialize_scoped_mmap_selftests ()
#if defined(HAVE_SYS_MMAN_H) && defined(HAVE_UNISTD_H)
selftests::register_test ("scoped_mmap",
selftests::scoped_mmap::run_tests);
+ selftests::register_test ("mmap_file",
+ selftests::mmap_file::run_tests);
#endif
}