Make tests public. Rewrite most tests. Add tests.
[pintos-anon] / src / tests / vm / mmap-clean.c
1 #include <string.h>
2 #include <syscall.h>
3 #include "tests/vm/sample.inc"
4 #include "tests/lib.h"
5 #include "tests/main.h"
6
7 void
8 test_main (void)
9 {
10   static const char overwrite[] = "Now is the time for all good...";
11   static char buffer[sizeof sample - 1];
12   char *actual = (char *) 0x54321000;
13   int handle;
14   mapid_t map;
15
16   /* Open file, map, verify data. */
17   CHECK ((handle = open ("sample.txt")) > 1, "open \"sample.txt\"");
18   CHECK ((map = mmap (handle, actual)) != MAP_FAILED, "mmap \"sample.txt\"");
19   if (memcmp (actual, sample, strlen (sample)))
20     fail ("read of mmap'd file reported bad data");
21
22   /* Modify file. */
23   CHECK (write (handle, overwrite, strlen (overwrite))
24          == (int) strlen (overwrite),
25          "write \"sample.txt\"");
26
27   /* Close mapping.  Data should not be written back, because we
28      didn't modify it via the mapping. */
29   msg ("munmap \"sample.txt\"");
30   munmap (map);
31
32   /* Read file back. */
33   msg ("seek \"sample.txt\"");
34   seek (handle, 0);
35   CHECK (read (handle, buffer, sizeof buffer) == sizeof buffer,
36          "read \"sample.txt\"");
37
38   /* Verify that file overwrite worked. */
39   if (memcmp (buffer, overwrite, strlen (overwrite))
40       || memcmp (buffer + strlen (overwrite), sample + strlen (overwrite),
41                  strlen (sample) - strlen (overwrite))) 
42     {
43       if (!memcmp (buffer, sample, strlen (sample)))
44         fail ("munmap wrote back clean page");
45       else
46         fail ("read surprising data from file"); 
47     }
48   else
49     msg ("file change was retained after munmap");
50 }