From 3e0a99a05953d0cde7bbf041a07779ae2bc299e9 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 1 Nov 2023 16:58:43 +0000 Subject: [PATCH] tests: Add a very basic test suite for gio-tool MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It gives nowhere near full coverage, but it’s something we can build on in future. Signed-off-by: Philip Withnall Helps: #3158 Helps: #2950 --- gio/meson.build | 2 +- gio/tests/gio-tool.py | 124 ++++++++++++++++++++++++++++++++++++++++++ gio/tests/meson.build | 4 ++ 3 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 gio/tests/gio-tool.py diff --git a/gio/meson.build b/gio/meson.build index 9f7c220f5..0eb4ca6a4 100644 --- a/gio/meson.build +++ b/gio/meson.build @@ -985,7 +985,7 @@ gio_tool_sources = [ 'gio-tool-tree.c', ] -executable('gio', gio_tool_sources, +gio_tool = executable('gio', gio_tool_sources, install : true, install_tag : 'bin', c_args : gio_c_args, diff --git a/gio/tests/gio-tool.py b/gio/tests/gio-tool.py new file mode 100644 index 000000000..b977eb102 --- /dev/null +++ b/gio/tests/gio-tool.py @@ -0,0 +1,124 @@ +#!/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 collections +import os +import shutil +import subprocess +import tempfile +import unittest + +import taptestrunner + + +Result = collections.namedtuple("Result", ("info", "out", "err")) + + +class TestGioTool(unittest.TestCase): + """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. + """ + + # Track the cwd, we want to back out to that to clean up our tempdir + cwd = "" + + def setUp(self): + self.timeout_seconds = 6 # seconds per test + self.tmpdir = tempfile.TemporaryDirectory() + self.cwd = os.getcwd() + os.chdir(self.tmpdir.name) + print("tmpdir:", self.tmpdir.name) + + ext = "" + if os.name == "nt": + ext = ".exe" + + if "G_TEST_BUILDDIR" in os.environ: + self.__gio = os.path.join( + os.environ["G_TEST_BUILDDIR"], + "..", + "gio" + ext, + ) + else: + self.__gio = shutil.which("gio" + ext) + print("gio:", self.__gio) + + def tearDown(self): + os.chdir(self.cwd) + self.tmpdir.cleanup() + + def runGio(self, *args): + argv = [self.__gio] + argv.extend(args) + print("Running:", argv) + + env = os.environ.copy() + env["LC_ALL"] = "C.UTF-8" + env["G_DEBUG"] = "fatal-warnings" + print("Environment:", env) + + # We want to ensure consistent line endings... + info = subprocess.run( + argv, + timeout=self.timeout_seconds, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=env, + universal_newlines=True, + ) + info.check_returncode() + out = info.stdout.strip() + err = info.stderr.strip() + + result = Result(info, out, err) + + print("Output:", result.out) + return result + + 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() + + +if __name__ == "__main__": + unittest.main(testRunner=taptestrunner.TAPTestRunner()) diff --git a/gio/tests/meson.build b/gio/tests/meson.build index c53e8790b..75fd9b5a8 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -181,6 +181,10 @@ python_tests = { 'suite': ['gdbus-codegen', 'slow'], 'timeout': 90, }, + 'gio-tool.py' : { + 'depends' : gio_tool, + 'can_fail' : host_system == 'windows', + }, } test_env = environment()