blob: 7b592420630428bed36562aef33187ba80e7e612 [file] [log] [blame]
#define _LARGEFILE64_SOURCE /* needed to use lseek64 */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <parlib/arch/arch.h>
#include <unistd.h>
#include <errno.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <utest/utest.h>
/* This test will run with a 2LS */
#include <parlib/parlib.h>
#include <parlib/uthread.h>
TEST_SUITE("MMAP PAGE FAULT");
/* <--- Begin definition of test cases ---> */
char global_char;
/* Hacky helper to start flushing the page cache. It will never stop btw. */
static void turn_on_flusher(void)
{
int ret;
int fd = open("#regress/mondata", O_RDWR);
const char msg[] = "fs pmflusher";
assert(fd >= 0);
ret = write(fd, msg, sizeof(msg));
assert(ret == sizeof(msg));
}
/* This test isn't guaranteed to trigger a PF on an mmap'd file, but it's
* likely. This is close coupled to KFS (hello.txt), #regress, and the behavior
* of pm_flusher. */
bool test_pf(void)
{
int fd;
void *addr;
fd = open("hello.txt", O_READ);
UT_ASSERT(fd >= 0);
addr = mmap(0, 4096, PROT_READ, MAP_SHARED, fd, 0);
UT_ASSERT(addr != MAP_FAILED);
turn_on_flusher();
for (int i = 0; i < 100; i++) {
global_char = *(char*)addr;
uthread_usleep(1000);
}
return TRUE;
}
/* <--- End definition of test cases ---> */
struct utest utests[] = {
UTEST_REG(pf),
};
int num_utests = sizeof(utests) / sizeof(struct utest);
int main(int argc, char *argv[])
{
char **whitelist = &argv[1];
int whitelist_len = argc - 1;
//parlib_wants_to_be_mcp = FALSE; // XXX should be able to do this!
uthread_mcp_init();
RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len);
}