[Pkg-mozext-commits] [requestpolicy] 62/257: [tst][add] RP Puppeteer "Requests" API
David Prévot
taffit at moszumanska.debian.org
Thu Jan 28 03:19:56 UTC 2016
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch master
in repository requestpolicy.
commit 5a07b4cd31dbe4d27aef9b587a13063837d15236
Author: Martin Kimmerle <dev at 256k.de>
Date: Sat Sep 26 21:11:12 2015 +0200
[tst][add] RP Puppeteer "Requests" API
---
tests/marionette/rp_puppeteer/__init__.py | 4 +
tests/marionette/rp_puppeteer/api/requests.py | 117 +++++++++++
tests/marionette/rp_puppeteer/tests/manifest.ini | 1 +
.../marionette/rp_puppeteer/tests/test_requests.py | 217 +++++++++++++++++++++
4 files changed, 339 insertions(+)
diff --git a/tests/marionette/rp_puppeteer/__init__.py b/tests/marionette/rp_puppeteer/__init__.py
index d3ec217..4fb0dc0 100644
--- a/tests/marionette/rp_puppeteer/__init__.py
+++ b/tests/marionette/rp_puppeteer/__init__.py
@@ -16,6 +16,10 @@ class RequestPolicyPuppeteer(object):
def prefs(self):
pass
+ @use_class_as_property('api.requests.Requests')
+ def requests(self):
+ pass
+
@use_class_as_property('api.rules.Rules')
def rules(self):
pass
diff --git a/tests/marionette/rp_puppeteer/api/requests.py b/tests/marionette/rp_puppeteer/api/requests.py
new file mode 100644
index 0000000..151fe3f
--- /dev/null
+++ b/tests/marionette/rp_puppeteer/api/requests.py
@@ -0,0 +1,117 @@
+# 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/.
+
+from firefox_puppeteer.base import BaseLib
+from contextlib import contextmanager
+
+
+class Requests(BaseLib):
+ """Class for observing requests."""
+
+ def __init__(self, marionette_getter, sandbox="default"):
+ super(Requests, self).__init__(marionette_getter)
+ self._sandbox = "requestpolicy-requests-" + sandbox
+
+ def __del__(self):
+ self.stop_listening()
+ self.cleanup_sandbox()
+
+ #################################
+ # Public Properties and Methods #
+ #################################
+
+ @property
+ def all(self):
+ return self.marionette.execute_script("""
+ if (typeof this.requestObserver !== "object") {
+ return null;
+ }
+ return this.requestObserver.requests;
+ """, sandbox=self._sandbox, new_sandbox=False)
+
+ @property
+ def listening(self):
+ """Whether or not requests are currently observed."""
+
+ return self.marionette.execute_script("""
+ return typeof this.listening === "boolean" && this.listening === true;
+ """, sandbox=self._sandbox, new_sandbox=False)
+
+ @property
+ def sandbox(self):
+ return self._sandbox
+
+ def start_listening(self):
+ """Start observing requests."""
+
+ self.continue_listening()
+ self.clear()
+
+ def continue_listening(self):
+ """Start observing requests without clearing the requests."""
+
+ # Already listening?
+ if self.listening:
+ return
+
+ return self.marionette.execute_script("""
+ Cu.import("chrome://rpcontinued/content/lib/request-processor.jsm");
+
+ this.requestObserver = (function (self) {
+ self.requests = self.requests || [];
+ self.pushRequest = function (aIsAllowed, aOriginUri, aDestUri,
+ aRequestResult) {
+ self.requests.push({
+ origin: aOriginUri,
+ dest: aDestUri,
+ isAllowed: aIsAllowed
+ });
+ };
+ self.observeBlockedRequest = self.pushRequest.bind(self, false);
+ self.observeAllowedRequest = self.pushRequest.bind(self, true);
+ return self;
+ })(this.requestObserver || {});
+
+ RequestProcessor.addRequestObserver(requestObserver);
+ this.listening = true;
+ """, sandbox=self._sandbox, new_sandbox=False)
+
+ def stop_listening(self):
+ """Stop observing requests."""
+
+ if not self.listening:
+ return
+
+ return self.marionette.execute_script("""
+ RequestProcessor.removeRequestObserver(this.requestObserver);
+ this.listening = false;
+ """, sandbox=self._sandbox, new_sandbox=False)
+
+ @contextmanager
+ def listen(self):
+ self.start_listening()
+ try:
+ yield
+ finally:
+ self.stop_listening()
+
+ def cleanup_sandbox(self):
+ """Clean up the sandbox."""
+
+ if self.listening:
+ self.stop_listening()
+
+ # Mainly send `new_sandbox=True`.
+ self.marionette.execute_script("", sandbox=self._sandbox,
+ new_sandbox=True)
+
+ def clear(self):
+ """Clear info about requests but continue to listen."""
+
+ if not self.listening:
+ return
+
+ self.marionette.execute_script("""
+ this.requestObserver.requests = [];
+ """, sandbox=self._sandbox, new_sandbox=False)
diff --git a/tests/marionette/rp_puppeteer/tests/manifest.ini b/tests/marionette/rp_puppeteer/tests/manifest.ini
index 50c7fb6..8bdd95b 100644
--- a/tests/marionette/rp_puppeteer/tests/manifest.ini
+++ b/tests/marionette/rp_puppeteer/tests/manifest.ini
@@ -1,4 +1,5 @@
[test_addons.py]
[test_error_detection.py]
[test_prefs.py]
+[test_requests.py]
[test_rules.py]
diff --git a/tests/marionette/rp_puppeteer/tests/test_requests.py b/tests/marionette/rp_puppeteer/tests/test_requests.py
new file mode 100644
index 0000000..7c5b6c2
--- /dev/null
+++ b/tests/marionette/rp_puppeteer/tests/test_requests.py
@@ -0,0 +1,217 @@
+# 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/.
+
+from rp_ui_harness import RequestPolicyTestCase
+from rp_puppeteer.api.requests import Requests
+from marionette_driver.errors import JavascriptException
+
+
+PREF_DEFAULT_ALLOW = "extensions.requestpolicy.defaultPolicy.allow"
+
+
+class TestRequestObserver(RequestPolicyTestCase):
+
+ def setUp(self):
+ RequestPolicyTestCase.setUp(self)
+
+ self.sandbox_1 = "test_requests_1"
+ self.sandbox_2 = "test_requests_2"
+
+ def test_listening(self):
+ """Test that `listening` returns correct values."""
+
+ self.assertFalse(self.requests.listening)
+ # start to listen
+ self.requests.start_listening()
+ self.assertTrue(self.requests.listening)
+ # stop listening
+ self.requests.stop_listening()
+ self.assertFalse(self.requests.listening)
+
+ def test_start_stop_multiple_times(self):
+ self.assertFalse(self.requests.listening)
+
+ self.requests.start_listening()
+ self.assertTrue(self.requests.listening)
+ self.requests.start_listening()
+ self.assertTrue(self.requests.listening)
+
+ self.requests.stop_listening()
+ self.assertFalse(self.requests.listening)
+ self.requests.stop_listening()
+ self.assertFalse(self.requests.listening)
+
+ def test_start_stop_multiple_instances(self):
+ requests_1 = Requests(lambda: self.marionette)
+ requests_2 = Requests(lambda: self.marionette)
+ self.assertFalse(requests_1.listening)
+ self.assertFalse(requests_2.listening)
+
+ requests_1.start_listening()
+ self.assertTrue(requests_1.listening)
+ self.assertTrue(requests_2.listening)
+
+ requests_2.stop_listening()
+ self.assertFalse(requests_1.listening)
+ self.assertFalse(requests_2.listening)
+
+ def test_listen(self):
+ self.assertFalse(self.requests.listening)
+ with self.requests.listen():
+ self.assertTrue(self.requests.listening)
+ self.assertFalse(self.requests.listening)
+
+ def test_custom_sandbox(self):
+ """Test that an independent sandbox can be specified."""
+
+ requests_1 = Requests(lambda: self.marionette, sandbox=self.sandbox_1)
+ requests_2 = Requests(lambda: self.marionette, sandbox=self.sandbox_2)
+ self.assertFalse(requests_1.listening)
+ self.assertFalse(requests_2.listening)
+
+ requests_1.start_listening()
+ self.assertTrue(requests_1.listening)
+ self.assertFalse(requests_2.listening)
+
+ requests_2.start_listening()
+ self.assertTrue(requests_1.listening)
+ self.assertTrue(requests_2.listening)
+
+ requests_1.stop_listening()
+ self.assertFalse(requests_1.listening)
+ self.assertTrue(requests_2.listening)
+
+ requests_2.stop_listening()
+ self.assertFalse(requests_1.listening)
+ self.assertFalse(requests_2.listening)
+
+ def test_stop_on_deletion(self):
+ """Test that the listener is stopped when the object gets removed."""
+
+ requests_1 = Requests(lambda: self.marionette, sandbox=self.sandbox_1)
+ requests_1.start_listening()
+ self.assertTrue(requests_1.listening)
+ # Reset variable.
+ requests_1 = None
+
+ requests_2 = Requests(lambda: self.marionette, sandbox=self.sandbox_1)
+ self.assertFalse(requests_2.listening)
+
+
+ def test_clear(self):
+ self.assertFalse(self.requests.listening)
+ self.requests.start_listening()
+ self.assertTrue(self.requests.listening)
+
+ # produce some requests
+ with self.marionette.using_context("content"):
+ self.marionette.navigate("http://www.maindomain.test/")
+ self.assertNotEqual(len(self.requests.all), 0,
+ "The list of requests is not empty.")
+
+ self.requests.clear()
+ self.assertEqual(len(self.requests.all), 0,
+ "The list of requests is empty.")
+ self.assertTrue(self.requests.listening, "Still listening.")
+
+ # clean up
+ self.requests.stop_listening()
+
+ def test_cleanup_sandbox(self):
+ """Test cleaning up a sandbox removes old values."""
+
+ def set_foo():
+ self.marionette.execute_script("""
+ this.foo = 1;
+ """, sandbox=self.requests.sandbox)
+
+ def typeof_foo():
+ return self.marionette.execute_script("""
+ return typeof this.foo;
+ """, sandbox=self.requests.sandbox, new_sandbox=False)
+
+ # Set foo.
+ set_foo()
+
+ self.assertEqual(typeof_foo(), "number",
+ msg="Variable `foo` should exist.")
+
+ self.requests.cleanup_sandbox()
+
+ self.assertEqual(typeof_foo(), "undefined",
+ msg="Variable `foo` should not exist.")
+
+
+class TestGettingRequests(RequestPolicyTestCase):
+ """Class for testing `Requests.all`."""
+
+ def setUp(self):
+ RequestPolicyTestCase.setUp(self)
+
+ self.prefs.set_pref(PREF_DEFAULT_ALLOW, False)
+ self.requests.start_listening()
+
+ def tearDown(self):
+ self.prefs.reset_pref(PREF_DEFAULT_ALLOW)
+ self.requests.stop_listening()
+
+ def test_empty_sandbox(self):
+ self.requests.cleanup_sandbox()
+ self.assertIsNone(self.requests.all)
+
+ def test_allowed_denied(self):
+ """Test a page with one allowed and one denied request."""
+
+ with self.marionette.using_context("content"):
+ self.marionette.navigate("http://www.maindomain.test/img_1.html")
+
+ # Obligatory requests.
+ expected_requests = [
+ {
+ "origin": "chrome://browser/content/browser.xul",
+ "dest": "http://www.maindomain.test/img_1.html",
+ "isAllowed": True
+ },
+ {
+ "origin": "http://www.maindomain.test/img_1.html",
+ "dest": "http://www.maindomain.test/same-site-image.png",
+ "isAllowed": True
+ }, {
+ "origin": "http://www.maindomain.test/img_1.html",
+ "dest": "http://www.otherdomain.test/cross-site-image.png",
+ "isAllowed": False
+ }
+ ]
+
+ # Requests that are recorded _sometimes_.
+ possible_additional_requests = [
+ {
+ # The favicon is only loaded if it's the first load of
+ # the domain.
+ "origin": "http://www.maindomain.test/favicon.ico",
+ "dest": "http://www.otherdomain.test/subdirectory/flag-gray.png",
+ "isAllowed": False
+ }
+ ]
+
+ # Get all recorded requests.
+ requests = self.requests.all
+
+ # Filter out "possible additional requests".
+ requests = filter(lambda r: r not in possible_additional_requests,
+ requests)
+
+ self.assertGreaterEqual(len(requests), len(expected_requests))
+
+ for expected_request in expected_requests:
+ len_before = len(requests)
+ # filter out the expected request
+ requests = filter(lambda r: r != expected_request, requests)
+ self.assertLess(len(requests), len_before,
+ ("Some requests matched expected request {}."
+ .format(str(expected_request))))
+
+ self.assertEqual(len(requests), 0,
+ ("All requests should have been filtered out, so "
+ "`requests` should be empty: {}".format(requests)))
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/requestpolicy.git
More information about the Pkg-mozext-commits
mailing list