aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorWojtek Kosior <koszko@koszko.org>2022-01-18 18:55:05 +0100
committerWojtek Kosior <koszko@koszko.org>2022-01-18 19:28:11 +0100
commit046b8a7b3e7259bf451926732e6221076b1d4153 (patch)
tree3746d157139ba88f7c78a7d17cd97a6e5cf48a6a /test
parent17614206a6e23900e0ddd91c4e4e40ec08eaec99 (diff)
downloadbrowser-extension-046b8a7b3e7259bf451926732e6221076b1d4153.tar.gz
browser-extension-046b8a7b3e7259bf451926732e6221076b1d4153.zip
facilitate caching repository responses in content scripts
Diffstat (limited to 'test')
-rw-r--r--test/unit/test_CORS_bypass_server.py3
-rw-r--r--test/unit/test_repo_query_cacher.py114
-rw-r--r--test/world_wide_library.py15
3 files changed, 130 insertions, 2 deletions
diff --git a/test/unit/test_CORS_bypass_server.py b/test/unit/test_CORS_bypass_server.py
index 35ea565..8b845b9 100644
--- a/test/unit/test_CORS_bypass_server.py
+++ b/test/unit/test_CORS_bypass_server.py
@@ -21,7 +21,6 @@ import pytest
import json
from selenium.webdriver.support.ui import WebDriverWait
-from ..extension_crafting import ExtraHTML
from ..script_loader import load_script
from ..world_wide_library import some_data
@@ -46,7 +45,7 @@ async function fetch_resources() {
const results = {};
const promises = [];
for (const [name, url] of Object.entries(urls)) {
- const sending = browser.runtime.sendMessage(["CORS_bypasss",
+ const sending = browser.runtime.sendMessage(["CORS_bypass",
fetch_data(url)]);
promises.push(sending.then(response => results[name] = response));
}
diff --git a/test/unit/test_repo_query_cacher.py b/test/unit/test_repo_query_cacher.py
new file mode 100644
index 0000000..d5c7396
--- /dev/null
+++ b/test/unit/test_repo_query_cacher.py
@@ -0,0 +1,114 @@
+# SPDX-License-Identifier: CC0-1.0
+
+"""
+Haketilo unit tests - caching responses from remote repositories
+"""
+
+# This file is part of Haketilo
+#
+# Copyright (C) 2022 Wojtek Kosior <koszko@koszko.org>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the CC0 1.0 Universal License as published by
+# the Creative Commons Corporation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# CC0 1.0 Universal License for more details.
+
+import pytest
+import json
+from selenium.webdriver.support.ui import WebDriverWait
+
+from ..script_loader import load_script
+
+tab_id_responder = '''
+function tell_tab_id(msg, sender, respond_cb) {
+ if (msg[0] === "learn_tab_id")
+ respond_cb(sender.tab.id);
+}
+browser.runtime.onMessage.addListener(tell_tab_id);
+'''
+
+def content_script():
+ return load_script('content/repo_query_cacher.js') + ''';
+ start();
+ browser.runtime.sendMessage(["learn_tab_id"])
+ .then(tid => window.wrappedJSObject.haketilo_tab = tid);
+ '''
+
+def bypass_js():
+ return load_script('background/CORS_bypass_server.js') + '; start();'
+
+def run_content_script_in_new_window(driver, url):
+ initial_handle = driver.current_window_handle
+ handles = driver.window_handles
+ driver.execute_script('window.open(arguments[0], "_blank");', url)
+ WebDriverWait(driver, 10).until(lambda d: d.window_handles is not handles)
+ new_handle = [h for h in driver.window_handles if h not in handles][0]
+
+ driver.switch_to.window(new_handle)
+
+ get_tab_id = lambda d: d.execute_script('return window.haketilo_tab;')
+ tab_id = WebDriverWait(driver, 10).until(get_tab_id)
+
+ driver.switch_to.window(initial_handle)
+ return tab_id
+
+def fetch_through_cache(driver, tab_id, url):
+ return driver.execute_script(
+ '''
+ return browser.tabs.sendMessage(arguments[0],
+ ["repo_query", arguments[1]]);
+ ''',
+ tab_id, url)
+
+@pytest.mark.ext_data({
+ 'content_script': content_script,
+ 'background_script': lambda: bypass_js() + ';' + tab_id_responder
+})
+@pytest.mark.usefixtures('webextension')
+def test_repo_query_cacher_normal_use(driver, execute_in_page):
+ """
+ Test if HTTP requests made through our cacher return correct results.
+ """
+ tab_id = run_content_script_in_new_window(driver, 'https://gotmyowndoma.in')
+
+ result = fetch_through_cache(driver, tab_id, 'https://counterdoma.in/')
+ assert set(result.keys()) == {'ok', 'status', 'json'}
+ counter_initial = result['json']['counter']
+ assert type(counter_initial) is int
+
+ for i in range(2):
+ result = fetch_through_cache(driver, tab_id, 'https://counterdoma.in/')
+ assert result['json']['counter'] == counter_initial
+
+ tab_id = run_content_script_in_new_window(driver, 'https://gotmyowndoma.in')
+ result = fetch_through_cache(driver, tab_id, 'https://counterdoma.in/')
+ assert result['json']['counter'] == counter_initial + 1
+
+ for i in range(2):
+ result = fetch_through_cache(driver, tab_id, 'https://nxdoma.in/')
+ assert set(result.keys()) == {'ok', 'status', 'error-json'}
+ assert result['ok'] == False
+ assert result['status'] == 404
+
+ for i in range(2):
+ result = fetch_through_cache(driver, tab_id, 'bad://url')
+ assert set(result.keys()) == {'error'}
+
+@pytest.mark.ext_data({
+ 'content_script': content_script,
+ 'background_script': tab_id_responder
+})
+@pytest.mark.usefixtures('webextension')
+def test_repo_query_cacher_bgscript_error(driver):
+ """
+ Test if our cacher properly reports errors in communication with the
+ background script.
+ """
+ tab_id = run_content_script_in_new_window(driver, 'https://gotmyowndoma.in')
+
+ result = fetch_through_cache(driver, tab_id, 'https://counterdoma.in/')
+ assert set(result.keys()) == {'error'}
diff --git a/test/world_wide_library.py b/test/world_wide_library.py
index bed6ec3..14e3d2f 100644
--- a/test/world_wide_library.py
+++ b/test/world_wide_library.py
@@ -31,6 +31,7 @@ from hashlib import sha256
from pathlib import Path
from shutil import rmtree
from threading import Lock
+import json
from .misc_constants import here
@@ -87,6 +88,18 @@ def dump_scripts(directory='./injected_scripts'):
some_data = '{"some": "data"}'
+# used by handler function of https://counterdoma.in
+request_counter = 0
+
+def serve_counter(command, get_params, post_params):
+ global request_counter
+ request_counter += 1
+ return (
+ 200,
+ {'Cache-Control': 'private, max-age=0, no-store'},
+ json.dumps({'counter': request_counter})
+ )
+
catalog = {
'http://gotmyowndoma.in':
(302, {'location': 'http://gotmyowndoma.in/index.html'}, None),
@@ -108,6 +121,8 @@ catalog = {
'https://anotherdoma.in/resource/blocked/by/CORS.json':
lambda command, get_params, post_params: (200, {}, some_data),
+ 'https://counterdoma.in/': serve_counter,
+
'https://serve.scrip.ts/': serve_script,
'https://site.with.scripts.block.ed':