Hello community,

here is the log from the commit of package libmodulemd for openSUSE:Factory 
checked in at 2019-05-12 11:44:18
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libmodulemd (Old)
 and      /work/SRC/openSUSE:Factory/.libmodulemd.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libmodulemd"

Sun May 12 11:44:18 2019 rev:5 rq:702039 version:unknown

Changes:
--------
--- /work/SRC/openSUSE:Factory/libmodulemd/libmodulemd.changes  2019-04-30 
13:05:20.353937894 +0200
+++ /work/SRC/openSUSE:Factory/.libmodulemd.new.5148/libmodulemd.changes        
2019-05-12 11:44:51.951887694 +0200
@@ -1,0 +2,9 @@
+Fri May 10 14:30:36 UTC 2019 - Neal Gompa <[email protected]>
+
+- Update to 2.3.1 (v2) and 1.8.8 (v1)
+  + Make Modulemd.Component.set_*() functions accept NULL 
(gh#fedora-modularity/libmodulemd#279)
+  + Fix segmentation fault in XMD code due to improper memory management 
(gh#fedora-modularity/libmodulemd#274)
+  + Fix assorted documentation issues
+- Disable executing test suite on ARM and RISC-V due to performance issues 
with builders
+
+-------------------------------------------------------------------

Old:
----
  modulemd-2.3.0.tar.xz

New:
----
  modulemd-2.3.1.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libmodulemd.spec ++++++
--- /var/tmp/diff_new_pack.hW6wcH/_old  2019-05-12 11:44:54.835896161 +0200
+++ /var/tmp/diff_new_pack.hW6wcH/_new  2019-05-12 11:44:54.835896161 +0200
@@ -18,7 +18,7 @@
 
 %global majorversion 2
 %global minorversion 3
-%global patchversion 0
+%global patchversion 1
 %global majorminorversion %{majorversion}.%{minorversion}
 %global nsversion %{majorversion}.0
 
@@ -31,7 +31,7 @@
 # Legacy modulemd API
 %global oldmajorver 1
 %global oldminorver 8
-%global oldpatchver 7
+%global oldpatchver 8
 %global oldmajorminorver %{oldmajorver}.%{oldminorver}
 %global oldnsver %{oldmajorver}.0
 
@@ -41,7 +41,6 @@
 %global olddevname %{name}%{oldmajorver}-devel
 %global oldgirname typelib-1_0-Modulemd-%{oldmajorver}_0
 
-
 Name:           libmodulemd
 Version:        %{libmodulemd_version}
 Release:        0
@@ -158,7 +157,11 @@
 
 %check
 export LC_CTYPE=C.utf8
+# Don't run tests on ARM and RISC-V for now. There are problems
+# with performance on the builders and often these time out.
+%ifnarch %{arm} aarch64 riscv64
 %meson_test
+%endif
 
 %install
 %meson_install

++++++ modulemd-2.3.0.tar.xz -> modulemd-2.3.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.3.0/.travis/coverity_prep.sh 
new/modulemd-2.3.1/.travis/coverity_prep.sh
--- old/modulemd-2.3.0/.travis/coverity_prep.sh 2019-04-23 02:15:08.000000000 
+0200
+++ new/modulemd-2.3.1/.travis/coverity_prep.sh 2019-05-03 14:21:00.000000000 
+0200
@@ -3,6 +3,9 @@
 set -x
 
 echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN 
CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-
+curl -s -L https://entrust.com/root-certificates/entrust_l1k.cer | tee -a 
/etc/pki/ca-trust/source/anchors/entrust_l1k.cer
+sudo update-ca-trust
+
 
 curl -s https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh -o 
/usr/bin/travisci_build_coverity_scan.sh
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.3.0/README.md new/modulemd-2.3.1/README.md
--- old/modulemd-2.3.0/README.md        2019-04-23 02:15:08.000000000 +0200
+++ new/modulemd-2.3.1/README.md        2019-05-03 14:21:00.000000000 +0200
@@ -18,6 +18,10 @@
 from gi.repository import Modulemd
 ```
 
+It's highly recommended that you install `python2-libmodulemd` or
+`python3-libmodulemd`, which will seamlessly translate GLib Variants to native
+Python objects and vice-versa.
+
 # Working with repodata (DNF use-case)
 The libmodulemd API provides a number of convenience tools for interacting
 with repodata (that is, streams of YAML that contains information on multiple
@@ -185,9 +189,10 @@
 ## Python
 ```python
 stream = Modulemd.ModuleStream.read_file ('/path/to/module_name.yaml',
+                                          True,
                                           module_name,
                                           stream_name)
-v2_stream = stream.upgrade(Modulemd.ModuleStreamVersion.TWO)
+v2_stream = stream.upgrade(Modulemd.ModuleStreamVersionEnum.TWO)
 v2_stream.validate()
 ```
 In the example above, we upgraded the stream to v2, in case we were reading 
from v1 metadata. This will allow us to avoid having to manage multiple 
code-paths and support only the latest we understand. After that, it calls 
validate() to ensure that the content that was read in was valid both 
syntactically and referentially.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.3.0/bindings/python/gi/overrides/Modulemd.py 
new/modulemd-2.3.1/bindings/python/gi/overrides/Modulemd.py
--- old/modulemd-2.3.0/bindings/python/gi/overrides/Modulemd.py 2019-04-23 
02:15:08.000000000 +0200
+++ new/modulemd-2.3.1/bindings/python/gi/overrides/Modulemd.py 2019-05-03 
14:21:00.000000000 +0200
@@ -42,8 +42,9 @@
 __all__ = []
 
 
-class ModulemdUtil():
+class ModulemdUtil(object):
 
+    @staticmethod
     def variant_str(s):
         """ Converts a string to a GLib.Variant
         """
@@ -52,6 +53,7 @@
 
         return GLib.Variant('s', s)
 
+    @staticmethod
     def variant_bool(b):
         """ Converts a boolean to a GLib.Varant
         """
@@ -60,6 +62,7 @@
 
         return GLib.Variant('b', b)
 
+    @staticmethod
     def variant_list(l):
         """ Converts a list to a GLib.Variant
         """
@@ -71,6 +74,7 @@
             l_variant.append(ModulemdUtil.python_to_variant(item))
         return GLib.Variant('av', l_variant)
 
+    @staticmethod
     def variant_dict(d):
         """ Converts a dictionary to a dictionary of GLib.Variant
         """
@@ -80,6 +84,7 @@
         d_variant = ModulemdUtil.dict_values(d)
         return GLib.Variant('a{sv}', d_variant)
 
+    @staticmethod
     def dict_values(d):
         """ Converts each dictionary value to a GLib.Variant
         """
@@ -94,6 +99,7 @@
             d_variant[k] = ModulemdUtil.python_to_variant(v)
         return d_variant
 
+    @staticmethod
     def python_to_variant(obj):
         if isinstance(obj, str):
             return ModulemdUtil.variant_str(obj)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.3.0/meson.build 
new/modulemd-2.3.1/meson.build
--- old/modulemd-2.3.0/meson.build      2019-04-23 02:15:08.000000000 +0200
+++ new/modulemd-2.3.1/meson.build      2019-05-03 14:21:00.000000000 +0200
@@ -10,7 +10,7 @@
 # For more information on free software, see 
<https://www.gnu.org/philosophy/free-sw.en.html>.
 
 project('modulemd', 'c',
-        version : '2.3.0',
+        version : '2.3.1',
         default_options : [
           'buildtype=debugoptimized',
           'c_std=c11',
@@ -20,7 +20,7 @@
         license : 'MIT',
         meson_version : '>=0.47.0')
 
-libmodulemd_v1_version = '1.8.7'
+libmodulemd_v1_version = '1.8.8'
 libmodulemd_v2_version = meson.project_version()
 
 cc = meson.get_compiler('c')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.3.0/modulemd/v2/include/modulemd-2.0/modulemd-component-module.h 
new/modulemd-2.3.1/modulemd/v2/include/modulemd-2.0/modulemd-component-module.h
--- 
old/modulemd-2.3.0/modulemd/v2/include/modulemd-2.0/modulemd-component-module.h 
    2019-04-23 02:15:08.000000000 +0200
+++ 
new/modulemd-2.3.1/modulemd/v2/include/modulemd-2.0/modulemd-component-module.h 
    2019-05-03 14:21:00.000000000 +0200
@@ -49,7 +49,7 @@
 /**
  * modulemd_component_module_set_ref:
  * @self: This #ModulemdComponentModule object.
- * @ref: The commit ID in the SCM repository.
+ * @ref: (in) (nullable): The commit ID in the SCM repository.
  *
  * Since: 2.0
  */
@@ -73,7 +73,7 @@
 /**
  * modulemd_component_module_set_repository:
  * @self: This #ModulemdComponentModule object
- * @repository: The URI of the SCM repository.
+ * @repository: (in) (nullable): The URI of the SCM repository.
  *
  * Since: 2.0
  */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.3.0/modulemd/v2/include/modulemd-2.0/modulemd-component-rpm.h 
new/modulemd-2.3.1/modulemd/v2/include/modulemd-2.0/modulemd-component-rpm.h
--- 
old/modulemd-2.3.0/modulemd/v2/include/modulemd-2.0/modulemd-component-rpm.h    
    2019-04-23 02:15:08.000000000 +0200
+++ 
new/modulemd-2.3.1/modulemd/v2/include/modulemd-2.0/modulemd-component-rpm.h    
    2019-05-03 14:21:00.000000000 +0200
@@ -126,7 +126,7 @@
 /**
  * modulemd_component_rpm_set_cache:
  * @self: This #ModulemdComponentRpm object.
- * @cache: The lookaside cache URL.
+ * @cache: (in) (nullable): The lookaside cache URL.
  *
  * Since: 2.0
  */
@@ -150,7 +150,7 @@
 /**
  * modulemd_component_rpm_set_ref:
  * @self: This #ModulemdComponentRpm object.
- * @ref: The commit ID in the SCM repository.
+ * @ref: (in) (nullable): The commit ID in the SCM repository.
  *
  * Since: 2.0
  */
@@ -173,7 +173,7 @@
 /**
  * modulemd_component_rpm_set_repository:
  * @self: This #ModulemdComponentRpm object
- * @repository: The URI of the SCM repository.
+ * @repository: (in) (nullable): The URI of the SCM repository.
  *
  * Since: 2.0
  */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.3.0/modulemd/v2/include/modulemd-2.0/modulemd-component.h 
new/modulemd-2.3.1/modulemd/v2/include/modulemd-2.0/modulemd-component.h
--- old/modulemd-2.3.0/modulemd/v2/include/modulemd-2.0/modulemd-component.h    
2019-04-23 02:15:08.000000000 +0200
+++ new/modulemd-2.3.1/modulemd/v2/include/modulemd-2.0/modulemd-component.h    
2019-05-03 14:21:00.000000000 +0200
@@ -213,7 +213,8 @@
 /**
  * modulemd_component_set_rationale:
  * @self: This #ModulemdComponent object
- * @rationale: The reason that this component is part of the stream.
+ * @rationale: (in) (nullable): The reason that this component is part of the
+ * stream.
  *
  * Since: 2.0
  */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.3.0/modulemd/v2/include/modulemd-2.0/modulemd-module-stream.h 
new/modulemd-2.3.1/modulemd/v2/include/modulemd-2.0/modulemd-module-stream.h
--- 
old/modulemd-2.3.0/modulemd/v2/include/modulemd-2.0/modulemd-module-stream.h    
    2019-04-23 02:15:08.000000000 +0200
+++ 
new/modulemd-2.3.1/modulemd/v2/include/modulemd-2.0/modulemd-module-stream.h    
    2019-05-03 14:21:00.000000000 +0200
@@ -107,14 +107,14 @@
  * modulemd_module_stream_read_file:
  * @path: (in): The path to a YAML document containing a module stream
  * definition.
+ * @strict: (in): Whether the parser should return failure if it encounters an
+ * unknown mapping key or if it should ignore it.
  * @module_name: (in) (nullable): An optional module name to override the
  * document on disk. Mostly useful in cases where the name is being
  * auto-detected from git.
  * @module_stream: (in) (nullable): An optional module stream name to override
  * the document on disk. Mostly useful in cases where the name is being
  * auto-detected from git.
- * @strict: (in): Whether the parser should return failure if it encounters an
- * unknown mapping key or if it should ignore it.
  * @error: (out): A #GError that will return the reason for a failed read.
  *
  * Create a #ModulemdModuleStream object from a YAML file.
@@ -139,14 +139,14 @@
  * modulemd_module_stream_read_string:
  * @yaml_string: (in): A YAML document string containing a module stream
  * definition.
+ * @strict: (in): Whether the parser should return failure if it encounters an
+ * unknown mapping key or if it should ignore it.
  * @module_name: (in) (nullable): An optional module name to override the
  * document on disk. Mostly useful in cases where the name is being
  * auto-detected from git.
  * @module_stream: (in) (nullable): An optional module stream name to override
  * the document on disk. Mostly useful in cases where the name is being
  * auto-detected from git.
- * @strict: (in): Whether the parser should return failure if it encounters an
- * unknown mapping key or if it should ignore it.
  * @error: (out): A #GError that will return the reason for a failed read.
  *
  * Create a #ModulemdModuleStream object from a YAML string.
@@ -171,14 +171,14 @@
  * modulemd_module_stream_read_stream: (skip)
  * @stream: (in): A YAML document as a FILE * containing a module stream
  * definition.
+ * @strict: (in): Whether the parser should return failure if it encounters an
+ * unknown mapping key or if it should ignore it.
  * @module_name: (in) (nullable): An optional module name to override the
  * document on disk. Mostly useful in cases where the name is being
  * auto-detected from git.
  * @module_stream: (in) (nullable): An optional module stream name to override
  * the document on disk. Mostly useful in cases where the name is being
  * auto-detected from git.
- * @strict: (in): Whether the parser should return failure if it encounters an
- * unknown mapping key or if it should ignore it.
  * @error: (out): A #GError that will return the reason for a failed read.
  *
  * Create a #ModulemdModuleStream object from a YAML file.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.3.0/modulemd/v2/include/modulemd-2.0/modulemd.h 
new/modulemd-2.3.1/modulemd/v2/include/modulemd-2.0/modulemd.h
--- old/modulemd-2.3.0/modulemd/v2/include/modulemd-2.0/modulemd.h      
2019-04-23 02:15:08.000000000 +0200
+++ new/modulemd-2.3.1/modulemd/v2/include/modulemd-2.0/modulemd.h      
2019-05-03 14:21:00.000000000 +0200
@@ -162,9 +162,10 @@
  *
  * |[<!-- language="Python" -->
  * stream = Modulemd.ModuleStream.read_file ('/path/to/module_name.yaml',
+ *                                           True,
  *                                           module_name,
  *                                           stream_name)
- * v2_stream = stream.upgrade(Modulemd.ModuleStreamVersion.TWO)
+ * v2_stream = stream.upgrade(Modulemd.ModuleStreamVersionEnum.TWO)
  * v2_stream.validate()
  * ]|
  *
@@ -173,6 +174,10 @@
  * code-paths and support only the latest we understand. After that, it calls
  * validate() to ensure that the content that was read in was valid both
  * syntactically and referentially.
+ *
+ * Also available is `Modulemd.ModuleStreamVersionEnum.LATEST` which will
+ * always represent the highest-supported ModuleStream version. This may change
+ * at any time.
  */
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.3.0/modulemd/v2/modulemd-module-stream-v1.c 
new/modulemd-2.3.1/modulemd/v2/modulemd-module-stream-v1.c
--- old/modulemd-2.3.0/modulemd/v2/modulemd-module-stream-v1.c  2019-04-23 
02:15:08.000000000 +0200
+++ new/modulemd-2.3.1/modulemd/v2/modulemd-module-stream-v1.c  2019-05-03 
14:21:00.000000000 +0200
@@ -861,7 +861,7 @@
   g_return_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self));
 
   g_clear_pointer (&self->xmd, g_variant_unref);
-  self->xmd = xmd;
+  self->xmd = modulemd_variant_deep_copy (xmd);
 }
 
 GVariant *
@@ -1069,7 +1069,7 @@
     copy, v1_self, servicelevels, modulemd_module_stream_v1_add_servicelevel);
 
   if (v1_self->xmd != NULL)
-    modulemd_module_stream_v1_set_xmd (copy, g_variant_ref (v1_self->xmd));
+    modulemd_module_stream_v1_set_xmd (copy, v1_self->xmd);
 
   return MODULEMD_MODULE_STREAM (g_steal_pointer (&copy));
 }
@@ -1421,7 +1421,7 @@
                   return NULL;
                 }
               modulemd_module_stream_v1_set_xmd (modulestream, xmd);
-              xmd = NULL;
+              g_clear_pointer (&xmd, g_variant_unref);
             }
 
           /* Dependencies */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.3.0/modulemd/v2/modulemd-util.c 
new/modulemd-2.3.1/modulemd/v2/modulemd-util.c
--- old/modulemd-2.3.0/modulemd/v2/modulemd-util.c      2019-04-23 
02:15:08.000000000 +0200
+++ new/modulemd-2.3.1/modulemd/v2/modulemd-util.c      2019-05-03 
14:21:00.000000000 +0200
@@ -271,15 +271,25 @@
   g_hash_table_unref ((GHashTable *)table);
 }
 
+
+static void
+destroy_variant_data (gpointer data)
+{
+  g_free (data);
+}
+
+
 GVariant *
 modulemd_variant_deep_copy (GVariant *variant)
 {
   const GVariantType *data_type = g_variant_get_type (variant);
   gsize data_size = g_variant_get_size (variant);
-  gconstpointer data = g_variant_get_data (variant);
+  gpointer data = g_malloc0 (data_size);
+
+  g_variant_store (variant, data);
 
-  return g_variant_ref_sink (
-    g_variant_new_from_data (data_type, data, data_size, TRUE, NULL, NULL));
+  return g_variant_ref_sink (g_variant_new_from_data (
+    data_type, data, data_size, FALSE, destroy_variant_data, data));
 }
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.3.0/modulemd/v2/modulemd-yaml-util.c 
new/modulemd-2.3.1/modulemd/v2/modulemd-yaml-util.c
--- old/modulemd-2.3.0/modulemd/v2/modulemd-yaml-util.c 2019-04-23 
02:15:08.000000000 +0200
+++ new/modulemd-2.3.1/modulemd/v2/modulemd-yaml-util.c 2019-05-03 
14:21:00.000000000 +0200
@@ -957,7 +957,8 @@
       g_set_error (error,
                    MODULEMD_YAML_ERROR,
                    MODULEMD_YAML_ERROR_EMIT,
-                   "Unhandled variant type");
+                   "Unhandled variant type: \"%s\"",
+                   g_variant_get_type_string (variant));
       return FALSE;
     }
   return TRUE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.3.0/modulemd/v2/tests/ModulemdTests/modulestream.py 
new/modulemd-2.3.1/modulemd/v2/tests/ModulemdTests/modulestream.py
--- old/modulemd-2.3.0/modulemd/v2/tests/ModulemdTests/modulestream.py  
2019-04-23 02:15:08.000000000 +0200
+++ new/modulemd-2.3.1/modulemd/v2/tests/ModulemdTests/modulestream.py  
2019-05-03 14:21:00.000000000 +0200
@@ -528,10 +528,10 @@
 
             xmd_copy = stream.get_xmd()
             assert xmd_copy
-            assert 'outer_key' in xmd
-            assert 'scalar' in xmd['outer_key']
-            assert 'inner_key' in xmd['outer_key'][1]
-            assert xmd['outer_key'][1]['inner_key'] == 'another_scalar'
+            assert 'outer_key' in xmd_copy
+            assert 'scalar' in xmd_copy['outer_key']
+            assert 'inner_key' in xmd_copy['outer_key'][1]
+            assert xmd_copy['outer_key'][1]['inner_key'] == 'another_scalar'
 
     def test_upgrade(self):
         v1_stream = Modulemd.ModuleStreamV1.new("SuperModule", "latest")
@@ -1129,6 +1129,38 @@
                 "%s/modulemd/v2/tests/test_data/buildafter/invalid_key.yaml" %
                 (os.getenv('MESON_SOURCE_ROOT')), True)
 
+    def test_unicode_desc(self):
+        # Test a valid module stream with unicode in the description
+        stream = Modulemd.ModuleStream.read_file(
+            "%s/modulemd/v2/tests/test_data/stream_unicode.yaml" %
+            (os.getenv('MESON_SOURCE_ROOT')), True, '', '')
+
+        self.assertIsNotNone(stream)
+        self.assertTrue(stream.validate())
+
+    def test_xmd_issue_274(self):
+        # Test a valid module stream with unicode in the description
+        stream = Modulemd.ModuleStream.read_file(
+            "%s/modulemd/v2/tests/test_data/stream_unicode.yaml" %
+            (os.getenv('MESON_SOURCE_ROOT')), True, '', '')
+
+        # In this bug, we were getting a traceback attemping to call
+        # get_xmd() more than once on the same stream. There were subtle
+        # memory issues at play here.
+        if '_overrides_module' in dir(Modulemd):
+            # The XMD python tests can only be run against the installed lib
+            # because the overrides that translate between python and GVariant
+            # must be installed in /usr/lib/python*/site-packages/gi/overrides
+            # or they are not included when importing Modulemd
+
+            xmd = stream.get_xmd()
+            mbs_xmd = stream.get_xmd()['mbs']
+            mbs_xmd2 = stream.get_xmd()['mbs']
+
+        else:
+            stream.get_xmd()
+            stream.get_xmd()
+
 
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.3.0/modulemd/v2/tests/test-modulemd-modulestream.c 
new/modulemd-2.3.1/modulemd/v2/tests/test-modulemd-modulestream.c
--- old/modulemd-2.3.0/modulemd/v2/tests/test-modulemd-modulestream.c   
2019-04-23 02:15:08.000000000 +0200
+++ new/modulemd-2.3.1/modulemd/v2/tests/test-modulemd-modulestream.c   
2019-05-03 14:21:00.000000000 +0200
@@ -911,6 +911,52 @@
   g_assert_true (modulemd_rpm_map_entry_equals (entry, retrieved_entry));
 }
 
+static void
+module_stream_v2_test_unicode_desc (void)
+{
+  g_autoptr (ModulemdModuleStream) stream = NULL;
+  g_autofree gchar *path = NULL;
+  g_autoptr (GError) error = NULL;
+
+  /* Test a module stream with unicode in description */
+  path = g_strdup_printf ("%s/modulemd/v2/tests/test_data/stream_unicode.yaml",
+                          g_getenv ("MESON_SOURCE_ROOT"));
+  g_assert_nonnull (path);
+
+  stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error);
+  g_assert_nonnull (stream);
+  g_assert_no_error (error);
+}
+
+
+static void
+module_stream_v2_test_xmd_issue_274 (void)
+{
+  g_autoptr (ModulemdModuleStream) stream = NULL;
+  g_autofree gchar *path = NULL;
+  g_autoptr (GError) error = NULL;
+  GVariant *xmd1 = NULL;
+  GVariant *xmd2 = NULL;
+
+  path = g_strdup_printf ("%s/modulemd/v2/tests/test_data/stream_unicode.yaml",
+                          g_getenv ("MESON_SOURCE_ROOT"));
+  g_assert_nonnull (path);
+
+  stream = modulemd_module_stream_read_file (path, TRUE, NULL, NULL, &error);
+  g_assert_nonnull (stream);
+  g_assert_no_error (error);
+  g_assert_cmpint (modulemd_module_stream_get_mdversion (stream),
+                   ==,
+                   MD_MODULESTREAM_VERSION_ONE);
+
+  xmd1 =
+    modulemd_module_stream_v1_get_xmd (MODULEMD_MODULE_STREAM_V1 (stream));
+  xmd2 =
+    modulemd_module_stream_v1_get_xmd (MODULEMD_MODULE_STREAM_V1 (stream));
+
+  g_assert_true (xmd1 == xmd2);
+}
+
 
 int
 main (int argc, char *argv[])
@@ -1012,6 +1058,11 @@
               module_stream_v2_test_rpm_map,
               NULL);
 
+  g_test_add_func ("/modulemd/v2/modulestream/v2/unicode/description",
+                   module_stream_v2_test_unicode_desc);
+
+  g_test_add_func ("/modulemd/v2/modulestream/v2/xmd/issue274",
+                   module_stream_v2_test_xmd_issue_274);
 
   return g_test_run ();
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.3.0/modulemd/v2/tests/test_data/stream_unicode.yaml 
new/modulemd-2.3.1/modulemd/v2/tests/test_data/stream_unicode.yaml
--- old/modulemd-2.3.0/modulemd/v2/tests/test_data/stream_unicode.yaml  
1970-01-01 01:00:00.000000000 +0100
+++ new/modulemd-2.3.1/modulemd/v2/tests/test_data/stream_unicode.yaml  
2019-05-03 14:21:00.000000000 +0200
@@ -0,0 +1,26 @@
+document: modulemd
+version: 1
+data:
+  description: Fedora 28 traditional base ’
+  name: platform
+  license:
+    module: [MIT]
+  profiles:
+    buildroot:
+      rpms: [bash, bzip2, coreutils, cpio, diffutils, fedora-release, 
findutils, gawk,
+        gcc, gcc-c++, grep, gzip, info, make, patch, redhat-rpm-config, 
rpm-build,
+        sed, shadow-utils, tar, unzip, util-linux, which, xz]
+    srpm-buildroot:
+      rpms: [bash, fedora-release, fedpkg-minimal, gnupg2, redhat-rpm-config, 
rpm-build,
+        shadow-utils]
+  stream: f28
+  summary: Fedora 28 traditional base
+  version: 3
+  context: 00000000
+  xmd:
+    mbs:
+      buildrequires: {}
+      commit: virtual
+      requires: {}
+      mse: true
+      koji_tag: module-f28-build


Reply via email to