138 lines
4.4 KiB
Python
138 lines
4.4 KiB
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 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()
|