def test_is_passthrough_enabled_hook(self): snap_dict = OrderedDict( { "name": "snap-test", "version": "test-version", "summary": "test-summary", "description": "test-description", "hooks": {"test-hook": {"passthrough": {"some-key": "some-value"}}}, } ) snap = Snap.from_dict(snap_dict=snap_dict) snap.validate() self.assertEqual(True, snap.is_passthrough_enabled)
def test_simple(self): snap_dict = OrderedDict({ "name": "snap-test", "version": "snap-version", "summary": "snap-summary", "description": "snap-description", "grade": "stable", }) snap = Snap.from_dict(snap_dict=snap_dict) snap.validate() self.assertEqual(snap_dict, snap.to_dict()) self.assertEqual(False, snap.is_passthrough_enabled) self.assertEqual(snap_dict["name"], snap.name) self.assertEqual(snap_dict["version"], snap.version) self.assertEqual(snap_dict["summary"], snap.summary) self.assertEqual(snap_dict["description"], snap.description)
def test_grade_devel_statisfies_required_grade(self): self.fake_snapd.snaps_result = [{ "name": "fake-base", "channel": "edge", "revision": "fake-revision" }] snap_dict = OrderedDict({ "name": "snap-test", "base": "fake-base", "version": "snap-version", "summary": "snap-summary", "description": "snap-description", "grade": "devel", }) snap = Snap.from_dict(snap_dict=snap_dict) snap.validate()
def test_ensure_command_chain_assumption(self): snap_dict = OrderedDict({ "name": "snap-test", "version": "snap-version", "summary": "snap-summary", "description": "snap-description", "apps": { "test-app": { "command": "test-app", "command-chain": ["test-command-chain"], } }, }) snap = Snap.from_dict(snap_dict=snap_dict) snap._ensure_command_chain_assumption() snap.validate() self.assertEqual({"command-chain"}, snap.assumes)
def test_write_snap_yaml_with_base_core18(self): snap_dict = OrderedDict({ "name": "snap-test", "version": "snap-version", "summary": "snap-summary", "description": "snap-description", "base": "core18", "grade": "devel", }) snap = Snap.from_dict(snap_dict=snap_dict) snap.validate() # Write snap yaml. snap_yaml_path = os.path.join(self.path, "snap.yaml") snap.write_snap_yaml(path=snap_yaml_path) # Read snap yaml. written_snap_yaml = open(snap_yaml_path, "r").read() self.assertEqual(snap_dict, snap.to_dict()) self.assertTrue("base" in written_snap_yaml)
def test_system_usernames_shortform_scope(self): snap_dict = OrderedDict({ "name": "snap-test", "version": "test-version", "summary": "test-summary", "description": "test-description", "system-usernames": { "snap_daemon": "shared", "lxd": "shared" }, }) snap = Snap.from_dict(snap_dict=snap_dict) snap.validate() self.assertThat(snap.system_usernames["snap_daemon"].name, Equals("snap_daemon")) self.assertThat(snap.system_usernames["snap_daemon"].scope, Equals(SystemUserScope.SHARED)) self.assertThat(snap.system_usernames["lxd"].name, Equals("lxd")) self.assertThat(snap.system_usernames["lxd"].scope, Equals(SystemUserScope.SHARED))
def test_all_keys(self): snap_dict = { "name": "snap-test", "version": "test-version", "summary": "test-summary", "description": "test-description", "adopt-info": "some-part", "apps": {"test-app": {"command": "test-app"}}, "architectures": ["all"], "assumes": ["command-chain"], "base": "core18", "confinement": "strict", "compression": "lzo", "environment": {"TESTING": "1"}, "epoch": 0, "grade": "devel", "hooks": { "test-hook": { "command-chain": ["cmd1"], "environment": {"FOO": "BAR"}, "plugs": ["network"], } }, "layout": {"/target": {"bind": "$SNAP/foo"}}, "license": "GPL", "passthrough": {"test": "value"}, "plugs": {"test-plug": {"interface": "some-value"}}, "slots": {"test-slot": {"interface": "some-value"}}, "system-usernames": {"snap_daemon": {"scope": "shared"}}, "title": "test-title", "type": "base", } snap = Snap.from_dict(snap_dict=snap_dict) snap.validate() self.assertEqual(snap_dict, snap.to_dict()) self.assertEqual(True, snap.is_passthrough_enabled)
def test_build_base_and_write_snap_yaml_type_base_with_build_base(self): snap_dict = OrderedDict({ "name": "core20", "version": "snap-version", "summary": "snap-summary", "description": "snap-description", "grade": "devel", "build-base": "core18", "type": "base", }) snap = Snap.from_dict(snap_dict=snap_dict) snap.validate() # Write snap yaml. snap_yaml_path = os.path.join(self.path, "snap.yaml") snap.write_snap_yaml(path=snap_yaml_path) # Read snap yaml. written_snap_yaml = open(snap_yaml_path, "r").read() self.assertTrue("base" in written_snap_yaml) self.assertFalse("build-base" in written_snap_yaml) self.assertEqual(snap.get_build_base(), "core18")
def __init__(self, project: project.Project) -> None: self.build_snaps: Set[str] = set() self.project = project # raw_snapcraft_yaml is read only, create a new copy snapcraft_yaml = apply_extensions(project.info.get_raw_snapcraft()) self.validator = Validator(snapcraft_yaml) self.validator.validate() snapcraft_yaml = self._expand_filesets(snapcraft_yaml) self.data = self._expand_env(snapcraft_yaml) self.data["architectures"] = _process_architectures( self.data.get("architectures"), project.deb_arch) self._ensure_no_duplicate_app_aliases() grammar_processor = grammar_processing.GlobalGrammarProcessor( properties=self.data, project=project) keys_path = project._get_keys_path() if any([ package_repo.install(keys_path=keys_path) for package_repo in project._snap_meta.package_repositories ]): repo.Repo.refresh_build_packages() self.build_tools = grammar_processor.get_build_packages() self.build_tools |= set(project.additional_build_packages) # If version: git is used we want to add "git" to build-packages if self.data.get("version") == "git": self.build_tools.add("git") # XXX: Resetting snap_meta due to above mangling of data. # Convergence to operating on snap_meta will remove this requirement... project._snap_meta = Snap.from_dict(self.data) # Always add the base for building for non os and base snaps if project.info.base is None and project.info.type in ("app", "gadget"): raise SnapcraftEnvironmentError( "A base is required for snaps of type {!r}.".format( project.info.type)) if project.info.base is not None: # If the base is already installed by other means, skip its installation. # But, we should always add it when in a docker environment so # the creator of said docker image is aware that it is required. if common.is_process_container( ) or not repo.snaps.SnapPackage.is_snap_installed( project.info.base): self.build_snaps.add(project.info.base) self.parts = PartsConfig( parts=self.data, project=project, validator=self.validator, build_snaps=self.build_snaps, build_tools=self.build_tools, )
def test_empty_from_dict(self): snap_dict = OrderedDict({}) snap = Snap.from_dict(snap_dict=snap_dict) self.assertEqual(snap_dict, snap.to_dict())
def test_all_keys(self): snap_dict = OrderedDict({ "name": "snap-test", "version": "test-version", "summary": "test-summary", "description": "test-description", "apps": { "test-app": { "command": "test-app" } }, "architectures": ["all"], "assumes": ["command-chain"], "base": "core", "confinement": "strict", "environment": { "TESTING": "1" }, "epoch": 0, "grade": "devel", "hooks": { "test-hook": { "command-chain": ["cmd1"], "plugs": ["network"] } }, "layout": { "/target": { "bind": "$SNAP/foo" } }, "license": "GPL", "plugs": { "test-plug": OrderedDict({"interface": "some-value"}) }, "slots": { "test-slot": OrderedDict({"interface": "some-value"}) }, "system-usernames": OrderedDict({"snap_daemon": OrderedDict({"scope": "shared"})}), "title": "test-title", "type": "base", }) snap = Snap.from_dict(snap_dict=snap_dict) snap.validate() self.assertEqual(snap_dict, snap.to_dict()) self.assertEqual(False, snap.is_passthrough_enabled) self.assertEqual(snap_dict["name"], snap.name) self.assertEqual(snap_dict["version"], snap.version) self.assertEqual(snap_dict["summary"], snap.summary) self.assertEqual(snap_dict["description"], snap.description) self.assertEqual(snap_dict["apps"]["test-app"], snap.apps["test-app"].to_dict()) self.assertEqual(snap_dict["architectures"], snap.architectures) self.assertEqual(set(snap_dict["assumes"]), snap.assumes) self.assertEqual(snap_dict["base"], snap.base) self.assertEqual(snap_dict["environment"], snap.environment) self.assertEqual(snap_dict["hooks"]["test-hook"], snap.hooks["test-hook"].to_dict()) self.assertEqual(snap_dict["license"], snap.license) self.assertEqual(snap_dict["plugs"]["test-plug"], snap.plugs["test-plug"].to_yaml_object()) self.assertEqual(snap_dict["slots"]["test-slot"], snap.slots["test-slot"].to_yaml_object()) self.assertEqual(snap_dict["confinement"], snap.confinement) self.assertEqual(snap_dict["title"], snap.title) self.assertEqual(snap_dict["type"], snap.type)
def test_snap_yaml_all_keys(self): snap_dict = { "name": "snap-test", "version": "test-version", "summary": "test-summary", "description": "test-description", "adopt-info": "some-part", "apps": {"test-app": {"command": "test-app"}}, "architectures": ["all"], "assumes": ["command-chain"], "base": "core18", "confinement": "strict", "compression": "xz", "environment": {"TESTING": "1"}, "epoch": 0, "grade": "devel", "hooks": { "test-hook": { "command-chain": ["cmd1"], "environment": {"FOO": "BAR"}, "plugs": ["network"], } }, "layout": {"/target": {"bind": "$SNAP/foo"}}, "license": "GPL", "links": { "issues": ["https://bug_url.org"], "donation": [ "https://paypal.com", "https://cafecito.app/", "https://ko-fi.com/", ], "contact": ["mailto:[email protected]", "*****@*****.**"], "source-code": ["https://github.com/org/source"], "website": ["https://webfront.org"], }, "package-repositories": [ {"type": "apt", "ppa": "test/ppa"}, { "type": "apt", "architectures": ["amd64", "i386"], "components": ["main"], "formats": ["deb"], "key-id": "A" * 40, "key-server": "test-key-server.com", "suites": ["xenial"], "url": "http://archive.ubuntu.com", }, ], "passthrough": {"test": "value"}, "plugs": {"test-plug": {"interface": "some-value"}}, "slots": {"test-slot": {"interface": "some-value"}}, "system-usernames": {"snap_daemon": {"scope": "shared"}}, "title": "test-title", "type": "base", } snap = Snap.from_dict(snap_dict=snap_dict) snap.validate() expected_dict = snap_dict.copy() expected_dict.pop("adopt-info") expected_dict.pop("compression") expected_dict.pop("package-repositories") expected_dict.update(expected_dict.pop("passthrough")) self.assertEqual(expected_dict, snap.to_snap_yaml_dict()) self.assertEqual(True, snap.is_passthrough_enabled)
def test_snap_yaml_all_keys(self): snap_dict = { "name": "snap-test", "version": "test-version", "summary": "test-summary", "description": "test-description", "adopt-info": "some-part", "apps": { "test-app": { "command": "test-app" } }, "architectures": ["all"], "assumes": ["command-chain"], "base": "core", "confinement": "strict", "environment": { "TESTING": "1" }, "epoch": 0, "grade": "devel", "hooks": { "test-hook": { "command-chain": ["cmd1"], "plugs": ["network"] } }, "layout": { "/target": { "bind": "$SNAP/foo" } }, "license": "GPL", "package-repositories": [ { "type": "apt", "ppa": "test/ppa" }, { "type": "apt", "architectures": ["amd64", "i386"], "components": ["main"], "deb-types": ["deb"], "key-id": "test-key-id", "key-server": "test-key-server.com", "name": "test-name", "suites": ["xenial"], "url": "http://archive.ubuntu.com", }, ], "passthrough": { "test": "value" }, "plugs": { "test-plug": { "interface": "some-value" } }, "slots": { "test-slot": { "interface": "some-value" } }, "system-usernames": { "snap_daemon": { "scope": "shared" } }, "title": "test-title", "type": "base", } snap = Snap.from_dict(snap_dict=snap_dict) snap.validate() expected_dict = snap_dict.copy() expected_dict.pop("adopt-info") expected_dict.pop("base") expected_dict.pop("package-repositories") expected_dict.update(expected_dict.pop("passthrough")) self.assertEqual(expected_dict, snap.to_snap_yaml_dict()) self.assertEqual(True, snap.is_passthrough_enabled)