1 #ifndef GLIB_DISABLE_DEPRECATION_WARNINGS
2 #define GLIB_DISABLE_DEPRECATION_WARNINGS
3 #endif
4 
5 #include <glib.h>
6 #include <string.h>
7 #include <glib/gstdio.h>
8 #include <sys/stat.h>
9 #include <sys/types.h>
10 #include <fcntl.h>
11 
12 #ifdef G_OS_UNIX
13 #include <unistd.h>
14 #endif
15 #ifdef G_OS_WIN32
16 #include <io.h>
17 #endif
18 
19 static void
test_basic(void)20 test_basic (void)
21 {
22   GMappedFile *file;
23   GError *error;
24 
25   error = NULL;
26   file = g_mapped_file_new (g_test_get_filename (G_TEST_DIST, "empty", NULL), FALSE, &error);
27   g_assert_no_error (error);
28 
29   g_mapped_file_ref (file);
30   g_mapped_file_unref (file);
31 
32   g_mapped_file_unref (file);
33 }
34 
35 static void
test_empty(void)36 test_empty (void)
37 {
38   GMappedFile *file;
39   GError *error;
40 
41   error = NULL;
42   file = g_mapped_file_new (g_test_get_filename (G_TEST_DIST, "empty", NULL), FALSE, &error);
43   g_assert_no_error (error);
44 
45   g_assert_null (g_mapped_file_get_contents (file));
46 
47   g_mapped_file_free (file);
48 }
49 
50 #ifdef G_OS_UNIX
51 static void
test_device(void)52 test_device (void)
53 {
54   GError *error = NULL;
55   GMappedFile *file;
56 
57   file = g_mapped_file_new ("/dev/null", FALSE, &error);
58   g_assert_true (g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_INVAL) ||
59                  g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NODEV) ||
60                  g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM));
61   g_assert_null (file);
62   g_error_free (error);
63 }
64 #endif
65 
66 static void
test_nonexisting(void)67 test_nonexisting (void)
68 {
69   GMappedFile *file;
70   GError *error;
71 
72   error = NULL;
73   file = g_mapped_file_new ("no-such-file", FALSE, &error);
74   g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT);
75   g_clear_error (&error);
76   g_assert_null (file);
77 }
78 
79 static void
test_writable(void)80 test_writable (void)
81 {
82   GMappedFile *file;
83   GError *error = NULL;
84   gchar *contents;
85   gsize len;
86   const gchar *old = "MMMMMMMMMMMMMMMMMMMMMMMMM";
87   const gchar *new = "abcdefghijklmnopqrstuvxyz";
88   gchar *tmp_copy_path;
89 
90   tmp_copy_path = g_build_filename (g_get_tmp_dir (), "glib-test-4096-random-bytes", NULL);
91 
92   g_file_get_contents (g_test_get_filename (G_TEST_DIST, "4096-random-bytes", NULL), &contents, &len, &error);
93   g_assert_no_error (error);
94   g_file_set_contents (tmp_copy_path, contents, len, &error);
95   g_assert_no_error (error);
96 
97   g_free (contents);
98 
99   file = g_mapped_file_new (tmp_copy_path, TRUE, &error);
100   g_assert_no_error (error);
101 
102   contents = g_mapped_file_get_contents (file);
103   g_assert_cmpuint (strncmp (contents, old, strlen (old)), ==, 0);
104 
105   memcpy (contents, new, strlen (new));
106   g_assert_cmpuint (strncmp (contents, new, strlen (new)), ==, 0);
107 
108   g_mapped_file_free (file);
109 
110   error = NULL;
111   file = g_mapped_file_new (tmp_copy_path, FALSE, &error);
112   g_assert_no_error (error);
113 
114   contents = g_mapped_file_get_contents (file);
115   g_assert_cmpuint (strncmp (contents, old, strlen (old)), ==, 0);
116 
117   g_mapped_file_free (file);
118 
119   g_free (tmp_copy_path);
120 }
121 
122 static void
test_writable_fd(void)123 test_writable_fd (void)
124 {
125   GMappedFile *file;
126   GError *error = NULL;
127   gchar *contents;
128   const gchar *old = "MMMMMMMMMMMMMMMMMMMMMMMMM";
129   const gchar *new = "abcdefghijklmnopqrstuvxyz";
130   gsize len;
131   int fd;
132   gchar *tmp_copy_path;
133 
134   tmp_copy_path = g_build_filename (g_get_tmp_dir (), "glib-test-4096-random-bytes", NULL);
135 
136   g_file_get_contents (g_test_get_filename (G_TEST_DIST, "4096-random-bytes", NULL), &contents, &len, &error);
137   g_assert_no_error (error);
138   g_file_set_contents (tmp_copy_path, contents, len, &error);
139   g_assert_no_error (error);
140 
141   g_free (contents);
142 
143   fd = g_open (tmp_copy_path, O_RDWR, 0);
144   g_assert_cmpint (fd, !=, -1);
145   file = g_mapped_file_new_from_fd (fd, TRUE, &error);
146   g_assert_no_error (error);
147 
148   contents = g_mapped_file_get_contents (file);
149   g_assert_cmpuint (strncmp (contents, old, strlen (old)), ==, 0);
150 
151   memcpy (contents, new, strlen (new));
152   g_assert_cmpuint (strncmp (contents, new, strlen (new)), ==, 0);
153 
154   g_mapped_file_free (file);
155   close (fd);
156 
157   error = NULL;
158   fd = g_open (tmp_copy_path, O_RDWR, 0);
159   g_assert_cmpint (fd, !=, -1);
160   file = g_mapped_file_new_from_fd (fd, TRUE, &error);
161   g_assert_no_error (error);
162 
163   contents = g_mapped_file_get_contents (file);
164   g_assert_cmpuint (strncmp (contents, old, strlen (old)), ==, 0);
165 
166   g_mapped_file_free (file);
167 
168   g_free (tmp_copy_path);
169 }
170 
171 static void
test_gbytes(void)172 test_gbytes (void)
173 {
174   GMappedFile *file;
175   GBytes *bytes;
176   GError *error;
177 
178   error = NULL;
179   file = g_mapped_file_new (g_test_get_filename (G_TEST_DIST, "empty", NULL), FALSE, &error);
180   g_assert_no_error (error);
181 
182   bytes = g_mapped_file_get_bytes (file);
183   g_mapped_file_unref (file);
184 
185   g_assert_cmpint (g_bytes_get_size (bytes), ==, 0);
186   g_bytes_unref (bytes);
187 }
188 
189 int
main(int argc,char * argv[])190 main (int argc, char *argv[])
191 {
192   g_test_init (&argc, &argv, NULL);
193 
194   g_test_add_func ("/mappedfile/basic", test_basic);
195   g_test_add_func ("/mappedfile/empty", test_empty);
196 #ifdef G_OS_UNIX
197   g_test_add_func ("/mappedfile/device", test_device);
198 #endif
199   g_test_add_func ("/mappedfile/nonexisting", test_nonexisting);
200   g_test_add_func ("/mappedfile/writable", test_writable);
201   g_test_add_func ("/mappedfile/writable_fd", test_writable_fd);
202   g_test_add_func ("/mappedfile/gbytes", test_gbytes);
203 
204   return g_test_run ();
205 }
206