Silence a bunch of -Wunused-but-set-variable warnings
[platform/upstream/glib.git] / gio / tests / converter-stream.c
index 0efd5fc..8017015 100644 (file)
@@ -92,14 +92,11 @@ g_expander_converter_convert (GConverter *converter,
                              gsize      *bytes_written,
                              GError    **error)
 {
-  GExpanderConverter  *conv;
   const guint8 *in, *in_end;
   guint8 v, *out;
   int i;
   gsize block_size;
 
-  conv = G_EXPANDER_CONVERTER (converter);
-
   in = inbuf;
   out = outbuf;
   in_end = in + inbuf_size;
@@ -211,14 +208,11 @@ g_compressor_converter_convert (GConverter *converter,
                                gsize      *bytes_written,
                                GError    **error)
 {
-  GCompressorConverter  *conv;
   const guint8 *in, *in_end;
   guint8 v, *out;
   int i;
   gsize block_size;
 
-  conv = G_COMPRESSOR_CONVERTER (converter);
-
   in = inbuf;
   out = outbuf;
   in_end = in + inbuf_size;
@@ -301,6 +295,7 @@ test_expander (void)
   GInputStream *mem, *cstream;
   GOutputStream *mem_out, *cstream_out;
   GConverter *expander;
+  GConverter *converter;
   GError *error;
   int i;
 
@@ -325,6 +320,10 @@ test_expander (void)
                                             sizeof (unexpanded_data),
                                             NULL);
   cstream = g_converter_input_stream_new (mem, expander);
+  g_assert (g_converter_input_stream_get_converter (G_CONVERTER_INPUT_STREAM (cstream)) == expander);
+  g_object_get (cstream, "converter", &converter, NULL);
+  g_assert (converter == expander);
+  g_object_unref (converter);
   g_object_unref (mem);
 
   total_read = 0;
@@ -349,6 +348,10 @@ test_expander (void)
 
   mem_out = g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
   cstream_out = g_converter_output_stream_new (mem_out, expander);
+  g_assert (g_converter_output_stream_get_converter (G_CONVERTER_OUTPUT_STREAM (cstream_out)) == expander);
+  g_object_get (cstream_out, "converter", &converter, NULL);
+  g_assert (converter == expander);
+  g_object_unref (converter);
   g_object_unref (mem_out);
 
   for (i = 0; i < sizeof(unexpanded_data); i++)
@@ -493,6 +496,8 @@ test_compressor (void)
   g_assert (total_read == 1);
   g_assert (*converted == 5);
 
+  g_object_unref (cstream);
+
   mem = g_memory_input_stream_new_from_data (expanded,
                                             5*1000 * 2,
                                             NULL);
@@ -539,6 +544,7 @@ test_compressor (void)
       if (res == -1)
        {
          g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PARTIAL_INPUT);
+          g_error_free (error);
          break;
        }
 
@@ -558,15 +564,201 @@ test_compressor (void)
   g_object_unref (compressor);
 }
 
+#define DATA_LENGTH 1000000
+
+static void
+test_corruption (GZlibCompressorFormat format, gint level)
+{
+  GError *error = NULL;
+  guint32 *data0, *data1;
+  gsize data1_size;
+  gint i;
+  GInputStream *istream0, *istream1, *cistream1;
+  GOutputStream *ostream1, *ostream2, *costream1;
+  GConverter *compressor, *decompressor;
+  GZlibCompressorFormat fmt;
+  gint lvl;
+
+  data0 = g_malloc (DATA_LENGTH * sizeof (guint32));
+  for (i = 0; i < DATA_LENGTH; i++)
+    data0[i] = g_random_int ();
+
+  istream0 = g_memory_input_stream_new_from_data (data0,
+    DATA_LENGTH * sizeof (guint32), NULL);
+
+  ostream1 = g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
+  compressor = G_CONVERTER (g_zlib_compressor_new (format, level));
+  costream1 = g_converter_output_stream_new (ostream1, compressor);
+  g_assert (g_converter_output_stream_get_converter (G_CONVERTER_OUTPUT_STREAM (costream1)) == compressor);
+
+  g_output_stream_splice (costream1, istream0, 0, NULL, &error);
+  g_assert_no_error (error);
+
+  g_object_unref (costream1);
+
+  g_converter_reset (compressor);
+  g_object_get (compressor, "format", &fmt, "level", &lvl, NULL);
+  g_assert_cmpint (fmt, ==, format);
+  g_assert_cmpint (lvl, ==, level);
+  g_object_unref (compressor);
+  data1 = g_memory_output_stream_steal_data (G_MEMORY_OUTPUT_STREAM (ostream1));
+  data1_size = g_memory_output_stream_get_data_size (
+    G_MEMORY_OUTPUT_STREAM (ostream1));
+  g_object_unref (ostream1);
+  g_object_unref (istream0);
+
+  istream1 = g_memory_input_stream_new_from_data (data1, data1_size, g_free);
+  decompressor = G_CONVERTER (g_zlib_decompressor_new (format));
+  cistream1 = g_converter_input_stream_new (istream1, decompressor);
+
+  ostream2 = g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
+
+  g_output_stream_splice (ostream2, cistream1, 0, NULL, &error);
+  g_assert_no_error (error);
+
+  g_assert_cmpuint (DATA_LENGTH * sizeof (guint32), ==,
+    g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (ostream2)));
+  g_assert (memcmp (data0, g_memory_output_stream_get_data (
+    G_MEMORY_OUTPUT_STREAM (ostream2)), DATA_LENGTH * sizeof (guint32)) == 0);
+  g_object_unref (istream1);
+  g_converter_reset (decompressor);
+  g_object_get (decompressor, "format", &fmt, NULL);
+  g_assert_cmpint (fmt, ==, format);
+  g_object_unref (decompressor);
+  g_object_unref (cistream1);
+  g_object_unref (ostream2);
+  g_free (data0);
+}
+
+typedef struct {
+  const gchar *path;
+  GZlibCompressorFormat format;
+  gint level;
+} CompressorTest;
+
+static void
+test_roundtrip (gconstpointer data)
+{
+  const CompressorTest *test = data;
+
+  g_test_bug ("162549");
+
+  test_corruption (test->format, test->level);
+}
+
+typedef struct {
+  const gchar *path;
+  const gchar *charset_in;
+  const gchar *text_in;
+  const gchar *charset_out;
+  const gchar *text_out;
+  gint n_fallbacks;
+} CharsetTest;
+
+static void
+test_charset (gconstpointer data)
+{
+  const CharsetTest *test = data;
+  GInputStream *in, *in2;
+  GConverter *conv;
+  gchar *buffer;
+  gsize count;
+  gsize bytes_read;
+  GError *error;
+  gboolean fallback;
+
+  conv = (GConverter *)g_charset_converter_new (test->charset_out, test->charset_in, NULL);
+  g_object_get (conv, "use-fallback", &fallback, NULL);
+  g_assert (!fallback);
+
+  in = g_memory_input_stream_new_from_data (test->text_in, -1, NULL);
+  in2 = g_converter_input_stream_new (in, conv);
+
+  count = 2 * strlen (test->text_out);
+  buffer = g_malloc0 (count);
+  error = NULL;
+  g_input_stream_read_all (in2, buffer, count, &bytes_read, NULL, &error);
+  if (test->n_fallbacks == 0)
+    {
+      g_assert_no_error (error);
+      g_assert_cmpint (bytes_read, ==, strlen (test->text_out));
+      g_assert_cmpstr (buffer, ==, test->text_out);
+    }
+  else
+    {
+      g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA);
+      g_error_free (error);
+    }
+
+  g_free (buffer);
+  g_object_unref (in2);
+  g_object_unref (in);
+
+  if (test->n_fallbacks == 0)
+    {
+       g_object_unref (conv);
+       return;
+    }
+
+  g_converter_reset (conv);
+
+  g_assert (!g_charset_converter_get_use_fallback (G_CHARSET_CONVERTER (conv)));
+  g_charset_converter_set_use_fallback (G_CHARSET_CONVERTER (conv), TRUE);
+
+  in = g_memory_input_stream_new_from_data (test->text_in, -1, NULL);
+  in2 = g_converter_input_stream_new (in, conv);
+
+  count = 2 * strlen (test->text_out);
+  buffer = g_malloc0 (count);
+  error = NULL;
+  g_input_stream_read_all (in2, buffer, count, &bytes_read, NULL, &error);
+  g_assert_no_error (error);
+  g_assert_cmpstr (buffer, ==, test->text_out);
+  g_assert_cmpint (bytes_read, ==, strlen (test->text_out));
+  g_assert_cmpint (test->n_fallbacks, ==, g_charset_converter_get_num_fallbacks (G_CHARSET_CONVERTER (conv)));
+
+  g_free (buffer);
+  g_object_unref (in2);
+  g_object_unref (in);
+
+  g_object_unref (conv);
+}
+
 int
 main (int   argc,
       char *argv[])
 {
+  CompressorTest compressor_tests[] = {
+    { "/converter-output-stream/corruption/zlib-0", G_ZLIB_COMPRESSOR_FORMAT_ZLIB, 0 },
+    { "/converter-output-stream/corruption/zlib-9", G_ZLIB_COMPRESSOR_FORMAT_ZLIB, 9 },
+    { "/converter-output-stream/corruption/gzip-0", G_ZLIB_COMPRESSOR_FORMAT_GZIP, 0 },
+    { "/converter-output-stream/corruption/gzip-9", G_ZLIB_COMPRESSOR_FORMAT_GZIP, 9 },
+    { "/converter-output-stream/corruption/raw-0", G_ZLIB_COMPRESSOR_FORMAT_RAW, 0 },
+    { "/converter-output-stream/corruption/raw-9", G_ZLIB_COMPRESSOR_FORMAT_RAW, 9 },
+  };
+  CharsetTest charset_tests[] = {
+    { "/converter-input-stream/charset/utf8->latin1", "UTF-8", "\303\205rr Sant\303\251", "ISO-8859-1", "\305rr Sant\351", 0 },
+    { "/converter-input-stream/charset/latin1->utf8", "ISO-8859-1", "\305rr Sant\351", "UTF-8", "\303\205rr Sant\303\251", 0 },
+    { "/converter-input-stream/charset/fallbacks", "UTF-8", "Some characters just don't fit into latin1: πא", "ISO-8859-1", "Some characters just don't fit into latin1: \\CF\\80\\D7\\90", 4 },
+
+  };
+
+  gint i;
+
   g_type_init ();
   g_test_init (&argc, &argv, NULL);
 
+  g_test_bug_base ("http://bugzilla.gnome.org/");
+
   g_test_add_func ("/converter-input-stream/expander", test_expander);
   g_test_add_func ("/converter-input-stream/compressor", test_compressor);
 
+  for (i = 0; i < G_N_ELEMENTS (compressor_tests); i++)
+    g_test_add_data_func (compressor_tests[i].path, &compressor_tests[i], test_roundtrip);
+
+  for (i = 0; i < G_N_ELEMENTS (charset_tests); i++)
+    g_test_add_data_func (charset_tests[i].path, &charset_tests[i], test_charset);
+
+
   return g_test_run();
 }