diff --git a/tests/30mmap.tests b/tests/30mmap.tests new file mode 100644 index 000000000..66bc7b69a --- /dev/null +++ b/tests/30mmap.tests @@ -0,0 +1,36 @@ +TESTING "File mmaping" ./test-filemmap + + +TEST "chunksize not initialized" mmap_missing_chunksize < +#include +#include + TESTS_BEGIN -TEST ("detail_usage") +/* + The first two are not really tests, but some code to check for + filesystem and kernel semantics which might be moved elsewhere someday +*/ +TEST ("mmap_semantic") { + int fd = open (",mmaptest", O_RDWR|O_CREAT, 0666); + printf ("got fd %d\n", fd); + printf ("error %s\n", strerror (errno)); + ftruncate (fd, 8192); + + void* addr = mmap (NULL, + 8192, + PROT_WRITE, + MAP_SHARED, + fd, + 0); + + printf ("mapped at %p\n", addr); + printf ("error %s\n", strerror (errno)); + + int i = 0; + while (++i && ! errno) + { + addr = mmap (NULL, + 4096, + PROT_READ|PROT_WRITE, + MAP_SHARED, + fd, + 0); + + printf ("mapped %d again %p\n", i, addr); + printf ("error %s\n", strerror (errno)); + } +} + +TEST ("fd_semantic") +{ + mkdir (",testdir", 0777); errno = 0; + + int i = 0; + while (++i && ! errno) + { + char name[256]; + + sprintf (name, ",testdir/file_%d", i); + int fd = open (name, O_RDWR|O_CREAT, 0666); + printf ("#%d opened %d\n", i, fd); + printf ("error %s\n", strerror (errno)); + + void* addr = mmap (NULL, + 8192, + PROT_WRITE, + MAP_SHARED, + fd, + 0); + printf ("mapped at %p\n", addr); + + close (fd); + } + +} + + +TEST ("mmap_missing_chunksize") +{ + lumiera_config_init ("./"); lumiera_backend_init (); - LumieraFile file = lumiera_file_new (",tmp-filemmap", LUMIERA_FILE_CREATE, 4096); + LumieraFile file = lumiera_file_new (",tmp-filemmap", LUMIERA_FILE_CREATE); + + LumieraMMapings mmaps = lumiera_file_mmapings (file); + + if (!mmaps) + fprintf (stderr, "%s\n", lumiera_error()); + + lumiera_file_delete (file); + + lumiera_backend_destroy (); + lumiera_config_destroy (); +} + + +TEST ("mmap_forget_releasing") +{ + lumiera_config_init ("./"); + lumiera_backend_init (); + LumieraFile file = lumiera_file_new (",tmp-filemmap", LUMIERA_FILE_CREATE); + lumiera_file_chunksize_set (file, 4096); LumieraMMapings mmaps = lumiera_file_mmapings (file); @@ -45,16 +134,166 @@ TEST ("detail_usage") llist_init (&user); LumieraMMap mmap = lumiera_mmapings_mmap_acquire (mmaps, file, &user, 0, 100); + + (void) mmap; //lumiera_mmapings_release_mmap (mmaps, &user, mmap); + lumiera_file_delete (file); + + lumiera_backend_destroy (); + lumiera_config_destroy (); +} + + +TEST ("mmap_simple") +{ + lumiera_config_init ("./"); + lumiera_backend_init (); + LumieraFile file = lumiera_file_new (",tmp-filemmap", LUMIERA_FILE_CREATE); + lumiera_file_chunksize_set (file, 4096); + + LumieraMMapings mmaps = lumiera_file_mmapings (file); + + llist user; + llist_init (&user); + LumieraMMap mmap = lumiera_mmapings_mmap_acquire (mmaps, file, &user, 0, 100); lumiera_mmapings_release_mmap (mmaps, &user, mmap); lumiera_file_delete (file); + + /* check that the file got truncated to the desired size */ + struct stat st; + stat (",tmp-filemmap", &st); + ENSURE (st.st_size == 100); + lumiera_backend_destroy (); + lumiera_config_destroy (); } +TEST ("mmap_checkout_twice") +{ + lumiera_config_init ("./"); + lumiera_backend_init (); + LumieraFile file = lumiera_file_new (",tmp-filemmap", LUMIERA_FILE_CREATE); + lumiera_file_chunksize_set (file, 4096); + + LumieraMMapings mmaps = lumiera_file_mmapings (file); + + llist user; + llist_init (&user); + LumieraMMap mmap = lumiera_mmapings_mmap_acquire (mmaps, file, &user, 0, 100); + + llist user2; + llist_init (&user2); + LumieraMMap mmap2 = lumiera_mmapings_mmap_acquire (mmaps, file, &user2, 0, 100); + + ENSURE (lumiera_mmap_address (mmap) == lumiera_mmap_address (mmap2)); + + lumiera_mmapings_release_mmap (mmaps, &user, mmap); + + lumiera_mmapings_release_mmap (mmaps, &user2, mmap2); + + lumiera_file_delete (file); + + /* check that the file got truncated to the desired size */ + struct stat st; + stat (",tmp-filemmap", &st); + ENSURE (st.st_size == 100); + + lumiera_backend_destroy (); + lumiera_config_destroy (); +} + + + +TEST ("mmap_checkout_again") +{ + lumiera_config_init ("./"); + lumiera_backend_init (); + LumieraFile file = lumiera_file_new (",tmp-filemmap", LUMIERA_FILE_CREATE); + lumiera_file_chunksize_set (file, 4096); + + LumieraMMapings mmaps = lumiera_file_mmapings (file); + + llist user; + llist_init (&user); + LumieraMMap mmap = lumiera_mmapings_mmap_acquire (mmaps, file, &user, 0, 100); + lumiera_mmapings_release_mmap (mmaps, &user, mmap); + + llist user2; + llist_init (&user2); + LumieraMMap mmap2 = lumiera_mmapings_mmap_acquire (mmaps, file, &user2, 0, 100); + lumiera_mmapings_release_mmap (mmaps, &user2, mmap2); + + lumiera_file_delete (file); + + /* check that the file got truncated to the desired size */ + struct stat st; + stat (",tmp-filemmap", &st); + ENSURE (st.st_size == 100); + + lumiera_backend_destroy (); + lumiera_config_destroy (); +} + + + +TEST ("mmap_grow_existing_file") +{ + lumiera_config_init ("./"); + lumiera_backend_init (); + LumieraFile file = lumiera_file_new (",tmp-filemmap", LUMIERA_FILE_READWRITE); + + lumiera_file_chunksize_set (file, 4096); + + LumieraMMapings mmaps = lumiera_file_mmapings (file); + + llist user; + llist_init (&user); + + LumieraMMap mmap = lumiera_mmapings_mmap_acquire (mmaps, file, &user, 0, 100); + lumiera_mmapings_release_mmap (mmaps, &user, mmap); + + lumiera_file_delete (file); + + /* check that the file got truncated to the desired size */ + struct stat st; + stat (",tmp-filemmap", &st); + ENSURE (st.st_size == 100); + + lumiera_backend_destroy (); + lumiera_config_destroy (); +} + + +TEST ("mmap_readonly_file") +{ + lumiera_config_init ("./"); + lumiera_backend_init (); + LumieraFile file = lumiera_file_new (",tmp-filemmap", LUMIERA_FILE_READONLY); + + lumiera_file_chunksize_set (file, 4096); + + LumieraMMapings mmaps = lumiera_file_mmapings (file); + + llist user; + llist_init (&user); + + LumieraMMap mmap = lumiera_mmapings_mmap_acquire (mmaps, file, &user, 0, 100); + lumiera_mmapings_release_mmap (mmaps, &user, mmap); + + lumiera_file_delete (file); + + /* check that the file got truncated to the desired size */ + struct stat st; + stat (",tmp-filemmap", &st); + ENSURE (st.st_size == 100); + + lumiera_backend_destroy (); + lumiera_config_destroy (); +}