Esempio n. 1
0
    def test_failed_build_with_debug(self):
        def call_effect(*args, **kwargs):
            if "snapcraft snap --output snap.snap" in " ".join(args[0]):
                raise CalledProcessError(returncode=255, cmd=args[0])
            return self.fake_lxd.check_output_side_effect()(*args, **kwargs)

        self.fake_lxd.check_call_mock.side_effect = call_effect

        self.project = Project(
            snapcraft_yaml_file_path=self.snapcraft_yaml.
            snapcraft_yaml_file_path,
            debug=True,
        )
        self.make_containerbuild().execute()

        self.fake_lxd.check_call_mock.assert_has_calls(
            [call(["lxc", "exec", self.fake_lxd.name, "--", "bash", "-i"])])
Esempio n. 2
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: crystal-snap
            base: unsupported-base
        """))

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            source = "dir"
            crystal_channel = "latest/stable"
            crystal_build_options = []

        self.options = Options()
Esempio n. 3
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent(
                """\
            name: gradle-snap
            base: {base}
        """.format(
                    base=self.base
                )
            )
        )

        self.options.gradle_openjdk_version = self.version

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)
Esempio n. 4
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: scons-snap
            base: core18
        """))

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            """Internal Options Class matching the Scons plugin"""

            scons_options = ["--debug=explain"]

        self.options = Options()
Esempio n. 5
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: maven-snap
            base: unsupported-base
        """))

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            source = "dir"
            maven_version = "3.3"
            maven_version_checksum = "sha1/1234567890"
            maven_openjdk_version = "10"

        self.options = Options()
Esempio n. 6
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent(
                """\
            name: plainbox-snap
            base: unsupported-base
        """
            )
        )

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            source = "dir"

        self.options = Options()
Esempio n. 7
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: meson-snap
            base: core18
        """))

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            """Internal Options Class matching the Meson plugin"""

            meson_parameters = []
            meson_version = []

        self.options = Options()
Esempio n. 8
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: waf-snap
            base: core18
        """))

        self.project = Project(target_deb_arch=self.deb_arch,
                               snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            """Internal Options Class matching the Waf plugin"""

            configflags = []

        self.options = Options()
Esempio n. 9
0
    def test_non_prime_and_no_version(self):
        snapcraft_yaml = fixture_setup.SnapcraftYaml(self.path, version=None)
        snapcraft_yaml.data["adopt-info"] = "test-part"
        snapcraft_yaml.update_part(
            "test-part",
            {
                "plugin": "nil",
                "override-build": "snapcraftctl set-version 1.0"
            },
        )
        self.useFixture(snapcraft_yaml)

        project = Project(
            snapcraft_yaml_file_path=snapcraft_yaml.snapcraft_yaml_file_path)
        project_config = project_loader.load_config(project)

        # This should not fail
        lifecycle.execute(steps.PULL, project_config)
Esempio n. 10
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent(
                """\
            name: conda-snap
            base: unsupported-base
        """
            )
        )

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            pass

        self.options = Options()
Esempio n. 11
0
    def setUp(self):
        super().setUp()

        self.project = Project(target_deb_arch=self.deb_arch)
        self.project._snap_meta = meta.snap.Snap(name="test-snap",
                                                 base="core18")

        patcher = mock.patch("snapcraft.internal.common.run")
        self.run_mock = patcher.start()
        self.addCleanup(patcher.stop)

        patcher = mock.patch("snapcraft.ProjectOptions.is_cross_compiling")
        patcher.start()
        self.addCleanup(patcher.stop)

        patcher = mock.patch.dict(os.environ, {})
        self.env_mock = patcher.start()
        self.addCleanup(patcher.stop)
Esempio n. 12
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent(
                """\
            name: go-snap
            base: core18
        """
            )
        )

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            source = "."
            nodejs_version = nodejs._NODEJS_VERSION
            nodejs_package_manager = "npm"
            nodejs_yarn_version = ""
            source = "."

        self.options = Options()

        # always have a package.json stub under source
        open("package.json", "w").close()

        patcher = mock.patch("snapcraft.internal.common.run")
        self.run_mock = patcher.start()
        self.addCleanup(patcher.stop)

        patcher = mock.patch("snapcraft.internal.common.run_output")
        self.run_output_mock = patcher.start()
        self.addCleanup(patcher.stop)
        self.run_output_mock.return_value = '{"dependencies": []}'

        patcher = mock.patch("snapcraft.sources.Tar")
        self.tar_mock = patcher.start()
        self.addCleanup(patcher.stop)

        self.nodejs_url = nodejs.get_nodejs_release(
            nodejs._NODEJS_VERSION, self.project.deb_arch
        )

        self.useFixture(fixture_setup.CleanEnvironment())
Esempio n. 13
0
def get_project(*, skip_snapcraft_yaml: bool = False, **kwargs):
    if skip_snapcraft_yaml:
        snapcraft_yaml_file_path = None
    else:
        snapcraft_yaml_file_path = get_snapcraft_yaml()

    ctx = click.get_current_context()
    for key, value in ctx.parent.params.items():
        if not kwargs.get(key):
            kwargs[key] = value

    project = Project(
        debug=kwargs.pop("debug"),
        use_geoip=kwargs.pop("enable_geoip"),
        parallel_builds=not kwargs.pop("no_parallel_builds"),
        target_deb_arch=kwargs.pop("target_arch"),
        snapcraft_yaml_file_path=snapcraft_yaml_file_path,
    )
    return project
Esempio n. 14
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: maven-snap
            base: {base}
        """.format(base=self.base)))

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            maven_options = []
            maven_targets = [""]
            maven_version = maven._DEFAULT_MAVEN_VERSION
            maven_version_checksum = maven._DEFAULT_MAVEN_CHECKSUM
            maven_openjdk_version = self.version

        self.options = Options()
Esempio n. 15
0
    def test_project_with_snapcraft_yaml_file_path_carries_info(self):
        snapcraft_yaml_file_path = self.make_snapcraft_yaml(
            """\
            name: foo
            version: "1"
            summary: bar
            description: baz
            confinement: strict

            parts:
              part1:
                plugin: go
            """
        )

        project = Project(snapcraft_yaml_file_path=snapcraft_yaml_file_path)

        # Only 1 value is enough
        self.assertThat(project.info.name, Equals("foo"))
Esempio n. 16
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: go-snap
            base: core18
        """))

        self.project = Project(target_deb_arch=self.deb_arch,
                               snapcraft_yaml_file_path=snapcraft_yaml_path)

        patcher = mock.patch("snapcraft.internal.common.run")
        self.run_mock = patcher.start()
        self.addCleanup(patcher.stop)

        patcher = mock.patch("snapcraft.internal.common.run_output")
        self.run_output_mock = patcher.start()
        self.addCleanup(patcher.stop)
Esempio n. 17
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: ant-snap
            base: {base}
        """.format(base=self.base)))

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            ant_properties = {}
            ant_build_targets = None
            ant_version = ant._DEFAULT_ANT_VERSION
            ant_version_checksum = ant._DEFAULT_ANT_CHECKSUM
            ant_openjdk_version = self.version

        self.options = Options()
Esempio n. 18
0
def get_project(*, is_managed_host: bool = False, **kwargs):
    # We need to do this here until we can get_snapcraft_yaml as part of Project.
    if is_managed_host:
        os.chdir(os.path.expanduser(os.path.join("~", "project")))

    snapcraft_yaml_file_path = get_snapcraft_yaml()

    ctx = click.get_current_context()
    for key, value in ctx.parent.params.items():
        if not kwargs.get(key):
            kwargs[key] = value

    project = Project(
        debug=kwargs.pop("debug"),
        target_deb_arch=kwargs.pop("target_arch"),
        snapcraft_yaml_file_path=snapcraft_yaml_file_path,
        is_managed_host=is_managed_host,
    )
    return project
Esempio n. 19
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: gradle-snap
            base: {base}
        """.format(base=self.base)))

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            gradle_options = []
            gradle_output_dir = "build/libs"
            gradle_version = gradle._DEFAULT_GRADLE_VERSION
            gradle_version_checksum = gradle._DEFAULT_GRADLE_CHECKSUM
            gradle_openjdk_version = self.version

        self.options = Options()
Esempio n. 20
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: plainbox-snap
            base: core18
        """))

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            source = "."

        self.options = Options()

        patcher = mock.patch.object(plainbox_provider.PlainboxProviderPlugin,
                                    "run")
        self.mock_run = patcher.start()
        self.addCleanup(patcher.stop)
Esempio n. 21
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: gradle-snap
            base: core18
        """))

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            gradle_options = []
            gradle_build_jar = False
            gradle_output_dir = "build/libs"
            gradle_version = gradle._DEFAULT_GRADLE_VERSION
            gradle_version_checksum = gradle._DEFAULT_GRADLE_CHECKSUM
            gradle_openjdk_version = "11"

        self.options = Options()
Esempio n. 22
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: ant-snap
            base: {base}
        """.format(base=self.base)))

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            ant_properties = {}
            ant_build_targets = None
            ant_channel = None
            ant_version = "1.10.5"
            ant_version_checksum = "sha512/a7f1e0cec9d5ed1b3ab6cddbb9364f127305a997bbc88ecd734f9ef142ec0332375e01ace3592759bb5c3307cd9c1ac0a78a30053f304c7030ea459498e4ce4e"
            ant_openjdk_version = self.version

        self.options = Options()
Esempio n. 23
0
    def setUp(self):
        super().setUp()

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent(
                """\
            name: conda-snap
            base: core18
        """
            )
        )

        self.project = Project(
            target_deb_arch=self.deb_arch, snapcraft_yaml_file_path=snapcraft_yaml_path
        )

        if self.project.deb_arch != "amd64":
            self.skipTest("architecture is not supported by conda plugin")

        self.fake_check_call = fixtures.MockPatch("subprocess.check_call")
        self.useFixture(self.fake_check_call)
Esempio n. 24
0
    def setUp(self):
        super().setUp()

        self.instance_name = "ridicoulus-hours"
        patcher = mock.patch("petname.Generate",
                             return_value=self.instance_name)
        patcher.start()
        self.addCleanup(patcher.stop)

        snapcraft_yaml_file_path = self.make_snapcraft_yaml(
            dedent("""\
            name: project-name
        """))
        self.project = Project(
            snapcraft_yaml_file_path=snapcraft_yaml_file_path)

        self.echoer_mock = mock.Mock()

        patcher = mock.patch("snapcraft.internal.repo.snaps.get_assertion")
        self.get_assertion_mock = patcher.start()
        self.addCleanup(patcher.stop)
Esempio n. 25
0
    def setUp(self):
        super().setUp()

        self.useFixture(fixtures.EnvironmentVariable(*self.env_var))

        snapcraft_yaml_path = self.make_snapcraft_yaml(
            dedent("""\
            name: gradle-snap
            base: core18
        """))

        self.project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path)

        class Options:
            gradle_options = []
            gradle_output_dir = "build/libs"
            gradle_version = gradle._DEFAULT_GRADLE_VERSION
            gradle_version_checksum = gradle._DEFAULT_GRADLE_CHECKSUM
            gradle_openjdk_version = "11"

        self.options = Options()
Esempio n. 26
0
    def test_project_local_plugin_location(self):
        snapcraft_yaml_file_path = self.make_snapcraft_yaml(
            """\
            name: foo
            version: "1"
            summary: bar
            description: baz
            confinement: strict

            parts:
              part1:
                plugin: nil
            """,
            location=self.location,
        )

        project = Project(snapcraft_yaml_file_path=snapcraft_yaml_file_path)
        self.assertThat(
            project.local_plugins_dir,
            Equals(os.path.join(os.getcwd(), self.location, "snap", "plugins")),
        )
Esempio n. 27
0
def conduct_project_sanity_check(project: Project) -> None:
    """Sanity check the project itself before continuing.

    The checks done here are meant to be light, and not rely on the build environment.
    """
    # The snapcraft.yaml should be valid even without extensions applied
    # This here check is mostly for backwards compatibility with the
    # rest of the code base.
    if project.info is not None:
        project.info.validate_raw_snapcraft()

    snap_dir_path = os.path.join(project._get_snapcraft_assets_dir())
    if os.path.isdir(snap_dir_path):
        # TODO: move this check to the ProjectInfo class.
        _check_snap_dir(snap_dir_path)

    if project._snap_meta.package_repositories and not os.getenv(
            "SNAPCRAFT_ENABLE_EXPERIMENTAL_PACKAGE_REPOSITORIES"):
        raise SnapcraftEnvironmentError(
            "*EXPERIMENTAL* 'package-repositories' configured, but not enabled. "
            "Enable with '--enable-experimental-package-repositories' flag.")
Esempio n. 28
0
    def setUp(self):
        super().setUp()
        self.fake_lxd = fixture_setup.FakeLXD()
        self.useFixture(self.fake_lxd)
        self.fake_lxd.kernel_arch = self.server

        self.fake_logger = fixtures.FakeLogger(level=logging.INFO)
        self.useFixture(self.fake_logger)

        patcher = patch("snapcraft.internal.lxd._containerbuild.SnapInjector")
        self.snap_injector_mock = patcher.start()
        self.addCleanup(patcher.stop)

        self.snapcraft_yaml = fixture_setup.SnapcraftYaml(self.path)
        self.useFixture(self.snapcraft_yaml)
        self.project = Project(
            snapcraft_yaml_file_path=self.snapcraft_yaml.
            snapcraft_yaml_file_path,
            target_deb_arch=self.target_arch,
        )

        self.useFixture(fixtures.EnvironmentVariable("SUDO_UID", "1000"))
Esempio n. 29
0
def test_project_with_snapcraft_yaml_file_path_carries_info(tmp_work_path):
    snapcraft_yaml_path = pathlib.Path("snapcraft.yaml")
    with snapcraft_yaml_path.open("w") as snapcraft_yaml_file:
        print(
            dedent("""\
            name: foo
            version: "1"
            summary: bar
            description: baz
            confinement: strict

            parts:
              part1:
                plugin: go
            """),
            file=snapcraft_yaml_file,
        )

    project = Project(snapcraft_yaml_file_path=snapcraft_yaml_path.as_posix())

    # Only 1 value is enough
    assert project.info.name == "foo"
Esempio n. 30
0
def test_icon(tmp_work_path):
    snapcraft_yaml_path = tmp_work_path / "snap/snapcraft.yaml"
    snapcraft_yaml_path.parent.mkdir(parents=True)
    with snapcraft_yaml_path.open("w") as snapcraft_file:
        print(
            dedent("""\
            name: project-name
            base: core18
            version: "1.0"
            summary: sanity checks
            description: sanity checks
            grade: stable
            confinement: strict
            icon: foo.png

            parts:
              nil:
                plugin: nil
            """),
            file=snapcraft_file,
        )

    project = Project(
        is_managed_host=False,
        snapcraft_yaml_file_path=snapcraft_yaml_path.as_posix(),
    )

    # Test without icon raises error
    with pytest.raises(
            snapcraft.internal.errors.SnapcraftEnvironmentError) as exc_info:
        conduct_project_sanity_check(project)

    assert exc_info.value.get_brief(
    ) == "Specified icon 'foo.png' does not exist."

    # Test with icon passes.
    (tmp_work_path / "foo.png").touch()
    conduct_project_sanity_check(project)