Skip to content

Commit b881624

Browse files
Sorted out thread safety in XMP properties access
1 parent a4f6b2e commit b881624

1 file changed

Lines changed: 16 additions & 12 deletions

File tree

‎tests/test_properties.py‎

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@
2020
import os
2121
import sys
2222
import tempfile
23+
import threading
2324
import unittest
2425

2526
import exiv2
2627

28+
properties_lock = threading.Lock()
29+
2730

2831
class TestPropertiesModule(unittest.TestCase):
2932
key_name = 'Xmp.dc.description'
@@ -83,21 +86,22 @@ def test_XmpProperties(self):
8386
properties.propertyTitle(key)
8487
with self.assertRaises(exiv2.Exiv2Error):
8588
properties.propertyType(key)
86-
if 'unittest-ft' in sys.argv[0]:
87-
self.skipTest("don't test writing to global XMP namespaces")
88-
namespaces = properties.registeredNamespaces()
89-
self.assertIsInstance(namespaces, dict)
90-
self.assertGreater(len(namespaces), 0)
91-
self.assertEqual(namespaces[self.prefix_name], self.namespace)
89+
# registeredNamespaces is not thread safe in exiv2 <= 0.28.x
90+
if exiv2.testVersion(0, 29, 0) or 'unittest-ft' not in sys.argv[0]:
91+
namespaces = properties.registeredNamespaces()
92+
self.assertIsInstance(namespaces, dict)
93+
self.assertGreater(len(namespaces), 0)
94+
self.assertEqual(namespaces[self.prefix_name], self.namespace)
9295
# these don't seem to have any effect on properties.registeredNamespaces
9396
prefix = 'exmpl'
9497
namespace = 'http://example.com/'
95-
properties.registerNs(namespace, prefix)
96-
self.assertEqual(properties.ns(prefix), namespace)
97-
properties.unregisterNs(namespace)
98-
with self.assertRaises(exiv2.Exiv2Error):
99-
properties.ns(prefix)
100-
properties.unregisterNs()
98+
with properties_lock:
99+
properties.registerNs(namespace, prefix)
100+
self.assertEqual(properties.ns(prefix), namespace)
101+
properties.unregisterNs(namespace)
102+
with self.assertRaises(exiv2.Exiv2Error):
103+
properties.ns(prefix)
104+
properties.unregisterNs()
101105

102106
def test_XmpPropertyInfo(self):
103107
key = exiv2.XmpKey(self.key_name)

0 commit comments

Comments
 (0)