diff options
Diffstat (limited to 'testing/mozbase/mozprofile/tests/test_permissions.py')
-rwxr-xr-x | testing/mozbase/mozprofile/tests/test_permissions.py | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/testing/mozbase/mozprofile/tests/test_permissions.py b/testing/mozbase/mozprofile/tests/test_permissions.py new file mode 100755 index 0000000000..d943bab66e --- /dev/null +++ b/testing/mozbase/mozprofile/tests/test_permissions.py @@ -0,0 +1,225 @@ +#!/usr/bin/env python + +# 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 __future__ import absolute_import + +import os +import sqlite3 + +import mozunit +import pytest + +from mozprofile.permissions import Permissions + +LOCATIONS = """http://mochi.test:8888 primary,privileged +http://127.0.0.1:80 noxul +http://127.0.0.1:8888 privileged +""" + + +@pytest.fixture +def locations_file(tmpdir): + locations_file = tmpdir.join("locations.txt") + locations_file.write(LOCATIONS) + return locations_file.strpath + + +@pytest.fixture +def perms(tmpdir, locations_file): + return Permissions(tmpdir.mkdir("profile").strpath, locations_file) + + +def test_create_permissions_db(perms): + profile_dir = perms._profileDir + perms_db_filename = os.path.join(profile_dir, "permissions.sqlite") + + select_stmt = "select origin, type, permission from moz_hosts" + + con = sqlite3.connect(perms_db_filename) + cur = con.cursor() + cur.execute(select_stmt) + entries = cur.fetchall() + + assert len(entries) == 3 + + assert entries[0][0] == "http://mochi.test:8888" + assert entries[0][1] == "allowXULXBL" + assert entries[0][2] == 1 + + assert entries[1][0] == "http://127.0.0.1" + assert entries[1][1] == "allowXULXBL" + assert entries[1][2] == 2 + + assert entries[2][0] == "http://127.0.0.1:8888" + assert entries[2][1] == "allowXULXBL" + assert entries[2][2] == 1 + + perms._locations.add_host("a.b.c", port="8081", scheme="https", options="noxul") + + cur.execute(select_stmt) + entries = cur.fetchall() + + assert len(entries) == 4 + assert entries[3][0] == "https://a.b.c:8081" + assert entries[3][1] == "allowXULXBL" + assert entries[3][2] == 2 + + # when creating a DB we should default to user_version==5 + cur.execute("PRAGMA user_version") + entries = cur.fetchall() + assert entries[0][0] == 5 + + perms.clean_db() + # table should be removed + cur.execute("select * from sqlite_master where type='table'") + entries = cur.fetchall() + assert len(entries) == 0 + + +def test_nw_prefs(perms): + prefs, user_prefs = perms.network_prefs(False) + + assert len(user_prefs) == 0 + assert len(prefs) == 0 + + prefs, user_prefs = perms.network_prefs(True) + assert len(user_prefs) == 2 + assert user_prefs[0] == ("network.proxy.type", 2) + assert user_prefs[1][0] == "network.proxy.autoconfig_url" + + origins_decl = ( + "var knownOrigins = (function () { return ['http://mochi.test:8888', " + "'http://127.0.0.1:80', 'http://127.0.0.1:8888'].reduce" + ) + assert origins_decl in user_prefs[1][1] + + proxy_check = ( + "'http': 'PROXY mochi.test:8888'", + "'https': 'PROXY mochi.test:4443'", + "'ws': 'PROXY mochi.test:4443'", + "'wss': 'PROXY mochi.test:4443'", + ) + assert all(c in user_prefs[1][1] for c in proxy_check) + + +@pytest.fixture +def perms_db_filename(tmpdir): + return tmpdir.join("permissions.sqlite").strpath + + +@pytest.fixture +def permDB(perms_db_filename): + permDB = sqlite3.connect(perms_db_filename) + yield permDB + permDB.cursor().close() + + +# pylint: disable=W1638 +@pytest.fixture(params=range(2, 6)) +def version(request, perms_db_filename, permDB, locations_file): + version = request.param + + cursor = permDB.cursor() + cursor.execute("PRAGMA user_version=%d;" % version) + + if version == 5: + cursor.execute( + """CREATE TABLE IF NOT EXISTS moz_hosts ( + id INTEGER PRIMARY KEY, + origin TEXT, + type TEXT, + permission INTEGER, + expireType INTEGER, + expireTime INTEGER, + modificationTime INTEGER)""" + ) + elif version == 4: + cursor.execute( + """CREATE TABLE IF NOT EXISTS moz_hosts ( + id INTEGER PRIMARY KEY, + host TEXT, + type TEXT, + permission INTEGER, + expireType INTEGER, + expireTime INTEGER, + modificationTime INTEGER, + appId INTEGER, + isInBrowserElement INTEGER)""" + ) + elif version == 3: + cursor.execute( + """CREATE TABLE IF NOT EXISTS moz_hosts ( + id INTEGER PRIMARY KEY, + host TEXT, + type TEXT, + permission INTEGER, + expireType INTEGER, + expireTime INTEGER, + appId INTEGER, + isInBrowserElement INTEGER)""" + ) + elif version == 2: + cursor.execute( + """CREATE TABLE IF NOT EXISTS moz_hosts ( + id INTEGER PRIMARY KEY, + host TEXT, + type TEXT, + permission INTEGER, + expireType INTEGER, + expireTime INTEGER)""" + ) + else: + raise Exception("version must be 2, 3, 4 or 5") + permDB.commit() + + # Create a permissions object to read the db + Permissions(os.path.dirname(perms_db_filename), locations_file) + return version + + +def test_verify_user_version(version, permDB): + """Verifies that we call INSERT statements using the correct number + of columns for existing databases. + """ + select_stmt = "select * from moz_hosts" + + cur = permDB.cursor() + cur.execute(select_stmt) + entries = cur.fetchall() + + assert len(entries) == 3 + + columns = { + 1: 6, + 2: 6, + 3: 8, + 4: 9, + 5: 7, + }[version] + + assert len(entries[0]) == columns + for x in range(4, columns): + assert entries[0][x] == 0 + + +def test_schema_version(perms, locations_file): + profile_dir = perms._profileDir + perms_db_filename = os.path.join(profile_dir, "permissions.sqlite") + perms.write_db(open(locations_file, "w+b")) + + stmt = "PRAGMA user_version;" + + con = sqlite3.connect(perms_db_filename) + cur = con.cursor() + cur.execute(stmt) + entries = cur.fetchall() + + schema_version = entries[0][0] + assert schema_version == 5 + + +if __name__ == "__main__": + mozunit.main() |