aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2021-08-05 18:07:21 -0300
committerEuAndreh <eu@euandre.org>2021-08-05 18:07:21 -0300
commit8cb0207e09c301a02e21f5e8a395c7c958781f1b (patch)
treebb4ad55274e71bb2dc2bd4ed61958abf524df4ea
parentMove tests/resources{ => /repositories}/repo* (diff)
downloadgistatic-8cb0207e09c301a02e21f5e8a395c7c958781f1b.tar.gz
gistatic-8cb0207e09c301a02e21f5e8a395c7c958781f1b.tar.xz
tests/: Add integration tests, also test with Valgrind
-rw-r--r--Makefile15
-rw-r--r--src/gistatic.c4
-rwxr-xr-xtests/dev-integration.sh16
-rwxr-xr-xtests/integration.sh58
-rwxr-xr-xtests/lib.sh143
-rw-r--r--tests/resources/assets/index.html73
-rw-r--r--tests/resources/assets/logo.svg62
-rw-r--r--tests/resources/assets/refs.html120
-rw-r--r--tests/resources/assets/style.css76
9 files changed, 553 insertions, 14 deletions
diff --git a/Makefile b/Makefile
index f12fa70..03c006b 100644
--- a/Makefile
+++ b/Makefile
@@ -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;
+}