From bbc9fae4291d0c2cb3976d158ecd20e0bd2a8ea0 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Tue, 15 Mar 2022 10:12:06 +0100 Subject: serialize and deserialize entire Response object when relaying fetch() calls to other contexts using sendMessage --- test/haketilo_test/unit/test_CORS_bypass_server.py | 65 ++++++++++++---------- 1 file changed, 36 insertions(+), 29 deletions(-) (limited to 'test/haketilo_test/unit/test_CORS_bypass_server.py') diff --git a/test/haketilo_test/unit/test_CORS_bypass_server.py b/test/haketilo_test/unit/test_CORS_bypass_server.py index 45e4ebb..45f06a9 100644 --- a/test/haketilo_test/unit/test_CORS_bypass_server.py +++ b/test/haketilo_test/unit/test_CORS_bypass_server.py @@ -24,29 +24,28 @@ from selenium.webdriver.support.ui import WebDriverWait from ..script_loader import load_script from ..world_wide_library import some_data -urls = { - 'resource': 'https://anotherdoma.in/resource/blocked/by/CORS.json', - 'nonexistent': 'https://nxdoma.in/resource.json', - 'invalid': 'w3csucks://invalid.url/' +datas = { + 'resource': 'https://anotherdoma.in/resource/blocked/by/CORS.json', + 'nonexistent': 'https://nxdoma.in/resource.json', + 'invalid': 'w3csucks://invalid.url/', + 'redirected_ok': 'https://site.with.scripts.block.ed', + 'redirected_err': 'https://site.with.scripts.block.ed' } +for name, url in [*datas.items()]: + datas[name] = {'url': url} + +datas['redirected_ok']['init'] = {'redirect': 'follow'} +datas['redirected_err']['init'] = {'redirect': 'error'} + content_script = '''\ -const urls = %s; - -function fetch_data(url) { - return { - url, - to_get: ["ok", "status"], - to_call: ["text", "json"] - }; -} +const datas = %s; async function fetch_resources() { const results = {}; const promises = []; - for (const [name, url] of Object.entries(urls)) { - const sending = browser.runtime.sendMessage(["CORS_bypass", - fetch_data(url)]); + for (const [name, data] of Object.entries(datas)) { + const sending = browser.runtime.sendMessage(["CORS_bypass", data]); promises.push(sending.then(response => results[name] = response)); } @@ -58,7 +57,7 @@ async function fetch_resources() { fetch_resources(); ''' -content_script = content_script % json.dumps(urls); +content_script = content_script % json.dumps(datas); @pytest.mark.ext_data({ 'content_script': content_script, @@ -77,33 +76,41 @@ def test_CORS_bypass_server(driver, execute_in_page): ''' const result = {}; let promises = []; - for (const [name, url] of Object.entries(arguments[0])) { + for (const [name, data] of Object.entries(arguments[0])) { const [ok_cb, err_cb] = ["ok", "err"].map(status => () => result[name] = status); - promises.push(fetch(url).then(ok_cb, err_cb)); + promises.push(fetch(data.url).then(ok_cb, err_cb)); } // Make the promises non-failing. promises = promises.map(p => new Promise(cb => p.then(cb, cb))); returnval(Promise.all(promises).then(() => result)); ''', - {**urls, 'sameorigin': './nonexistent_resource'}) + {**datas, 'sameorigin': './nonexistent_resource'}) - assert results == dict([*[(k, 'err') for k in urls.keys()], + assert results == dict([*[(k, 'err') for k in datas.keys()], ('sameorigin', 'ok')]) done = lambda d: d.execute_script('return window.haketilo_fetch_results;') results = WebDriverWait(driver, 10).until(done) assert set(results['invalid'].keys()) == {'error'} + assert results['invalid']['error']['fileName'].endswith('background.js') + assert type(results['invalid']['error']['lineNumber']) is int + assert type(results['invalid']['error']['message']) is str + assert results['invalid']['error']['name'] == 'TypeError' - assert set(results['nonexistent'].keys()) == \ - {'ok', 'status', 'text', 'error_json'} - assert results['nonexistent']['ok'] == False assert results['nonexistent']['status'] == 404 - assert results['nonexistent']['text'] == 'Handler for this URL not found.' + assert results['nonexistent']['statusText'] == 'Not Found' + assert any([name.lower() == 'content-length' + for name, value in results['nonexistent']['headers']]) + assert bytes.fromhex(results['nonexistent']['body']) == \ + b'Handler for this URL not found.' - assert set(results['resource'].keys()) == {'ok', 'status', 'text', 'json'} - assert results['resource']['ok'] == True assert results['resource']['status'] == 200 - assert results['resource']['text'] == some_data - assert results['resource']['json'] == json.loads(some_data) + assert results['resource']['statusText'] == 'OK' + assert any([name.lower() == 'content-length' + for name, value in results['resource']['headers']]) + assert bytes.fromhex(results['resource']['body']) == b'{"some": "data"}' + + assert results['redirected_ok']['status'] == 200 + assert results['redirected_err']['error']['name'] == 'TypeError' -- cgit v1.2.3