[gupnp-av] Add a test for GUPnPLastChangeParser.



commit b6abeeccbc7f36c1f0da1741024d27351064538b
Author: Krzesimir Nowak <krnowak openismus com>
Date:   Tue Nov 27 11:24:48 2012 +0100

    Add a test for GUPnPLastChangeParser.
    
    Fixes to some issues will follow, but the two-mutes test is going to
    fail anyways.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=689141

 tests/gtest/Makefile.am               |    6 +-
 tests/gtest/test-last-change-parser.c |  258 +++++++++++++++++++++++++++++++++
 2 files changed, 263 insertions(+), 1 deletions(-)
---
diff --git a/tests/gtest/Makefile.am b/tests/gtest/Makefile.am
index 2525023..2b1b3b1 100644
--- a/tests/gtest/Makefile.am
+++ b/tests/gtest/Makefile.am
@@ -5,13 +5,17 @@ TESTS=$(check_PROGRAMS)
 
 check_PROGRAMS = \
 	test-regression \
-	test-media-collection
+	test-media-collection \
+	test-last-change-parser
 
 test_regression_SOURCES = test-regression.c
 
 test_media_collection_SOURCES =  \
 	test-media-collection.c
 
+test_last_change_parser_SOURCES = \
+	test-last-change-parser.c
+
 LDADD = \
 	$(top_builddir)/libgupnp-av/libgupnp-av-1.0.la \
 	$(LIBGUPNP_LIBS)
diff --git a/tests/gtest/test-last-change-parser.c b/tests/gtest/test-last-change-parser.c
new file mode 100644
index 0000000..58fb717
--- /dev/null
+++ b/tests/gtest/test-last-change-parser.c
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Author: Krzesimir Nowak <krnowak openismus 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., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <libgupnp-av/gupnp-last-change-parser.h>
+
+#define TEST_GENERAL \
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?> " \
+"<Event " \
+"xmlns=\"urn:schemas-upnp-org:metadata-1-0/RCS/\" " \
+"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"; " \
+"xsi:schemaLocation=\" " \
+"urn:schemas-upnp-org:metadata-1-0/RCS/ " \
+"http://www.upnp.org/schemas/av/rcs-event-v1-20060531.xsd\";> " \
+"<InstanceID val=\"0\"> " \
+"<Foo val=\"-13\"/> " \
+"<Bar val=\"ajwaj\"/> " \
+"</InstanceID> " \
+"<InstanceID val=\"1\"> " \
+"<Baz val=\"true\"/> " \
+"<Qux val=\"42\"/> " \
+"</InstanceID> " \
+"</Event>"
+
+#define BOGUS_TEXT "This is not an XML document!"
+
+#define TEST_TWO_MUTES \
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?> " \
+"<Event " \
+"xmlns=\"urn:schemas-upnp-org:metadata-1-0/RCS/\" " \
+"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"; " \
+"xsi:schemaLocation=\" " \
+"urn:schemas-upnp-org:metadata-1-0/RCS/ " \
+"http://www.upnp.org/schemas/av/rcs-event-v1-20060531.xsd\";> " \
+"<InstanceID val=\"0\"> " \
+"<Mute channel=\"Master\" val=\"0\"/> " \
+"<Mute channel=\"CF\" val=\"1\"/> " \
+"</InstanceID> " \
+"</Event>"
+
+static void
+general (void)
+{
+  GUPnPLastChangeParser *parser = gupnp_last_change_parser_new ();
+  GError                *error1 = NULL;
+  GError                *error2 = NULL;
+  gboolean               r1;
+  gboolean               r2;
+  gint                   foo = -1;
+  gchar                 *bar = NULL;
+  gboolean               baz = FALSE;
+  guint                  qux = G_MAXUINT;;
+
+  r1 = gupnp_last_change_parser_parse_last_change (parser,
+                                                   0,
+                                                   TEST_GENERAL,
+                                                   &error1,
+                                                   "Foo",
+                                                           G_TYPE_INT,
+                                                           &foo,
+                                                   "Bar",
+                                                           G_TYPE_STRING,
+                                                           &bar,
+                                                   NULL);
+  r2 = gupnp_last_change_parser_parse_last_change (parser,
+                                                   1,
+                                                   TEST_GENERAL,
+                                                   &error2,
+                                                   "Baz",
+                                                           G_TYPE_BOOLEAN,
+                                                           &baz,
+                                                   "Qux",
+                                                           G_TYPE_UINT,
+                                                           &qux,
+                                                   NULL);
+
+  g_object_unref (parser);
+
+  g_assert (r1 == TRUE);
+  g_assert_no_error (error1);
+  g_assert_cmpint (foo, ==, -13);
+  g_assert_cmpstr (bar, ==, "ajwaj");
+
+  g_free (bar);
+
+  g_assert (r2 == TRUE);
+  g_assert_no_error (error2);
+  g_assert (baz == TRUE);
+  g_assert_cmpuint (qux, ==, 42);
+}
+
+static void
+bogus_text (void)
+{
+  GUPnPLastChangeParser *parser = gupnp_last_change_parser_new ();
+  GError                *error = NULL;
+  gboolean               r;
+  int                    whatever = -1;
+
+  r = gupnp_last_change_parser_parse_last_change (parser,
+                                                  0,
+                                                  BOGUS_TEXT,
+                                                  &error,
+                                                  "whatever",
+                                                          G_TYPE_INT,
+                                                          &whatever,
+                                                  NULL);
+
+  g_object_unref (parser);
+
+  g_assert (r == FALSE);
+  g_assert_error (error, GUPNP_XML_ERROR, GUPNP_XML_ERROR_PARSE);
+  g_assert_cmpint (whatever, ==, -1);
+}
+
+static void
+nonexistent_instance (void)
+{
+  GUPnPLastChangeParser *parser = gupnp_last_change_parser_new ();
+  GError                *error = NULL;
+  gboolean               r;
+  gint                   foo = -1;
+  gchar                 *bar = NULL;
+  gboolean               baz = FALSE;
+  guint                  qux = G_MAXUINT;;
+
+  r = gupnp_last_change_parser_parse_last_change (parser,
+                                                  42,
+                                                  TEST_GENERAL,
+                                                  &error,
+                                                  "Foo",
+                                                          G_TYPE_INT,
+                                                          &foo,
+                                                  "Bar",
+                                                          G_TYPE_STRING,
+                                                          &bar,
+                                                  "Baz",
+                                                          G_TYPE_BOOLEAN,
+                                                          &baz,
+                                                  "Qux",
+                                                          G_TYPE_UINT,
+                                                          &qux,
+                                                  NULL);
+
+  g_object_unref (parser);
+
+  g_assert (r == FALSE);
+  g_assert_no_error (error);
+  g_assert_cmpint (foo, ==, -1);
+  g_assert_cmpstr (bar, ==, NULL);
+  g_assert (baz == FALSE);
+  g_assert_cmpuint (qux, ==, G_MAXUINT);
+}
+
+/* FIXME: We really have no way to test whether some variable does not
+   exist. In the test below I set baz to FALSE and qux to G_MAXUINT
+   and check whether those variables have still the same values after
+   parsing. It may happen that those variable existed in LastChange
+   document and had exactly those values. */
+static void
+nonexistent_variable (void)
+{
+  GUPnPLastChangeParser *parser = gupnp_last_change_parser_new ();
+  GError                *error = NULL;
+  gboolean               r;
+  gboolean               baz = FALSE;
+  guint                  qux = G_MAXUINT;;
+
+  r = gupnp_last_change_parser_parse_last_change (parser,
+                                                  0,
+                                                  TEST_GENERAL,
+                                                  &error,
+                                                  "Baz",
+                                                          G_TYPE_BOOLEAN,
+                                                          &baz,
+                                                  "Qux",
+                                                          G_TYPE_UINT,
+                                                          &qux,
+                                                  NULL);
+
+  g_object_unref (parser);
+
+  g_assert (r == TRUE);
+  g_assert_no_error (error);
+  g_assert (baz == FALSE);
+  g_assert_cmpuint (qux, ==, G_MAXUINT);
+}
+
+/* FIXME: There is no possibility for fine-grained selection of
+   variables we want to extract. There can be two "Mute" variables on
+   different "channel"s, but currently the code can only take the
+   first "Mute" variable ignoring "channel" attribute. */
+static void
+two_mutes (void)
+{
+  GUPnPLastChangeParser *parser = gupnp_last_change_parser_new ();
+  GError                *error = NULL;
+  gint                   master_mute = -1;
+  gint                   cf_mute = -1;
+  gboolean               r;
+
+  r = gupnp_last_change_parser_parse_last_change (parser,
+                                                  0,
+                                                  TEST_TWO_MUTES,
+                                                  &error,
+                                                  "Mute",
+                                                          G_TYPE_INT,
+                                                          &master_mute,
+                                                  "Mute",
+                                                          G_TYPE_INT,
+                                                          &cf_mute,
+                                                  NULL);
+
+  g_object_unref (parser);
+
+  g_assert (r == TRUE);
+  g_assert_no_error (error);
+  g_assert_cmpint (master_mute, ==, 0);
+  g_message ("Omitting the check of \"Mute\" for \"CF\" channel as this test "
+             "fails, because of design issues.");
+  //g_assert_cmpint (cf_mute, ==, 1);
+}
+
+int
+main (int argc, char **argv)
+{
+#if !GLIB_CHECK_VERSION (2, 35, 0)
+  g_type_init ();
+#endif
+  g_test_init (&argc, &argv, NULL);
+
+  g_test_add_func ("/last-change-parser/general", general);
+  g_test_add_func ("/last-change-parser/bogus-text", bogus_text);
+  g_test_add_func ("/last-change-parser/nonexistent-instance", nonexistent_instance);
+  g_test_add_func ("/last-change-parser/nonexistent-variable", nonexistent_variable);
+  g_test_add_func ("/last-change-parser/two-mutes", two_mutes);
+
+  g_test_run ();
+
+  return 0;
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]