few tests for mmaping
This commit is contained in:
parent
17c07bad42
commit
67386a20eb
2 changed files with 277 additions and 2 deletions
36
tests/30mmap.tests
Normal file
36
tests/30mmap.tests
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
TESTING "File mmaping" ./test-filemmap
|
||||
|
||||
|
||||
TEST "chunksize not initialized" mmap_missing_chunksize <<END
|
||||
return: 0
|
||||
END
|
||||
|
||||
|
||||
TEST "mmap not released should fail" mmap_forget_releasing <<END
|
||||
return: 134
|
||||
END
|
||||
|
||||
|
||||
TEST "basic mmap" mmap_simple <<END
|
||||
return: 0
|
||||
END
|
||||
|
||||
|
||||
TEST "use mmap twice" mmap_checkout_twice <<END
|
||||
return: 0
|
||||
END
|
||||
|
||||
|
||||
TEST "reuse mmap" mmap_checkout_again <<END
|
||||
return: 0
|
||||
END
|
||||
|
||||
|
||||
TEST "grow file" mmap_grow_existing_file <<END
|
||||
return: 0
|
||||
END
|
||||
|
||||
|
||||
TEST "readonly file" mmap_readonly_file <<END
|
||||
return: 0
|
||||
END
|
||||
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "lib/llist.h"
|
||||
|
||||
#include "backend/config.h"
|
||||
#include "backend/backend.h"
|
||||
#include "backend/file.h"
|
||||
#include "backend/filedescriptor.h"
|
||||
|
|
@ -32,12 +33,100 @@
|
|||
|
||||
#include "tests/test.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
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 ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue