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