Blame gio/tests/data-output-stream.c

Packit ae235b
/* GLib testing framework examples and tests
Packit ae235b
 * Copyright (C) 2008 Red Hat, Inc.
Packit ae235b
 * Authors: Tomas Bzatek <tbzatek@redhat.com>
Packit ae235b
 *
Packit ae235b
 * This work is provided "as is"; redistribution and modification
Packit ae235b
 * in whole or in part, in any medium, physical or electronic is
Packit ae235b
 * permitted without restriction.
Packit ae235b
 *
Packit ae235b
 * This work is distributed in the hope that it will be useful,
Packit ae235b
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit ae235b
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Packit ae235b
 *
Packit ae235b
 * In no event shall the authors or contributors be liable for any
Packit ae235b
 * direct, indirect, incidental, special, exemplary, or consequential
Packit ae235b
 * damages (including, but not limited to, procurement of substitute
Packit ae235b
 * goods or services; loss of use, data, or profits; or business
Packit ae235b
 * interruption) however caused and on any theory of liability, whether
Packit ae235b
 * in contract, strict liability, or tort (including negligence or
Packit ae235b
 * otherwise) arising in any way out of the use of this software, even
Packit ae235b
 * if advised of the possibility of such damage.
Packit ae235b
 */
Packit ae235b
Packit ae235b
#include <glib/glib.h>
Packit ae235b
#include <gio/gio.h>
Packit ae235b
#include <stdlib.h>
Packit ae235b
#include <string.h>
Packit ae235b
Packit ae235b
#define MAX_LINES		0xFFF	
Packit ae235b
#define MAX_LINES_BUFF 		0xFFFFFF
Packit ae235b
#define MAX_BYTES_BINARY	0x100	
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_basic (void)
Packit ae235b
{
Packit ae235b
  GOutputStream *stream;
Packit ae235b
  GOutputStream *base_stream;
Packit ae235b
  gpointer data;
Packit ae235b
  gint val;
Packit ae235b
Packit ae235b
  data = g_malloc0 (MAX_LINES_BUFF);
Packit ae235b
  
Packit ae235b
  /* initialize objects */
Packit ae235b
  base_stream = g_memory_output_stream_new (data, MAX_LINES_BUFF, NULL, NULL);
Packit ae235b
  stream = G_OUTPUT_STREAM (g_data_output_stream_new (base_stream));
Packit ae235b
Packit ae235b
  g_object_get (stream, "byte-order", &val, NULL);
Packit ae235b
  g_assert_cmpint (val, ==, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
Packit ae235b
  g_object_set (stream, "byte-order", G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN, NULL);
Packit ae235b
  g_assert_cmpint (g_data_output_stream_get_byte_order (G_DATA_OUTPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN);
Packit ae235b
Packit ae235b
  g_object_unref (stream);
Packit ae235b
  g_object_unref (base_stream);
Packit ae235b
  g_free (data);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_read_lines (GDataStreamNewlineType newline_type)
Packit ae235b
{
Packit ae235b
  GOutputStream *stream;
Packit ae235b
  GOutputStream *base_stream;
Packit ae235b
  GError *error = NULL;
Packit ae235b
  gpointer data;
Packit ae235b
  char *lines;
Packit ae235b
  int size;
Packit ae235b
  int i;
Packit ae235b
Packit ae235b
#define TEST_STRING	"some_text"
Packit ae235b
  
Packit ae235b
  const char* endl[4] = {"\n", "\r", "\r\n", "\n"};
Packit ae235b
  
Packit ae235b
  
Packit ae235b
  data = g_malloc0 (MAX_LINES_BUFF);
Packit ae235b
  lines = g_malloc0 ((strlen (TEST_STRING) + strlen (endl[newline_type])) * MAX_LINES + 1);
Packit ae235b
  
Packit ae235b
  /* initialize objects */
Packit ae235b
  base_stream = g_memory_output_stream_new (data, MAX_LINES_BUFF, NULL, NULL);
Packit ae235b
  stream = G_OUTPUT_STREAM (g_data_output_stream_new (base_stream));
Packit ae235b
Packit ae235b
  
Packit ae235b
  /*  fill data */
Packit ae235b
  for (i = 0; i < MAX_LINES; i++)
Packit ae235b
    {
Packit ae235b
      gboolean res;
Packit ae235b
      char *s = g_strconcat (TEST_STRING, endl[newline_type], NULL);
Packit ae235b
      res = g_data_output_stream_put_string (G_DATA_OUTPUT_STREAM (stream), s, NULL, &error);
Packit ae235b
      g_stpcpy ((char*)(lines + i*strlen(s)), s);
Packit ae235b
      g_assert_no_error (error);
Packit ae235b
      g_assert (res == TRUE);
Packit ae235b
      g_free (s);
Packit ae235b
    }
Packit ae235b
Packit ae235b
  /*  Byte order testing */
Packit ae235b
  g_data_output_stream_set_byte_order (G_DATA_OUTPUT_STREAM (stream), G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
Packit ae235b
  g_assert_cmpint (g_data_output_stream_get_byte_order (G_DATA_OUTPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
Packit ae235b
  g_data_output_stream_set_byte_order (G_DATA_OUTPUT_STREAM (stream), G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN);
Packit ae235b
  g_assert_cmpint (g_data_output_stream_get_byte_order (G_DATA_OUTPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN);
Packit ae235b
  
Packit ae235b
  /*  compare data */
Packit ae235b
  size = strlen (data);
Packit ae235b
  g_assert_cmpint (size, <, MAX_LINES_BUFF);
Packit ae235b
  g_assert_cmpstr ((char*)data, ==, lines);
Packit ae235b
  
Packit ae235b
  g_object_unref (base_stream);
Packit ae235b
  g_object_unref (stream);
Packit ae235b
  g_free (data);
Packit ae235b
  g_free (lines);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_read_lines_LF (void)
Packit ae235b
{
Packit ae235b
  test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_LF);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_read_lines_CR (void)
Packit ae235b
{
Packit ae235b
  test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_CR);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_read_lines_CR_LF (void)
Packit ae235b
{
Packit ae235b
  test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
Packit ae235b
}
Packit ae235b
Packit ae235b
enum TestDataType {
Packit ae235b
  TEST_DATA_BYTE = 0,
Packit ae235b
  TEST_DATA_INT16,
Packit ae235b
  TEST_DATA_UINT16,
Packit ae235b
  TEST_DATA_INT32,
Packit ae235b
  TEST_DATA_UINT32,
Packit ae235b
  TEST_DATA_INT64,
Packit ae235b
  TEST_DATA_UINT64
Packit ae235b
};
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_data_array (guchar *buffer, gsize len,
Packit ae235b
		 enum TestDataType data_type, GDataStreamByteOrder byte_order)
Packit ae235b
{
Packit ae235b
  GOutputStream *stream;
Packit ae235b
  GOutputStream *base_stream;
Packit ae235b
  guchar *stream_data;
Packit ae235b
  
Packit ae235b
  GError *error = NULL;
Packit ae235b
  guint pos;
Packit ae235b
  GDataStreamByteOrder native;
Packit ae235b
  gboolean swap;
Packit ae235b
  gboolean res;
Packit ae235b
  
Packit ae235b
  /*  create objects */
Packit ae235b
  stream_data = g_malloc0 (len);
Packit ae235b
  base_stream = g_memory_output_stream_new (stream_data, len, NULL, NULL);
Packit ae235b
  stream = G_OUTPUT_STREAM (g_data_output_stream_new (base_stream));
Packit ae235b
  g_data_output_stream_set_byte_order (G_DATA_OUTPUT_STREAM (stream), byte_order);
Packit ae235b
  
Packit ae235b
  /*  Set flag to swap bytes if needed */
Packit ae235b
  native = (G_BYTE_ORDER == G_BIG_ENDIAN) ? G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN : G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN;
Packit ae235b
  swap = (byte_order != G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN) && (byte_order != native);
Packit ae235b
Packit ae235b
  /* set len to length of buffer cast to actual type */
Packit ae235b
  switch (data_type)
Packit ae235b
    {
Packit ae235b
    case TEST_DATA_BYTE:
Packit ae235b
      break;
Packit ae235b
    case TEST_DATA_INT16:
Packit ae235b
    case TEST_DATA_UINT16:
Packit ae235b
      g_assert_cmpint (len % 2, ==, 0);
Packit ae235b
    case TEST_DATA_INT32:
Packit ae235b
    case TEST_DATA_UINT32:
Packit ae235b
      g_assert_cmpint (len % 4, ==, 0);
Packit ae235b
    case TEST_DATA_INT64:
Packit ae235b
    case TEST_DATA_UINT64:
Packit ae235b
      g_assert_cmpint (len % 8, ==, 0);
Packit ae235b
      len /= 8;
Packit ae235b
      break;
Packit ae235b
    default:
Packit ae235b
      g_assert_not_reached ();
Packit ae235b
      break;
Packit ae235b
    }
Packit ae235b
Packit ae235b
  /*  Write data to the file */
Packit ae235b
  for (pos = 0; pos < len; pos++)
Packit ae235b
    {
Packit ae235b
      switch (data_type)
Packit ae235b
	{
Packit ae235b
	case TEST_DATA_BYTE:
Packit ae235b
	  res = g_data_output_stream_put_byte (G_DATA_OUTPUT_STREAM (stream), buffer[pos], NULL, &error);
Packit ae235b
	  break;
Packit ae235b
	case TEST_DATA_INT16:
Packit ae235b
	  res = g_data_output_stream_put_int16 (G_DATA_OUTPUT_STREAM (stream), ((gint16 *) buffer)[pos], NULL, &error);
Packit ae235b
	  break;
Packit ae235b
	case TEST_DATA_UINT16:
Packit ae235b
	  res = g_data_output_stream_put_uint16 (G_DATA_OUTPUT_STREAM (stream), ((guint16 *) buffer)[pos], NULL, &error);
Packit ae235b
	  break;
Packit ae235b
	case TEST_DATA_INT32:
Packit ae235b
	  res = g_data_output_stream_put_int32 (G_DATA_OUTPUT_STREAM (stream), ((gint32 *) buffer)[pos], NULL, &error);
Packit ae235b
	  break;
Packit ae235b
	case TEST_DATA_UINT32:
Packit ae235b
	  res = g_data_output_stream_put_uint32 (G_DATA_OUTPUT_STREAM (stream), ((guint32 *) buffer)[pos], NULL, &error);
Packit ae235b
	  break;
Packit ae235b
	case TEST_DATA_INT64:
Packit ae235b
	  res = g_data_output_stream_put_int64 (G_DATA_OUTPUT_STREAM (stream), ((gint64 *) buffer)[pos], NULL, &error);
Packit ae235b
	  break;
Packit ae235b
	case TEST_DATA_UINT64:
Packit ae235b
	  res = g_data_output_stream_put_uint64 (G_DATA_OUTPUT_STREAM (stream), ((guint64 *) buffer)[pos], NULL, &error);
Packit ae235b
	  break;
Packit ae235b
        default:
Packit ae235b
          g_assert_not_reached ();
Packit ae235b
          break;
Packit ae235b
	}
Packit ae235b
      g_assert_no_error (error);
Packit ae235b
      g_assert_cmpint (res, ==, TRUE);
Packit ae235b
    }
Packit ae235b
  
Packit ae235b
  /*  Compare data back */
Packit ae235b
  for (pos = 0; pos < len; pos++)
Packit ae235b
    {
Packit ae235b
      switch (data_type)
Packit ae235b
        {
Packit ae235b
        case TEST_DATA_BYTE:
Packit ae235b
          /* swapping unnecessary */
Packit ae235b
          g_assert_cmpint (buffer[pos], ==, stream_data[pos]);
Packit ae235b
          break;
Packit ae235b
        case TEST_DATA_UINT16:
Packit ae235b
          if (swap)
Packit ae235b
            g_assert_cmpint (GUINT16_SWAP_LE_BE (((guint16 *) buffer)[pos]), ==, ((guint16 *) stream_data)[pos]);
Packit ae235b
          else
Packit ae235b
            g_assert_cmpint (((guint16 *) buffer)[pos], ==, ((guint16 *) stream_data)[pos]);
Packit ae235b
          break;
Packit ae235b
        case TEST_DATA_INT16:
Packit ae235b
          if (swap)
Packit ae235b
            g_assert_cmpint ((gint16) GUINT16_SWAP_LE_BE (((gint16 *) buffer)[pos]), ==, ((gint16 *) stream_data)[pos]);
Packit ae235b
          else
Packit ae235b
            g_assert_cmpint (((gint16 *) buffer)[pos], ==, ((gint16 *) stream_data)[pos]);
Packit ae235b
          break;
Packit ae235b
        case TEST_DATA_UINT32:
Packit ae235b
          if (swap)
Packit ae235b
            g_assert_cmpint (GUINT32_SWAP_LE_BE (((guint32 *) buffer)[pos]), ==, ((guint32 *) stream_data)[pos]);
Packit ae235b
          else
Packit ae235b
            g_assert_cmpint (((guint32 *) buffer)[pos], ==, ((guint32 *) stream_data)[pos]);
Packit ae235b
          break;
Packit ae235b
        case TEST_DATA_INT32:
Packit ae235b
          if (swap)
Packit ae235b
            g_assert_cmpint ((gint32) GUINT32_SWAP_LE_BE (((gint32 *) buffer)[pos]), ==, ((gint32 *) stream_data)[pos]);
Packit ae235b
          else
Packit ae235b
            g_assert_cmpint (((gint32 *) buffer)[pos], ==, ((gint32 *) stream_data)[pos]);
Packit ae235b
          break;
Packit ae235b
        case TEST_DATA_UINT64:
Packit ae235b
          if (swap)
Packit ae235b
            g_assert_cmpint (GUINT64_SWAP_LE_BE (((guint64 *) buffer)[pos]), ==, ((guint64 *) stream_data)[pos]);
Packit ae235b
          else
Packit ae235b
            g_assert_cmpint (((guint64 *) buffer)[pos], ==, ((guint64 *) stream_data)[pos]);
Packit ae235b
          break;
Packit ae235b
        case TEST_DATA_INT64:
Packit ae235b
          if (swap)
Packit ae235b
            g_assert_cmpint ((gint64) GUINT64_SWAP_LE_BE (((gint64 *) buffer)[pos]), ==, ((gint64 *) stream_data)[pos]);
Packit ae235b
          else
Packit ae235b
            g_assert_cmpint (((gint64 *) buffer)[pos], ==, ((gint64 *) stream_data)[pos]);
Packit ae235b
          break;
Packit ae235b
        default:
Packit ae235b
            g_assert_not_reached ();
Packit ae235b
          break;
Packit ae235b
        }
Packit ae235b
    }
Packit ae235b
  
Packit ae235b
  g_object_unref (base_stream);
Packit ae235b
  g_object_unref (stream);
Packit ae235b
  g_free (stream_data);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_read_int (void)
Packit ae235b
{
Packit ae235b
  GRand *randomizer;
Packit ae235b
  gpointer buffer;
Packit ae235b
  int i;
Packit ae235b
  
Packit ae235b
  randomizer = g_rand_new ();
Packit ae235b
  buffer = g_malloc0(MAX_BYTES_BINARY);
Packit ae235b
  
Packit ae235b
  /*  Fill in some random data */
Packit ae235b
  for (i = 0; i < MAX_BYTES_BINARY; i++)
Packit ae235b
    {
Packit ae235b
      guchar x = 0;
Packit ae235b
      while (! x)  x = (guchar)g_rand_int (randomizer);
Packit ae235b
      *(guchar*)((guchar*)buffer + sizeof (guchar) * i) = x; 
Packit ae235b
    }
Packit ae235b
Packit ae235b
  for (i = 0; i < 3; i++)
Packit ae235b
    {
Packit ae235b
      int j;
Packit ae235b
      for (j = 0; j <= TEST_DATA_UINT64; j++)
Packit ae235b
	test_data_array (buffer, MAX_BYTES_BINARY, j, i);
Packit ae235b
    }
Packit ae235b
  
Packit ae235b
  g_rand_free (randomizer);
Packit ae235b
  g_free (buffer);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_seek (void)
Packit ae235b
{
Packit ae235b
  GDataOutputStream *stream;
Packit ae235b
  GMemoryOutputStream *base_stream;
Packit ae235b
  GSeekable *seekable;
Packit ae235b
  GError *error;
Packit ae235b
  guchar *stream_data;
Packit ae235b
  gsize len;
Packit ae235b
  gboolean res;
Packit ae235b
Packit ae235b
  len = 8;
Packit ae235b
  
Packit ae235b
  /*  create objects */
Packit ae235b
  stream_data = g_malloc0 (len);
Packit ae235b
  base_stream = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (stream_data, len, NULL, NULL));
Packit ae235b
  stream = g_data_output_stream_new (G_OUTPUT_STREAM (base_stream));
Packit ae235b
  g_data_output_stream_set_byte_order (stream, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
Packit ae235b
  seekable = G_SEEKABLE (stream);
Packit ae235b
  g_assert (!g_seekable_can_truncate (seekable));
Packit ae235b
  error = NULL;
Packit ae235b
  
Packit ae235b
  /* Write */
Packit ae235b
  g_assert_cmpint (g_seekable_tell (seekable), ==, 0);
Packit ae235b
  res = g_data_output_stream_put_uint16 (stream, 0x0123, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_data_output_stream_put_uint16 (stream, 0x4567, NULL, NULL);
Packit ae235b
  g_assert_cmpint (g_seekable_tell (seekable), ==, 4);
Packit ae235b
  g_assert_cmpint (stream_data[0], ==, 0x01);
Packit ae235b
  g_assert_cmpint (stream_data[1], ==, 0x23);
Packit ae235b
  g_assert_cmpint (stream_data[2], ==, 0x45);
Packit ae235b
  g_assert_cmpint (stream_data[3], ==, 0x67);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
Packit ae235b
Packit ae235b
  /* Forward relative seek */
Packit ae235b
  res = g_seekable_seek (seekable, 2, G_SEEK_CUR, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_seekable_tell (seekable), ==, 6);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
Packit ae235b
  res = g_data_output_stream_put_uint16 (stream, 0x89AB, NULL, &error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_seekable_tell (seekable), ==, 8);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
Packit ae235b
  g_assert_cmpint (stream_data[0], ==, 0x01);
Packit ae235b
  g_assert_cmpint (stream_data[1], ==, 0x23);
Packit ae235b
  g_assert_cmpint (stream_data[2], ==, 0x45);
Packit ae235b
  g_assert_cmpint (stream_data[3], ==, 0x67);
Packit ae235b
  g_assert_cmpint (stream_data[4], ==, 0x00);
Packit ae235b
  g_assert_cmpint (stream_data[5], ==, 0x00);
Packit ae235b
  g_assert_cmpint (stream_data[6], ==, 0x89);
Packit ae235b
  g_assert_cmpint (stream_data[7], ==, 0xAB);
Packit ae235b
Packit ae235b
  /* Backward relative seek */
Packit ae235b
  res = g_seekable_seek (seekable, -3, G_SEEK_CUR, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_seekable_tell (seekable), ==, 5);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
Packit ae235b
  res = g_data_output_stream_put_uint16 (stream, 0xCDEF, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_seekable_tell (seekable), ==, 7);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
Packit ae235b
  g_assert_cmpint (stream_data[0], ==, 0x01);
Packit ae235b
  g_assert_cmpint (stream_data[1], ==, 0x23);
Packit ae235b
  g_assert_cmpint (stream_data[2], ==, 0x45);
Packit ae235b
  g_assert_cmpint (stream_data[3], ==, 0x67);
Packit ae235b
  g_assert_cmpint (stream_data[4], ==, 0x00);
Packit ae235b
  g_assert_cmpint (stream_data[5], ==, 0xCD);
Packit ae235b
  g_assert_cmpint (stream_data[6], ==, 0xEF);
Packit ae235b
  g_assert_cmpint (stream_data[7], ==, 0xAB);
Packit ae235b
Packit ae235b
  /* From start */
Packit ae235b
  res = g_seekable_seek (seekable, 4, G_SEEK_SET, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_seekable_tell (seekable), ==, 4);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
Packit ae235b
  res = g_data_output_stream_put_uint16 (stream, 0xFEDC, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_seekable_tell (seekable), ==, 6);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
Packit ae235b
  g_assert_cmpint (stream_data[0], ==, 0x01);
Packit ae235b
  g_assert_cmpint (stream_data[1], ==, 0x23);
Packit ae235b
  g_assert_cmpint (stream_data[2], ==, 0x45);
Packit ae235b
  g_assert_cmpint (stream_data[3], ==, 0x67);
Packit ae235b
  g_assert_cmpint (stream_data[4], ==, 0xFE);
Packit ae235b
  g_assert_cmpint (stream_data[5], ==, 0xDC);
Packit ae235b
  g_assert_cmpint (stream_data[6], ==, 0xEF);
Packit ae235b
  g_assert_cmpint (stream_data[7], ==, 0xAB);
Packit ae235b
Packit ae235b
  /* From end */
Packit ae235b
  res = g_seekable_seek (seekable, -4, G_SEEK_END, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_seekable_tell (seekable), ==, 4);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
Packit ae235b
  res = g_data_output_stream_put_uint16 (stream, 0xBA87, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_seekable_tell (seekable), ==, 6);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
Packit ae235b
  g_assert_cmpint (stream_data[0], ==, 0x01);
Packit ae235b
  g_assert_cmpint (stream_data[1], ==, 0x23);
Packit ae235b
  g_assert_cmpint (stream_data[2], ==, 0x45);
Packit ae235b
  g_assert_cmpint (stream_data[3], ==, 0x67);
Packit ae235b
  g_assert_cmpint (stream_data[4], ==, 0xBA);
Packit ae235b
  g_assert_cmpint (stream_data[5], ==, 0x87);
Packit ae235b
  g_assert_cmpint (stream_data[6], ==, 0xEF);
Packit ae235b
  g_assert_cmpint (stream_data[7], ==, 0xAB);
Packit ae235b
Packit ae235b
  g_object_unref (stream);
Packit ae235b
  g_object_unref (base_stream);
Packit ae235b
  g_free (stream_data);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_truncate (void)
Packit ae235b
{
Packit ae235b
  GDataOutputStream *stream;
Packit ae235b
  GMemoryOutputStream *base_stream;
Packit ae235b
  GSeekable *seekable;
Packit ae235b
  GError *error;
Packit ae235b
  guchar *stream_data;
Packit ae235b
  gsize len;
Packit ae235b
  gboolean res;
Packit ae235b
Packit ae235b
  len = 8;
Packit ae235b
Packit ae235b
  /* Create objects */
Packit ae235b
  stream_data = g_malloc0 (len);
Packit ae235b
  base_stream = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (stream_data, len, g_realloc, g_free));
Packit ae235b
  stream = g_data_output_stream_new (G_OUTPUT_STREAM (base_stream));
Packit ae235b
  g_data_output_stream_set_byte_order (stream, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
Packit ae235b
  seekable = G_SEEKABLE (stream);
Packit ae235b
  error = NULL;
Packit ae235b
  g_assert (g_seekable_can_truncate (seekable));
Packit ae235b
  
Packit ae235b
  /* Write */
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 0);
Packit ae235b
  res = g_data_output_stream_put_uint16 (stream, 0x0123, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  res = g_data_output_stream_put_uint16 (stream, 0x4567, NULL, NULL);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
Packit ae235b
  stream_data = g_memory_output_stream_get_data (base_stream);
Packit ae235b
  g_assert_cmpint (stream_data[0], ==, 0x01);
Packit ae235b
  g_assert_cmpint (stream_data[1], ==, 0x23);
Packit ae235b
  g_assert_cmpint (stream_data[2], ==, 0x45);
Packit ae235b
  g_assert_cmpint (stream_data[3], ==, 0x67);
Packit ae235b
Packit ae235b
  /* Truncate at position */
Packit ae235b
  res = g_seekable_truncate (seekable, 4, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 4);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
Packit ae235b
  stream_data = g_memory_output_stream_get_data (base_stream);
Packit ae235b
  g_assert_cmpint (stream_data[0], ==, 0x01);
Packit ae235b
  g_assert_cmpint (stream_data[1], ==, 0x23);
Packit ae235b
  g_assert_cmpint (stream_data[2], ==, 0x45);
Packit ae235b
  g_assert_cmpint (stream_data[3], ==, 0x67);
Packit ae235b
Packit ae235b
  /* Truncate beyond position */
Packit ae235b
  res = g_seekable_truncate (seekable, 6, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 6);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 6);
Packit ae235b
  stream_data = g_memory_output_stream_get_data (base_stream);
Packit ae235b
  g_assert_cmpint (stream_data[0], ==, 0x01);
Packit ae235b
  g_assert_cmpint (stream_data[1], ==, 0x23);
Packit ae235b
  g_assert_cmpint (stream_data[2], ==, 0x45);
Packit ae235b
  g_assert_cmpint (stream_data[3], ==, 0x67);
Packit ae235b
Packit ae235b
  /* Truncate before position */
Packit ae235b
  res = g_seekable_truncate (seekable, 2, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (res);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 2);
Packit ae235b
  g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 2);
Packit ae235b
  stream_data = g_memory_output_stream_get_data (base_stream);
Packit ae235b
  g_assert_cmpint (stream_data[0], ==, 0x01);
Packit ae235b
  g_assert_cmpint (stream_data[1], ==, 0x23);
Packit ae235b
Packit ae235b
  g_object_unref (stream);
Packit ae235b
  g_object_unref (base_stream);
Packit ae235b
}
Packit ae235b
Packit ae235b
int
Packit ae235b
main (int   argc,
Packit ae235b
      char *argv[])
Packit ae235b
{
Packit ae235b
  g_test_init (&argc, &argv, NULL);
Packit ae235b
Packit ae235b
  g_test_add_func ("/data-output-stream/basic", test_basic);
Packit ae235b
  g_test_add_func ("/data-output-stream/write-lines-LF", test_read_lines_LF);
Packit ae235b
  g_test_add_func ("/data-output-stream/write-lines-CR", test_read_lines_CR);
Packit ae235b
  g_test_add_func ("/data-output-stream/write-lines-CR-LF", test_read_lines_CR_LF);
Packit ae235b
  g_test_add_func ("/data-output-stream/write-int", test_read_int);
Packit ae235b
  g_test_add_func ("/data-output-stream/seek", test_seek);
Packit ae235b
  g_test_add_func ("/data-output-stream/truncate", test_truncate);
Packit ae235b
Packit ae235b
  return g_test_run();
Packit ae235b
}