diff --git a/.gitignore b/.gitignore index 00ef136..bf17c05 100644 --- a/.gitignore +++ b/.gitignore @@ -28,8 +28,3 @@ /avocado-79.0.tar.gz /avocado-80.0.tar.gz /avocado-82.0.tar.gz -/avocado-92.0.tar.gz -/avocado-92.1.tar.gz -/avocado-92.1-python312.patch -/avocado-92.3.tar.gz -/avocado-112.0.tar.gz diff --git a/python-avocado.spec b/python-avocado.spec index 8dd8cf4..b05f121 100644 --- a/python-avocado.spec +++ b/python-avocado.spec @@ -9,10 +9,10 @@ %global gittar avocado-%{version}.tar.gz %else %if ! 0%{?commit:1} - %global commit e4ede79f097dcc1dbd30e43ffe3b7daf52d2204d + %global commit e97540793998c4f24a16000465dd7fdd213bf2b9 %endif %if ! 0%{?commit_date:1} - %global commit_date 20251010 + %global commit_date 20200911 %endif %global shortcommit %(c=%{commit};echo ${c:0:9}) %global gitrel .%{commit_date}git%{shortcommit} @@ -24,20 +24,18 @@ # the functional tests are time and resource sensitive and can # cause race conditions and random build failures. They are # enabled by default. -# You can disable them with rpmbuild ... --without tests -%bcond_without tests +%global with_tests 1 -# Only Fedora 36 and later have a suitable python3-resutlsdb_api -# package -%if 0%{?fedora} >= 36 +# resultsdb is not available for RHEL +%if ! 0%{?rhel} %global with_resultsdb 1 %else %global with_resultsdb 0 %endif Name: python-avocado -Version: 112.0 -Release: 1%{?gitrel}%{?dist} +Version: 82.0 +Release: 2%{?gitrel}%{?dist} Summary: Framework with tools and libraries for Automated Testing # Found licenses: # avocado/core/tapparser.py: MIT @@ -60,35 +58,23 @@ BuildRequires: python3-jinja2 BuildRequires: python3-lxml BuildRequires: python3-psutil BuildRequires: python3-setuptools -%if ! 0%{?rhel} -BuildRequires: python-aexpect -%endif %if %{with_resultsdb} BuildRequires: python3-resultsdb_api BuildRequires: python3-pycdlib %endif -%if %{with tests} -BuildRequires: python3-jsonschema -%if ! 0%{?rhel} >= 9 +%if 0%{?with_tests} BuildRequires: genisoimage -%endif BuildRequires: libcdio BuildRequires: psmisc %if ! 0%{?rhel} BuildRequires: perl-Test-Harness -BuildRequires: python3-xmlschema -BuildRequires: ansible-core %endif BuildRequires: glibc-all-langpacks BuildRequires: python3-netifaces BuildRequires: python3-yaml -BuildRequires: nmap-ncat -BuildRequires: gcc -BuildRequires: gdb -BuildRequires: gdb-gdbserver %endif -# with tests +# with_tests %description Avocado is a set of tools and libraries (what people call @@ -98,12 +84,10 @@ these days a framework) to perform automated testing. %prep %setup -q -n avocado-%{gitref} %if 0%{?rhel} -sed -e 's/"PyYAML>=4.2b2"/"PyYAML>=3.12"/' -i optional_plugins/varianter_yaml_to_mux/setup.py -%endif -%if 0%{?fedora} >= 42 -sed -e '/"markupsafe<3.0.0"/d' -i optional_plugins/html/setup.py -sed -e '/"markupsafe<3.0.0"/d' -i optional_plugins/ansible/setup.py +sed -e "s/'PyYAML>=4.2b2'/'PyYAML>=3.12'/" -i optional_plugins/varianter_yaml_to_mux/setup.py %endif +# drop unnecessary install requirement +sed -e "s/'markupsafe<2.0.0', //" -i optional_plugins/html/setup.py %build %py3_build @@ -118,14 +102,12 @@ popd pushd optional_plugins/varianter_yaml_to_mux %py3_build popd +pushd optional_plugins/loader_yaml + %py3_build +popd pushd optional_plugins/golang %py3_build popd -%if ! 0%{?rhel} -pushd optional_plugins/ansible - %py3_build -popd -%endif pushd optional_plugins/varianter_pict %py3_build popd @@ -135,33 +117,22 @@ popd pushd optional_plugins/result_upload %py3_build popd -pushd optional_plugins/mail +pushd optional_plugins/glib %py3_build popd -%if ! 0%{?rhel} -pushd optional_plugins/spawner_remote - %py3_build -popd -%endif rst2man man/avocado.rst man/avocado.1 %install %py3_install for exe in \ avocado \ + avocado-runner \ avocado-runner-noop \ - avocado-runner-dry-run \ + avocado-runner-exec \ avocado-runner-exec-test \ avocado-runner-python-unittest \ avocado-runner-avocado-instrumented \ avocado-runner-tap \ - avocado-runner-asset \ - avocado-runner-package \ - avocado-runner-pip \ - avocado-runner-podman-image \ - avocado-runner-sysinfo \ - avocado-runner-vmimage \ - avocado-external-runner \ avocado-software-manager do mv %{buildroot}%{_bindir}/$exe %{buildroot}%{_bindir}/$exe-%{python3_version} @@ -173,6 +144,9 @@ done rm -rf %{buildroot}%{python3_sitelib}/avocado/etc # ditto for libexec files rm -rf %{buildroot}%{python3_sitelib}/avocado/libexec +# adjust permissions for file containing shebang line needed for +# spawning tasks in podman containers +chmod -c +x %{buildroot}%{python3_sitelib}/avocado/core/nrunner.py pushd optional_plugins/html %py3_install popd @@ -184,14 +158,12 @@ popd pushd optional_plugins/varianter_yaml_to_mux %py3_install popd +pushd optional_plugins/loader_yaml + %py3_install +popd pushd optional_plugins/golang %py3_install popd -%if ! 0%{?rhel} -pushd optional_plugins/ansible - %py3_install -popd -%endif pushd optional_plugins/varianter_pict %py3_install popd @@ -201,14 +173,9 @@ popd pushd optional_plugins/result_upload %py3_install popd -pushd optional_plugins/mail +pushd optional_plugins/glib %py3_install popd -%if ! 0%{?rhel} -pushd optional_plugins/spawner_remote - %py3_install -popd -%endif # cleanup plugin test cruft rm -rf %{buildroot}%{python3_sitelib}/tests mkdir -p %{buildroot}%{_sysconfdir}/avocado @@ -232,12 +199,13 @@ cp -r examples/plugins %{buildroot}%{_docdir}/avocado/plugins cp -r examples/tests %{buildroot}%{_docdir}/avocado/tests cp -r examples/varianter_cit %{buildroot}%{_docdir}/avocado/varianter_cit cp -r examples/varianter_pict %{buildroot}%{_docdir}/avocado/varianter_pict +cp -r examples/wrappers %{buildroot}%{_docdir}/avocado/wrappers cp -r examples/yaml_to_mux %{buildroot}%{_docdir}/avocado/yaml_to_mux -mkdir -p %{buildroot}%{_datarootdir}/avocado -mv %{buildroot}%{python3_sitelib}/avocado/schemas %{buildroot}%{_datarootdir}/avocado +cp -r examples/yaml_to_mux_loader %{buildroot}%{_docdir}/avocado/yaml_to_mux_loader find %{buildroot}%{_docdir}/avocado -type f -name '*.py' -exec chmod -c -x {} ';' -%if %{with tests} + +%if 0%{?with_tests} %check # LANG: to make the results predictable, we pin the language # that is used during test execution. @@ -248,7 +216,7 @@ find %{buildroot}%{_docdir}/avocado -type f -name '*.py' -exec chmod -c -x {} '; PYTHONPATH=%{buildroot}%{python3_sitelib}:. \ LANG=en_US.UTF-8 \ AVOCADO_CHECK_LEVEL=0 \ - %{python3} selftests/check.py --skip static-checks --disable-plugin-checks robot + %{python3} selftests/run %endif @@ -274,12 +242,15 @@ these days a framework) to perform automated testing. %{_bindir}/avocado-%{python3_version} %{_bindir}/avocado-3 %{_bindir}/avocado +%{_bindir}/avocado-runner-%{python3_version} +%{_bindir}/avocado-runner-3 +%{_bindir}/avocado-runner %{_bindir}/avocado-runner-noop-%{python3_version} %{_bindir}/avocado-runner-noop-3 %{_bindir}/avocado-runner-noop -%{_bindir}/avocado-runner-dry-run-%{python3_version} -%{_bindir}/avocado-runner-dry-run-3 -%{_bindir}/avocado-runner-dry-run +%{_bindir}/avocado-runner-exec-%{python3_version} +%{_bindir}/avocado-runner-exec-3 +%{_bindir}/avocado-runner-exec %{_bindir}/avocado-runner-exec-test-%{python3_version} %{_bindir}/avocado-runner-exec-test-3 %{_bindir}/avocado-runner-exec-test @@ -292,30 +263,9 @@ these days a framework) to perform automated testing. %{_bindir}/avocado-runner-tap-%{python3_version} %{_bindir}/avocado-runner-tap-3 %{_bindir}/avocado-runner-tap -%{_bindir}/avocado-runner-asset-%{python3_version} -%{_bindir}/avocado-runner-asset-3 -%{_bindir}/avocado-runner-asset -%{_bindir}/avocado-runner-package-%{python3_version} -%{_bindir}/avocado-runner-package-3 -%{_bindir}/avocado-runner-package -%{_bindir}/avocado-runner-pip-%{python3_version} -%{_bindir}/avocado-runner-pip-3 -%{_bindir}/avocado-runner-pip -%{_bindir}/avocado-runner-podman-image-%{python3_version} -%{_bindir}/avocado-runner-podman-image-3 -%{_bindir}/avocado-runner-podman-image -%{_bindir}/avocado-runner-sysinfo-%{python3_version} -%{_bindir}/avocado-runner-sysinfo-3 -%{_bindir}/avocado-runner-sysinfo -%{_bindir}/avocado-runner-vmimage-%{python3_version} -%{_bindir}/avocado-runner-vmimage-3 -%{_bindir}/avocado-runner-vmimage %{_bindir}/avocado-software-manager-%{python3_version} %{_bindir}/avocado-software-manager-3 %{_bindir}/avocado-software-manager -%{_bindir}/avocado-external-runner-%{python3_version} -%{_bindir}/avocado-external-runner-3 -%{_bindir}/avocado-external-runner %package -n python-avocado-common @@ -336,10 +286,6 @@ Common files (such as configuration) for the Avocado Testing Framework. %dir %{_sysconfdir}/avocado/scripts/job %dir %{_sysconfdir}/avocado/scripts/job/pre.d %dir %{_sysconfdir}/avocado/scripts/job/post.d -%dir %{_sharedstatedir}/avocado/data -%dir %{_datarootdir}/avocado -%dir %{_datarootdir}/avocado/schemas -%{_datarootdir}/avocado/schemas/* %config(noreplace) %{_sysconfdir}/avocado/sysinfo/commands %config(noreplace) %{_sysconfdir}/avocado/sysinfo/files %config(noreplace) %{_sysconfdir}/avocado/sysinfo/profilers @@ -393,6 +339,20 @@ defined in a yaml file(s). %{python3_sitelib}/avocado_framework_plugin_varianter_yaml_to_mux-%{version}-py%{python3_version}.egg-info +%package -n python3-avocado-plugins-loader-yaml +Summary: Avocado plugin that loads tests from YAML files +License: GPLv2+ +Requires: python3-avocado-plugins-varianter-yaml-to-mux == %{version}-%{release} + +%description -n python3-avocado-plugins-loader-yaml +Can be used to produce a test suite from definitions in a YAML file, +similar to the one used in the yaml_to_mux varianter plugin. + +%files -n python3-avocado-plugins-loader-yaml +%{python3_sitelib}/avocado_loader_yaml/ +%{python3_sitelib}/avocado_framework_plugin_loader_yaml-%{version}-py%{python3_version}.egg-info + + %package -n python3-avocado-plugins-golang Summary: Avocado plugin for execution of golang tests License: GPLv2+ @@ -406,25 +366,6 @@ also run them. %files -n python3-avocado-plugins-golang %{python3_sitelib}/avocado_golang/ %{python3_sitelib}/avocado_framework_plugin_golang-%{version}-py%{python3_version}.egg-info -%{_bindir}/avocado-runner-golang - - -%if ! 0%{?rhel} -%package -n python3-avocado-plugins-ansible -Summary: Avocado Ansible Dependency plugin -License: GPLv2+ -Requires: python3-avocado == %{version}-%{release} -Requires: ansible-core - -%description -n python3-avocado-plugins-ansible -Adds to Avocado the ability to use ansible modules as dependecies for -tests. - -%files -n python3-avocado-plugins-ansible -%{python3_sitelib}/avocado_ansible* -%{python3_sitelib}/avocado_framework_plugin_ansible* -%{_bindir}/avocado-runner-ansible-module -%endif %package -n python3-avocado-plugins-varianter-pict @@ -469,32 +410,20 @@ a dedicated sever. %{python3_sitelib}/avocado_result_upload/ %{python3_sitelib}/avocado_framework_plugin_result_upload-%{version}-py%{python3_version}.egg-info -%package -n python3-avocado-plugins-result-mail -Summary: Avocado Mail Notification for Jobs + +%package -n python3-avocado-plugins-glib +Summary: Avocado plugin for execution of GLib Test Framework tests License: GPLv2+ Requires: python3-avocado == %{version}-%{release} -%description -n python3-avocado-plugins-result-mail -The Mail result plugin enables you to receive email notifications -for job start and completion events within the Avocado testing framework. +%description -n python3-avocado-plugins-glib +This optional plugin is intended to list and run tests written in the +GLib Test Framework. -%files -n python3-avocado-plugins-result-mail -%{python3_sitelib}/avocado_result_mail* -%{python3_sitelib}/avocado_framework_plugin_result_mail* +%files -n python3-avocado-plugins-glib +%{python3_sitelib}/avocado_glib/ +%{python3_sitelib}/avocado_framework_plugin_glib-%{version}-py%{python3_version}.egg-info -%if ! 0%{?rhel} -%package -n python3-avocado-plugins-spawner-remote -Summary: Avocado Plugin to spawn tests on a remote host -License: GPLv2+ -Requires: python3-avocado == %{version}-%{release} - -%description -n python3-avocado-plugins-spawner-remote -This optional plugin is intended to spawn tests on a remote host. - -%files -n python3-avocado-plugins-spawner-remote -%{python3_sitelib}/avocado_spawner_remote* -%{python3_sitelib}/avocado_framework_plugin_spawner_remote* -%endif %package -n python-avocado-examples Summary: Avocado Test Framework Example Tests @@ -515,7 +444,9 @@ examples of how to write tests on your own. %{_docdir}/avocado/tests %{_docdir}/avocado/varianter_cit %{_docdir}/avocado/varianter_pict +%{_docdir}/avocado/wrappers %{_docdir}/avocado/yaml_to_mux +%{_docdir}/avocado/yaml_to_mux_loader %package -n python-avocado-bash @@ -538,93 +469,6 @@ Again Shell code (and possibly other similar shells). %changelog -* Fri Oct 10 2025 Cleber Rosa - 112.0-1 -- Sync with upstream release 112.0 -- Removed python3-elementpath build requirement -- Made the remote spawner a proper sub package -- Packaged JSON schema files -- Introduced new sub package for mail plugin -- Removed the pinning of markupsafe on Fedora 42 and later -- Packaged avocado-runner-pip -- Packaged avocado-runner-vmimage -- Provide requirements for running the functional test - nrunner.py:TaskRunStatusService.test_task_status_service_lost -- Require gcc, gdb and gdb-gdbserver for tests - -* Fri Jul 25 2025 Fedora Release Engineering - 92.3-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Tue Jun 03 2025 Python Maint - 92.3-5 -- Rebuilt for Python 3.14 - -* Mon Jan 20 2025 Miro Hrončok - 92.3-4 -- Loosen the PyYAML version requirement in python3-avocado-plugins-varianter-yaml-to-mux - -* Mon Jan 20 2025 Cleber Rosa - 92.3-3 -- convert remaining licenses to SPDX - -* Sat Jan 18 2025 Fedora Release Engineering - 92.3-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Mon Aug 19 2024 Cleber Rosa - 92.3-1 -- Updated to 92.3 -- Support building and running under Python 3.13 for F42 -- Removed patch from 92.1 as its present in 92.3 - -* Fri Jul 26 2024 Miroslav Suchý - 92.1-8 -- convert license to SPDX - -* Fri Jul 19 2024 Fedora Release Engineering - 92.1-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Fri Jun 07 2024 Python Maint - 92.1-6 -- Rebuilt for Python 3.13 - -* Mon Jan 29 2024 Fedora Release Engineering - 92.1-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Fri Jan 26 2024 Fedora Release Engineering - 92.1-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Sun Jan 21 2024 Fedora Release Engineering - 92.1-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Fri Jul 21 2023 Fedora Release Engineering - 92.1-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Mon Jul 17 2023 Cleber Rosa - 92.1-1 -- Updated to 92.1 -- Support building and running under Python 3.12 for F39 - -* Wed Jun 14 2023 Python Maint - 92.0-3 -- Rebuilt for Python 3.12 - -* Fri Jan 20 2023 Fedora Release Engineering - 92.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Tue Aug 9 2022 Cleber Rosa - 92.0-1 -- Use selftests/check.py job instead of more limited selftests/run -- Included avocado-runner-sysinfo, avocado-runner-requirement-package, - avocado-runner-requirement-asset and avocado-runner-dry-run and - avocado-runner-golang executables -- Removed avocado-runner-exec executable -- Removed loader_yaml and glib plugin packages - -* Fri Jul 22 2022 Fedora Release Engineering - 82.0-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Tue Jun 21 2022 Python Maint - 82.0-6 -- Rebuilt for Python 3.11 - -* Fri Jan 21 2022 Fedora Release Engineering - 82.0-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Wed Jul 28 2021 Merlin Mathesius - 82.0-4 -- Loosen jinja2 version requirement to fix FTBFS in Rawhide - -* Fri Jul 23 2021 Fedora Release Engineering - 82.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - * Thu Mar 18 2021 Merlin Mathesius - 82.0-2 - Drop obsolete packages from BuildRequires - Generate man page directly using 'rst2man' rather than requiring 'make' diff --git a/sources b/sources index 6494afc..4721c3f 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (avocado-112.0.tar.gz) = 1872eda730f5cd28f0562732464ce14b2c7731cedb298fcc4b093a04235d26cc5e3db7f92c3ae3edcd6104ad2db4fce66fa7a6148da754e4bdb8120fa12a75a3 +SHA512 (avocado-82.0.tar.gz) = 099ab131b2b941602550e71507e4ca517d5d2cd5152b255edace0473c9de93aac8163a61689414b5b58f9211f58981c3c30c1c3ca8a191283f609722ce07f173 diff --git a/tests/gdbtest.py b/tests/gdbtest.py index c0cdc55..d814fa5 100755 --- a/tests/gdbtest.py +++ b/tests/gdbtest.py @@ -1,7 +1,14 @@ +#!/usr/bin/env python + import os +from six.moves import xrange as range + from avocado import Test -from avocado.utils import gdb, genio, process +from avocado import main +from avocado.utils import gdb +from avocado.utils import genio +from avocado.utils import process class GdbTest(Test): @@ -25,22 +32,17 @@ class GdbTest(Test): "-auto-debug-it"] def setUp(self): - self.return99_binary_path = os.path.join(self.teststmpdir, 'return99') - if not os.path.exists(self.return99_binary_path): - return99_source_path = self.get_data('return99.c') - if return99_source_path is None: - self.cancel('Test is missing data file "return99.c"') - process.system(f'gcc -O0 -g {return99_source_path} -o {self.return99_binary_path}') - - self.segfault_binary_path = os.path.join(self.teststmpdir, 'segfault') - if not os.path.exists(self.segfault_binary_path): - segfault_source_path = self.get_data('segfault.c') - if segfault_source_path is None: - self.cancel('Test is missing data file "segfault.c"') - process.system(f'gcc -O0 -g {segfault_source_path} -o {self.segfault_binary_path}') + return99_source_path = os.path.join(self.datadir, 'return99.c') + segfault_source_path = os.path.join(self.datadir, 'segfault.c') + self.return99_binary_path = os.path.join(self.outputdir, 'return99') + process.system('gcc -O0 -g %s -o %s' % (return99_source_path, + self.return99_binary_path)) + self.segfault_binary_path = os.path.join(self.outputdir, 'segfault') + process.system('gcc -O0 -g %s -o %s' % (segfault_source_path, + self.segfault_binary_path)) @staticmethod - def is_process_alive(process): # pylint: disable=W0621 + def is_process_alive(process): """ Checks if a process is still alive @@ -71,14 +73,14 @@ class GdbTest(Test): g = gdb.GDB() self.log.info("Testing existing (valid) GDB commands using raw commands") for cmd in self.VALID_CMDS: - info_cmd = f"-info-gdb-mi-command {cmd[1:]}" + info_cmd = "-info-gdb-mi-command %s" % cmd[1:] r = g.cmd(info_cmd) self.assertEqual(r.result.result.command.exists, 'true') self.log.info("Testing non-existing (invalid) GDB commands using raw " "commands") for cmd in self.INVALID_CMDS: - info_cmd = f"-info-gdb-mi-command {cmd[1:]}" + info_cmd = "-info-gdb-mi-command %s" % cmd[1:] r = g.cmd(info_cmd) self.assertEqual(r.result.result.command.exists, 'false') @@ -103,7 +105,7 @@ class GdbTest(Test): self.log.info("Testing that GDB loads a file and sets a breakpoint") g = gdb.GDB() - file_cmd = f"-file-exec-and-symbols {self.return99_binary_path}" + file_cmd = "-file-exec-and-symbols %s" % self.return99_binary_path r = g.cmd(file_cmd) self.assertEqual(r.result.class_, 'done') @@ -143,7 +145,7 @@ class GdbTest(Test): self.log.info("Testing that a core dump will be generated") g = gdb.GDB() - file_cmd = f"-file-exec-and-symbols {self.segfault_binary_path}" + file_cmd = "-file-exec-and-symbols %s" % self.segfault_binary_path r = g.cmd(file_cmd) self.assertEqual(r.result.class_, 'done') @@ -154,12 +156,12 @@ class GdbTest(Test): other_messages = g.read_until_break() core_path = None for msg in other_messages: - parsed_msg = gdb.parse_mi(msg.decode()) + parsed_msg = gdb.parse_mi(msg) if (hasattr(parsed_msg, 'class_') and (parsed_msg.class_ == 'stopped') and (parsed_msg.result.signal_name == 'SIGSEGV')): - core_path = f"{self.segfault_binary_path}.core" - gcore_cmd = f'gcore {core_path}' + core_path = "%s.core" % self.segfault_binary_path + gcore_cmd = 'gcore %s' % core_path gcore_cmd = gdb.encode_mi_cli(gcore_cmd) r = g.cmd(gcore_cmd) self.assertEqual(r.result.class_, 'done') @@ -189,14 +191,14 @@ class GdbTest(Test): # Do 100 cycle of target (kind of connects) and disconnects for _ in range(0, 100): - cmd = f'-target-select extended-remote :{s.port}' + cmd = '-target-select extended-remote :%s' % s.port r = g.cmd(cmd) self.assertEqual(r.result.class_, 'connected') r = g.cmd('-target-disconnect') self.assertEqual(r.result.class_, 'done') # manual server shutdown - cmd = f'-target-select extended-remote :{s.port}' + cmd = '-target-select extended-remote :%s' % s.port r = g.cmd(cmd) self.assertEqual(r.result.class_, 'connected') r = g.cli_cmd('monitor exit') @@ -232,15 +234,15 @@ class GdbTest(Test): s = gdb.GDBServer() g = gdb.GDB() - cmd = f'-file-exec-and-symbols {self.return99_binary_path}' + cmd = '-file-exec-and-symbols %s' % self.return99_binary_path r = g.cmd(cmd) self.assertEqual(r.result.class_, 'done') - cmd = f'set remote exec-file {self.return99_binary_path}' + cmd = 'set remote exec-file %s' % self.return99_binary_path r = g.cmd(cmd) self.assertEqual(r.result.class_, 'done') - cmd = f"-break-insert {'main'}" + cmd = "-break-insert %s" % 'main' r = g.cmd(cmd) self.assertEqual(r.result.class_, 'done') @@ -248,7 +250,7 @@ class GdbTest(Test): other_messages = g.read_until_break() for msg in other_messages: - parsed_msg = gdb.parse_mi(msg.decode()) + parsed_msg = gdb.parse_mi(msg) if (hasattr(parsed_msg, 'class_') and parsed_msg.class_ == 'stopped' and parsed_msg.result.reason == 'breakpoint-hit'): @@ -276,8 +278,7 @@ class GdbTest(Test): c1 = gdb.GDB() c1.connect(s.port) c2 = gdb.GDB() - with self.assertRaises(gdb.UnexpectedResponseError): - c2.connect(s.port) + self.assertRaises(ValueError, c2.connect, s.port) s.exit() def test_server_exit(self): @@ -309,6 +310,43 @@ class GdbTest(Test): server_instances[i].exit() self.assertFalse(self.is_process_alive(server_instances[i].process)) + def test_interactive(self): + """ + Tests avocado's GDB plugin features + + If GDB command line options are given, `--gdb-run-bin=return99` for + this particular test, the test will stop at binary main() function. + """ + self.log.info('Testing GDB interactivity') + process.run(self.return99_binary_path, ignore_status=True) + + def test_interactive_args(self): + """ + Tests avocado's GDB plugin features with an executable and args + + If GDB command line options are given, `--gdb-run-bin=return99` for + this particular test, the test will stop at binary main() function. + + This test uses `process.run()` without an `ignore_status` parameter + """ + self.log.info('Testing GDB interactivity with arguments') + result = process.run("%s 0" % self.return99_binary_path) + self.assertEqual(result.exit_status, 0) + + def test_exit_status(self): + """ + Tests avocado's GDB plugin features + + If GDB command line options are given, `--gdb-run-bin=return99` for + this particular test, the test will stop at binary main() function. + """ + self.log.info('Testing process exit statuses') + for arg, exp in [(-1, 255), (8, 8)]: + self.log.info('Expecting exit status "%s"', exp) + cmd = "%s %s" % (self.return99_binary_path, arg) + result = process.run(cmd, ignore_status=True) + self.assertEqual(result.exit_status, exp) + def test_server_stderr(self): self.log.info('Testing server stderr collection') s = gdb.GDBServer() @@ -316,7 +354,7 @@ class GdbTest(Test): self.assertTrue(os.path.exists(s.stderr_path)) stderr_lines = genio.read_all_lines(s.stderr_path) - listening_line = f"Listening on port {s.port}" + listening_line = "Listening on port %s" % s.port self.assertIn(listening_line, stderr_lines) def test_server_stdout(self): @@ -334,14 +372,28 @@ class GdbTest(Test): stdout_lines = genio.read_all_lines(s.stdout_path) self.assertIn("return 99", stdout_lines) - @staticmethod - def test_remote(): + def test_interactive_stdout(self): + """ + Tests avocado's GDB plugin features + + If GDB command line options are given, `--gdb-run-bin=return99` for + this particular test, the test will stop at binary main() function. + """ + self.log.info('Testing GDB interactivity') + result = process.run(self.return99_binary_path, ignore_status=True) + self.assertIn("return 99\n", result.stdout) + + def test_remote(self): """ Tests GDBRemote interaction with a GDBServer """ s = gdb.GDBServer() r = gdb.GDBRemote('127.0.0.1', s.port) r.connect() - r.cmd(b"qSupported") - r.cmd(b"qfThreadInfo") + r.cmd("qSupported") + r.cmd("qfThreadInfo") s.exit() + + +if __name__ == '__main__': + main()