1# This Source Code Form is subject to the terms of the Mozilla Public
2# License, v. 2.0. If a copy of the MPL was not distributed with this
3# file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5from marionette_driver.errors import JavascriptException
6
7from marionette_harness import MarionetteTestCase
8
9
10class TestPreferences(MarionetteTestCase):
11    prefs = {
12        "bool": "marionette.test.bool",
13        "int": "marionette.test.int",
14        "string": "marionette.test.string",
15    }
16
17    def tearDown(self):
18        for pref in self.prefs.values():
19            self.marionette.clear_pref(pref)
20
21        super(TestPreferences, self).tearDown()
22
23    def test_clear_pref(self):
24        self.assertIsNone(self.marionette.get_pref(self.prefs["bool"]))
25
26        self.marionette.set_pref(self.prefs["bool"], True)
27        self.assertTrue(self.marionette.get_pref(self.prefs["bool"]))
28
29        self.marionette.clear_pref(self.prefs["bool"])
30        self.assertIsNone(self.marionette.get_pref(self.prefs["bool"]))
31
32    def test_get_and_set_pref(self):
33        # By default none of the preferences are set
34        self.assertIsNone(self.marionette.get_pref(self.prefs["bool"]))
35        self.assertIsNone(self.marionette.get_pref(self.prefs["int"]))
36        self.assertIsNone(self.marionette.get_pref(self.prefs["string"]))
37
38        # Test boolean values
39        self.marionette.set_pref(self.prefs["bool"], True)
40        value = self.marionette.get_pref(self.prefs["bool"])
41        self.assertTrue(value)
42        self.assertEqual(type(value), bool)
43
44        # Test int values
45        self.marionette.set_pref(self.prefs["int"], 42)
46        value = self.marionette.get_pref(self.prefs["int"])
47        self.assertEqual(value, 42)
48        self.assertEqual(type(value), int)
49
50        # Test string values
51        self.marionette.set_pref(self.prefs["string"], "abc")
52        value = self.marionette.get_pref(self.prefs["string"])
53        self.assertEqual(value, "abc")
54        self.assertTrue(isinstance(value, basestring))
55
56        # Test reset value
57        self.marionette.set_pref(self.prefs["string"], None)
58        self.assertIsNone(self.marionette.get_pref(self.prefs["string"]))
59
60    def test_get_set_pref_default_branch(self):
61        pref_default = "marionette.test.pref_default1"
62        self.assertIsNone(self.marionette.get_pref(self.prefs["string"]))
63
64        self.marionette.set_pref(pref_default, "default_value", default_branch=True)
65        self.assertEqual(self.marionette.get_pref(pref_default), "default_value")
66        self.assertEqual(self.marionette.get_pref(pref_default, default_branch=True),
67                         "default_value")
68
69        self.marionette.set_pref(pref_default, "user_value")
70        self.assertEqual(self.marionette.get_pref(pref_default), "user_value")
71        self.assertEqual(self.marionette.get_pref(pref_default, default_branch=True),
72                         "default_value")
73
74        self.marionette.clear_pref(pref_default)
75        self.assertEqual(self.marionette.get_pref(pref_default), "default_value")
76
77    def test_get_pref_value_type(self):
78        # Without a given value type the properties URL will be returned only
79        pref_complex = "browser.menu.showCharacterEncoding"
80        properties_file = "chrome://browser/locale/browser.properties"
81        self.assertEqual(self.marionette.get_pref(pref_complex, default_branch=True),
82                         properties_file)
83
84        # Otherwise the property named like the pref will be translated
85        value = self.marionette.get_pref(pref_complex, default_branch=True,
86                                         value_type="nsIPrefLocalizedString")
87        self.assertNotEqual(value, properties_file)
88
89    def test_set_prefs(self):
90        # By default none of the preferences are set
91        self.assertIsNone(self.marionette.get_pref(self.prefs["bool"]))
92        self.assertIsNone(self.marionette.get_pref(self.prefs["int"]))
93        self.assertIsNone(self.marionette.get_pref(self.prefs["string"]))
94
95        # Set a value on the default branch first
96        pref_default = "marionette.test.pref_default2"
97        self.assertIsNone(self.marionette.get_pref(pref_default))
98        self.marionette.set_prefs({pref_default: "default_value"}, default_branch=True)
99
100        # Set user values
101        prefs = {self.prefs["bool"]: True, self.prefs["int"]: 42,
102                 self.prefs["string"]: "abc", pref_default: "user_value"}
103        self.marionette.set_prefs(prefs)
104
105        self.assertTrue(self.marionette.get_pref(self.prefs["bool"]))
106        self.assertEqual(self.marionette.get_pref(self.prefs["int"]), 42)
107        self.assertEqual(self.marionette.get_pref(self.prefs["string"]), "abc")
108        self.assertEqual(self.marionette.get_pref(pref_default), "user_value")
109        self.assertEqual(self.marionette.get_pref(pref_default, default_branch=True),
110                         "default_value")
111
112    def test_using_prefs(self):
113        # Test that multiple preferences can be set with "using_prefs", and that
114        # they are set correctly and unset correctly after leaving the context
115        # manager.
116        pref_not_existent = "marionette.test.not_existent1"
117        pref_default = "marionette.test.pref_default3"
118
119        self.marionette.set_prefs({self.prefs["string"]: "abc",
120                                   self.prefs["int"]: 42,
121                                   self.prefs["bool"]: False,
122                                   })
123        self.assertFalse(self.marionette.get_pref(self.prefs["bool"]))
124        self.assertEqual(self.marionette.get_pref(self.prefs["int"]), 42)
125        self.assertEqual(self.marionette.get_pref(self.prefs["string"]), "abc")
126        self.assertIsNone(self.marionette.get_pref(pref_not_existent))
127
128        with self.marionette.using_prefs({self.prefs["bool"]: True,
129                                          self.prefs["int"]: 24,
130                                          self.prefs["string"]: "def",
131                                          pref_not_existent: "existent"}):
132
133            self.assertTrue(self.marionette.get_pref(self.prefs["bool"]), True)
134            self.assertEquals(self.marionette.get_pref(self.prefs["int"]), 24)
135            self.assertEquals(self.marionette.get_pref(self.prefs["string"]), "def")
136            self.assertEquals(self.marionette.get_pref(pref_not_existent), "existent")
137
138        self.assertFalse(self.marionette.get_pref(self.prefs["bool"]))
139        self.assertEqual(self.marionette.get_pref(self.prefs["int"]), 42)
140        self.assertEqual(self.marionette.get_pref(self.prefs["string"]), "abc")
141        self.assertIsNone(self.marionette.get_pref(pref_not_existent))
142
143        # Using context with default branch
144        self.marionette.set_pref(pref_default, "default_value", default_branch=True)
145        self.assertEqual(self.marionette.get_pref(pref_default, default_branch=True),
146                         "default_value")
147
148        with self.marionette.using_prefs({pref_default: "new_value"}, default_branch=True):
149            self.assertEqual(self.marionette.get_pref(pref_default, default_branch=True),
150                             "new_value")
151
152        self.assertEqual(self.marionette.get_pref(pref_default, default_branch=True),
153                         "default_value")
154
155    def test_using_prefs_exception(self):
156        # Test that throwing an exception inside the context manager doesn"t
157        # prevent the preferences from being restored at context manager exit.
158        self.marionette.set_pref(self.prefs["string"], "abc")
159
160        try:
161            with self.marionette.using_prefs({self.prefs["string"]: "def"}):
162                self.assertEquals(self.marionette.get_pref(self.prefs["string"]), "def")
163                self.marionette.execute_script("return foo.bar.baz;")
164        except JavascriptException:
165            pass
166
167        self.assertEquals(self.marionette.get_pref(self.prefs["string"]), "abc")
168