Commit graph

1186 commits

Author SHA1 Message Date
ed7398f2f7
Add support for creating toolboxes from Containerfile
Signed-off-by: William Brawner <me@wbrawner.com>
2023-11-10 22:33:58 -07:00
Debarshi Ray
f28ad7749f test/system: Unbreak the manual page checks with GNU roff >= 1.23
GNU roff 1.23 stopped remapping unescaped Hyphen-Minus (ie., - or 0x2D)
characters in the input to Hyphen-Minus in the output.  Instead, it
follows the specified behaviour of converting unescaped Hyphen-Minus
characters in the input to Hyphen (ie., ‐ or 0x2010) in the output.  To
get Hyphen-Minus characters in the output, one needs to escape the
Hyphen-Minus with a backslash (ie., \-) in the input [1].

Therefore, the command line options documented in the manuals are no
longer prefixed with the Hyphen-Minus character that's needed to
ctually use them.  This breaks copying and pasting from the manuals and
searching within them.

Unfortunately, escaping the Hyphen-Minus characters in Markdown doesn't
have the intended effect of having Hyphen-Minus in the generated manual
pages [2].  Therefore, this is worked around by having the tests check
for both Hyphen-Minus and Hyphen.

Note that some operating system distributions, like Debian, have
reverted this change from GNU roff, but others haven't.  So, unless it
can be guaranteed that the manuals will always have Hyphen-Minus
regardless of which GNU roff version or variant is being used, the tests
need to check for both.

[1] https://lwn.net/Articles/947941/
    https://lists.gnu.org/archive/html/info-gnu/2023-07/msg00001.html
    https://git.savannah.gnu.org/cgit/groff.git/tree/PROBLEMS?h=1.23.0#n82

[2] https://github.com/cpuguy83/go-md2man/issues/101

https://github.com/containers/toolbox/pull/1398
2023-11-02 15:57:52 +01:00
Debarshi Ray
651995e8f1 gen-docs-list: Use En Dash for the date range for consistency
https://github.com/containers/toolbox/pull/1398
2023-11-02 15:57:49 +01:00
Debarshi Ray
154156d860 images/fedora: Ensure that documentation and translations are present
This should finally ensure that the fedora-toolbox image doesn't have
any package that had its content, such as documentation or translations,
stripped out by the fedora base image.

Until now, missing-docs had a hand-maintained list of packages that had
their content stripped out by the fedora base image.  These packages are
reinstalled when building the fedora-toolbox image to restore the lost
content.  Unfortunately, this list was incomplete because it was only
updated when someone noticed that something is missing.

Now, the list is generated with:
  $ rpm --all --query --state --queryformat "PACKAGE: %{NAME}\n"

... to ensure that it's always complete.

The existing built-in test to ensure that the desired files are actually
present in the final image was extended to cover some of those that were
absent.  A new built-in test, based on the above rpm(1) command, was
added as a fallback to ensure that the final image doesn't have any
package with missing content.

Only the images for currently maintained Fedoras (ie., 37, 38 and 39)
were updated.

As suggested by Brian Campbell.

https://github.com/containers/toolbox/issues/603
2023-11-01 14:59:04 +01:00
Debarshi Ray
9b5313e5a7 images: Ensure that the useradd(8), etc. manuals are available
The shadow-utils package has always been part of the fedora base image.
It's explicitly listed in extra-packages as a safeguard against losing
useradd(8) and usermod(8) by mistake because they are needed by the
entry point of a Toolbx container [1].  Hence, the need to restore the
shadow-utils documentation that was stripped out in the base image.

Only the images for currently maintained Fedoras (ie., 37, 38 and 39)
were updated.

[1] Commit c6772f0f11
    https://github.com/containers/toolbox/commit/c6772f0f112e8004

https://github.com/containers/toolbox/pull/1394
2023-10-27 20:09:51 +02:00
Debarshi Ray
c7665d3476 images: Unbreak the tests for Fedora 37
The Korean translations for the psmisc manuals were only added in psmisc
23.6 [1], while Fedora 37 has psmisc 23.4.  This led to:
  STEP 16/20: RUN rm /extra-packages
  STEP 17/20: COPY ensure-files /
  STEP 18/20: RUN ret_val=0;   while read file; do     if ! compgen ...
  /usr/share/man/ko/man1/pstree.1*: No such file or directory
  Error: building at STEP "RUN ret_val=0;   while read file; do...":
    while running runtime: exit status 1

Fallout from e41d920dd9

[1] psmisc commit 3098e641dc1ddb21
    https://gitlab.com/psmisc/psmisc/-/commit/3098e641dc1ddb21

[2] https://src.fedoraproject.org/rpms/psmisc/tree/f37

https://github.com/containers/toolbox/pull/1394
2023-10-27 20:09:46 +02:00
Debarshi Ray
41aba93e29 images: Update the tests for Fedora 39
The translations for the RPM manuals were removed upstream during the
RPM 4.19 development cycle [1].  So, replace them with rpm2cpio(8),
which is another popular command shipped by the rpm package.

[1] RPM commit 4df74a9644b18136
    https://github.com/rpm-software-management/rpm/commit/4df74a9644b18136
    https://github.com/rpm-software-management/rpm/pull/2245

https://github.com/containers/toolbox/pull/1391
2023-10-25 19:53:02 +02:00
Debarshi Ray
e41d920dd9 images: Add psmisc to Fedora 37, 38 and 39
It's currently being pulled in as a dependency of iproute.  However,
since it's explicitly mentioned in the list of default packages on
Fedora Silverblue and Workstation [1], it should be mentioned here too.

The psmisc package marks the translations for its manuals with %lang().
Therefore, it's a very good example for testing that the fedora-toolbox
image is localized just like Fedora Silverblue and Workstation.

This is unlike the xz package, whose translations for manuals were added
to the tests recently [2].  The xz package doesn't mark its translated
manuals with %lang() [3], which means that they are going to get
installed regardless of whether RPM has been configured to not install
localization files or not.  eg., through the %_install_langs macro.  So,
they aren't a good candidate for the tests until this is fixed.

[1] fedora-comps commit e4ed54dfcc497fd0
    https://pagure.io/fedora-comps/c/e4ed54dfcc497fd0
    https://pagure.io/fedora-comps/pull-request/379

[2] Commit 20188a097a
    https://github.com/containers/toolbox/commit/20188a097a1a7a16
    https://github.com/containers/toolbox/pull/1384

[3] https://src.fedoraproject.org/rpms/xz/pull-request/10

https://github.com/containers/toolbox/pull/1390
2023-10-19 18:31:09 +02:00
Debarshi Ray
cb4e5dd52d playbooks: Show the go-md2man(1) version
Ansible's built-in 'package' module doesn't show any details when
installing the RPMs.  All that can be seen is:
  TASK [Install RPM packages]
  fedora-rawhide | changed

Therefore, there's no way to know what version of the packages got
installed.

In this case, not knowing the go-md2man(1) version being used by the CI
makes it difficult to know why the tests are failing on Fedora Rawhide
and Fedora 39 with:
  not ok 3 help: Command 'help' in 177ms
  # (from function `assert_line' in file
       test/system/libs/bats-assert/src/assert.bash, line 479,
  #  in test file test/system/002-help.bats, line 48)
  #   `assert_line --index 0 --partial "toolbox(1)"' failed
  # /usr/bin/man
  #
  # -- line does not contain substring --
  # index     : 0
  # substring : toolbox(1)
  # line      : troff:<standard input>:33: warning: cannot select font
                  'C'
  # --
  #

It could be either because the CI is still using an older version of
go-md2man(1) [1,2], or that there's some other problem.

[1] Fedora golang-github-cpuguy83-md2man commit 117806d50e401c19
    https://src.fedoraproject.org/rpms/golang-github-cpuguy83-md2man/c/117806d50e401c19
    https://src.fedoraproject.org/rpms/golang-github-cpuguy83-md2man/pull-request/3

[2] go-md2man commit d85280db9b54b574
    https://github.com/cpuguy83/go-md2man/commit/d85280db9b54b574
    https://github.com/cpuguy83/go-md2man/issues/99

https://github.com/containers/toolbox/pull/1386
2023-10-14 00:20:22 +02:00
Debarshi Ray
9ec02f01b2 test/system: Shorten the names of the tests and use consistent wording
Currently, some of the names of the tests were too long, and had
inconsistent and verbose wording.  This made it difficult to look at
them and get a gist of all the scenarios being tested.  The names are
like headings.  They shouldn't be too long, should capture the primary
objective of the test and be consistent in their wording.

Note that the term 'usage screen' was particularly confusing.  Prior to
commit 3dc106e10a, 'usage screen' in the names of the tests also
referred to the very brief listing of the commands and options that's
shown by 'toolbox help' and 'toolbox --help' in the absence of man(1).
In the context of this change, the term referred to the brief two line
error message that's shown when an unknown command or flag is used.  So,
it will be good to not use it anymore.

https://github.com/containers/toolbox/pull/1386
2023-10-12 15:08:52 +02:00
Debarshi Ray
fd5b9b5975 test/system: Use the same checks for the toolbox(1) manual
... for both 'toolbox help' and 'toolbox --help'.

https://github.com/containers/toolbox/pull/1386
2023-10-12 13:38:40 +02:00
Debarshi Ray
e7f729fb24 test/system: Check the line count in the standard error & output streams
https://github.com/containers/toolbox/pull/1386
2023-10-12 13:18:34 +02:00
Debarshi Ray
d0b9c6ac04 test/system: Ensure that error messages go to the standard error stream
Currently, there's no way to get assert_line to use the stderr_lines
array [1].  This is worked around by assigning stderr_lines to the
'lines' array.

[1] https://github.com/bats-core/bats-assert/issues/42

https://github.com/containers/toolbox/pull/1386
2023-10-12 13:18:34 +02:00
Debarshi Ray
3dc106e10a test/system: Clarify misleading 'toolbox --help' test
Commit 5e63e9ec9b added a 'help' command to show the toolbox(1)
manual or a manual page for a specific command, and made the --help flag
identical to it.  Therefore it's misleading to say that the --help flag
should show the usage screen.  The usage screen is a brief listing of
the commands and options, which isn't the same thing as the more
detailed manuals.

Later, after this test was written, commit 40fc1689a3 added a
fallback for host operating systems without man(1), like Fedora CoreOS,
that would show a very brief usage screen with only the most common
commands.

To make it more confusing, the test was checking for a string that's
common to both the toolbox(1) manual and the fallback brief usage screen
that might be shown by 'toolbox --help'.  This meant that it was neither
able to distinguish between the code paths nor ensure that they were
working as intended.

This was resolved by adapting the existing 'toolbox --help' test to
strictly ensure that it's showing the toolbox(1) manual when man(1) is
present, and by adding a new test to strictly ensure that it's showing
the fallback brief usage screen when man(1) is absent.

Until Bats 1.10.0, 'run --keep-empty-lines' had a bug where it counted
the trailing newline on the last line as a separate line [1].  However,
Bats 1.10.0 is only available in Fedora >= 39 and is absent from Fedoras
37 and 38.

Fallout from b27795a03e

[1] Bats commit 6648e2143bffb933
    https://github.com/bats-core/bats-core/commit/6648e2143bffb933
    https://github.com/bats-core/bats-core/issues/708

https://github.com/containers/toolbox/pull/1386
2023-10-12 13:18:34 +02:00
Debarshi Ray
29ed6f8ef0 test/system: Keep empty lines to prevent missing and spurious newlines
https://github.com/containers/toolbox/pull/1386
2023-10-12 13:18:34 +02:00
Debarshi Ray
b8138e0b54 .zuul: Try to prevent the CI from timing out on Fedora
With the recent expansion of the test suite, it's necessary to increase
the timeout for all Fedora nodes to prevent the CI from timing out.

https://github.com/containers/toolbox/pull/1387
2023-10-12 13:18:02 +02:00
Debarshi Ray
7abfa706f3 test/system: Unbreak the line count checks with Bats >= 1.10.0
Until Bats 1.10.0, 'run --keep-empty-lines' had a bug where it counted
the trailing newline on the last line as a separate line [1].  However,
Bats 1.10.0 is only available in Fedora >= 39 and is absent from Fedoras
37 and 38.

[1] Bats commit 6648e2143bffb933
    https://github.com/bats-core/bats-core/commit/6648e2143bffb933
    https://github.com/bats-core/bats-core/issues/708

https://github.com/containers/toolbox/pull/1387
2023-10-12 11:10:54 +02:00
Debarshi Ray
20188a097a images: Ensure that the manuals from extra-packages are available
Until now, only the packages that are present in the fedora base image,
and had their documentation stripped out, were being tested for the
availability of documentation.  There were no tests for the extra
packages that get added to the base image to form the fedora-toolbox
image.

The util-linux and xz packages were picked as examples for these new
tests.  The xz package is a particularly good example because it has
translations for its manuals.  It can help test that the fedora-toolbox
image is localized just like Fedora Silverblue and Workstation.

Only the images for currently maintained Fedoras (ie., 37, 38 and 39)
were updated.

https://github.com/containers/toolbox/pull/1384
2023-10-09 13:12:55 +02:00
Debarshi Ray
c98e282db6 images/fedora: Reorder alphabetically
Fallout from 6a3c5ce8d1

https://github.com/containers/toolbox/pull/1384
2023-10-09 13:12:55 +02:00
Debarshi Ray
53a0316472 .zuul: Enable testing on Fedora 39
https://github.com/containers/toolbox/pull/1385
2023-10-06 12:43:44 +02:00
Debarshi Ray
51ffd2793d test/system: Test that environment variables for Bash history are kept
Fedora's /etc/profile overwrites the HISTSIZE environment variable.  It
can't be preserved until this is fixed [1].

Bats 0.8.0 picked up a regression that causes bogus SC2030 and SC2031
instances [2], and must be silenced so that https://www.shellcheck.net/
doesn't complain:
  Line 36:
  HISTFILESIZE=1001
  ^----------^ SC2030 (info): Modification of HISTFILESIZE is local (to
               subshell caused by @bats test).
  Line 91:
  if [ "$HISTFILESIZE" = "" ]; then
        ^-----------^ SC2031 (info): HISTFILESIZE was modified in a
                      subshell. That change might be lost.

See:
https://www.shellcheck.net/wiki/SC2030
https://www.shellcheck.net/wiki/SC2031

[1] https://pagure.io/setup/pull-request/48

[2] https://github.com/koalaman/shellcheck/issues/2431

https://github.com/containers/toolbox/issues/1359
2023-09-30 14:22:31 +02:00
Debarshi Ray
5cdd30efd3 pkg/utils: Preserve environment variables for Bash's history facility
Any system-wide customization to Bash's history facilities done through
a custom /etc/profile.d configuration snippet on the host operating
system gets lost inside the Toolbx container.

This is because Toolbx doesn't know what name to expect for the custom
/etc/profile.d snippet on the host, and, hence, can't give access to it
through a bind mount or symbolic link inside the container.  The user
can definitely set up their own symbolic link inside the container to a
snippet inside /run/host/etc/profile.d.  However, it's tedious to do
that for all containers, and the user may not even know that they are
missing the customization until they notice something wrong with the
history, which is shared across all containers and the host, and at that
point they might have already lost commands that they can't easily
reconstruct.

Therefore, it's worth trying to improve the situation by default.

This tries to preserve the environment variables used to customize
Bash's history facilities [1] across the host operating system and
Toolbx container.  It assumes that the Bash start-up scripts inside the
container won't overwrite any of the propagated variables, which might
not always be the case [2].

[1] https://www.gnu.org/software/bash/manual/html_node/Bash-History-Facilities.html
    https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html

[2] https://pagure.io/setup/pull-request/48

https://github.com/containers/toolbox/issues/1359
2023-09-30 14:22:31 +02:00
Trung Lê
540b13cd0b .github/workflows: Build the Ubuntu images for ppc64le
https://github.com/containers/toolbox/pull/1353

Signed-off-by: Trung Lê <8@tle.id.au>
2023-09-28 08:29:36 +02:00
Debarshi Ray
b5aeaa243b doc/toolbox: Add a usage section
... similar to the website:
  https://containertoolbx.org/install/

As suggested by Sumantro Mukherjee.

https://github.com/containers/toolbox/pull/1379
2023-09-25 20:03:32 +02:00
Debarshi Ray
14e66fd5e5 doc/toolbox: Mention Arch Linux and Ubuntu as supported
https://github.com/containers/toolbox/pull/1379
2023-09-25 19:36:08 +02:00
Debarshi Ray
4ebaea6803 build: Enforce shellcheck(1) on all Bats tests
https://github.com/containers/toolbox/pull/1331
2023-09-25 18:17:44 +02:00
Debarshi Ray
4362c39c13 test/system: Silence SC2154
Otherwise https://www.shellcheck.net/ would complain:
  Line 343:
  if [ "$status" -ne 0 ]; then
        ^-----^ SC2154 (warning): status is referenced but not assigned.

See: https://www.shellcheck.net/wiki/SC2154

https://github.com/containers/toolbox/pull/1378
2023-09-25 18:13:58 +02:00
Debarshi Ray
574dbc920c test/system: Specify explit return values
This removes any ambiguities and makes it clear what value is being
returned.

https://github.com/containers/toolbox/pull/1378
2023-09-25 18:13:54 +02:00
Debarshi Ray
0d43d22b5b test/system: Simplify checking if the image exists or not
Bats' 'run' helper is not necessary to merely check if a command
succeeded or not [1].  In this case, it's idiomatic to use the command
as the condition for an 'if' branch.

[1] https://bats-core.readthedocs.io/en/stable/writing-tests.html

https://github.com/containers/toolbox/pull/1378
2023-09-25 18:13:50 +02:00
Debarshi Ray
9f85e13da9 test/system: Use the standard error output for error messages
https://github.com/containers/toolbox/pull/1377
2023-09-25 17:21:52 +02:00
Debarshi Ray
5ac8567bad test/system: Specify an explit return value
This removes any ambiguities and makes it clear what value is being
returned.

https://github.com/containers/toolbox/pull/1377
2023-09-25 16:08:14 +02:00
Debarshi Ray
61e2c970f8 test/system: Make it easier to spot failures to download & cache images
Currently, if 'skopeo copy ...' fails to download and cache an OCI image
during setup_suite(), the test suite doesn't immediately fail, but
continues.  It only fails later when trying to set up the Docker
registry and contains a lot of noise:
  not ok 1 setup_suite
  # (from function `assert_success' in file
       test/system/libs/bats-assert/src/assert.bash, line 114,
  #  from function `_setup_docker_registry' in file
       test/system/libs/helpers.bash, line 211,
  #  from function `setup_suite' in test file
       test/system/setup_suite.bash, line 59)
  #   `_setup_docker_registry' failed
  # Failed to cache image registry.fedoraproject.org/fedora-toolbox:38
      to /tmp/bats-run-GyTP7A/image-cache/fedora-toolbox-38
  #
  # -- command failed --
  # status : 1
  # output : time="2023-09-25T12:19:52+02:00" level=fatal
      msg="initializing source
        docker://registry.fedoraproject.org/fedora-toolbox:38-foo:
        reading manifest 38-foo in
        registry.fedoraproject.org/fedora-toolbox: manifest unknown"
  # --
  #
  # Failed to cache image quay.io/toolbx/arch-toolbox:latest to
      /tmp/bats-run-GyTP7A/image-cache/arch-toolbox-latest
  #
  # -- command failed --
  # status : 1
  # output : time="2023-09-25T12:20:48+02:00" level=fatal
      msg="initializing source
        docker://quay.io/toolbx/arch-toolbox:latest-foo: reading
        manifest latest-foo in quay.io/toolbx/arch-toolbox: manifest
        unknown"
  # --
  #
  # Failed to cache image registry.fedoraproject.org/fedora-toolbox:34
      to /tmp/bats-run-GyTP7A/image-cache/fedora-toolbox-34
  #
  # -- command failed --
  # status : 1
  # output : time="2023-09-25T12:21:42+02:00" level=fatal
      msg="initializing source
        docker://registry.fedoraproject.org/fedora-toolbox:34-foo:
        reading manifest 34-foo in
        registry.fedoraproject.org/fedora-toolbox: manifest unknown"
  # --
  #
  # ...
  #
  # -- command failed --
  # status : 1
  # output : time="2023-09-25T12:26:33+02:00" level=fatal
      msg="determining manifest MIME type for
        dir:/tmp/bats-run-GyTP7A/image-cache/fedora-toolbox-34: open
        /tmp/bats-run-GyTP7A/image-cache/fedora-toolbox-34/manifest.json:
        no such file or directory"
  # --
  #
  # docker-registry
  # 27fa141e291e64e4c7a148c88ddab219ff2bfb5802a2982dc4188dc11f41692d
  # Untagged: quay.io/toolbox_tests/registry:latest
  # Deleted: fea5a12cde107bb407bc44ede6dd9edea1d2b4171cd8e52b0cb330bf45e517e1

It makes it look as if the root cause of the failure is related to
setting up the Docker registry, which it isn't, and all that noise makes
it difficult to spot the actual problem.

Instead, from now on, it will be more obvious:
  not ok 1 setup_suite
  # (from function `setup_suite' in test file
       test/system/setup_suite.bash, line 44)
  #   `_pull_and_cache_distro_image "$system_id" "$system_version" ||
         false' failed
  # Failed to cache image registry.fedoraproject.org/fedora-toolbox:38
      to /tmp/bats-run-62b8CU/image-cache/fedora-toolbox-38
  # time="2023-09-25T13:55:42+02:00" level=fatal msg="initializing
      source docker://registry.fedoraproject.org/fedora-toolbox:38-foo:
      reading manifest 38-foo in
      registry.fedoraproject.org/fedora-toolbox: manifest unknown"

Note that Bats' 'run' helper [1] isn't designed to work inside
setup_suite().  eg., 'run --separate-stderr' doesn't work because
BATS_TEST_TMPDIR isn't defined.

[1] https://bats-core.readthedocs.io/en/stable/writing-tests.html

https://github.com/containers/toolbox/pull/1377
2023-09-25 16:02:25 +02:00
Debarshi Ray
74bf1af983 test/system: Remove stray 'podman ...' error in setup_suite() failures
If setup_suite() fails for some reason, then an unrelated message from
'podman system reset' would show up:
  not ok 1 setup_suite
  # (from function `setup_suite' in test file
       test/system/setup_suite.bash, line 43)
  #   `_pull_and_cache_distro_image foo || false' failed
  # Requested distro (foo) does not have a matching image
  #  A "/home/rishi/.cache/toolbox/system-test-storage/storage.conf"
       config file exists.
  # Remove this file if you did not modify the configuration.

This extra error message from 'podman system reset' serves no purpose
because it's not related to the cause of the setup_suite() failure.
It's just noise and it's better to silence it.

https://github.com/containers/toolbox/pull/1375
2023-09-23 00:29:36 +02:00
Debarshi Ray
9415797e8b test/system: Use long options, instead of their shorter aliases
The long options are easier to grep(1) for in the sources than their
shorter aliases.

https://github.com/containers/toolbox/pull/1375
2023-09-23 00:19:56 +02:00
Debarshi Ray
66a7ad7c97 test/system: Remove stray 'podman stop' error in setup_suite() failures
If setup_suite() fails for some reason, causing the Docker registry to
not be created, then an unrelated message from 'podman stop' would show
up:
  not ok 1 setup_suite
  # (from function `setup_suite' in test file
       test/system/setup_suite.bash, line 43)
  #   `_pull_and_cache_distro_image foo || false' failed
  # Requested distro (foo) does not have a matching image
  # Error: no container with name or ID "docker-registry" found: no such
      container
  # ...
  # ...

This extra error message from 'podman stop' serves no purpose because
it's not related to the cause of the setup_suite() failure.  It's just
noise and it's better to silence it.

https://github.com/containers/toolbox/pull/1375
2023-09-23 00:19:56 +02:00
Debarshi Ray
e1745ef9c2 test/system: Ensure failure if an invalid distribution is specified
Contrary to what the documentation might seem to imply [1], Bats' 'fail'
helper only aborts a test case under certain circumstances.  eg., when
called from setup_suite(), but not from within a child function, and a
@test case, but not from within the 'run' helper.

If 'fail' is called from within 'run', then the code after it will
continue to execute.  The test case will only fail if 'run' eventually
catches a non-zero exit code that's caught by 'assert_success' [2].
Similarly, it doesn't abort if called from within a child function in
setup_suite().

Currently, _pull_and_cache_distro_image() is a child function called
from setup_suite().  So 'fail' won't abort if an invalid distribution is
specified.

Fortunately, pull_distro_image() is being called from within @test
cases, but outside 'run'.  So, there's no problem with it now.  However,
some future code changes can unknowingly alter this reality and it too
can run into unexpected behaviour.

Therefore, it's better to be safe, and explicitly specify a non-zero
exit code after 'fail'.  It will ensure that it works as expected under
all circumstances.

[1] https://github.com/bats-core/bats-support

[2] https://github.com/bats-core/bats-assert

https://github.com/containers/toolbox/pull/1375
2023-09-23 00:04:32 +02:00
Debarshi Ray
a7feb00996 test/system: Make it easier to debug why a container didn't initialize
Currently, if a Toolbx container's entry point fails to initialize the
container, there's no way to see the debug logs and error messages from
the entry point:
  not ok 106 container: Check container starts without issues
  # (from function `assert_success' in file
       test/system/libs/bats-assert/src/assert.bash, line 114,
  #  in test file test/system/103-container.bats, line 39)
  #   `assert_success' failed
  #
  # -- command failed --
  # status : 1
  # output :
  # --
  #

Instead, from now on, they will be visible:
  not ok 106 container: Check container starts without issues
  # (from function `assert_success' in file
       test/system/libs/bats-assert/src/assert.bash, line 114,
  #  in test file test/system/103-container.bats, line 39)
  #   `assert_success' failed
  #
  # -- command failed --
  # status : 1
  # output (90 lines):
  #   Failed to initialize container fedora-toolbox-38
  #   level=debug msg="Running as real user ID 0"
  #   level=debug msg="Resolved absolute path to the executable as
        /usr/bin/toolbox"
  #   level=debug msg="TOOLBOX_PATH is /opt/bin/toolbox"
  #   level=debug msg="Migrating to newer Podman"
  #   level=debug msg="Migration not needed: running inside a container"
  #   level=debug msg="Setting up configuration"
  #   ...
  # --
  #

https://github.com/containers/toolbox/pull/1374
2023-09-22 18:24:54 +02:00
Debarshi Ray
6e5bffe9a0 test/system: Style fix
https://github.com/containers/toolbox/pull/1374
2023-09-22 18:24:50 +02:00
Debarshi Ray
0146d223d5 test/system: Make it easier to debug 'podman logs' failures
Bats' 'run' helper returns with an exit code of 0 even when the command
that it was given to run failed with a non-zero exit code [1].  This is
to enable making further assertions about the command after 'run' has
finished.  If there's nothing that checks for failures, then it will
continue as if everything is alright.

Therefore, currently, if 'podman logs' fails, there's no indication of
it and the test only fails later because it thinks that the container
failed to initialize:
  not ok 106 container: Check container starts without issues
  # (from function `assert_success' in file
       test/system/libs/bats-assert/src/assert.bash, line 114,
  #  in test file test/system/103-container.bats, line 39)
  #   `assert_success' failed
  #
  # -- command failed --
  # status : 1
  # output :
  # --
  #

Instead, from now on, it will be more obvious:
  not ok 106 container: Check container starts without issues
  # (from function `assert_success' in file
       test/system/libs/bats-assert/src/assert.bash, line 114,
  #  in test file test/system/103-container.bats, line 39)
  #   `assert_success' failed
  #
  # -- command failed --
  # status : 125
  # output (2 lines):
  #   Failed to invoke '/usr/bin/podman logs'
  #   Error: no container with name or ID "foo" found: no such container
  # --
  #

One alternative was to use 'assert_success' [2] to assert that the
command given to 'run' succeeded.  That would show the 'podman logs'
failure as:
  not ok 106 container: Check container starts without issues
  # (from function `assert_success' in file
       test/system/libs/bats-assert/src/assert.bash, line 114,
  #  in test file test/system/103-container.bats, line 39)
  #   `assert_success' failed
  #
  # -- command failed --
  # status : 1
  # output (29 lines):
  #
  #   -- command failed --
  #   status : 125
  #   output : Error: no container with name or ID "foo" found: no such
        container
  #   --
  #
  # ...
  #
  #   -- command failed --
  #   status : 125
  #   output : Error: no container with name or ID "foo" found: no such
        container
  #   --
  # --
  #

However, it's a bit too noisy because of the 'assert_success' not
terminating container_started() and continuing to loop for the remaining
attempts.

[1] https://bats-core.readthedocs.io/en/stable/writing-tests.html

[2] https://github.com/bats-core/bats-assert

https://github.com/containers/toolbox/pull/1372
2023-09-22 18:21:08 +02:00
Debarshi Ray
a27b480cef test/system: Rename a variable
A subsequent commit will use this variable to set the return value for a
different condition.  Therefore, the name needs to be changed to suit
the purpose.

https://github.com/containers/toolbox/pull/1372
2023-09-22 18:21:08 +02:00
Debarshi Ray
d3161ea60e test/system: Limit the scope of the return value to the function
This should prevent this function from overwriting variables of the
same name beyond the function and causing hard-to-debug problems.

https://github.com/containers/toolbox/pull/1372
2023-09-22 18:20:43 +02:00
Debarshi Ray
12da2b845f test/system: Limit the scope of the loop counters to the functions
This should prevent these functions from overwriting variables of the
same name beyond the function and causing hard-to-debug problems [1].

[1] Bats commit 502dc47dd063c187
    https://github.com/bats-core/bats-core/commit/502dc47dd063c187
    https://github.com/bats-core/bats-core/issues/726

https://github.com/containers/toolbox/pull/1373
2023-09-21 22:14:58 +02:00
Debarshi Ray
8f6e47a191 test/system: Avoid future problems caused by Bat's 'run' overwriting 'i'
Until Bats 1.10.0, 'run' with options had a bug where it would overwrite
the value of the 'i' variable even outside 'run' [1].

In these particular instances, no options are being passed to 'run',
and, hence, currently there's no problem.  However, in case a future
commit adds an option, then it could lead to hard-to-debug problems.
eg., --separate-stderr sets 'i' to 1, --show-output-of-passing-tests
sets it to 2, etc..  Therefore, depending on the flag and the loop, the
loop might get terminated prematurely or run infinitely or something
else.

Moreover, Bats 1.10.0 is only available in Fedora >= 39 and is absent
from Fedoras 37 and 38.  Therefore, it's not possible to consider this
bug fixed.

Hence, it's better to preemptively work around it to avoid any future
issues.

[1] Bats commit 502dc47dd063c187
    https://github.com/bats-core/bats-core/commit/502dc47dd063c187
    https://github.com/bats-core/bats-core/issues/726

https://github.com/containers/toolbox/pull/1373
2023-09-21 19:22:24 +02:00
Debarshi Ray
c586cc9278 test/commit: Simplify a 'for' loop
An ascending 'for' loop is more idiomatic than its descending
counterpart.

https://github.com/containers/toolbox/pull/1373
2023-09-21 19:22:17 +02:00
Debarshi Ray
5c0372e959 test/system: Silence SC2034
Otherwise https://www.shellcheck.net/ would complain:
  Line 442:
  for TRIES in 1 2 3 4 5; do
  ^-^ SC2034 (warning): TRIES appears unused. Verify use (or export if
      used externally).

See: https://www.shellcheck.net/wiki/SC2034

This also makes the code consistent with the rest.

https://github.com/containers/toolbox/pull/1371
2023-09-20 15:16:50 +02:00
Debarshi Ray
d528301b7f test/system: Silence SC2155
Otherwise https://www.shellcheck.net/ would complain:
  Line 624:
  local system_id="$(get_system_id)"
        ^-------^ SC2155 (warning): Declare and assign separately to
                  avoid masking return values.

See: https://www.shellcheck.net/wiki/SC2155

https://github.com/containers/toolbox/pull/1370
2023-09-20 10:24:29 +02:00
Debarshi Ray
7d24e98070 test/system: Silence SC2154
Otherwise https://www.shellcheck.net/ would complain:
  Line 33:
  assert [ ${#stderr_lines[@]} -eq 0 ]
           ^-----------------^ SC2154 (warning): stderr_lines is
                               referenced but not assigned.

See: https://www.shellcheck.net/wiki/SC2154

https://github.com/containers/toolbox/pull/1369
2023-09-20 01:33:29 +02:00
Debarshi Ray
74d2f2180d test/system: Silence SC1090
Otherwise https://www.shellcheck.net/ would complain:
  Line 505:
  . "$os_release"
    ^-----------^ SC1090 (warning): ShellCheck can't follow non-constant
                  source. Use a directive to specify location.

See: https://www.shellcheck.net/wiki/SC1090

https://github.com/containers/toolbox/pull/1368
2023-09-20 00:04:49 +02:00
Debarshi Ray
363c3f83ca test/system: Style fix
https://github.com/containers/toolbox/pull/1367
2023-09-19 23:40:42 +02:00
Debarshi Ray
5c6b566371 test/system: Use existing wrapper for 'podman start'
https://github.com/containers/toolbox/pull/1367
2023-09-19 23:40:36 +02:00