[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