Branch data Line data Source code
1 : : #include <gio/gio.h>
2 : :
3 : : static void
4 : 1 : test_write (void)
5 : : {
6 : : GOutputStream *base;
7 : : GOutputStream *out;
8 : : GError *error;
9 : 1 : const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz";
10 : :
11 : 1 : base = g_memory_output_stream_new (g_malloc0 (20), 20, NULL, g_free);
12 : 1 : out = g_buffered_output_stream_new (base);
13 : :
14 : 1 : g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 4096);
15 : 1 : g_assert (!g_buffered_output_stream_get_auto_grow (G_BUFFERED_OUTPUT_STREAM (out)));
16 : 1 : g_object_set (out, "auto-grow", TRUE, NULL);
17 : 1 : g_assert (g_buffered_output_stream_get_auto_grow (G_BUFFERED_OUTPUT_STREAM (out)));
18 : 1 : g_object_set (out, "auto-grow", FALSE, NULL);
19 : :
20 : 1 : g_buffered_output_stream_set_buffer_size (G_BUFFERED_OUTPUT_STREAM (out), 16);
21 : 1 : g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 16);
22 : :
23 : 1 : error = NULL;
24 : 1 : g_assert_cmpint (g_output_stream_write (out, buffer, 10, NULL, &error), ==, 10);
25 : 1 : g_assert_no_error (error);
26 : :
27 : 1 : g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0);
28 : :
29 : 1 : g_assert_cmpint (g_output_stream_write (out, buffer + 10, 10, NULL, &error), ==, 6);
30 : 1 : g_assert_no_error (error);
31 : :
32 : 1 : g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0);
33 : 1 : g_assert (g_output_stream_flush (out, NULL, &error));
34 : 1 : g_assert_no_error (error);
35 : 1 : g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 16);
36 : :
37 : 1 : g_assert_cmpstr (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (base)), ==, "abcdefghijklmnop");
38 : :
39 : 1 : g_object_unref (out);
40 : 1 : g_object_unref (base);
41 : 1 : }
42 : :
43 : : static void
44 : 1 : test_grow (void)
45 : : {
46 : : GOutputStream *base;
47 : : GOutputStream *out;
48 : : GError *error;
49 : 1 : const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz";
50 : : gint size;
51 : : gboolean grow;
52 : :
53 : 1 : base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free);
54 : 1 : out = g_buffered_output_stream_new_sized (base, 16);
55 : :
56 : 1 : g_buffered_output_stream_set_auto_grow (G_BUFFERED_OUTPUT_STREAM (out), TRUE);
57 : :
58 : 1 : g_object_get (out, "buffer-size", &size, "auto-grow", &grow, NULL);
59 : 1 : g_assert_cmpint (size, ==, 16);
60 : 1 : g_assert (grow);
61 : :
62 : 1 : g_assert (g_seekable_can_seek (G_SEEKABLE (out)));
63 : :
64 : 1 : error = NULL;
65 : 1 : g_assert_cmpint (g_output_stream_write (out, buffer, 10, NULL, &error), ==, 10);
66 : 1 : g_assert_no_error (error);
67 : :
68 : 1 : g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 16);
69 : 1 : g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0);
70 : :
71 : 1 : g_assert_cmpint (g_output_stream_write (out, buffer + 10, 10, NULL, &error), ==, 10);
72 : 1 : g_assert_no_error (error);
73 : :
74 : 1 : g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), >=, 20);
75 : 1 : g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0);
76 : :
77 : 1 : g_assert (g_output_stream_flush (out, NULL, &error));
78 : 1 : g_assert_no_error (error);
79 : :
80 : 1 : g_assert_cmpstr (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (base)), ==, "abcdefghijklmnopqrst");
81 : :
82 : 1 : g_object_unref (out);
83 : 1 : g_object_unref (base);
84 : 1 : }
85 : :
86 : : static void
87 : 1 : test_close (void)
88 : : {
89 : : GOutputStream *base;
90 : : GOutputStream *out;
91 : : GError *error;
92 : :
93 : 1 : base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free);
94 : 1 : out = g_buffered_output_stream_new (base);
95 : :
96 : 1 : g_assert (g_filter_output_stream_get_close_base_stream (G_FILTER_OUTPUT_STREAM (out)));
97 : :
98 : 1 : error = NULL;
99 : 1 : g_assert (g_output_stream_close (out, NULL, &error));
100 : 1 : g_assert_no_error (error);
101 : 1 : g_assert (g_output_stream_is_closed (base));
102 : :
103 : 1 : g_object_unref (out);
104 : 1 : g_object_unref (base);
105 : :
106 : 1 : base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free);
107 : 1 : out = g_buffered_output_stream_new (base);
108 : :
109 : 1 : g_filter_output_stream_set_close_base_stream (G_FILTER_OUTPUT_STREAM (out), FALSE);
110 : :
111 : 1 : error = NULL;
112 : 1 : g_assert (g_output_stream_close (out, NULL, &error));
113 : 1 : g_assert_no_error (error);
114 : 1 : g_assert (!g_output_stream_is_closed (base));
115 : :
116 : 1 : g_object_unref (out);
117 : 1 : g_object_unref (base);
118 : 1 : }
119 : :
120 : : static void
121 : 1 : test_seek (void)
122 : : {
123 : : GMemoryOutputStream *base;
124 : : GOutputStream *out;
125 : : GSeekable *seekable;
126 : : GError *error;
127 : : gsize bytes_written;
128 : : gboolean ret;
129 : 1 : const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz";
130 : :
131 : 1 : base = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (g_malloc0 (30), 30, NULL, g_free));
132 : 1 : out = g_buffered_output_stream_new_sized (G_OUTPUT_STREAM (base), 8);
133 : 1 : seekable = G_SEEKABLE (out);
134 : 1 : error = NULL;
135 : :
136 : : /* Write data */
137 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 0);
138 : 1 : ret = g_output_stream_write_all (out, buffer, 4, &bytes_written, NULL, &error);
139 : 1 : g_assert_no_error (error);
140 : 1 : g_assert_cmpint (bytes_written, ==, 4);
141 : 1 : g_assert (ret);
142 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4);
143 : 1 : g_assert_cmpint (g_memory_output_stream_get_data_size (base), ==, 0);
144 : :
145 : : /* Forward relative seek */
146 : 1 : ret = g_seekable_seek (seekable, 2, G_SEEK_CUR, NULL, &error);
147 : 1 : g_assert_no_error (error);
148 : 1 : g_assert (ret);
149 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6);
150 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]);
151 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]);
152 : 1 : g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]);
153 : 1 : g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]);
154 : 1 : ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error);
155 : 1 : g_assert_no_error (error);
156 : 1 : g_assert (ret);
157 : 1 : g_assert_cmpint (bytes_written, ==, 2);
158 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8);
159 : :
160 : : /* Backward relative seek */
161 : 1 : ret = g_seekable_seek (seekable, -4, G_SEEK_CUR, NULL, &error);
162 : 1 : g_assert_no_error (error);
163 : 1 : g_assert (ret);
164 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4);
165 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]);
166 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]);
167 : 1 : g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]);
168 : 1 : g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]);
169 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]);
170 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]);
171 : 1 : ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error);
172 : 1 : g_assert_no_error (error);
173 : 1 : g_assert (ret);
174 : 1 : g_assert_cmpint (bytes_written, ==, 2);
175 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6);
176 : :
177 : : /* From start */
178 : 1 : ret = g_seekable_seek (seekable, 2, G_SEEK_SET, NULL, &error);
179 : 1 : g_assert_no_error (error);
180 : 1 : g_assert (ret);
181 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 2);
182 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]);
183 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]);
184 : 1 : g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]);
185 : 1 : g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]);
186 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]);
187 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]);
188 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]);
189 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]);
190 : 1 : ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error);
191 : 1 : g_assert_no_error (error);
192 : 1 : g_assert (ret);
193 : 1 : g_assert_cmpint (bytes_written, ==, 2);
194 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4);
195 : :
196 : : /* From end */
197 : 1 : ret = g_seekable_seek (seekable, 6 - 30, G_SEEK_END, NULL, &error);
198 : 1 : g_assert_no_error (error);
199 : 1 : g_assert (ret);
200 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6);
201 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]);
202 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]);
203 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]);
204 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]);
205 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]);
206 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]);
207 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]);
208 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]);
209 : 1 : ret = g_output_stream_write_all (out, buffer + 2, 2, &bytes_written, NULL, &error);
210 : 1 : g_assert_no_error (error);
211 : 1 : g_assert (ret);
212 : 1 : g_assert_cmpint (bytes_written, ==, 2);
213 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8);
214 : :
215 : : /* Check flush */
216 : 1 : ret = g_output_stream_flush (out, NULL, &error);
217 : 1 : g_assert_no_error (error);
218 : 1 : g_assert (ret);
219 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8);
220 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]);
221 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]);
222 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]);
223 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]);
224 : 1 : g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]);
225 : 1 : g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]);
226 : 1 : g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]);
227 : 1 : g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]);
228 : :
229 : 1 : g_object_unref (out);
230 : 1 : g_object_unref (base);
231 : 1 : }
232 : :
233 : : static void
234 : 1 : test_truncate(void)
235 : : {
236 : : GMemoryOutputStream *base_stream;
237 : : GOutputStream *stream;
238 : : GSeekable *seekable;
239 : : GError *error;
240 : : gsize bytes_written;
241 : : guchar *stream_data;
242 : : gsize len;
243 : : gboolean res;
244 : :
245 : 1 : len = 8;
246 : :
247 : : /* Create objects */
248 : 1 : stream_data = g_malloc0 (len);
249 : 1 : base_stream = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (stream_data, len, g_realloc, g_free));
250 : 1 : stream = g_buffered_output_stream_new_sized (G_OUTPUT_STREAM (base_stream), 8);
251 : 1 : seekable = G_SEEKABLE (stream);
252 : :
253 : 1 : g_assert (g_seekable_can_truncate (seekable));
254 : :
255 : : /* Write */
256 : 1 : g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len);
257 : 1 : g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 0);
258 : :
259 : 1 : error = NULL;
260 : 1 : res = g_output_stream_write_all (stream, "ab", 2, &bytes_written, NULL, &error);
261 : 1 : g_assert_no_error (error);
262 : 1 : g_assert (res);
263 : 1 : res = g_output_stream_write_all (stream, "cd", 2, &bytes_written, NULL, &error);
264 : 1 : g_assert_no_error (error);
265 : 1 : g_assert (res);
266 : :
267 : 1 : res = g_output_stream_flush (stream, NULL, &error);
268 : 1 : g_assert_no_error (error);
269 : 1 : g_assert (res);
270 : :
271 : 1 : g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len);
272 : 1 : g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
273 : 1 : stream_data = g_memory_output_stream_get_data (base_stream);
274 : 1 : g_assert_cmpint (stream_data[0], ==, 'a');
275 : 1 : g_assert_cmpint (stream_data[1], ==, 'b');
276 : 1 : g_assert_cmpint (stream_data[2], ==, 'c');
277 : 1 : g_assert_cmpint (stream_data[3], ==, 'd');
278 : :
279 : : /* Truncate at position */
280 : 1 : res = g_seekable_truncate (seekable, 4, NULL, &error);
281 : 1 : g_assert_no_error (error);
282 : 1 : g_assert (res);
283 : 1 : g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 4);
284 : 1 : g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
285 : 1 : stream_data = g_memory_output_stream_get_data (base_stream);
286 : 1 : g_assert_cmpint (stream_data[0], ==, 'a');
287 : 1 : g_assert_cmpint (stream_data[1], ==, 'b');
288 : 1 : g_assert_cmpint (stream_data[2], ==, 'c');
289 : 1 : g_assert_cmpint (stream_data[3], ==, 'd');
290 : :
291 : : /* Truncate beyond position */
292 : 1 : res = g_seekable_truncate (seekable, 6, NULL, &error);
293 : 1 : g_assert_no_error (error);
294 : 1 : g_assert (res);
295 : 1 : g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 6);
296 : 1 : g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 6);
297 : 1 : stream_data = g_memory_output_stream_get_data (base_stream);
298 : 1 : g_assert_cmpint (stream_data[0], ==, 'a');
299 : 1 : g_assert_cmpint (stream_data[1], ==, 'b');
300 : 1 : g_assert_cmpint (stream_data[2], ==, 'c');
301 : 1 : g_assert_cmpint (stream_data[3], ==, 'd');
302 : :
303 : : /* Truncate before position */
304 : 1 : res = g_seekable_truncate (seekable, 2, NULL, &error);
305 : 1 : g_assert_no_error (error);
306 : 1 : g_assert (res);
307 : 1 : g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 2);
308 : 1 : g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 2);
309 : 1 : stream_data = g_memory_output_stream_get_data (base_stream);
310 : 1 : g_assert_cmpint (stream_data[0], ==, 'a');
311 : 1 : g_assert_cmpint (stream_data[1], ==, 'b');
312 : :
313 : 1 : g_object_unref (stream);
314 : 1 : g_object_unref (base_stream);
315 : 1 : }
316 : :
317 : : int
318 : 1 : main (int argc, char *argv[])
319 : : {
320 : 1 : g_test_init (&argc, &argv, NULL);
321 : :
322 : 1 : g_test_add_func ("/buffered-output-stream/write", test_write);
323 : 1 : g_test_add_func ("/buffered-output-stream/grow", test_grow);
324 : 1 : g_test_add_func ("/buffered-output-stream/seek", test_seek);
325 : 1 : g_test_add_func ("/buffered-output-stream/truncate", test_truncate);
326 : 1 : g_test_add_func ("/filter-output-stream/close", test_close);
327 : :
328 : 1 : return g_test_run ();
329 : : }
|