podman/test/apiv2/01-basic.at
Ed Santiago f5b3dc976c Tests: Fix common flakes, and improve apiv2 test log
- apiv2 - the 'ten /info requests' test is flaking often,
  taking ~8 seconds (our limit is 7, up from 5 a few weeks
  ago). Brent suggested that the first /info call might be
  expensive, because it needs to access storage. So, let's
  prime it by running one /info outside the timing loop.
  And, because even that continues to fail, bump it up
  to 10 seconds and file #8076 to track the slowdown.

- toolbox test - WaitForReady() has timed out, even on one
  occasion causing a run failure because it failed 3 times.
  Solution: bump up timeout from 2s to 5s. Not really great,
  but CI systems are underpowered, and it's not unreasonable
  that 2s might be too low.

- sdnotify test - add a 'podman wait' between stop & rm.
  This may prevent a "cannot rm container as it is running"
  race condition.

While working on this, Brent and I noticed a few ways that
test-apiv2 logging can be improved:

- test name: when request is POST, display the jsonified
  parameters, not the original input ones. This should
  make it much easier to reproduce failures.

- use curl's "--write-out" option to capture http code,
  content type, and request time. We were getting the
  first two via grep from logged headers; this is cleaner.
  And there was no other way to get timing. We now include
  the timing as X-Response-Time in the log file.

- abort on *any* curl error, not just 7 (cannot connect).
  Any error at all from curl is bad news.

Signed-off-by: Ed Santiago <santiago@redhat.com>
2020-10-20 11:32:49 -06:00

89 lines
2.6 KiB
Bash

# -*- sh -*-
#
# The earliest most basic tests. If any of these fail, life is bad
#
# NOTE: paths with a leading slash will be interpreted as-is;
# paths without will have '/v1.40/' prepended.
t GET /_ping 200 OK
t HEAD /_ping 200
t GET /libpod/_ping 200 OK
t HEAD /libpod/_ping 200
t GET _ping 200 OK
t HEAD _ping 200
t GET libpod/_ping 200 OK
t HEAD libpod/_ping 200
for i in /version version; do
t GET $i 200 \
.Components[0].Name="Podman Engine" \
.Components[0].Details.APIVersion=2.0.0 \
.Components[0].Details.MinAPIVersion=2.0.0 \
.Components[0].Details.Os=linux \
.ApiVersion=1.40 \
.MinAPIVersion=1.24 \
.Os=linux
done
#
# Garbage tests - requests that should yield errors
#
t GET /nonesuch 404
t POST /nonesuch '' 404
t GET container/nonesuch/json 404
t GET libpod/containers/nonesuch/json 404
#### FIXME: maybe someday: t GET 'libpod/containers/json?a=b' 400
# Method not allowed
t POST /_ping '' 405
t DELETE /_ping 405
t POST libpod/containers/json '' 405
t POST libpod/pods/abc '' 405
t POST info '' 405
t GET libpod/containers/create 405
#
# system info
#
# Some day perhaps it will always be runc; for now, cgroupsv2 requires crun
#
# FIXME: run 'podman info --format=json', and compare select fields
runtime=runc
if have_cgroupsv2; then
runtime=crun
fi
t GET info 200 \
.OSType=linux \
.DefaultRuntime~.*$runtime \
.MemTotal~[0-9]\\+
# Timing: make sure server stays responsive.
# Because /info may need to check storage, it may be slow the first time.
# Let's invoke it once to prime caches, then run ten queries in a timed loop.
t GET info 200
t0=$SECONDS
for i in $(seq 1 10); do
# FIXME: someday: refactor t(), separate out the 'curl' logic so we
# can call it directly. Then we won't get ten annoying 'ok' lines.
t GET info 200
done
t1=$SECONDS
delta_t=$((t1 - t2))
# Desired number of seconds in which we expect to run.
# FIXME: 10 seconds is a lot! PR #8076 opened to investigate why.
want=10
if [ $delta_t -le $want ]; then
_show_ok 1 "Time for ten /info requests ($delta_t seconds) <= ${want}s"
else
_show_ok 0 "Time for ten /info requests" "<= $want seconds" "$delta_t seconds"
fi
# Simple events test (see #7078)
t GET "events?stream=false" 200
t GET "libpod/events?stream=false" 200
# vim: filetype=sh