#define MAX_BYTES_BINARY 0x100
static void
+test_basic (void)
+{
+ GOutputStream *stream;
+ GOutputStream *base_stream;
+ gpointer data;
+ gint val;
+
+ data = g_malloc0 (MAX_LINES_BUFF);
+
+ /* initialize objects */
+ base_stream = g_memory_output_stream_new (data, MAX_LINES_BUFF, NULL, NULL);
+ stream = G_OUTPUT_STREAM (g_data_output_stream_new (base_stream));
+
+ g_object_get (stream, "byte-order", &val, NULL);
+ g_assert_cmpint (val, ==, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
+ g_object_set (stream, "byte-order", G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN, NULL);
+ g_assert_cmpint (g_data_output_stream_get_byte_order (G_DATA_OUTPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN);
+
+ g_object_unref (stream);
+ g_object_unref (base_stream);
+ g_free (data);
+}
+
+static void
test_read_lines (GDataStreamNewlineType newline_type)
{
GOutputStream *stream;
g_stpcpy ((char*)(lines + i*strlen(s)), s);
g_assert_no_error (error);
g_assert (res == TRUE);
+ g_free (s);
}
/* Byte order testing */
TEST_DATA_UINT64
};
-#define TEST_DATA_RETYPE(a, v) \
- (a == TEST_DATA_BYTE ? (guchar)v : \
- (a == TEST_DATA_INT16 ? (gint16)v : \
- (a == TEST_DATA_UINT16 ? (guint16)v : \
- (a == TEST_DATA_INT32 ? (gint32)v : \
- (a == TEST_DATA_UINT32 ? (guint32)v : \
- (a == TEST_DATA_INT64 ? (gint64)v : \
- (guint64)v ))))))
-
-#define TEST_DATA_RETYPE_BUFF(a, v) \
- (a == TEST_DATA_BYTE ? *(guchar*)v : \
- (a == TEST_DATA_INT16 ? *(gint16*)v : \
- (a == TEST_DATA_UINT16 ? *(guint16*)v : \
- (a == TEST_DATA_INT32 ? *(gint32*)v : \
- (a == TEST_DATA_UINT32 ? *(guint32*)v : \
- (a == TEST_DATA_INT64 ? *(gint64*)v : \
- *(guint64*)v ))))))
-
-
-
-
static void
-test_data_array (gpointer buffer, int len,
+test_data_array (guchar *buffer, gsize len,
enum TestDataType data_type, GDataStreamByteOrder byte_order)
{
GOutputStream *stream;
GOutputStream *base_stream;
- gpointer stream_data;
+ guchar *stream_data;
GError *error = NULL;
- int pos;
- int data_size = 1;
+ guint pos;
GDataStreamByteOrder native;
gboolean swap;
gboolean res;
- guint64 data;
/* create objects */
stream_data = g_malloc0 (len);
stream = G_OUTPUT_STREAM (g_data_output_stream_new (base_stream));
g_data_output_stream_set_byte_order (G_DATA_OUTPUT_STREAM (stream), byte_order);
+ /* Set flag to swap bytes if needed */
+ native = (G_BYTE_ORDER == G_BIG_ENDIAN) ? G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN : G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN;
+ swap = (byte_order != G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN) && (byte_order != native);
- /* Set correct data size */
+ /* set len to length of buffer cast to actual type */
switch (data_type)
{
case TEST_DATA_BYTE:
- data_size = 1;
break;
case TEST_DATA_INT16:
case TEST_DATA_UINT16:
- data_size = 2;
- break;
+ g_assert_cmpint (len % 2, ==, 0);
case TEST_DATA_INT32:
case TEST_DATA_UINT32:
- data_size = 4;
- break;
+ g_assert_cmpint (len % 4, ==, 0);
case TEST_DATA_INT64:
case TEST_DATA_UINT64:
- data_size = 8;
- break;
+ g_assert_cmpint (len % 8, ==, 0);
+ len /= 8;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
}
-
- /* Set flag to swap bytes if needed */
- native = (G_BYTE_ORDER == G_BIG_ENDIAN) ? G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN : G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN;
- swap = (byte_order != G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN) && (byte_order != native);
/* Write data to the file */
- pos = 0;
- while (pos < len)
+ for (pos = 0; pos < len; pos++)
{
switch (data_type)
{
case TEST_DATA_BYTE:
- res = g_data_output_stream_put_byte (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
+ res = g_data_output_stream_put_byte (G_DATA_OUTPUT_STREAM (stream), buffer[pos], NULL, &error);
break;
case TEST_DATA_INT16:
- res = g_data_output_stream_put_int16 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
+ res = g_data_output_stream_put_int16 (G_DATA_OUTPUT_STREAM (stream), ((gint16 *) buffer)[pos], NULL, &error);
break;
case TEST_DATA_UINT16:
- res = g_data_output_stream_put_uint16 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
+ res = g_data_output_stream_put_uint16 (G_DATA_OUTPUT_STREAM (stream), ((guint16 *) buffer)[pos], NULL, &error);
break;
case TEST_DATA_INT32:
- res = g_data_output_stream_put_int32 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
+ res = g_data_output_stream_put_int32 (G_DATA_OUTPUT_STREAM (stream), ((gint32 *) buffer)[pos], NULL, &error);
break;
case TEST_DATA_UINT32:
- res = g_data_output_stream_put_uint32 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
+ res = g_data_output_stream_put_uint32 (G_DATA_OUTPUT_STREAM (stream), ((guint32 *) buffer)[pos], NULL, &error);
break;
case TEST_DATA_INT64:
- res = g_data_output_stream_put_int64 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
+ res = g_data_output_stream_put_int64 (G_DATA_OUTPUT_STREAM (stream), ((gint64 *) buffer)[pos], NULL, &error);
break;
case TEST_DATA_UINT64:
- res = g_data_output_stream_put_uint64 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
+ res = g_data_output_stream_put_uint64 (G_DATA_OUTPUT_STREAM (stream), ((guint64 *) buffer)[pos], NULL, &error);
break;
+ default:
+ g_assert_not_reached ();
+ break;
}
g_assert_no_error (error);
g_assert_cmpint (res, ==, TRUE);
- pos += data_size;
}
-
/* Compare data back */
- pos = 0;
- data = 0;
- while (pos < len)
+ for (pos = 0; pos < len; pos++)
{
- data = TEST_DATA_RETYPE_BUFF(data_type, ((guchar*)stream_data + pos));
- if (swap)
- {
- switch (data_type)
- {
- case TEST_DATA_BYTE:
- break;
- case TEST_DATA_UINT16:
- case TEST_DATA_INT16:
- data = TEST_DATA_RETYPE(data_type, GUINT16_SWAP_LE_BE(TEST_DATA_RETYPE(data_type, data)));
- break;
- case TEST_DATA_UINT32:
- case TEST_DATA_INT32:
- data = TEST_DATA_RETYPE(data_type, GUINT32_SWAP_LE_BE(TEST_DATA_RETYPE(data_type, data)));
- break;
- case TEST_DATA_UINT64:
- case TEST_DATA_INT64:
- data = TEST_DATA_RETYPE(data_type, GUINT64_SWAP_LE_BE(TEST_DATA_RETYPE(data_type, data)));
- break;
- }
- }
- g_assert_cmpint (data, ==, TEST_DATA_RETYPE_BUFF(data_type, ((guchar*)buffer + pos)));
- break;
-
- pos += data_size;
+ switch (data_type)
+ {
+ case TEST_DATA_BYTE:
+ /* swapping unnecessary */
+ g_assert_cmpint (buffer[pos], ==, stream_data[pos]);
+ break;
+ case TEST_DATA_UINT16:
+ if (swap)
+ g_assert_cmpint (GUINT16_SWAP_LE_BE (((guint16 *) buffer)[pos]), ==, ((guint16 *) stream_data)[pos]);
+ else
+ g_assert_cmpint (((guint16 *) buffer)[pos], ==, ((guint16 *) stream_data)[pos]);
+ break;
+ case TEST_DATA_INT16:
+ if (swap)
+ g_assert_cmpint ((gint16) GUINT16_SWAP_LE_BE (((gint16 *) buffer)[pos]), ==, ((gint16 *) stream_data)[pos]);
+ else
+ g_assert_cmpint (((gint16 *) buffer)[pos], ==, ((gint16 *) stream_data)[pos]);
+ break;
+ case TEST_DATA_UINT32:
+ if (swap)
+ g_assert_cmpint (GUINT32_SWAP_LE_BE (((guint32 *) buffer)[pos]), ==, ((guint32 *) stream_data)[pos]);
+ else
+ g_assert_cmpint (((guint32 *) buffer)[pos], ==, ((guint32 *) stream_data)[pos]);
+ break;
+ case TEST_DATA_INT32:
+ if (swap)
+ g_assert_cmpint ((gint32) GUINT32_SWAP_LE_BE (((gint32 *) buffer)[pos]), ==, ((gint32 *) stream_data)[pos]);
+ else
+ g_assert_cmpint (((gint32 *) buffer)[pos], ==, ((gint32 *) stream_data)[pos]);
+ break;
+ case TEST_DATA_UINT64:
+ if (swap)
+ g_assert_cmpint (GUINT64_SWAP_LE_BE (((guint64 *) buffer)[pos]), ==, ((guint64 *) stream_data)[pos]);
+ else
+ g_assert_cmpint (((guint64 *) buffer)[pos], ==, ((guint64 *) stream_data)[pos]);
+ break;
+ case TEST_DATA_INT64:
+ if (swap)
+ g_assert_cmpint ((gint64) GUINT64_SWAP_LE_BE (((gint64 *) buffer)[pos]), ==, ((gint64 *) stream_data)[pos]);
+ else
+ g_assert_cmpint (((gint64 *) buffer)[pos], ==, ((gint64 *) stream_data)[pos]);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
}
g_object_unref (base_stream);
static void
test_read_int (void)
{
- GRand *rand;
+ GRand *randomizer;
gpointer buffer;
int i;
- rand = g_rand_new ();
+ randomizer = g_rand_new ();
buffer = g_malloc0(MAX_BYTES_BINARY);
/* Fill in some random data */
for (i = 0; i < MAX_BYTES_BINARY; i++)
{
guchar x = 0;
- while (! x) x = (guchar)g_rand_int (rand);
+ while (! x) x = (guchar)g_rand_int (randomizer);
*(guchar*)((guchar*)buffer + sizeof (guchar) * i) = x;
}
test_data_array (buffer, MAX_BYTES_BINARY, j, i);
}
- g_rand_free (rand);
+ g_rand_free (randomizer);
g_free (buffer);
}
+static void
+test_seek (void)
+{
+ GDataOutputStream *stream;
+ GMemoryOutputStream *base_stream;
+ GSeekable *seekable;
+ GError *error;
+ guchar *stream_data;
+ gsize len;
+ gboolean res;
+
+ len = 8;
+
+ /* create objects */
+ stream_data = g_malloc0 (len);
+ base_stream = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (stream_data, len, NULL, NULL));
+ stream = g_data_output_stream_new (G_OUTPUT_STREAM (base_stream));
+ g_data_output_stream_set_byte_order (stream, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
+ seekable = G_SEEKABLE (stream);
+ g_assert (!g_seekable_can_truncate (seekable));
+ error = NULL;
+
+ /* Write */
+ g_assert_cmpint (g_seekable_tell (seekable), ==, 0);
+ res = g_data_output_stream_put_uint16 (stream, 0x0123, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_data_output_stream_put_uint16 (stream, 0x4567, NULL, NULL);
+ g_assert_cmpint (g_seekable_tell (seekable), ==, 4);
+ g_assert_cmpint (stream_data[0], ==, 0x01);
+ g_assert_cmpint (stream_data[1], ==, 0x23);
+ g_assert_cmpint (stream_data[2], ==, 0x45);
+ g_assert_cmpint (stream_data[3], ==, 0x67);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
+
+ /* Forward relative seek */
+ res = g_seekable_seek (seekable, 2, G_SEEK_CUR, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_assert_cmpint (g_seekable_tell (seekable), ==, 6);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
+ res = g_data_output_stream_put_uint16 (stream, 0x89AB, NULL, &error);
+ g_assert (res);
+ g_assert_cmpint (g_seekable_tell (seekable), ==, 8);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
+ g_assert_cmpint (stream_data[0], ==, 0x01);
+ g_assert_cmpint (stream_data[1], ==, 0x23);
+ g_assert_cmpint (stream_data[2], ==, 0x45);
+ g_assert_cmpint (stream_data[3], ==, 0x67);
+ g_assert_cmpint (stream_data[4], ==, 0x00);
+ g_assert_cmpint (stream_data[5], ==, 0x00);
+ g_assert_cmpint (stream_data[6], ==, 0x89);
+ g_assert_cmpint (stream_data[7], ==, 0xAB);
+
+ /* Backward relative seek */
+ res = g_seekable_seek (seekable, -3, G_SEEK_CUR, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_assert_cmpint (g_seekable_tell (seekable), ==, 5);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
+ res = g_data_output_stream_put_uint16 (stream, 0xCDEF, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_assert_cmpint (g_seekable_tell (seekable), ==, 7);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
+ g_assert_cmpint (stream_data[0], ==, 0x01);
+ g_assert_cmpint (stream_data[1], ==, 0x23);
+ g_assert_cmpint (stream_data[2], ==, 0x45);
+ g_assert_cmpint (stream_data[3], ==, 0x67);
+ g_assert_cmpint (stream_data[4], ==, 0x00);
+ g_assert_cmpint (stream_data[5], ==, 0xCD);
+ g_assert_cmpint (stream_data[6], ==, 0xEF);
+ g_assert_cmpint (stream_data[7], ==, 0xAB);
+
+ /* From start */
+ res = g_seekable_seek (seekable, 4, G_SEEK_SET, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_assert_cmpint (g_seekable_tell (seekable), ==, 4);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
+ res = g_data_output_stream_put_uint16 (stream, 0xFEDC, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_assert_cmpint (g_seekable_tell (seekable), ==, 6);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
+ g_assert_cmpint (stream_data[0], ==, 0x01);
+ g_assert_cmpint (stream_data[1], ==, 0x23);
+ g_assert_cmpint (stream_data[2], ==, 0x45);
+ g_assert_cmpint (stream_data[3], ==, 0x67);
+ g_assert_cmpint (stream_data[4], ==, 0xFE);
+ g_assert_cmpint (stream_data[5], ==, 0xDC);
+ g_assert_cmpint (stream_data[6], ==, 0xEF);
+ g_assert_cmpint (stream_data[7], ==, 0xAB);
+
+ /* From end */
+ res = g_seekable_seek (seekable, -4, G_SEEK_END, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_assert_cmpint (g_seekable_tell (seekable), ==, 4);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
+ res = g_data_output_stream_put_uint16 (stream, 0xBA87, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_assert_cmpint (g_seekable_tell (seekable), ==, 6);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8);
+ g_assert_cmpint (stream_data[0], ==, 0x01);
+ g_assert_cmpint (stream_data[1], ==, 0x23);
+ g_assert_cmpint (stream_data[2], ==, 0x45);
+ g_assert_cmpint (stream_data[3], ==, 0x67);
+ g_assert_cmpint (stream_data[4], ==, 0xBA);
+ g_assert_cmpint (stream_data[5], ==, 0x87);
+ g_assert_cmpint (stream_data[6], ==, 0xEF);
+ g_assert_cmpint (stream_data[7], ==, 0xAB);
+
+ g_object_unref (stream);
+ g_object_unref (base_stream);
+ g_free (stream_data);
+}
+
+static void
+test_truncate (void)
+{
+ GDataOutputStream *stream;
+ GMemoryOutputStream *base_stream;
+ GSeekable *seekable;
+ GError *error;
+ guchar *stream_data;
+ gsize len;
+ gboolean res;
+
+ len = 8;
+
+ /* Create objects */
+ stream_data = g_malloc0 (len);
+ base_stream = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (stream_data, len, g_realloc, g_free));
+ stream = g_data_output_stream_new (G_OUTPUT_STREAM (base_stream));
+ g_data_output_stream_set_byte_order (stream, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
+ seekable = G_SEEKABLE (stream);
+ error = NULL;
+ g_assert (g_seekable_can_truncate (seekable));
+
+ /* Write */
+ g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 0);
+ res = g_data_output_stream_put_uint16 (stream, 0x0123, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ res = g_data_output_stream_put_uint16 (stream, 0x4567, NULL, NULL);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
+ stream_data = g_memory_output_stream_get_data (base_stream);
+ g_assert_cmpint (stream_data[0], ==, 0x01);
+ g_assert_cmpint (stream_data[1], ==, 0x23);
+ g_assert_cmpint (stream_data[2], ==, 0x45);
+ g_assert_cmpint (stream_data[3], ==, 0x67);
+
+ /* Truncate at position */
+ res = g_seekable_truncate (seekable, 4, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 4);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
+ stream_data = g_memory_output_stream_get_data (base_stream);
+ g_assert_cmpint (stream_data[0], ==, 0x01);
+ g_assert_cmpint (stream_data[1], ==, 0x23);
+ g_assert_cmpint (stream_data[2], ==, 0x45);
+ g_assert_cmpint (stream_data[3], ==, 0x67);
+
+ /* Truncate beyond position */
+ res = g_seekable_truncate (seekable, 6, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 6);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 6);
+ stream_data = g_memory_output_stream_get_data (base_stream);
+ g_assert_cmpint (stream_data[0], ==, 0x01);
+ g_assert_cmpint (stream_data[1], ==, 0x23);
+ g_assert_cmpint (stream_data[2], ==, 0x45);
+ g_assert_cmpint (stream_data[3], ==, 0x67);
+
+ /* Truncate before position */
+ res = g_seekable_truncate (seekable, 2, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (res);
+ g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 2);
+ g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 2);
+ stream_data = g_memory_output_stream_get_data (base_stream);
+ g_assert_cmpint (stream_data[0], ==, 0x01);
+ g_assert_cmpint (stream_data[1], ==, 0x23);
+
+ g_object_unref (stream);
+ g_object_unref (base_stream);
+}
+
int
main (int argc,
char *argv[])
{
- g_type_init ();
g_test_init (&argc, &argv, NULL);
- g_test_add_func ("/data-input-stream/read-lines-LF", test_read_lines_LF);
- g_test_add_func ("/data-input-stream/read-lines-CR", test_read_lines_CR);
- g_test_add_func ("/data-input-stream/read-lines-CR-LF", test_read_lines_CR_LF);
- g_test_add_func ("/data-input-stream/read-int", test_read_int);
+ g_test_add_func ("/data-output-stream/basic", test_basic);
+ g_test_add_func ("/data-output-stream/write-lines-LF", test_read_lines_LF);
+ g_test_add_func ("/data-output-stream/write-lines-CR", test_read_lines_CR);
+ g_test_add_func ("/data-output-stream/write-lines-CR-LF", test_read_lines_CR_LF);
+ g_test_add_func ("/data-output-stream/write-int", test_read_int);
+ g_test_add_func ("/data-output-stream/seek", test_seek);
+ g_test_add_func ("/data-output-stream/truncate", test_truncate);
return g_test_run();
}