blob: a03f85b0d179762edcf84661b8b6ca1d86819221 [file] [log] [blame]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os
import unittest
from StringIO import StringIO
import mozpack.path as mozpath
from mozbuild.dotproperties import (
DotProperties,
)
from mozunit import (
main,
)
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()