gstreamer/tests/check/libs/sparsefile.c
Tim-Philipp Müller fa94322349 sparsefile: keep it private as helper API for downloadbuffer
There's no expectation that any other element or applications
might want to use this helper API any time soon, so keep it
private for the time being. There were open questions regarding
portability and binding-friendliness too.

This also removes the gio dependency of -base again.

https://bugzilla.gnome.org/show_bug.cgi?id=729951
https://bugzilla.gnome.org/show_bug.cgi?id=729949
2014-05-13 20:05:55 +01:00

228 lines
6.2 KiB
C

/* GStreamer
*
* unit test for cachefile helper
*
* Copyright (C) 2014 Wim Taymans <wtaymans@redhat.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <glib/gstdio.h>
#include <gst/check/gstcheck.h>
/* not public API for now */
#include "../../../plugins/elements/gstsparsefile.c"
static void
expect_range_before (GstSparseFile * file, gsize offset, gsize start,
gsize stop)
{
gsize tstart, tstop;
fail_unless (gst_sparse_file_get_range_before (file, offset, &tstart,
&tstop) == TRUE);
fail_unless (tstart == start);
fail_unless (tstop == stop);
}
static void
expect_range_after (GstSparseFile * file, gsize offset, gsize start, gsize stop)
{
gsize tstart, tstop;
fail_unless (gst_sparse_file_get_range_after (file, offset, &tstart,
&tstop) == TRUE);
fail_unless (tstart == start);
fail_unless (tstop == stop);
}
static gboolean
expect_write (GstSparseFile * file, gsize offset, gsize count, gsize result,
gsize avail)
{
GError *error = NULL;
gchar buffer[200];
gsize res, a;
res = gst_sparse_file_write (file, offset, buffer, count, &a, &error);
if (res != result)
return FALSE;
if (res == 0) {
if (error == NULL)
return FALSE;
g_clear_error (&error);
} else if (a != avail)
return FALSE;
return TRUE;
}
static gboolean
expect_read (GstSparseFile * file, gsize offset, gsize count, gsize result,
gsize avail)
{
GError *error = NULL;
gchar buffer[200];
gsize res, a;
res = gst_sparse_file_read (file, offset, buffer, count, &a, &error);
if (res != result)
return FALSE;
if (res == 0) {
if (error == NULL)
return FALSE;
g_clear_error (&error);
} else if (a != avail)
return FALSE;
return TRUE;
}
GST_START_TEST (test_write_read)
{
GstSparseFile *file;
gint fd;
gchar *name;
gsize start, stop;
name = g_strdup ("cachefile-testXXXXXX");
fd = g_mkstemp (name);
fail_if (fd == -1);
file = gst_sparse_file_new ();
fail_unless (file != NULL);
fail_unless (gst_sparse_file_set_fd (file, fd));
fail_unless (gst_sparse_file_n_ranges (file) == 0);
/* should fail, we didn't write anything yet */
fail_unless (expect_read (file, 0, 100, 0, 0));
/* no ranges, searching for a range should fail */
fail_unless (gst_sparse_file_n_ranges (file) == 0);
fail_unless (gst_sparse_file_get_range_before (file, 0, &start,
&stop) == FALSE);
fail_unless (gst_sparse_file_get_range_before (file, 10, &start,
&stop) == FALSE);
fail_unless (gst_sparse_file_get_range_after (file, 0, &start,
&stop) == FALSE);
fail_unless (gst_sparse_file_get_range_after (file, 10, &start,
&stop) == FALSE);
/* now write some data */
fail_unless (expect_write (file, 0, 100, 100, 0));
/* we have 1 range now */
fail_unless (gst_sparse_file_n_ranges (file) == 1);
expect_range_before (file, 0, 0, 100);
expect_range_after (file, 0, 0, 100);
expect_range_before (file, 100, 0, 100);
expect_range_before (file, 50, 0, 100);
expect_range_before (file, 200, 0, 100);
fail_unless (gst_sparse_file_get_range_after (file, 100, &start,
&stop) == FALSE);
expect_range_after (file, 50, 0, 100);
/* we can read all data now */
fail_unless (expect_read (file, 0, 100, 100, 0));
/* we can read less */
fail_unless (expect_read (file, 0, 50, 50, 50));
/* but we can't read more than what is written */
fail_unless (expect_read (file, 0, 101, 0, 0));
g_unlink (name);
gst_sparse_file_free (file);
g_free (name);
}
GST_END_TEST;
GST_START_TEST (test_write_merge)
{
GstSparseFile *file;
gint fd;
gchar *name;
gsize start, stop;
name = g_strdup ("cachefile-testXXXXXX");
fd = g_mkstemp (name);
fail_if (fd == -1);
file = gst_sparse_file_new ();
gst_sparse_file_set_fd (file, fd);
/* write something at offset 0 */
fail_unless (expect_write (file, 0, 100, 100, 0));
/* we have 1 range now */
fail_unless (gst_sparse_file_n_ranges (file) == 1);
expect_range_before (file, 110, 0, 100);
expect_range_after (file, 50, 0, 100);
fail_unless (gst_sparse_file_get_range_after (file, 100, &start,
&stop) == FALSE);
/* read should fail */
fail_unless (expect_read (file, 50, 150, 0, 0));
/* write something at offset 150 */
fail_unless (expect_write (file, 150, 100, 100, 0));
/* we have 2 ranges now */
fail_unless (gst_sparse_file_n_ranges (file) == 2);
expect_range_before (file, 110, 0, 100);
expect_range_after (file, 50, 0, 100);
expect_range_after (file, 100, 150, 250);
expect_range_before (file, 150, 150, 250);
/* read should still fail */
fail_unless (expect_read (file, 50, 150, 0, 0));
/* fill the hole */
fail_unless (expect_write (file, 100, 50, 50, 100));
/* we have 1 range now */
fail_unless (gst_sparse_file_n_ranges (file) == 1);
expect_range_before (file, 110, 0, 250);
expect_range_after (file, 50, 0, 250);
expect_range_after (file, 100, 0, 250);
expect_range_before (file, 150, 0, 250);
fail_unless (gst_sparse_file_get_range_after (file, 250, &start,
&stop) == FALSE);
/* read work */
fail_unless (expect_read (file, 50, 150, 150, 50));
g_unlink (name);
gst_sparse_file_free (file);
g_free (name);
}
GST_END_TEST;
static Suite *
gst_cachefile_suite (void)
{
Suite *s = suite_create ("cachefile");
TCase *tc_chain = tcase_create ("general");
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_write_read);
tcase_add_test (tc_chain, test_write_merge);
return s;
}
GST_CHECK_MAIN (gst_cachefile);