testing/mozbase/mozprofile/tests/test_preferences.py

changeset 0
6474c204b198
     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()

mercurial