diff options
author | EuAndreh <eu@euandre.org> | 2021-08-05 18:07:21 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2021-08-05 18:07:21 -0300 |
commit | 8cb0207e09c301a02e21f5e8a395c7c958781f1b (patch) | |
tree | bb4ad55274e71bb2dc2bd4ed61958abf524df4ea | |
parent | Move tests/resources{ => /repositories}/repo* (diff) | |
download | gistatic-8cb0207e09c301a02e21f5e8a395c7c958781f1b.tar.gz gistatic-8cb0207e09c301a02e21f5e8a395c7c958781f1b.tar.xz |
tests/: Add integration tests, also test with Valgrind
-rw-r--r-- | Makefile | 15 | ||||
-rw-r--r-- | src/gistatic.c | 4 | ||||
-rwxr-xr-x | tests/dev-integration.sh | 16 | ||||
-rwxr-xr-x | tests/integration.sh | 58 | ||||
-rwxr-xr-x | tests/lib.sh | 143 | ||||
-rw-r--r-- | tests/resources/assets/index.html | 73 | ||||
-rw-r--r-- | tests/resources/assets/logo.svg | 62 | ||||
-rw-r--r-- | tests/resources/assets/refs.html | 120 | ||||
-rw-r--r-- | tests/resources/assets/style.css | 76 |
9 files changed, 553 insertions, 14 deletions
@@ -43,6 +43,7 @@ check: all src/gistatic.t ln -s .gitdir tests/resources/repositories/repo-1/.git ln -s .gitdir tests/resources/repositories/repo-2/.git ./src/gistatic.t + sh tests/integration.sh sh aux/assert-catgets.sh src/gistatic.c clean: @@ -64,18 +65,8 @@ uninstall: # Personal workflow targets # - -VALGRIND_FLAGS = \ - --show-error-list=yes \ - --show-leak-kinds=all \ - --leak-check=full \ - --track-origins=yes \ - --error-exitcode=1 - -c-dev-check: check - valgrind $(VALGRIND_FLAGS) ./src/gistatic.t - -dev-check: c-dev-check public +dev-check: check public + sh tests/dev-integration.sh sh aux/assert-shellcheck.sh sh aux/workflow/assert-todos.sh sh aux/workflow/assert-changelog.sh -n $(NAME) diff --git a/src/gistatic.c b/src/gistatic.c index d07cf17..217f3dd 100644 --- a/src/gistatic.c +++ b/src/gistatic.c @@ -260,7 +260,7 @@ static const char *const STYLE_STR = "" " padding-right: 1em;\n" "}\n" "\n" - "footer { \n" + "footer {\n" " text-align: center;\n" "}\n" ""; @@ -1641,7 +1641,7 @@ static int repo_write_snapshots( goto loop_cleanup; } - printf("reference name: %s\n", git_reference_shorthand(ref)); + // printf("reference name: %s\n", git_reference_shorthand(ref)); // https://github.com/ionescu007/minlzma // https://git.tukaani.org/?p=xz.git;a=tree;f=src;h=665b39e6439f1bb5afd9181ec0890c2ed26d047e;hb=HEAD diff --git a/tests/dev-integration.sh b/tests/dev-integration.sh new file mode 100755 index 0000000..a82ce14 --- /dev/null +++ b/tests/dev-integration.sh @@ -0,0 +1,16 @@ +#!/bin/sh +set -eu + +. tests/lib.sh + +VALGRIND_FLAGS=' +--show-error-list=yes +--show-leak-kinds=all +--leak-check=full +--track-origins=yes +--error-exitcode=1 +' + +valgrind $VALGRIND_FLAGS ./src/gistatic.t +valgrind $VALGRIND_FLAGS ./src/gistatic -o `mkdtemp` -u 'https://example.com' tests/resources/repositories/repo-1 +valgrind $VALGRIND_FLAGS ./src/gistatic -o `mkdtemp` -i tests/resources/repositories/* diff --git a/tests/integration.sh b/tests/integration.sh new file mode 100755 index 0000000..27a2dfc --- /dev/null +++ b/tests/integration.sh @@ -0,0 +1,58 @@ +#!/bin/sh +set -u + +. tests/lib.sh + +assert_file() { + if ! diff "$2" "$1"; then + printf '\n%s: File content differs.\n' \ + "$(ERROR)" >&2 + printf '\nexpected: %s\ngot: %s\n\n' "$1" "$2" >&2 + print_debug_info + exit 1 + fi +} + +test_index_generation() { + testing 'index generation' + + N="$LINENO" + OUT="$(mkstemp)" + ERR="$(mkstemp)" + DIR="$(mkdtemp)" + ./src/gistatic -i -o "$DIR" tests/resources/repositories/* \ + 1>"$OUT" 2>"$ERR" + STATUS=$? + assert_empty_stdout + assert_empty_stderr + assert_status 0 + assert_file tests/resources/assets/style.css "$DIR/style.css" + assert_file tests/resources/assets/logo.svg "$DIR/logo.svg" + assert_file tests/resources/assets/index.html "$DIR/index.html" + + test_ok +} + +test_repo_generation() { + testing 'repo generation' + + N="$LINENO" + OUT="$(mkstemp)" + ERR="$(mkstemp)" + DIR="$(mkdtemp)" + ./src/gistatic -o "$DIR" -u https://example.com/ \ + tests/resources/repositories/repo-1 1>"$OUT" 2>"$ERR" + STATUS=$? + assert_empty_stdout + assert_empty_stderr + assert_status 0 + + assert_file tests/resources/assets/style.css "$DIR/style.css" + assert_file tests/resources/assets/logo.svg "$DIR/logo.svg" + assert_file tests/resources/assets/refs.html "$DIR/refs.html" + + test_ok +} + +test_index_generation +test_repo_generation diff --git a/tests/lib.sh b/tests/lib.sh new file mode 100755 index 0000000..06a5b54 --- /dev/null +++ b/tests/lib.sh @@ -0,0 +1,143 @@ +#!/bin/sh + +end="\033[0m" +red="\033[0;31m" +green="\033[0;32m" +yellow="\033[0;33m" + +N= +OUT= +ERR= +STATUS= + +ERROR() { + # shellcheck disable=2059 + printf "${red}ERROR${end}" +} + +print_debug_info() { + printf 'LINENO: %s\nOUT: %s\nERR: %s\n' \ + "$N" "$OUT" "$ERR" >&2 +} + +assert_status() { + if [ "$STATUS" != "$1" ]; then + printf '\n%s: Bad status.\n\nexpected: %s\ngot: %s\n' \ + "$(ERROR)" "$1" "$STATUS" >&2 + print_debug_info + exit 1 + fi +} + +assert_usage() { + if ! grep -Fq 'Usage' "$1"; then + echo 'Expected to find "Usage" text, it was missing:' >&2 + cat "$1" >&2 + print_debug_info + exit 1 + fi +} + +assert_empty_stream() { + if [ -s "$2" ]; then + FMT='\n%s: Expected %s (%s) to be empty, but has content:\n%s\n' + # shellcheck disable=2059 + printf "$FMT" \ + "$(ERROR)" "$1" "$2" "$(cat "$2")" >&2 + print_debug_info + exit 1 + fi +} + +assert_empty_stdout() { + assert_empty_stream STDOUT "$OUT" +} + +assert_empty_stderr() { + assert_empty_stream STDERR "$ERR" +} + +assert_stream() { + if [ "$(cat "$2")" != "$3" ]; then + printf '\nERR: Bad %s (%s)\n\nexpected: %s\ngot: %s\n' \ + "$1" "$2" "$3" "$(cat "$2")" >&2 + print_debug_info + exit 1 + fi +} + +assert_stdout() { + assert_stream STDOUT "$OUT" "$1" +} + +assert_stderr() { + assert_stream STDERR "$ERR" "$1" +} + +assert_grep_stream() { + if ! grep -qE "$3" "$2"; then + printf '\nERR: Bad %s (%s)\n\ngrepping: %s\nin:\n%s\n' \ + "$1" "$2" "$3" "$(cat "$2")" >&2 + print_debug_info + exit 1 + fi +} + +assert_grep_stdout() { + assert_grep_stream STDOUT "$OUT" "$1" +} + +assert_grep_stderr() { + assert_grep_stream STDERR "$ERR" "$1" +} + +assert_fgrep_stream() { + if ! grep -Fq -- "$3" "$2"; then + printf '\nERR: Bad %s (%s)\n\ngrepping: %s\nin:\n%s\n' \ + "$1" "$2" "$3" "$(cat "$2")" >&2 + print_debug_info + exit 1 + fi +} + +assert_fgrep_stdout() { + assert_fgrep_stream STDOUT "$OUT" "$1" +} + +assert_fgrep_stderr() { + assert_fgrep_stream STDERR "$ERR" "$1" +} + +testing() { + printf "${yellow}testing${end}: %s..." "$1" >&2 +} + +test_ok() { + # shellcheck disable=2059 + printf " ${green}OK${end}.\n" >&2 +} + +uuid() { + # Taken from: + # https://serverfault.com/a/799198 + od -xN20 /dev/urandom | + head -1 | + awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}' +} + +tmpname() { + echo 'mkstemp(template)' | m4 -D template="${TMPDIR:-/tmp}/m4-tmpname." +} + +mkstemp() { + name="$(tmpname)" + touch "$name" + echo "$name" +} + +mkdtemp() { + name="$(tmpname)" + rm -f "$name" + mkdir "$name" + echo "$name" +} diff --git a/tests/resources/assets/index.html b/tests/resources/assets/index.html new file mode 100644 index 0000000..04aa8a2 --- /dev/null +++ b/tests/resources/assets/index.html @@ -0,0 +1,73 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <link rel="icon" type="image/svg+xml" href="logo.svg" /> + <link rel="stylesheet" type="text/css" href="style.css" /> + <title>Repositories</title> + </head> + <body> + <header> + <div class="header-horizontal-grouping"> + <img alt="Logo image of the repository list" class="logo" src="logo.svg" /> + <h1 class="header-description"> + Repositories + </h1> + </div> + <hr /> + </header> + <main> + <table> + <thead> + <tr> + <th> + Name + </th> + <th> + Description + </th> + <th> + Last commit + </th> + </tr> + </thead> + <tbody> + <tr> + <td> + <a href="repo-1/"> + repo-1 + </a> + </td> + <td> + Submodule repository for gistatic project tests + + </td> + <td> + 2021-07-31 19:29 + </td> + </tr> + <tr> + <td> + <a href="repo-2/"> + repo-2 + </a> + </td> + <td> + + </td> + <td> + 2021-07-31 19:27 + </td> + </tr> + </tbody> + </table> + </main> + <footer> + <hr /> + <p> + Generated with <a href="https://euandreh.xyz/gistatic">gistatic</a>. + </p> + </footer> + </body> +</html> diff --git a/tests/resources/assets/logo.svg b/tests/resources/assets/logo.svg new file mode 100644 index 0000000..ce566b2 --- /dev/null +++ b/tests/resources/assets/logo.svg @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"> + <path d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" /> + <path d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" /> + <path d="M 1 8 L 2 8 L 2 9 L 1 9 L 1 8 Z" /> + <path d="M 1 13 L 2 13 L 2 14 L 1 14 L 1 13 Z" /> + <path d="M 2 8 L 3 8 L 3 9 L 2 9 L 2 8 Z" /> + <path d="M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 Z" /> + <path d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" /> + <path d="M 3 13 L 4 13 L 4 14 L 3 14 L 3 13 Z" /> + <path d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" /> + <path d="M 4 8 L 5 8 L 5 9 L 4 9 L 4 8 Z" /> + <path d="M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 Z" /> + <path d="M 5 6 L 6 6 L 6 7 L 5 7 L 5 6 Z" /> + <path d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" /> + <path d="M 5 13 L 6 13 L 6 14 L 5 14 L 5 13 Z" /> + <path d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" /> + <path d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" /> + <path d="M 6 14 L 7 14 L 7 15 L 6 15 L 6 14 Z" /> + <path d="M 7 1 L 8 1 L 8 2 L 7 2 L 7 1 Z" /> + <path d="M 7 14 L 8 14 L 8 15 L 7 15 L 7 14 Z" /> + <path d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" /> + <path d="M 7 2 L 8 2 L 8 3 L 7 3 L 7 2 Z" /> + <path d="M 7 3 L 8 3 L 8 4 L 7 4 L 7 3 Z" /> + <path d="M 7 4 L 8 4 L 8 5 L 7 5 L 7 4 Z" /> + <path d="M 7 5 L 8 5 L 8 6 L 7 6 L 7 5 Z" /> + <path d="M 8 1 L 9 1 L 9 2 L 8 2 L 8 1 Z" /> + <path d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" /> + <path d="M 9 1 L 10 1 L 10 2 L 9 2 L 9 1 Z" /> + <path d="M 9 2 L 10 2 L 10 3 L 9 3 L 9 2 Z" /> + <path d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" /> + <path d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" /> + <path d="M 10 2 L 11 2 L 11 3 L 10 3 L 10 2 Z" /> + <path d="M 10 3 L 11 3 L 11 4 L 10 4 L 10 3 Z" /> + <path d="M 10 4 L 11 4 L 11 5 L 10 5 L 10 4 Z" /> + <path d="M 10 5 L 11 5 L 11 6 L 10 6 L 10 5 Z" /> + <path d="M 10 6 L 11 6 L 11 7 L 10 7 L 10 6 Z" /> + <path d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" /> + <path d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" /> + <path d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" /> + <path d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" /> + <path d="M 11 12 L 12 12 L 12 13 L 11 13 L 11 12 Z" /> + <path d="M 11 14 L 12 14 L 12 15 L 11 15 L 11 14 Z" /> + <path d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" /> + <path d="M 12 6 L 13 6 L 13 7 L 12 7 L 12 6 Z" /> + <path d="M 12 8 L 13 8 L 13 9 L 12 9 L 12 8 Z" /> + <path d="M 12 10 L 13 10 L 13 11 L 12 11 L 12 10 Z" /> + <path d="M 12 12 L 13 12 L 13 13 L 12 13 L 12 12 Z" /> + <path d="M 12 14 L 13 14 L 13 15 L 12 15 L 12 14 Z" /> + <path d="M 13 6 L 14 6 L 14 7 L 13 7 L 13 6 Z" /> + <path d="M 13 8 L 14 8 L 14 9 L 13 9 L 13 8 Z" /> + <path d="M 13 10 L 14 10 L 14 11 L 13 11 L 13 10 Z" /> + <path d="M 13 12 L 14 12 L 14 13 L 13 13 L 13 12 Z" /> + <path d="M 13 13 L 14 13 L 14 14 L 13 14 L 13 13 Z" /> + <path d="M 13 14 L 14 14 L 14 15 L 13 15 L 13 14 Z" /> + <path d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" /> + <path d="M 14 8 L 15 8 L 15 9 L 14 9 L 14 8 Z" /> + <path d="M 14 9 L 15 9 L 15 10 L 14 10 L 14 9 Z" /> + <path d="M 14 10 L 15 10 L 15 11 L 14 11 L 14 10 Z" /> + <path d="M 14 11 L 15 11 L 15 12 L 14 12 L 14 11 Z" /> + <path d="M 14 12 L 15 12 L 15 13 L 14 13 L 14 12 Z" /> +</svg> diff --git a/tests/resources/assets/refs.html b/tests/resources/assets/refs.html new file mode 100644 index 0000000..b24bd52 --- /dev/null +++ b/tests/resources/assets/refs.html @@ -0,0 +1,120 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <link rel="icon" type="image/svg+xml" href="logo.svg" /> + <link rel="stylesheet" type="text/css" href="style.css" /> + <link rel="alternate" type="application/atom+xml" href="commits.xml" title="repo-1 - commit feed" hreflang="en" /> + <link rel="alternate" type="application/atom+xml" href="tags.xml" title="repo-1 - tags feed" hreflang="en" /> + <title>repo-1</title> + </head> + <body> + <header> + <div class="header-horizontal-grouping"> + <img alt="Logo image of the repository list" class="logo" src="logo.svg" /> + <div class="header-description"> + <h1> + repo-1 + </h1> + <h2> + Submodule repository for gistatic project tests + + </h2> + <code> + git clone https://example.com/ + </code> + </div> + </div> + <nav> + <ul> + <li> + <a href="files.html"> + files + </a> + </li> + <li> + <a href="log.html"> + log + </a> + </li> + <li class="selected-nav-item"> + <a href="refs.html"> + refs + </a> + </li> + </ul> + </nav> + <hr /> + </header> + <main> + <table> + <thead> + <tr> + <th> + Branch + </th> + <th> + Commit message + </th> + <th> + Author + </th> + <th> + Date + </th> + </tr> + </thead> + <tbody> + <tr> + <td> + <a href="log/main.html"> + main + </a> + </td> + <td> + <a href="commit/1eaf054b3ceb3badcb36a2293277c758454a630d.html"> + description: Add + </a> + </td> + <td> + EuAndreh + </td> + <td> + 2021-07-31 19:29 + </td> + </tr> + </tbody> + </table> + <table> + <thead> + <tr> + <th> + Tag + </th> + <th> + Commit message + </th> + <th> + Download + </th> + <th> + Author + </th> + <th> + Date + </th> + </tr> + </thead> + <tbody> + </tbody> + </table> + </main> + <footer> + <hr /> + <p> + Generated with <a href="https://euandreh.xyz/gistatic">gistatic</a>. + </p> + </footer> + </body> +</html> diff --git a/tests/resources/assets/style.css b/tests/resources/assets/style.css new file mode 100644 index 0000000..9972738 --- /dev/null +++ b/tests/resources/assets/style.css @@ -0,0 +1,76 @@ +body { + font-family: monospace; + max-width: 1100px; + margin: 0 auto 0 auto; +} + +.logo { + height: 6em; + width: 6em; +} + +.header-horizontal-grouping { + display: flex; + align-items: center; + margin-top: 1em; + margin-bottom: 1em; +} + +.header-description { + margin-left: 2em; +} + +nav { + margin-top: 2em; +} + +nav ul { + display: flex; + list-style-type: none; + margin-bottom: 0; +} + +nav li { + margin-left: 10px; +} + +nav a { + padding: 2px 8px 0px 8px; + text-decoration: none; + color: black; +} + +nav a:hover { + text-decoration: underline; +} + +.selected-nav-item { + background-color: hsl(0, 0%, 87%); +} + +hr { + margin-top: 0; + border: 0; + border-top: 3px solid hsl(0, 0%, 87%); +} + +table { + margin: 2em auto; +} + +th { + padding-bottom: 1em; +} + +tbody tr:hover { + background-color: hsl(0, 0%, 93%); +} + +td { + padding-left: 1em; + padding-right: 1em; +} + +footer { + text-align: center; +} |