summaryrefslogtreecommitdiffstats
path: root/python/mozbuild/mozbuild/test/test_dotproperties.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozbuild/mozbuild/test/test_dotproperties.py')
-rw-r--r--python/mozbuild/mozbuild/test/test_dotproperties.py183
1 files changed, 183 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/test/test_dotproperties.py b/python/mozbuild/mozbuild/test/test_dotproperties.py
new file mode 100644
index 0000000000..4e7a437799
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/test_dotproperties.py
@@ -0,0 +1,183 @@
+# -*- coding: utf-8 -*-
+
+import os
+import unittest
+
+import mozpack.path as mozpath
+from mozunit import main
+from six import StringIO
+
+from mozbuild.dotproperties import DotProperties
+
+test_data_path = mozpath.abspath(mozpath.dirname(__file__))
+test_data_path = mozpath.join(test_data_path, "data")
+
+
+class TestDotProperties(unittest.TestCase):
+ def test_get(self):
+ contents = StringIO(
+ """
+key=value
+"""
+ )
+ p = DotProperties(contents)
+ self.assertEqual(p.get("missing"), None)
+ self.assertEqual(p.get("missing", "default"), "default")
+ self.assertEqual(p.get("key"), "value")
+
+ def test_update(self):
+ contents = StringIO(
+ """
+old=old value
+key=value
+"""
+ )
+ p = DotProperties(contents)
+ self.assertEqual(p.get("old"), "old value")
+ self.assertEqual(p.get("key"), "value")
+
+ new_contents = StringIO(
+ """
+key=new value
+"""
+ )
+ p.update(new_contents)
+ self.assertEqual(p.get("old"), "old value")
+ self.assertEqual(p.get("key"), "new value")
+
+ def test_get_list(self):
+ contents = StringIO(
+ """
+list.0=A
+list.1=B
+list.2=C
+
+order.1=B
+order.0=A
+order.2=C
+"""
+ )
+ p = DotProperties(contents)
+ self.assertEqual(p.get_list("missing"), [])
+ self.assertEqual(p.get_list("list"), ["A", "B", "C"])
+ self.assertEqual(p.get_list("order"), ["A", "B", "C"])
+
+ def test_get_list_with_shared_prefix(self):
+ contents = StringIO(
+ """
+list.0=A
+list.1=B
+list.2=C
+
+list.sublist.1=E
+list.sublist.0=D
+list.sublist.2=F
+
+list.sublist.second.0=G
+
+list.other.0=H
+"""
+ )
+ p = DotProperties(contents)
+ self.assertEqual(p.get_list("list"), ["A", "B", "C"])
+ self.assertEqual(p.get_list("list.sublist"), ["D", "E", "F"])
+ self.assertEqual(p.get_list("list.sublist.second"), ["G"])
+ self.assertEqual(p.get_list("list.other"), ["H"])
+
+ def test_get_dict(self):
+ contents = StringIO(
+ """
+A.title=title A
+
+B.title=title B
+B.url=url B
+
+C=value
+"""
+ )
+ p = DotProperties(contents)
+ self.assertEqual(p.get_dict("missing"), {})
+ self.assertEqual(p.get_dict("A"), {"title": "title A"})
+ self.assertEqual(p.get_dict("B"), {"title": "title B", "url": "url B"})
+ with self.assertRaises(ValueError):
+ p.get_dict("A", required_keys=["title", "url"])
+ with self.assertRaises(ValueError):
+ p.get_dict("missing", required_keys=["key"])
+ # A key=value pair is considered to root an empty dict.
+ self.assertEqual(p.get_dict("C"), {})
+ with self.assertRaises(ValueError):
+ p.get_dict("C", required_keys=["missing_key"])
+
+ def test_get_dict_with_shared_prefix(self):
+ contents = StringIO(
+ """
+A.title=title A
+A.subdict.title=title A subdict
+
+B.title=title B
+B.url=url B
+B.subdict.title=title B subdict
+B.subdict.url=url B subdict
+"""
+ )
+ p = DotProperties(contents)
+ self.assertEqual(p.get_dict("A"), {"title": "title A"})
+ self.assertEqual(p.get_dict("B"), {"title": "title B", "url": "url B"})
+ self.assertEqual(p.get_dict("A.subdict"), {"title": "title A subdict"})
+ self.assertEqual(
+ p.get_dict("B.subdict"),
+ {"title": "title B subdict", "url": "url B subdict"},
+ )
+
+ def test_get_dict_with_value_prefix(self):
+ contents = StringIO(
+ """
+A.default=A
+A.default.B=B
+A.default.B.ignored=B ignored
+A.default.C=C
+A.default.C.ignored=C ignored
+"""
+ )
+ p = DotProperties(contents)
+ self.assertEqual(p.get("A.default"), "A")
+ # This enumerates the properties.
+ self.assertEqual(p.get_dict("A.default"), {"B": "B", "C": "C"})
+ # They can still be fetched directly.
+ self.assertEqual(p.get("A.default.B"), "B")
+ self.assertEqual(p.get("A.default.C"), "C")
+
+ def test_unicode(self):
+ contents = StringIO(
+ """
+# Danish.
+# #### ~~ Søren Munk Skrøder, sskroeder - 2009-05-30 @ #mozmae
+
+# Korean.
+A.title=한메일
+
+# Russian.
+list.0 = test
+list.1 = Яндекс
+"""
+ )
+ p = DotProperties(contents)
+ self.assertEqual(p.get_dict("A"), {"title": "한메일"})
+ self.assertEqual(p.get_list("list"), ["test", "Яндекс"])
+
+ def test_valid_unicode_from_file(self):
+ # The contents of valid.properties is identical to the contents of the
+ # test above. This specifically exercises reading from a file.
+ p = DotProperties(os.path.join(test_data_path, "valid.properties"))
+ self.assertEqual(p.get_dict("A"), {"title": "한메일"})
+ self.assertEqual(p.get_list("list"), ["test", "Яндекс"])
+
+ def test_bad_unicode_from_file(self):
+ # The contents of bad.properties is not valid Unicode; see the comments
+ # in the file itself for details.
+ with self.assertRaises(UnicodeDecodeError):
+ DotProperties(os.path.join(test_data_path, "bad.properties"))
+
+
+if __name__ == "__main__":
+ main()