Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

# 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 pathlib import Path
from string import Template
from unittest.mock import patch
import mozunit
import mozpack.pkg
from mozpack.pkg import (
create_bom,
create_payload,
create_pkg,
get_app_info_plist,
get_apple_template,
get_relative_glob_list,
save_text_file,
xar_package_folder,
)
from mozpack.test.test_files import TestWithTmpDir
class TestPkg(TestWithTmpDir):
maxDiff = None
class MockSubprocessRun:
stderr = ""
stdout = ""
returncode = 0
def __init__(self, returncode=0):
self.returncode = returncode
def _mk_test_file(self, name, mode=0o777):
tool = Path(self.tmpdir) / f"{name}"
tool.touch()
tool.chmod(mode)
return tool
def test_get_apple_template(self):
tmpl = get_apple_template("Distribution.template")
assert type(tmpl) is Template
def test_get_apple_template_not_file(self):
with self.assertRaises(Exception):
get_apple_template("tmpl-should-not-exist")
def test_save_text_file(self):
content = "Hello"
destination = Path(self.tmpdir) / "test_save_text_file"
save_text_file(content, destination)
with destination.open("r") as file:
assert content == file.read()
def test_get_app_info_plist(self):
app_path = Path(self.tmpdir) / "app"
(app_path / "Contents").mkdir(parents=True)
(app_path / "Contents/Info.plist").touch()
data = {"foo": "bar"}
with patch.object(mozpack.pkg.plistlib, "load", lambda x: data):
assert data == get_app_info_plist(app_path)
def test_get_app_info_plist_not_file(self):
app_path = Path(self.tmpdir) / "app-does-not-exist"
with self.assertRaises(Exception):
get_app_info_plist(app_path)
def _mock_payload(self, returncode):
def _mock_run(*args, **kwargs):
return self.MockSubprocessRun(returncode)
return _mock_run
def test_create_payload(self):
destination = Path(self.tmpdir) / "mockPayload"
with patch.object(mozpack.pkg.subprocess, "run", self._mock_payload(0)):
create_payload(destination, Path(self.tmpdir), "cpio")
def test_create_bom(self):
bom_path = Path(self.tmpdir) / "Bom"
bom_path.touch()
root_path = Path(self.tmpdir)
tool_path = Path(self.tmpdir) / "not-really-used-during-test"
with patch.object(mozpack.pkg.subprocess, "check_call", lambda *x: None):
create_bom(bom_path, root_path, tool_path)
def get_relative_glob_list(self):
source = Path(self.tmpdir)
(source / "testfile").touch()
glob = "*"
assert len(get_relative_glob_list(source, glob)) == 1
def test_xar_package_folder(self):
source = Path(self.tmpdir)
dest = source / "fakedestination"
dest.touch()
tool = source / "faketool"
with patch.object(mozpack.pkg.subprocess, "check_call", lambda *x, **y: None):
xar_package_folder(source, dest, tool)
def test_xar_package_folder_not_absolute(self):
source = Path("./some/relative/path")
dest = Path("./some/other/relative/path")
tool = source / "faketool"
with patch.object(mozpack.pkg.subprocess, "check_call", lambda: None):
with self.assertRaises(Exception):
xar_package_folder(source, dest, tool)
def test_create_pkg(self):
def noop(*x, **y):
pass
def mock_get_app_info_plist(*args):
return {"CFBundleShortVersionString": "1.0.0"}
def mock_get_apple_template(*args):
return Template("fake template")
source = Path(self.tmpdir) / "FakeApp.app"
source.mkdir()
output = Path(self.tmpdir) / "output.pkg"
fake_tool = Path(self.tmpdir) / "faketool"
with patch.multiple(
mozpack.pkg,
get_app_info_plist=mock_get_app_info_plist,
get_apple_template=mock_get_apple_template,
save_text_file=noop,
create_payload=noop,
create_bom=noop,
xar_package_folder=noop,
):
create_pkg(source, output, fake_tool, fake_tool, fake_tool)
if __name__ == "__main__":
mozunit.main()