From 1fd8f0f98e63eb3004448169ba80ec2e731058c8 Mon Sep 17 00:00:00 2001 From: Srikavin Ramkumar Date: Wed, 4 Dec 2019 18:53:40 +0000 Subject: [PATCH 1/4] Copy Python tests for Modulemd.ModuleStream.documentation into C --- modulemd/tests/test-modulemd-modulestream.c | 115 ++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/modulemd/tests/test-modulemd-modulestream.c b/modulemd/tests/test-modulemd-modulestream.c index 93b140802..2f61bdca1 100644 --- a/modulemd/tests/test-modulemd-modulestream.c +++ b/modulemd/tests/test-modulemd-modulestream.c @@ -199,6 +199,107 @@ module_stream_v2_test_profiles (ModuleStreamFixture *fixture, } +static void +module_stream_v1_test_documentation (ModuleStreamFixture *fixture, + gconstpointer user_data) +{ + g_autoptr (ModulemdModuleStreamV1) stream = NULL; + g_autofree const gchar *documentation = NULL; + g_autofree gchar *documentation_prop = NULL; + + stream = modulemd_module_stream_v1_new (NULL, NULL); + + // Check the defaults + documentation = modulemd_module_stream_v1_get_documentation (stream); + g_object_get (stream, "documentation", &documentation_prop, NULL); + g_assert_null (documentation); + g_assert_null (documentation_prop); + + g_clear_pointer (&documentation_prop, g_free); + + // Test property setting + g_object_set (stream, "documentation", "http://example.com", NULL); + + documentation = modulemd_module_stream_v1_get_documentation (stream); + g_object_get (stream, "documentation", &documentation_prop, NULL); + g_assert_cmpstr (documentation_prop, ==, "http://example.com"); + g_assert_cmpstr (documentation, ==, "http://example.com"); + + g_clear_pointer (&documentation_prop, g_free); + + // Test set_documentation() + modulemd_module_stream_v1_set_documentation (stream, "http://redhat.com"); + + documentation = modulemd_module_stream_v1_get_documentation (stream); + g_object_get (stream, "documentation", &documentation_prop, NULL); + g_assert_cmpstr (documentation_prop, ==, "http://redhat.com"); + g_assert_cmpstr (documentation, ==, "http://redhat.com"); + + g_clear_pointer (&documentation_prop, g_free); + + // Test setting to NULL + g_object_set (stream, "documentation", NULL, NULL); + + documentation = modulemd_module_stream_v1_get_documentation (stream); + g_object_get (stream, "documentation", &documentation_prop, NULL); + g_assert_null (documentation); + g_assert_null (documentation_prop); + + g_clear_pointer (&documentation_prop, g_free); + g_clear_object (&stream); +} + + +static void +module_stream_v2_test_documentation (ModuleStreamFixture *fixture, + gconstpointer user_data) +{ + g_autoptr (ModulemdModuleStreamV2) stream = NULL; + g_autofree const gchar *documentation = NULL; + g_autofree gchar *documentation_prop = NULL; + + stream = modulemd_module_stream_v2_new (NULL, NULL); + + // Check the defaults + documentation = modulemd_module_stream_v2_get_documentation (stream); + g_object_get (stream, "documentation", &documentation_prop, NULL); + g_assert_null (documentation); + g_assert_null (documentation_prop); + + g_clear_pointer (&documentation_prop, g_free); + + // Test property setting + g_object_set (stream, "documentation", "http://example.com", NULL); + + documentation = modulemd_module_stream_v2_get_documentation (stream); + g_object_get (stream, "documentation", &documentation_prop, NULL); + g_assert_cmpstr (documentation_prop, ==, "http://example.com"); + g_assert_cmpstr (documentation, ==, "http://example.com"); + + g_clear_pointer (&documentation_prop, g_free); + + // Test set_documentation() + modulemd_module_stream_v2_set_documentation (stream, "http://redhat.com"); + + documentation = modulemd_module_stream_v2_get_documentation (stream); + g_object_get (stream, "documentation", &documentation_prop, NULL); + g_assert_cmpstr (documentation_prop, ==, "http://redhat.com"); + g_assert_cmpstr (documentation, ==, "http://redhat.com"); + + g_clear_pointer (&documentation_prop, g_free); + + // Test setting to NULL + g_object_set (stream, "documentation", NULL, NULL); + + documentation = modulemd_module_stream_v2_get_documentation (stream); + g_object_get (stream, "documentation", &documentation_prop, NULL); + g_assert_null (documentation); + g_assert_null (documentation_prop); + + g_clear_pointer (&documentation_prop, g_free); + g_clear_object (&stream); +} + static void module_stream_test_copy (ModuleStreamFixture *fixture, gconstpointer user_data) { @@ -1642,6 +1743,20 @@ main (int argc, char *argv[]) module_stream_test_arch, NULL); + g_test_add ("/modulemd/v2/modulestream/v1/documentation", + ModuleStreamFixture, + NULL, + NULL, + module_stream_v1_test_documentation, + NULL); + + g_test_add ("/modulemd/v2/modulestream/v2/documentation", + ModuleStreamFixture, + NULL, + NULL, + module_stream_v2_test_documentation, + NULL); + g_test_add ("/modulemd/v2/modulestream/v1/profiles", ModuleStreamFixture, NULL, From e5e7b3e98887b776dd465cd97e61df3dbf5156d9 Mon Sep 17 00:00:00 2001 From: Srikavin Ramkumar Date: Wed, 4 Dec 2019 22:13:27 -0500 Subject: [PATCH 2/4] Remove g_autofree Fixes a possible double free as get_documentation does not transfer ownership --- modulemd/tests/test-modulemd-modulestream.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modulemd/tests/test-modulemd-modulestream.c b/modulemd/tests/test-modulemd-modulestream.c index 2f61bdca1..999ce55bc 100644 --- a/modulemd/tests/test-modulemd-modulestream.c +++ b/modulemd/tests/test-modulemd-modulestream.c @@ -204,7 +204,7 @@ module_stream_v1_test_documentation (ModuleStreamFixture *fixture, gconstpointer user_data) { g_autoptr (ModulemdModuleStreamV1) stream = NULL; - g_autofree const gchar *documentation = NULL; + const gchar *documentation = NULL; g_autofree gchar *documentation_prop = NULL; stream = modulemd_module_stream_v1_new (NULL, NULL); @@ -255,7 +255,7 @@ module_stream_v2_test_documentation (ModuleStreamFixture *fixture, gconstpointer user_data) { g_autoptr (ModulemdModuleStreamV2) stream = NULL; - g_autofree const gchar *documentation = NULL; + const gchar *documentation = NULL; g_autofree gchar *documentation_prop = NULL; stream = modulemd_module_stream_v2_new (NULL, NULL); From 21e93f496b9e8b0eff2ebd130cf39b7074bbaa90 Mon Sep 17 00:00:00 2001 From: Srikavin Ramkumar Date: Wed, 4 Dec 2019 22:13:27 -0500 Subject: [PATCH 3/4] Replace hardcoded values with defines --- modulemd/tests/test-modulemd-modulestream.c | 47 +++++++++++---------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/modulemd/tests/test-modulemd-modulestream.c b/modulemd/tests/test-modulemd-modulestream.c index 999ce55bc..21d8a2239 100644 --- a/modulemd/tests/test-modulemd-modulestream.c +++ b/modulemd/tests/test-modulemd-modulestream.c @@ -14,6 +14,9 @@ #include "private/modulemd-yaml.h" #include "private/test-utils.h" +#define MMD_TEST_DOC_TEXT "http://example.com" +#define MMD_TEST_DOC_TEXT2 "http://redhat.com" +#define MMD_TEST_DOC_PROP "documentation" typedef struct _ModuleStreamFixture { } ModuleStreamFixture; @@ -211,37 +214,37 @@ module_stream_v1_test_documentation (ModuleStreamFixture *fixture, // Check the defaults documentation = modulemd_module_stream_v1_get_documentation (stream); - g_object_get (stream, "documentation", &documentation_prop, NULL); + g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_null (documentation); g_assert_null (documentation_prop); g_clear_pointer (&documentation_prop, g_free); // Test property setting - g_object_set (stream, "documentation", "http://example.com", NULL); + g_object_set (stream, MMD_TEST_DOC_PROP, MMD_TEST_DOC_TEXT, NULL); documentation = modulemd_module_stream_v1_get_documentation (stream); - g_object_get (stream, "documentation", &documentation_prop, NULL); - g_assert_cmpstr (documentation_prop, ==, "http://example.com"); - g_assert_cmpstr (documentation, ==, "http://example.com"); + g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); + g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_TEXT); + g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_TEXT); g_clear_pointer (&documentation_prop, g_free); // Test set_documentation() - modulemd_module_stream_v1_set_documentation (stream, "http://redhat.com"); + modulemd_module_stream_v1_set_documentation (stream, MMD_TEST_DOC_TEXT2); documentation = modulemd_module_stream_v1_get_documentation (stream); - g_object_get (stream, "documentation", &documentation_prop, NULL); - g_assert_cmpstr (documentation_prop, ==, "http://redhat.com"); - g_assert_cmpstr (documentation, ==, "http://redhat.com"); + g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); + g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_TEXT2); + g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_TEXT2); g_clear_pointer (&documentation_prop, g_free); // Test setting to NULL - g_object_set (stream, "documentation", NULL, NULL); + g_object_set (stream, MMD_TEST_DOC_PROP, NULL, NULL); documentation = modulemd_module_stream_v1_get_documentation (stream); - g_object_get (stream, "documentation", &documentation_prop, NULL); + g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_null (documentation); g_assert_null (documentation_prop); @@ -262,37 +265,37 @@ module_stream_v2_test_documentation (ModuleStreamFixture *fixture, // Check the defaults documentation = modulemd_module_stream_v2_get_documentation (stream); - g_object_get (stream, "documentation", &documentation_prop, NULL); + g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_null (documentation); g_assert_null (documentation_prop); g_clear_pointer (&documentation_prop, g_free); // Test property setting - g_object_set (stream, "documentation", "http://example.com", NULL); + g_object_set (stream, MMD_TEST_DOC_PROP, MMD_TEST_DOC_TEXT, NULL); documentation = modulemd_module_stream_v2_get_documentation (stream); - g_object_get (stream, "documentation", &documentation_prop, NULL); - g_assert_cmpstr (documentation_prop, ==, "http://example.com"); - g_assert_cmpstr (documentation, ==, "http://example.com"); + g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); + g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_TEXT); + g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_TEXT); g_clear_pointer (&documentation_prop, g_free); // Test set_documentation() - modulemd_module_stream_v2_set_documentation (stream, "http://redhat.com"); + modulemd_module_stream_v2_set_documentation (stream, MMD_TEST_DOC_TEXT2); documentation = modulemd_module_stream_v2_get_documentation (stream); - g_object_get (stream, "documentation", &documentation_prop, NULL); - g_assert_cmpstr (documentation_prop, ==, "http://redhat.com"); - g_assert_cmpstr (documentation, ==, "http://redhat.com"); + g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); + g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_TEXT2); + g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_TEXT2); g_clear_pointer (&documentation_prop, g_free); // Test setting to NULL - g_object_set (stream, "documentation", NULL, NULL); + g_object_set (stream, MMD_TEST_DOC_PROP, NULL, NULL); documentation = modulemd_module_stream_v2_get_documentation (stream); - g_object_get (stream, "documentation", &documentation_prop, NULL); + g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); g_assert_null (documentation); g_assert_null (documentation_prop); From 1cc1ce0dd3de1cdb5f1048fde28511658da564e4 Mon Sep 17 00:00:00 2001 From: Srikavin Ramkumar Date: Wed, 4 Dec 2019 22:13:27 -0500 Subject: [PATCH 4/4] Add unit tests for unicode characters --- modulemd/tests/ModulemdTests/modulestream.py | 9 +++++++ modulemd/tests/test-modulemd-modulestream.c | 28 ++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/modulemd/tests/ModulemdTests/modulestream.py b/modulemd/tests/ModulemdTests/modulestream.py index bb5b893e9..993f9d46e 100644 --- a/modulemd/tests/ModulemdTests/modulestream.py +++ b/modulemd/tests/ModulemdTests/modulestream.py @@ -350,6 +350,15 @@ def test_documentation(self): assert stream.props.documentation is None assert stream.get_documentation() is None + # Test unicode characters + unicode_test_str = ( + "À϶¥🌭∮⇒⇔¬β∀₂⌀ıəˈ⍳⍴V)═€ίζησθლბშიнстемองจึองታሽ።ደለᚢᛞᚦᚹ⠳⠞⠊⠎▉▒▒▓😃" + ) + + stream.props.documentation = unicode_test_str + assert stream.props.documentation == unicode_test_str + assert stream.get_documentation() == unicode_test_str + def test_summary(self): for version in modulestream_versions: stream = Modulemd.ModuleStream.new(version) diff --git a/modulemd/tests/test-modulemd-modulestream.c b/modulemd/tests/test-modulemd-modulestream.c index 21d8a2239..b6f995be2 100644 --- a/modulemd/tests/test-modulemd-modulestream.c +++ b/modulemd/tests/test-modulemd-modulestream.c @@ -17,6 +17,10 @@ #define MMD_TEST_DOC_TEXT "http://example.com" #define MMD_TEST_DOC_TEXT2 "http://redhat.com" #define MMD_TEST_DOC_PROP "documentation" +#define MMD_TEST_DOC_UNICODE_TEXT \ + "À϶¥🌭∮⇒⇔¬β∀₂⌀ıəˈ⍳⍴V)" \ + "═€ίζησθლბშიнстемองจึองታሽ።ደለᚢᛞᚦᚹ⠳⠞⠊⠎▉▒▒▓😃" + typedef struct _ModuleStreamFixture { } ModuleStreamFixture; @@ -249,6 +253,18 @@ module_stream_v1_test_documentation (ModuleStreamFixture *fixture, g_assert_null (documentation_prop); g_clear_pointer (&documentation_prop, g_free); + + // Test unicode characters + modulemd_module_stream_v1_set_documentation (stream, + MMD_TEST_DOC_UNICODE_TEXT); + + documentation = modulemd_module_stream_v1_get_documentation (stream); + g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); + g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_UNICODE_TEXT); + g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_UNICODE_TEXT); + + g_clear_pointer (&documentation_prop, g_free); + g_clear_object (&stream); } @@ -300,6 +316,18 @@ module_stream_v2_test_documentation (ModuleStreamFixture *fixture, g_assert_null (documentation_prop); g_clear_pointer (&documentation_prop, g_free); + + // Test unicode characters + modulemd_module_stream_v2_set_documentation (stream, + MMD_TEST_DOC_UNICODE_TEXT); + + documentation = modulemd_module_stream_v2_get_documentation (stream); + g_object_get (stream, MMD_TEST_DOC_PROP, &documentation_prop, NULL); + g_assert_cmpstr (documentation_prop, ==, MMD_TEST_DOC_UNICODE_TEXT); + g_assert_cmpstr (documentation, ==, MMD_TEST_DOC_UNICODE_TEXT); + + g_clear_pointer (&documentation_prop, g_free); + g_clear_object (&stream); }