initial repo - geomyidae-tests - geomyidae tests
HTML git clone git://bitreich.org/geomyidae-tests/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae-tests/
DIR Log
DIR Files
DIR Refs
DIR Tags
DIR README
DIR LICENSE
---
DIR commit 77772ad44967239799ef0fa93ab220d8d133b15e
HTML Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Fri, 21 Jul 2023 13:58:55 +0200
initial repo
Diffstat:
A Makefile | 13 +++++++++++++
A README | 7 +++++++
A env.c | 14 ++++++++++++++
A run.sh | 35 +++++++++++++++++++++++++++++++
A test.c | 97 ++++++++++++++++++++++++++++++
A tests | 7 +++++++
6 files changed, 173 insertions(+), 0 deletions(-)
---
DIR diff --git a/Makefile b/Makefile
@@ -0,0 +1,13 @@
+build: clean
+ ${CC} -o test.cgi test.c -static
+
+setup:
+ mkdir -p results
+ rm -f test_counter.txt
+
+clean-results:
+ rm -rf results
+ rm -f test_counter.txt
+
+clean:
+ rm -f test.cgi
DIR diff --git a/README b/README
@@ -0,0 +1,7 @@
+geomyidae testsuite initial prototype
+
+steps to run:
+
+as root: ./run.sh
+
+make sure geomyidae is not running
DIR diff --git a/env.c b/env.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+extern char **environ;
+
+int
+main(void)
+{
+ char **p;
+
+ for (p = environ; p && *p; p++)
+ puts(*p);
+
+ return 0;
+}
DIR diff --git a/run.sh b/run.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+bin="/home/hiltjo/p/geomyidae/geomyidae"
+host="127.0.0.1"
+port="7070"
+base="$(pwd)"
+user="hiltjo"
+group="hiltjo"
+
+run_tests() {
+ while read -r line; do
+ printf '%s\r\n' "$line" | nc "$host" "$port"
+ done < tests
+}
+
+uid=$(id -u)
+if test "$uid" != "0"; then
+ echo "needs to be run as root to be able to chroot the daemon, etc" >&2
+ exit 1
+fi
+
+# clean previous tests
+rm -rf results
+mkdir -p results
+chown "$user:$group" results
+rm -f test_counter.txt
+
+"$bin" -4 -d -b "$base" -p "$port" -o "$port" -h "$host" -u "$user" -g "$group" &
+run_tests
+pkill geomyidae
+
+"$bin" -4 -c -d -b "$base" -p "$port" -o "$port" -h "$host" -u "$user" -g "$group" &
+run_tests
+pkill geomyidae
+
+# TOOD: test TLS
DIR diff --git a/test.c b/test.c
@@ -0,0 +1,97 @@
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+const char *counter_path = "test_counter.txt";
+
+/* read counter */
+long
+get_test_counter(void)
+{
+ FILE *fp;
+ char buf[32];
+ size_t n;
+ long counter;
+
+ fp = fopen(counter_path, "rb+");
+ if (!fp)
+ return 0;
+
+ n = fread(buf, 1, sizeof(buf), fp);
+ if (n < 0 || ferror(fp))
+ return 0;
+ buf[n] = '\0';
+ counter = strtol(buf, NULL, 10);
+
+ return counter;
+}
+
+/* write new counter */
+int
+write_test_counter(long counter)
+{
+ FILE *fp;
+ char buf[32];
+ size_t n;
+ int ret;
+
+ fp = fopen(counter_path, "wb+");
+ if (!fp) {
+ fprintf(stderr, "error opening path for writing counter: %s",
+ strerror(errno));
+ return -1;
+ }
+
+ snprintf(buf, sizeof(buf), "%ld", counter);
+ fwrite(buf, 1, strlen(buf), fp);
+ ret = (fflush(fp) || ferror(fp)) ? -1 : 0;
+ fclose(fp);
+
+ return ret;
+}
+
+int
+main(void)
+{
+ FILE *fp;
+ char path[PATH_MAX];
+ const char *envs[] = {
+ "PATH_INFO",
+ "PATH_TRANSLATED",
+ "QUERY_STRING",
+ "SCRIPT_NAME",
+ /* TLS */
+ "SERVER_PROTOCOL",
+ "HTTPS",
+ /* gopher-specific: */
+ "SEARCHREQUEST",
+ "X_GOPHER_SEARCH"
+ };
+ char *p;
+ int i;
+ long counter;
+
+ counter = get_test_counter();
+
+ snprintf(path, sizeof(path), "results/%lld.txt", counter);
+ fp = fopen(path, "wb+");
+ if (!fp) {
+ fprintf(stderr, "error writing result to path: %s: %s\n",
+ path, strerror(errno));
+ return 1;
+ }
+
+ for (i = 0; i < sizeof(envs) / sizeof(envs[0]); i++) {
+ p = getenv(envs[i]);
+ if (!p)
+ p = "(null)";
+ fprintf(fp, "%s = %s\n", envs[i], p);
+ }
+ fclose(fp);
+
+ write_test_counter(counter + 1);
+
+ return 0;
+}
DIR diff --git a/tests b/tests
@@ -0,0 +1,7 @@
+test.cgi
+/test.cgi
+//test.cgi
+/?query
+/test.cgi?query
+/test.cgi?query=test
+/test.cgi?query=/test