Files
glib/gio/tests/gio-tool.py

157 lines
5.4 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# Copyright © 2018, 2019 Endless Mobile, Inc.
# Copyright © 2023 Philip Withnall
#
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA
"""Integration tests for the gio utility."""
import platform
import subprocess
import sys
import tempfile
import unittest
from pathlib import Path
import taptestrunner
import testprogramrunner
class TestGioTool(testprogramrunner.TestProgramRunner):
"""Integration test for running the gio tool.
This can be run when installed or uninstalled. When uninstalled, it
requires G_TEST_BUILDDIR and G_TEST_SRCDIR to be set.
The idea with this test harness is to test the gio utility, its
handling of command line arguments, its exit statuses, and its actual
effects on the file system.
"""
PROGRAM_NAME = "gio"
PROGRAM_TYPE = testprogramrunner.ProgramType.NATIVE
def runGio(self, *args):
return self.runTestProgram(args)
def test_help(self):
"""Test the --help argument and help subcommand."""
result = self.runGio("--help")
result2 = self.runGio("help")
self.assertEqual(result.out, result2.out)
self.assertEqual(result.err, result2.err)
self.assertIn("Usage:\n gio COMMAND", result.out)
self.assertIn("List the contents of locations", result.out)
def test_no_args(self):
"""Test running with no arguments at all."""
with self.assertRaises(subprocess.CalledProcessError):
self.runGio()
def test_info_non_default_attributes(self):
"""Test running `gio info --attributes` with a non-default list."""
with tempfile.NamedTemporaryFile(dir=self.tmpdir.name) as tmpfile:
result = self.runGio(
"info", "--attributes=standard::content-type", tmpfile.name
)
if sys.platform == "darwin":
self.assertIn("standard::content-type: public.text", result.out)
else:
self.assertIn(
"standard::content-type: application/x-zerosize", result.out
)
@unittest.skipIf(platform.system() == "Darwin", "gio launch not supported on darwin")
class TestGioLaunchExpandsDesktopEntry(testprogramrunner.TestProgramRunner):
"""Integration test for `gio launch` with field code %k in the Exec line.
This can be run when installed or uninstalled. When uninstalled, it
requires G_TEST_BUILDDIR and G_TEST_SRCDIR to be set.
The idea with this test harness is to test that the `gio launch` command
expands the `%k` field code in a desktop entry's Exec line to its location,
i.e. its absolute path.
"""
PROGRAM_NAME = "gio"
PROGRAM_TYPE = testprogramrunner.ProgramType.NATIVE
TEMPLATE = """
[Desktop Entry]
Type = Application
Name = Test
Exec = {python} -c 'print("%k")'
"""
def setUp(self):
super().setUp()
self.parent = Path(self.tmpdir.name).resolve()
self.folder = self.parent / "folder"
self.entry = self.folder / "desktop.entry"
self.sibling = self.parent / "sibling"
self.folder.mkdir(exist_ok=True, parents=True)
self.sibling.mkdir(exist_ok=True, parents=True)
with self.entry.open("w", encoding="utf-8") as fd:
fd.write(self.TEMPLATE.format(python=sys.executable))
def launchAndCheck(self, entry: Path, cwd: Path = None):
result = self.runTestProgram(["launch", str(entry)], cwd=str(cwd))
tests: Loosen string comparison assertion in gio-tool.py On BSD, the subprocess being spawned by `gio launch` ends up emitting debug output onto stdout, which confuses the strict string assertion in the test. Instead use a ‘contains’ assertion. Fixes this failure: ``` 348/385 glib:gio+no-valgrind / gio-tool.py ERROR 0.39s exit status 1 ――――――――――――――――――――――――――――――――――――― ✀ ――――――――――――――――――――――――――――――――――――― stderr: (test program exited with status code 1) ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― stdout: 12: UNKNOWN: --- stdout: 13: UNKNOWN: message: | stdout: 14: UNKNOWN: Traceback (most recent call last): stdout: 15: UNKNOWN: File "/var/tmp/gitlab_runner/builds/Ff4WDDRj/0/GNOME/glib/_build/../gio/tests/gio-tool.py", line 130, in test_absolute_from_folder stdout: 16: UNKNOWN: self.launchAndCheck(self.entry, cwd=self.folder) stdout: 17: UNKNOWN: File "/var/tmp/gitlab_runner/builds/Ff4WDDRj/0/GNOME/glib/_build/../gio/tests/gio-tool.py", line 126, in launchAndCheck stdout: 18: UNKNOWN: self.assertEqual(result.out, str(self.entry)) stdout: 19: UNKNOWN: AssertionError: '(gio launch:35500): GLib-GIO-DEBUG: 04:55[130 chars]ntry' != '/tmp/tmpa8oxxwvv/folder/desktop.entry' stdout: 20: UNKNOWN: - (gio launch:35500): GLib-GIO-DEBUG: 04:55:51.790: _g_io_module_get_default: Found default implementation local (GLocalVfs) for ‘gio-vfs’ stdout: 21: UNKNOWN: /tmp/tmpa8oxxwvv/folder/desktop.entry stdout: 22: UNKNOWN: ... ``` seen here: https://gitlab.gnome.org/GNOME/glib/-/jobs/5301812 Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2025-07-15 12:26:43 +01:00
self.assertIn(str(self.entry), result.out)
def test_absolute_from_folder(self):
"""Test with absolute path, with changing working directory to folder."""
self.launchAndCheck(self.entry, cwd=self.folder)
def test_absolute_from_parent(self):
"""Test with absolute path, with changing working directory to parent."""
self.launchAndCheck(self.entry, cwd=self.parent)
def test_absolute_from_sibling(self):
"""Test with absolute path, with changing working directory to sibling."""
self.launchAndCheck(self.entry, cwd=self.sibling)
def test_relative_from_folder(self):
"""Test with relative path, with changing working directory to folder."""
self.launchAndCheck(self.entry.relative_to(self.folder), cwd=self.folder)
def test_relative_from_parent(self):
"""Test with relative path, with changing working directory to parent."""
self.launchAndCheck(self.entry.relative_to(self.parent), cwd=self.parent)
def test_relative_from_sibling(self):
"""Test with relative path, with changing working directory to sibling."""
self.launchAndCheck(
Path("..") / self.entry.relative_to(self.parent), cwd=self.sibling
)
if __name__ == "__main__":
unittest.main(testRunner=taptestrunner.TAPTestRunner())