def test_snapcraftctl_errors_on_exception(self): os.mkdir("primedir") class _TestException(errors.ScriptletBaseError): fmt = "I'm an error" def _raise(): raise _TestException() runner = _runner.Runner( part_properties={"override-prime": "snapcraftctl prime"}, partdir=self.partdir, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={"prime": _raise}, build_env_generator=lambda: "export FOO=BAR", ) silent_popen = functools.partial(subprocess.Popen, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) with mock.patch("subprocess.Popen", wraps=silent_popen): self.assertRaises(errors.ScriptletRunError, runner.prime)
def test_snapcraft_utils_in_path_if_snap(self): self.useFixture(fixture_setup.FakeSnapcraftIsASnap()) os.mkdir("builddir") runner = _runner.Runner( part_properties={"override-build": "echo $PATH > path"}, partdir=self.partdir, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={}, build_env_generator=lambda: "export FOO=BAR", ) runner.build() expected_path_segment = "/snap/snapcraft/current/bin/scriptlet-bin" self.assertThat(os.path.join("builddir", "path"), FileExists()) self.assertThat( os.path.join("builddir", "path"), FileContains(matcher=Contains(expected_path_segment)), )
def test_snapcraftctl_no_alias_if_not_snap(self): os.mkdir('builddir') runner = _runner.Runner( part_properties={'build': 'alias snapcraftctl 2> /dev/null'}, sourcedir='sourcedir', builddir='builddir', stagedir='stagedir', primedir='primedir', builtin_functions={}) self.assertRaises(errors.ScriptletRunError, runner.build)
def test_prepare(self): os.mkdir('builddir') runner = _runner.Runner(part_properties={'prepare': 'touch prepare'}, sourcedir='sourcedir', builddir='builddir', stagedir='stagedir', primedir='primedir', builtin_functions={}) runner.prepare() self.assertThat(os.path.join('builddir', 'prepare'), FileExists())
def test_snapcraftctl_no_alias_if_not_snap(self): os.mkdir("builddir") runner = _runner.Runner( part_properties={"build": "alias snapcraftctl 2> /dev/null"}, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={}, ) self.assertRaises(errors.ScriptletRunError, runner.build)
def test_builtin_function_from_pull(self): os.mkdir('sourcedir') runner = _runner.Runner( part_properties={'override-pull': 'snapcraftctl pull'}, sourcedir='sourcedir', builddir='builddir', stagedir='stagedir', primedir='primedir', builtin_functions={'pull': _fake_pull}) runner.pull() self.assertThat(os.path.join('sourcedir', 'fake-pull'), FileExists())
def test_build(self): os.mkdir('builddir') runner = _runner.Runner( part_properties={'override-build': 'touch build'}, sourcedir='sourcedir', builddir='builddir', stagedir='stagedir', primedir='primedir', builtin_functions={}) runner.build() self.assertThat(os.path.join('builddir', 'build'), FileExists())
def test_builtin_function_from_prepare(self): os.mkdir('builddir') runner = _runner.Runner( part_properties={'prepare': 'snapcraftctl build'}, sourcedir='sourcedir', builddir='builddir', stagedir='stagedir', primedir='primedir', builtin_functions={'build': _fake_build}) runner.prepare() self.assertThat(os.path.join('builddir', 'fake-build'), FileExists())
def test_builtin_function_from_prepare(self): os.mkdir("builddir") runner = _runner.Runner( part_properties={"prepare": "snapcraftctl build"}, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={"build": _fake_build}, ) runner.prepare() self.assertThat(os.path.join("builddir", "fake-build"), FileExists())
def test_old_build(self): os.mkdir("builddir") runner = _runner.Runner( part_properties={"build": "touch build"}, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={}, ) runner.build() self.assertThat(os.path.join("builddir", "build"), FileExists())
def test_install_deprecation(self): self.fake_logger = fixtures.FakeLogger(level=logging.INFO) self.useFixture(self.fake_logger) _runner.Runner(part_properties={'install': 'foo'}, sourcedir='sourcedir', builddir='builddir', stagedir='stagedir', primedir='primedir', builtin_functions={}) self.assertThat( self.fake_logger.output, Contains("DEPRECATED: The 'install' keyword has been replaced by " "'override-build'"))
def test_builtin_function_from_pull(self): os.mkdir("sourcedir") runner = _runner.Runner( part_properties={"override-pull": "snapcraftctl pull"}, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={"pull": _fake_pull}, ) runner.pull() self.assertThat(os.path.join("sourcedir", "fake-pull"), FileExists())
def test_pull(self): os.mkdir("sourcedir") runner = _runner.Runner( part_properties={"override-pull": "touch pull"}, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={}, ) runner.pull() self.assertThat(os.path.join("sourcedir", "pull"), FileExists())
def test_stage(self): os.mkdir("stagedir") runner = _runner.Runner( part_properties={"override-stage": "touch stage"}, partdir=self.partdir, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={}, ) runner.stage() self.assertThat(os.path.join("stagedir", "stage"), FileExists())
def test_failure_to_execute_mid_script_results_in_failure(self): os.mkdir('builddir') script = dedent("""\ false # this should trigger an error touch success """) runner = _runner.Runner(part_properties={'build': script}, sourcedir='sourcedir', builddir='builddir', stagedir='stagedir', primedir='primedir', builtin_functions={}) self.assertRaises(errors.ScriptletRunError, runner.build)
def test_builtin_function_from_stage(self): os.mkdir("stagedir") runner = _runner.Runner( part_properties={"override-stage": "snapcraftctl stage"}, partdir=self.partdir, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={"stage": _fake_stage}, ) runner.stage() self.assertThat(os.path.join("stagedir", "fake-stage"), FileExists())
def test_pull(self): os.mkdir("sourcedir") runner = _runner.Runner( part_properties={"override-pull": "touch pull"}, partdir=self.partdir, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={}, build_env_generator=lambda: "export FOO=BAR", ) runner.pull() self.assertThat(os.path.join("sourcedir", "pull"), FileExists())
def test_snapcraftctl_no_alias_if_not_snap(self): os.mkdir("builddir") runner = _runner.Runner( part_properties={ "override-build": "alias snapcraftctl 2> /dev/null" }, partdir=self.partdir, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={}, build_env_generator=lambda: "export FOO=BAR", ) self.assertRaises(errors.ScriptletRunError, runner.build)
def test_builtin_function_from_prime(self): os.mkdir("primedir") runner = _runner.Runner( part_properties={"override-prime": "snapcraftctl prime"}, partdir=self.partdir, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={"prime": _fake_prime}, build_env_generator=lambda: "export FOO=BAR", ) runner.prime() self.assertThat(os.path.join("primedir", "fake-prime"), FileExists())
def test_failure_to_execute_mid_script_results_in_failure(self): os.mkdir("builddir") script = dedent("""\ false # this should trigger an error touch success """) runner = _runner.Runner( part_properties={"override-build": script}, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={}, ) self.assertRaises(errors.ScriptletRunError, runner.build)
def test_build_deprecation(self): self.fake_logger = fixtures.FakeLogger(level=logging.INFO) self.useFixture(self.fake_logger) _runner.Runner( part_properties={"build": "foo"}, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={}, ) self.assertThat( self.fake_logger.output, Contains("DEPRECATED: The 'build' keyword has been replaced by " "'override-build'"), )
def test_failure_on_last_script_command_results_in_failure(self): os.mkdir("builddir") script = dedent("""\ touch success false # this should trigger an error """) runner = _runner.Runner( part_properties={"override-build": script}, partdir=self.partdir, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={}, build_env_generator=lambda: "export FOO=BAR", ) self.assertRaises(errors.ScriptletRunError, runner.build)
def test_snapcraftctl_alias_if_snap(self): self.useFixture(fixture_setup.FakeSnapcraftIsASnap()) os.mkdir('builddir') runner = _runner.Runner( part_properties={'prepare': 'alias snapcraftctl > definition'}, sourcedir='sourcedir', builddir='builddir', stagedir='stagedir', primedir='primedir', builtin_functions={}) with mock.patch('os.path.exists', return_value=True): runner.prepare() expected_snapcrafctl = '/snap/snapcraft/current/bin/snapcraftctl' self.assertThat(os.path.join('builddir', 'definition'), FileExists()) self.assertThat( os.path.join('builddir', 'definition'), FileContains('snapcraftctl={!r}\n'.format(expected_snapcrafctl)))
def test_snapcraftctl_errors_on_exception(self): os.mkdir('primedir') class _TestException(errors.ScriptletBaseError): fmt = "I'm an error" def _raise(): raise _TestException() runner = _runner.Runner( part_properties={'override-prime': 'snapcraftctl prime'}, sourcedir='sourcedir', builddir='builddir', stagedir='stagedir', primedir='primedir', builtin_functions={'prime': _raise}) silent_popen = functools.partial(subprocess.Popen, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) with mock.patch('subprocess.Popen', wraps=silent_popen): self.assertRaises(errors.ScriptletRunError, runner.prime)
def test_snapcraftctl_alias_if_snap(self): self.useFixture(fixture_setup.FakeSnapcraftIsASnap()) os.mkdir("builddir") runner = _runner.Runner( part_properties={"prepare": "alias snapcraftctl > definition"}, sourcedir="sourcedir", builddir="builddir", stagedir="stagedir", primedir="primedir", builtin_functions={}, ) with mock.patch("os.path.exists", return_value=True): runner.prepare() expected_snapcrafctl = "/snap/snapcraft/current/bin/snapcraftctl" self.assertThat(os.path.join("builddir", "definition"), FileExists()) self.assertThat( os.path.join("builddir", "definition"), FileContains("snapcraftctl={!r}\n".format(expected_snapcrafctl)), )