1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/testing/mozbase/mozprofile/tests/test_preferences.py Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,305 @@ 1.4 +#!/usr/bin/env python 1.5 + 1.6 +# This Source Code Form is subject to the terms of the Mozilla Public 1.7 +# License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.8 +# You can obtain one at http://mozilla.org/MPL/2.0/. 1.9 + 1.10 +import mozfile 1.11 +import mozhttpd 1.12 +import os 1.13 +import shutil 1.14 +import tempfile 1.15 +import unittest 1.16 +from mozprofile.cli import MozProfileCLI 1.17 +from mozprofile.prefs import Preferences 1.18 +from mozprofile.profile import Profile 1.19 + 1.20 +here = os.path.dirname(os.path.abspath(__file__)) 1.21 + 1.22 +class PreferencesTest(unittest.TestCase): 1.23 + """test mozprofile preference handling""" 1.24 + 1.25 + # preferences from files/prefs_with_comments.js 1.26 + _prefs_with_comments = {'browser.startup.homepage': 'http://planet.mozilla.org', 1.27 + 'zoom.minPercent': 30, 1.28 + 'zoom.maxPercent': 300, 1.29 + 'webgl.verbose': 'false'} 1.30 + 1.31 + def run_command(self, *args): 1.32 + """ 1.33 + invokes mozprofile command line via the CLI factory 1.34 + - args : command line arguments (equivalent of sys.argv[1:]) 1.35 + """ 1.36 + 1.37 + # instantiate the factory 1.38 + cli = MozProfileCLI(list(args)) 1.39 + 1.40 + # create the profile 1.41 + profile = cli.profile() 1.42 + 1.43 + # return path to profile 1.44 + return profile.profile 1.45 + 1.46 + def compare_generated(self, _prefs, commandline): 1.47 + """ 1.48 + writes out to a new profile with mozprofile command line 1.49 + reads the generated preferences with prefs.py 1.50 + compares the results 1.51 + cleans up 1.52 + """ 1.53 + profile = self.run_command(*commandline) 1.54 + prefs_file = os.path.join(profile, 'user.js') 1.55 + self.assertTrue(os.path.exists(prefs_file)) 1.56 + read = Preferences.read_prefs(prefs_file) 1.57 + if isinstance(_prefs, dict): 1.58 + read = dict(read) 1.59 + self.assertEqual(_prefs, read) 1.60 + shutil.rmtree(profile) 1.61 + 1.62 + def test_basic_prefs(self): 1.63 + """test setting a pref from the command line entry point""" 1.64 + 1.65 + _prefs = {"browser.startup.homepage": "http://planet.mozilla.org/"} 1.66 + commandline = [] 1.67 + _prefs = _prefs.items() 1.68 + for pref, value in _prefs: 1.69 + commandline += ["--pref", "%s:%s" % (pref, value)] 1.70 + self.compare_generated(_prefs, commandline) 1.71 + 1.72 + def test_ordered_prefs(self): 1.73 + """ensure the prefs stay in the right order""" 1.74 + _prefs = [("browser.startup.homepage", "http://planet.mozilla.org/"), 1.75 + ("zoom.minPercent", 30), 1.76 + ("zoom.maxPercent", 300), 1.77 + ("webgl.verbose", 'false')] 1.78 + commandline = [] 1.79 + for pref, value in _prefs: 1.80 + commandline += ["--pref", "%s:%s" % (pref, value)] 1.81 + _prefs = [(i, Preferences.cast(j)) for i, j in _prefs] 1.82 + self.compare_generated(_prefs, commandline) 1.83 + 1.84 + def test_ini(self): 1.85 + 1.86 + # write the .ini file 1.87 + _ini = """[DEFAULT] 1.88 +browser.startup.homepage = http://planet.mozilla.org/ 1.89 + 1.90 +[foo] 1.91 +browser.startup.homepage = http://github.com/ 1.92 +""" 1.93 + try: 1.94 + fd, name = tempfile.mkstemp(suffix='.ini') 1.95 + os.write(fd, _ini) 1.96 + os.close(fd) 1.97 + commandline = ["--preferences", name] 1.98 + 1.99 + # test the [DEFAULT] section 1.100 + _prefs = {'browser.startup.homepage': 'http://planet.mozilla.org/'} 1.101 + self.compare_generated(_prefs, commandline) 1.102 + 1.103 + # test a specific section 1.104 + _prefs = {'browser.startup.homepage': 'http://github.com/'} 1.105 + commandline[-1] = commandline[-1] + ':foo' 1.106 + self.compare_generated(_prefs, commandline) 1.107 + 1.108 + finally: 1.109 + # cleanup 1.110 + os.remove(name) 1.111 + 1.112 + def test_reset_should_remove_added_prefs(self): 1.113 + """Check that when we call reset the items we expect are updated""" 1.114 + 1.115 + profile = Profile() 1.116 + prefs_file = os.path.join(profile.profile, 'user.js') 1.117 + 1.118 + # we shouldn't have any initial preferences 1.119 + initial_prefs = Preferences.read_prefs(prefs_file) 1.120 + self.assertFalse(initial_prefs) 1.121 + initial_prefs = file(prefs_file).read().strip() 1.122 + self.assertFalse(initial_prefs) 1.123 + 1.124 + # add some preferences 1.125 + prefs1 = [("mr.t.quotes", "i aint getting on no plane!")] 1.126 + profile.set_preferences(prefs1) 1.127 + self.assertEqual(prefs1, Preferences.read_prefs(prefs_file)) 1.128 + lines = file(prefs_file).read().strip().splitlines() 1.129 + self.assertTrue(bool([line for line in lines 1.130 + if line.startswith('#MozRunner Prefs Start')])) 1.131 + self.assertTrue(bool([line for line in lines 1.132 + if line.startswith('#MozRunner Prefs End')])) 1.133 + 1.134 + profile.reset() 1.135 + self.assertNotEqual(prefs1, 1.136 + Preferences.read_prefs(os.path.join(profile.profile, 'user.js')), 1.137 + "I pity the fool who left my pref") 1.138 + 1.139 + def test_magic_markers(self): 1.140 + """ensure our magic markers are working""" 1.141 + 1.142 + profile = Profile() 1.143 + prefs_file = os.path.join(profile.profile, 'user.js') 1.144 + 1.145 + # we shouldn't have any initial preferences 1.146 + initial_prefs = Preferences.read_prefs(prefs_file) 1.147 + self.assertFalse(initial_prefs) 1.148 + initial_prefs = file(prefs_file).read().strip() 1.149 + self.assertFalse(initial_prefs) 1.150 + 1.151 + # add some preferences 1.152 + prefs1 = [("browser.startup.homepage", "http://planet.mozilla.org/"), 1.153 + ("zoom.minPercent", 30)] 1.154 + profile.set_preferences(prefs1) 1.155 + self.assertEqual(prefs1, Preferences.read_prefs(prefs_file)) 1.156 + lines = file(prefs_file).read().strip().splitlines() 1.157 + self.assertTrue(bool([line for line in lines 1.158 + if line.startswith('#MozRunner Prefs Start')])) 1.159 + self.assertTrue(bool([line for line in lines 1.160 + if line.startswith('#MozRunner Prefs End')])) 1.161 + 1.162 + # add some more preferences 1.163 + prefs2 = [("zoom.maxPercent", 300), 1.164 + ("webgl.verbose", 'false')] 1.165 + profile.set_preferences(prefs2) 1.166 + self.assertEqual(prefs1 + prefs2, Preferences.read_prefs(prefs_file)) 1.167 + lines = file(prefs_file).read().strip().splitlines() 1.168 + self.assertTrue(len([line for line in lines 1.169 + if line.startswith('#MozRunner Prefs Start')]) == 2) 1.170 + self.assertTrue(len([line for line in lines 1.171 + if line.startswith('#MozRunner Prefs End')]) == 2) 1.172 + 1.173 + # now clean it up 1.174 + profile.clean_preferences() 1.175 + final_prefs = Preferences.read_prefs(prefs_file) 1.176 + self.assertFalse(final_prefs) 1.177 + lines = file(prefs_file).read().strip().splitlines() 1.178 + self.assertTrue('#MozRunner Prefs Start' not in lines) 1.179 + self.assertTrue('#MozRunner Prefs End' not in lines) 1.180 + 1.181 + def test_preexisting_preferences(self): 1.182 + """ensure you don't clobber preexisting preferences""" 1.183 + 1.184 + # make a pretend profile 1.185 + tempdir = tempfile.mkdtemp() 1.186 + 1.187 + try: 1.188 + # make a user.js 1.189 + contents = """ 1.190 +user_pref("webgl.enabled_for_all_sites", true); 1.191 +user_pref("webgl.force-enabled", true); 1.192 +""" 1.193 + user_js = os.path.join(tempdir, 'user.js') 1.194 + f = file(user_js, 'w') 1.195 + f.write(contents) 1.196 + f.close() 1.197 + 1.198 + # make sure you can read it 1.199 + prefs = Preferences.read_prefs(user_js) 1.200 + original_prefs = [('webgl.enabled_for_all_sites', True), ('webgl.force-enabled', True)] 1.201 + self.assertTrue(prefs == original_prefs) 1.202 + 1.203 + # now read this as a profile 1.204 + profile = Profile(tempdir, preferences={"browser.download.dir": "/home/jhammel"}) 1.205 + 1.206 + # make sure the new pref is now there 1.207 + new_prefs = original_prefs[:] + [("browser.download.dir", "/home/jhammel")] 1.208 + prefs = Preferences.read_prefs(user_js) 1.209 + self.assertTrue(prefs == new_prefs) 1.210 + 1.211 + # clean up the added preferences 1.212 + profile.cleanup() 1.213 + del profile 1.214 + 1.215 + # make sure you have the original preferences 1.216 + prefs = Preferences.read_prefs(user_js) 1.217 + self.assertTrue(prefs == original_prefs) 1.218 + finally: 1.219 + shutil.rmtree(tempdir) 1.220 + 1.221 + def test_json(self): 1.222 + _prefs = {"browser.startup.homepage": "http://planet.mozilla.org/"} 1.223 + json = '{"browser.startup.homepage": "http://planet.mozilla.org/"}' 1.224 + 1.225 + # just repr it...could use the json module but we don't need it here 1.226 + fd, name = tempfile.mkstemp(suffix='.json') 1.227 + os.write(fd, json) 1.228 + os.close(fd) 1.229 + 1.230 + commandline = ["--preferences", name] 1.231 + self.compare_generated(_prefs, commandline) 1.232 + 1.233 + def test_prefs_write(self): 1.234 + """test that the Preferences.write() method correctly serializes preferences""" 1.235 + 1.236 + _prefs = {'browser.startup.homepage': "http://planet.mozilla.org", 1.237 + 'zoom.minPercent': 30, 1.238 + 'zoom.maxPercent': 300} 1.239 + 1.240 + # make a Preferences manager with the testing preferences 1.241 + preferences = Preferences(_prefs) 1.242 + 1.243 + # write them to a temporary location 1.244 + path = None 1.245 + read_prefs = None 1.246 + try: 1.247 + with mozfile.NamedTemporaryFile(suffix='.js', delete=False) as f: 1.248 + path = f.name 1.249 + preferences.write(f, _prefs) 1.250 + 1.251 + # read them back and ensure we get what we put in 1.252 + read_prefs = dict(Preferences.read_prefs(path)) 1.253 + 1.254 + finally: 1.255 + # cleanup 1.256 + if path and os.path.exists(path): 1.257 + os.remove(path) 1.258 + 1.259 + self.assertEqual(read_prefs, _prefs) 1.260 + 1.261 + def test_read_prefs_with_comments(self): 1.262 + """test reading preferences from a prefs.js file that contains comments""" 1.263 + 1.264 + path = os.path.join(here, 'files', 'prefs_with_comments.js') 1.265 + self.assertEqual(dict(Preferences.read_prefs(path)), self._prefs_with_comments) 1.266 + 1.267 + def test_read_prefs_with_interpolation(self): 1.268 + """test reading preferences from a prefs.js file whose values 1.269 + require interpolation""" 1.270 + 1.271 + expected_prefs = { 1.272 + "browser.foo": "http://server-name", 1.273 + "zoom.minPercent": 30, 1.274 + "webgl.verbose": "false", 1.275 + "browser.bar": "somethingxyz" 1.276 + } 1.277 + values = { 1.278 + "server": "server-name", 1.279 + "abc": "something" 1.280 + } 1.281 + path = os.path.join(here, 'files', 'prefs_with_interpolation.js') 1.282 + read_prefs = Preferences.read_prefs(path, interpolation=values) 1.283 + self.assertEqual(dict(read_prefs), expected_prefs) 1.284 + 1.285 + def test_read_prefs_ttw(self): 1.286 + """test reading preferences through the web via mozhttpd""" 1.287 + 1.288 + # create a MozHttpd instance 1.289 + docroot = os.path.join(here, 'files') 1.290 + host = '127.0.0.1' 1.291 + port = 8888 1.292 + httpd = mozhttpd.MozHttpd(host=host, port=port, docroot=docroot) 1.293 + 1.294 + # create a preferences instance 1.295 + prefs = Preferences() 1.296 + 1.297 + try: 1.298 + # start server 1.299 + httpd.start(block=False) 1.300 + 1.301 + # read preferences through the web 1.302 + read = prefs.read_prefs('http://%s:%d/prefs_with_comments.js' % (host, port)) 1.303 + self.assertEqual(dict(read), self._prefs_with_comments) 1.304 + finally: 1.305 + httpd.stop() 1.306 + 1.307 +if __name__ == '__main__': 1.308 + unittest.main()