3 * unit test for GstMemory
5 * Copyright (C) <2012> Wim Taymans <wim.taymans at gmail.com>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
27 #ifdef HAVE_VALGRIND_H
28 # include <valgrind/valgrind.h>
30 # define RUNNING_ON_VALGRIND FALSE
33 #include <gst/check/gstcheck.h>
35 GST_START_TEST (test_submemory)
37 GstMemory *memory, *sub;
38 gsize size, maxsize, ssize;
41 memory = gst_allocator_alloc (NULL, 4, 0);
43 /* check sizes, memory starts out empty */
44 data = gst_memory_map (memory, &size, &maxsize, GST_MAP_WRITE);
45 fail_unless (size == 4, "memory has wrong size");
46 fail_unless (maxsize >= 4, "memory has wrong size");
48 gst_memory_unmap (memory, data, 4);
50 data = gst_memory_map (memory, &size, NULL, GST_MAP_READ);
52 sub = gst_memory_share (memory, 1, 2);
53 fail_if (sub == NULL, "share of memory returned NULL");
55 sdata = gst_memory_map (sub, &ssize, NULL, GST_MAP_READ);
56 fail_unless (ssize == 2, "submemory has wrong size");
57 fail_unless (memcmp (data + 1, sdata, 2) == 0,
58 "submemory contains the wrong data");
59 ASSERT_MEMORY_REFCOUNT (sub, "submemory", 1);
60 gst_memory_unmap (sub, sdata, ssize);
61 gst_memory_unref (sub);
63 /* create a submemory of size 0 */
64 sub = gst_memory_share (memory, 1, 0);
65 fail_if (sub == NULL, "share memory returned NULL");
66 sdata = gst_memory_map (sub, &ssize, NULL, GST_MAP_READ);
67 fail_unless (ssize == 0, "submemory has wrong size");
68 fail_unless (memcmp (data + 1, sdata, 0) == 0,
69 "submemory contains the wrong data");
70 ASSERT_MEMORY_REFCOUNT (sub, "submemory", 1);
71 gst_memory_unmap (sub, sdata, ssize);
72 gst_memory_unref (sub);
74 /* test if metadata is coppied, not a complete memory copy so only the
75 * timestamp and offset fields are copied. */
76 sub = gst_memory_share (memory, 0, 1);
77 fail_if (sub == NULL, "share of memory returned NULL");
78 fail_unless (gst_memory_get_sizes (sub, NULL, NULL) == 1,
79 "submemory has wrong size");
80 gst_memory_unref (sub);
82 /* test if metadata is coppied, a complete memory is copied so all the timing
83 * fields should be copied. */
84 sub = gst_memory_share (memory, 0, 4);
85 fail_if (sub == NULL, "share of memory returned NULL");
86 fail_unless (gst_memory_get_sizes (sub, NULL, NULL) == 4,
87 "submemory has wrong size");
90 gst_memory_unref (sub);
92 gst_memory_unmap (memory, data, size);
93 gst_memory_unref (memory);
98 GST_START_TEST (test_is_span)
100 GstMemory *memory, *sub1, *sub2;
102 memory = gst_allocator_alloc (NULL, 4, 0);
104 sub1 = gst_memory_share (memory, 0, 2);
105 fail_if (sub1 == NULL, "share of memory returned NULL");
107 sub2 = gst_memory_share (memory, 2, 2);
108 fail_if (sub2 == NULL, "share of memory returned NULL");
110 fail_if (gst_memory_is_span (memory, sub2, NULL) == TRUE,
111 "a parent memory can't be span");
113 fail_if (gst_memory_is_span (sub1, memory, NULL) == TRUE,
114 "a parent memory can't be span");
116 fail_if (gst_memory_is_span (sub1, sub2, NULL) == FALSE,
117 "two submemorys next to each other should be span");
120 gst_memory_unref (sub1);
121 gst_memory_unref (sub2);
122 gst_memory_unref (memory);
127 static const char ro_memory[] = "abcdefghijklmnopqrstuvwxyz";
130 create_read_only_memory (void)
134 /* assign some read-only data to the new memory */
135 mem = gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
136 (gpointer) ro_memory, NULL, sizeof (ro_memory), 0, sizeof (ro_memory));
137 fail_if (gst_memory_is_writable (mem));
142 GST_START_TEST (test_writable)
144 GstMemory *mem, *mem2;
148 /* create read-only memory and try to write */
149 mem = create_read_only_memory ();
151 ASSERT_CRITICAL (gst_memory_map (mem, &size, NULL, GST_MAP_WRITE));
152 fail_if (gst_memory_is_writable (mem));
154 mem2 = gst_memory_copy (mem, 0, -1);
155 fail_if (gst_memory_is_writable (mem));
156 fail_unless (gst_memory_is_writable (mem2));
158 data = gst_memory_map (mem2, &size, NULL, GST_MAP_WRITE);
160 gst_memory_unmap (mem2, data, size);
162 gst_memory_ref (mem2);
163 ASSERT_CRITICAL (gst_memory_map (mem, &size, NULL, GST_MAP_WRITE));
164 gst_memory_unref (mem2);
166 data = gst_memory_map (mem2, &size, NULL, GST_MAP_WRITE);
168 gst_memory_unmap (mem2, data, size);
170 gst_memory_unref (mem2);
172 gst_memory_unref (mem);
177 GST_START_TEST (test_submemory_writable)
179 GstMemory *mem, *sub_mem;
182 /* create sub-memory of read-only memory and try to write */
183 mem = create_read_only_memory ();
185 sub_mem = gst_memory_share (mem, 0, 8);
186 fail_if (gst_memory_is_writable (sub_mem));
188 ASSERT_CRITICAL (gst_memory_map (mem, &size, NULL, GST_MAP_WRITE));
189 ASSERT_CRITICAL (gst_memory_map (sub_mem, &size, NULL, GST_MAP_WRITE));
191 gst_memory_unref (sub_mem);
192 gst_memory_unref (mem);
197 GST_START_TEST (test_copy)
199 GstMemory *memory, *copy;
201 guint8 *data, *sdata;
203 memory = gst_allocator_alloc (NULL, 4, 0);
204 ASSERT_MEMORY_REFCOUNT (memory, "memory", 1);
206 copy = gst_memory_copy (memory, 0, -1);
207 ASSERT_MEMORY_REFCOUNT (memory, "memory", 1);
208 ASSERT_MEMORY_REFCOUNT (copy, "copy", 1);
209 /* memorys are copied and must point to different memory */
210 fail_if (memory == copy);
212 data = gst_memory_map (memory, &size, NULL, GST_MAP_READ);
213 sdata = gst_memory_map (copy, &ssize, NULL, GST_MAP_READ);
215 /* NOTE that data is refcounted */
216 fail_unless (size == ssize);
218 gst_memory_unmap (copy, sdata, ssize);
219 gst_memory_unmap (memory, data, size);
221 gst_memory_unref (copy);
222 gst_memory_unref (memory);
224 memory = gst_allocator_alloc (NULL, 0, 0);
225 data = gst_memory_map (memory, &size, NULL, GST_MAP_READ);
226 fail_unless (size == 0);
227 gst_memory_unmap (memory, data, size);
229 /* copying a 0-sized memory should not crash */
230 copy = gst_memory_copy (memory, 0, -1);
231 data = gst_memory_map (copy, &size, NULL, GST_MAP_READ);
232 fail_unless (size == 0);
233 gst_memory_unmap (copy, data, size);
235 gst_memory_unref (copy);
236 gst_memory_unref (memory);
241 GST_START_TEST (test_try_new_and_alloc)
247 mem = gst_allocator_alloc (NULL, 0, 0);
248 fail_unless (mem != NULL);
249 data = gst_memory_map (mem, &size, NULL, GST_MAP_READ);
250 fail_unless (size == 0);
251 gst_memory_unmap (mem, data, size);
252 gst_memory_unref (mem);
254 /* normal alloc should still work */
255 mem = gst_allocator_alloc (NULL, 640 * 480 * 4, 0);
256 fail_unless (mem != NULL);
257 data = gst_memory_map (mem, &size, NULL, GST_MAP_WRITE);
258 fail_unless (data != NULL);
259 fail_unless (size == (640 * 480 * 4));
260 data[640 * 479 * 4 + 479] = 0xff;
261 gst_memory_unmap (mem, data, size);
263 gst_memory_unref (mem);
266 /* Disabled this part of the test, because it happily succeeds on 64-bit
267 * machines that have enough memory+swap, because the address space is large
268 * enough. There's not really any way to test the failure case except by
269 * allocating chunks of memory until it fails, which would suck. */
271 /* now this better fail (don't run in valgrind, it will abort
272 * or warn when passing silly arguments to malloc) */
273 if (!RUNNING_ON_VALGRIND) {
274 mem = gst_allocator_alloc (NULL, (guint) - 1, 0);
275 fail_unless (mem == NULL);
282 GST_START_TEST (test_resize)
286 gsize size, maxsize, offset;
288 /* one memory block */
289 mem = gst_allocator_alloc (NULL, 100, 0);
291 size = gst_memory_get_sizes (mem, &offset, &maxalloc);
292 fail_unless (size == 100);
293 fail_unless (offset == 0);
294 fail_unless (maxalloc >= 100);
296 ASSERT_CRITICAL (gst_memory_resize (mem, 200, 50));
297 ASSERT_CRITICAL (gst_memory_resize (mem, 0, 150));
298 ASSERT_CRITICAL (gst_memory_resize (mem, 1, maxalloc));
299 ASSERT_CRITICAL (gst_memory_resize (mem, maxalloc, 1));
301 /* this does nothing */
302 gst_memory_resize (mem, 0, 100);
304 /* nothing should have changed */
305 size = gst_memory_get_sizes (mem, &offset, &maxsize);
306 fail_unless (size == 100);
307 fail_unless (offset == 0);
308 fail_unless (maxsize == maxalloc);
310 gst_memory_resize (mem, 0, 50);
311 size = gst_memory_get_sizes (mem, &offset, &maxsize);
312 fail_unless (size == 50);
313 fail_unless (offset == 0);
314 fail_unless (maxsize == maxalloc);
316 gst_memory_resize (mem, 0, 100);
317 size = gst_memory_get_sizes (mem, &offset, &maxsize);
318 fail_unless (size == 100);
319 fail_unless (offset == 0);
320 fail_unless (maxsize == maxalloc);
322 gst_memory_resize (mem, 1, 99);
323 size = gst_memory_get_sizes (mem, &offset, &maxsize);
324 fail_unless (size == 99);
325 fail_unless (offset == 1);
326 fail_unless (maxsize == maxalloc);
328 ASSERT_CRITICAL (gst_memory_resize (mem, 1, maxalloc - 1));
330 gst_memory_resize (mem, 0, 99);
331 size = gst_memory_get_sizes (mem, &offset, &maxsize);
332 fail_unless (size == 99);
333 fail_unless (offset == 1);
334 fail_unless (maxsize == maxalloc);
336 gst_memory_resize (mem, -1, 100);
337 size = gst_memory_get_sizes (mem, &offset, &maxsize);
338 fail_unless (size == 100);
339 fail_unless (offset == 0);
340 fail_unless (maxsize == maxalloc);
342 /* can't set offset below 0 */
343 ASSERT_CRITICAL (gst_memory_resize (mem, -1, 100));
345 gst_memory_resize (mem, 50, 40);
346 size = gst_memory_get_sizes (mem, &offset, &maxsize);
347 fail_unless (size == 40);
348 fail_unless (offset == 50);
349 fail_unless (maxsize == maxalloc);
351 gst_memory_resize (mem, -50, 100);
352 size = gst_memory_get_sizes (mem, &offset, &maxsize);
353 fail_unless (size == 100);
354 fail_unless (offset == 0);
355 fail_unless (maxsize == maxalloc);
357 gst_memory_resize (mem, 0, 0);
358 size = gst_memory_get_sizes (mem, &offset, &maxsize);
359 fail_unless (size == 0);
360 fail_unless (offset == 0);
361 fail_unless (maxsize == maxalloc);
363 gst_memory_resize (mem, 0, 100);
364 size = gst_memory_get_sizes (mem, &offset, &maxsize);
365 fail_unless (size == 100);
366 fail_unless (offset == 0);
367 fail_unless (maxsize == maxalloc);
369 gst_memory_resize (mem, 0, 100);
370 size = gst_memory_get_sizes (mem, &offset, &maxsize);
371 fail_unless (size == 100);
372 fail_unless (offset == 0);
373 fail_unless (maxsize == maxalloc);
375 gst_memory_unref (mem);
380 GST_START_TEST (test_map)
384 gsize size, maxsize, offset;
387 /* one memory block */
388 mem = gst_allocator_alloc (NULL, 100, 0);
390 size = gst_memory_get_sizes (mem, &offset, &maxalloc);
391 fail_unless (size == 100);
392 fail_unless (offset == 0);
393 fail_unless (maxalloc >= 100);
395 /* see if simply mapping works */
396 data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
397 fail_unless (data != NULL);
398 fail_unless (size == 100);
399 fail_unless (maxsize == maxalloc);
400 ASSERT_CRITICAL (gst_memory_unmap (mem, (guint8 *) data - 1, maxsize + 1));
401 gst_memory_unmap (mem, data, size);
403 /* make smaller by unmapping less */
404 data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
405 fail_unless (data != NULL);
406 fail_unless (size == 100);
407 fail_unless (maxsize == maxalloc);
408 gst_memory_unmap (mem, data, size - 1);
410 size = gst_memory_get_sizes (mem, &offset, &maxalloc);
411 fail_unless (size == 99);
412 fail_unless (offset == 0);
413 fail_unless (maxalloc >= 100);
415 /* make bigger by unmapping more */
416 data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
417 fail_unless (data != NULL);
418 fail_unless (size == 99);
419 fail_unless (maxsize == maxalloc);
420 gst_memory_unmap (mem, data, size + 1);
422 size = gst_memory_get_sizes (mem, &offset, &maxalloc);
423 fail_unless (size == 100);
424 fail_unless (offset == 0);
425 fail_unless (maxalloc >= 100);
427 /* resize beyond the maxsize */
428 data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
429 fail_unless (data != NULL);
430 fail_unless (size == 100);
431 fail_unless (maxsize == maxalloc);
432 ASSERT_CRITICAL (gst_memory_unmap (mem, data, maxsize + 1));
433 gst_memory_unmap (mem, data, maxsize);
435 /* add offset, maxsize should be smaller now */
436 gst_memory_resize (mem, 1, 99);
438 data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
439 fail_unless (data != NULL);
440 fail_unless (size == 99);
441 fail_unless (maxsize == maxalloc - 1);
442 ASSERT_CRITICAL (gst_memory_unmap (mem, data, maxsize + 1));
443 gst_memory_unmap (mem, data, maxsize);
445 gst_memory_unref (mem);
450 GST_START_TEST (test_map_nested)
453 gsize size1, maxsize1, size2, maxsize2;
454 gpointer data1, data2;
456 mem = gst_allocator_alloc (NULL, 100, 0);
459 data1 = gst_memory_map (mem, &size1, &maxsize1, GST_MAP_READ);
460 fail_unless (data1 != NULL);
461 fail_unless (size1 == 100);
463 data2 = gst_memory_map (mem, &size2, &maxsize2, GST_MAP_READ);
464 fail_unless (data2 == data1);
465 fail_unless (size2 == 100);
467 /* unmap in reverse order */
468 gst_memory_unmap (mem, data2, size2);
469 gst_memory_unmap (mem, data1, size1);
472 data1 = gst_memory_map (mem, &size1, &maxsize1, GST_MAP_READ);
473 fail_unless (data1 != NULL);
474 fail_unless (size1 == 100);
476 data2 = gst_memory_map (mem, &size2, &maxsize2, GST_MAP_READ);
477 fail_unless (data2 == data1);
478 fail_unless (size2 == 100);
480 /* unmap in different order */
481 gst_memory_unmap (mem, data1, size1);
482 gst_memory_unmap (mem, data2, size2);
484 data1 = gst_memory_map (mem, &size1, &maxsize1, GST_MAP_READ);
486 ASSERT_CRITICAL (gst_memory_map (mem, &size2, &maxsize2, GST_MAP_WRITE));
487 ASSERT_CRITICAL (gst_memory_map (mem, &size2, &maxsize2, GST_MAP_READWRITE));
488 data2 = gst_memory_map (mem, &size2, &maxsize2, GST_MAP_READ);
489 gst_memory_unmap (mem, data1, size1);
490 gst_memory_unmap (mem, data2, size2);
491 fail_unless (mem->state == 0);
493 data1 = gst_memory_map (mem, &size1, &maxsize1, GST_MAP_WRITE);
495 ASSERT_CRITICAL (gst_memory_map (mem, &size2, &maxsize2, GST_MAP_READ));
496 ASSERT_CRITICAL (gst_memory_map (mem, &size2, &maxsize2, GST_MAP_READWRITE));
497 data2 = gst_memory_map (mem, &size2, &maxsize2, GST_MAP_WRITE);
498 gst_memory_unmap (mem, data1, size1);
499 gst_memory_unmap (mem, data2, size2);
500 /* nothing was mapped */
501 ASSERT_CRITICAL (gst_memory_unmap (mem, data2, size2));
503 data1 = gst_memory_map (mem, &size1, &maxsize1, GST_MAP_READWRITE);
504 data2 = gst_memory_map (mem, &size2, &maxsize2, GST_MAP_READ);
505 gst_memory_unmap (mem, data2, size2);
506 data2 = gst_memory_map (mem, &size2, &maxsize2, GST_MAP_WRITE);
507 gst_memory_unmap (mem, data2, size2);
509 ASSERT_CRITICAL (gst_memory_unmap (mem, (guint8 *) data1 - 1, size1));
510 gst_memory_unmap (mem, data1, size1);
511 /* nothing was mapped */
512 ASSERT_CRITICAL (gst_memory_unmap (mem, data1, size1));
514 gst_memory_unref (mem);
519 GST_START_TEST (test_map_resize)
522 gsize size, maxsize, maxalloc, offset;
525 mem = gst_allocator_alloc (NULL, 100, 0);
528 data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
529 fail_unless (data != NULL);
530 fail_unless (size == 100);
532 /* resize the buffer */
533 gst_memory_resize (mem, 1, size - 1);
534 size = gst_memory_get_sizes (mem, &offset, &maxalloc);
535 fail_unless (size == 99);
536 fail_unless (offset == 1);
537 fail_unless (maxalloc >= 100);
539 /* unmap the buffer with original pointer and size, should restore the offset
541 gst_memory_unmap (mem, data, 100);
543 size = gst_memory_get_sizes (mem, &offset, &maxalloc);
544 fail_unless (size == 100);
545 fail_unless (offset == 0);
546 fail_unless (maxalloc >= 100);
548 data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
549 fail_unless (data != NULL);
550 fail_unless (size == 100);
551 fail_unless (maxsize >= 100);
553 /* resize the buffer with unmap */
554 gst_memory_unmap (mem, (guint8 *) data + 1, 99);
556 size = gst_memory_get_sizes (mem, &offset, &maxalloc);
557 fail_unless (size == 99);
558 fail_unless (offset == 1);
559 fail_unless (maxalloc >= 100);
562 data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
563 gst_memory_unmap (mem, (guint8 *) data - 1, 100);
565 size = gst_memory_get_sizes (mem, &offset, &maxalloc);
566 fail_unless (size == 100);
567 fail_unless (offset == 0);
568 fail_unless (maxalloc >= 100);
570 data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
571 gst_memory_unmap (mem, (guint8 *) data + 1, -1);
573 size = gst_memory_get_sizes (mem, &offset, &maxalloc);
574 fail_unless (size == 99);
575 fail_unless (offset == 1);
576 fail_unless (maxalloc >= 100);
578 data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
579 gst_memory_unmap (mem, (guint8 *) data - 1, -1);
581 size = gst_memory_get_sizes (mem, &offset, &maxalloc);
582 fail_unless (size == 100);
583 fail_unless (offset == 0);
584 fail_unless (maxalloc >= 100);
586 gst_memory_unref (mem);
593 gst_memory_suite (void)
595 Suite *s = suite_create ("GstMemory");
596 TCase *tc_chain = tcase_create ("general");
598 suite_add_tcase (s, tc_chain);
599 tcase_add_test (tc_chain, test_submemory);
600 tcase_add_test (tc_chain, test_submemory_writable);
601 tcase_add_test (tc_chain, test_writable);
602 tcase_add_test (tc_chain, test_is_span);
603 tcase_add_test (tc_chain, test_copy);
604 tcase_add_test (tc_chain, test_try_new_and_alloc);
605 tcase_add_test (tc_chain, test_resize);
606 tcase_add_test (tc_chain, test_map);
607 tcase_add_test (tc_chain, test_map_nested);
608 tcase_add_test (tc_chain, test_map_resize);
613 GST_CHECK_MAIN (gst_memory);