diff options
Diffstat (limited to 'testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py')
-rw-r--r-- | testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py b/testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py new file mode 100644 index 000000000..e86de2bd5 --- /dev/null +++ b/testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py @@ -0,0 +1,138 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import os + +from marionette_driver.by import By +from marionette_driver.errors import JavascriptException + +from marionette_harness import ( + MarionetteTestCase, + skip_if_chrome, + skip_if_mobile, + WindowManagerMixin, +) + + +class TestImportScriptContent(WindowManagerMixin, MarionetteTestCase): + contexts = set(["chrome", "content"]) + + script_file = os.path.abspath( + os.path.join(__file__, os.path.pardir, "importscript.js")) + another_script_file = os.path.abspath( + os.path.join(__file__, os.path.pardir, "importanotherscript.js")) + + def setUp(self): + super(TestImportScriptContent, self).setUp() + + for context in self.contexts: + with self.marionette.using_context(context): + self.marionette.clear_imported_scripts() + self.reset_context() + + def tearDown(self): + self.close_all_windows() + + super(TestImportScriptContent, self).tearDown() + + def reset_context(self): + self.marionette.set_context("content") + + @property + def current_context(self): + return self.marionette._send_message("getContext", key="value") + + @property + def other_context(self): + return self.contexts.copy().difference([self.current_context]).pop() + + def is_defined(self, symbol): + return self.marionette.execute_script( + "return typeof {} != 'undefined'".format(symbol)) + + def assert_defined(self, symbol, msg=None): + if msg is None: + msg = "Expected symbol {} to be defined".format(symbol) + self.assertTrue(self.is_defined(symbol), msg) + + def assert_undefined(self, symbol, msg=None): + if msg is None: + msg = "Expected symbol {} to be undefined".format(symbol) + self.assertFalse(self.is_defined(symbol), msg) + + def assert_scripts_cleared(self): + self.marionette.import_script(self.script_file) + self.assert_defined("testFunc") + self.marionette.clear_imported_scripts() + self.assert_undefined("testFunc") + + def test_import_script(self): + self.marionette.import_script(self.script_file) + self.assertEqual( + "i'm a test function!", self.marionette.execute_script("return testFunc();")) + self.assertEqual("i'm a test function!", self.marionette.execute_async_script( + "marionetteScriptFinished(testFunc());")) + + def test_import_script_twice(self): + self.marionette.import_script(self.script_file) + self.assert_defined("testFunc") + + # TODO(ato): Note that the WebDriver command primitives + # does not allow us to check what scripts have been imported. + # I suspect we must to do this through an xpcshell test. + + self.marionette.import_script(self.script_file) + self.assert_defined("testFunc") + + def test_import_script_and_clear(self): + self.marionette.import_script(self.script_file) + self.assert_defined("testFunc") + self.marionette.clear_imported_scripts() + self.assert_scripts_cleared() + self.assert_undefined("testFunc") + with self.assertRaises(JavascriptException): + self.marionette.execute_script("return testFunc()") + with self.assertRaises(JavascriptException): + self.marionette.execute_async_script( + "marionetteScriptFinished(testFunc())") + + def test_clear_scripts_in_other_context(self): + self.marionette.import_script(self.script_file) + self.assert_defined("testFunc") + + # clearing other context's script file should not affect ours + with self.marionette.using_context(self.other_context): + self.marionette.clear_imported_scripts() + self.assert_undefined("testFunc") + + self.assert_defined("testFunc") + + def test_multiple_imports(self): + self.marionette.import_script(self.script_file) + self.marionette.import_script(self.another_script_file) + self.assert_defined("testFunc") + self.assert_defined("testAnotherFunc") + + @skip_if_chrome("Needs content scope") + @skip_if_mobile("New windows not supported in Fennec") + def test_imports_apply_globally(self): + self.marionette.navigate( + self.marionette.absolute_url("test_windows.html")) + + def open_window_with_link(): + self.marionette.find_element(By.LINK_TEXT, "Open new window").click() + + new_window = self.open_window(trigger=open_window_with_link) + self.marionette.switch_to_window(new_window) + + self.marionette.import_script(self.script_file) + self.marionette.close_chrome_window() + + self.marionette.switch_to_window(self.start_window) + self.assert_defined("testFunc") + + +class TestImportScriptChrome(TestImportScriptContent): + def reset_context(self): + self.marionette.set_context("chrome") |