diff options
Diffstat (limited to 'python/mozbuild/mozbuild/test/test_dotproperties.py')
-rw-r--r-- | python/mozbuild/mozbuild/test/test_dotproperties.py | 183 |
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() |