few tests for mmaping

This commit is contained in:
Christian Thaeter 2008-12-08 21:01:23 +01:00
parent 17c07bad42
commit 67386a20eb
2 changed files with 277 additions and 2 deletions

36
tests/30mmap.tests Normal file
View 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

View file

@ -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 ();
}