]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: basic benchmarking support for the unit test framework enable
authordjm@openbsd.org <djm@openbsd.org>
Tue, 15 Apr 2025 04:00:42 +0000 (04:00 +0000)
committerDamien Miller <djm@mindrot.org>
Tue, 15 Apr 2025 05:33:12 +0000 (15:33 +1000)
with "make UNITTEST_BENCHMARK=yes"

ok dtucker@

OpenBSD-Regress-ID: 7f16a2e247f860897ca46ff87bccbe6002a32564

26 files changed:
Makefile.in
regress/Makefile
regress/unittests/Makefile.inc
regress/unittests/authopt/Makefile
regress/unittests/authopt/tests.c
regress/unittests/bitmap/Makefile
regress/unittests/bitmap/tests.c
regress/unittests/conversion/Makefile
regress/unittests/conversion/tests.c
regress/unittests/hostkeys/Makefile
regress/unittests/hostkeys/tests.c
regress/unittests/kex/Makefile
regress/unittests/kex/test_kex.c
regress/unittests/kex/tests.c
regress/unittests/match/Makefile
regress/unittests/match/tests.c
regress/unittests/misc/Makefile
regress/unittests/misc/tests.c
regress/unittests/sshbuf/tests.c
regress/unittests/sshkey/test_sshkey.c
regress/unittests/sshkey/tests.c
regress/unittests/sshsig/tests.c
regress/unittests/test_helper/test_helper.c
regress/unittests/test_helper/test_helper.h
regress/unittests/utf8/Makefile
regress/unittests/utf8/tests.c

index 4617cebcd5e439cbe29bda58c8444bc92b12f8fb..5a7a1bd101e3f4aeab29e6e65974b12c475d7f4d 100644 (file)
@@ -782,6 +782,13 @@ unit: regress-unit-binaries
                OBJ="$(BUILDDIR)/regress" \
                $@ && echo $@ tests passed
 
+unit-bench: regress-unit-binaries
+       cd $(srcdir)/regress || exit $$?; \
+       $(MAKE) \
+               .CURDIR="$(abs_top_srcdir)/regress" \
+               .OBJDIR="$(BUILDDIR)/regress" \
+               OBJ="$(BUILDDIR)/regress" $@
+
 TEST_SSH_SSHD="$(BUILDDIR)/sshd"
 
 interop-tests t-exec file-tests extra-tests: regress-prep regress-binaries $(TARGETS)
index 7e7f95b58a2c28ea12c40e40503d4c6532aeab28..8b69e14e998f55739786d3f8b27959f86d71106a 100644 (file)
@@ -292,26 +292,33 @@ t-extra:  ${EXTRA_TESTS:=.sh}
 interop: ${INTEROP_TARGETS}
 
 # Unit tests, built by top-level Makefile
-unit:
+unit unit-bench:
        set -e ; if test -z "${SKIP_UNIT}" ; then \
                V="" ; \
                test "x${USE_VALGRIND}" = "x" || \
                    V=${.CURDIR}/valgrind-unit.sh ; \
-                $$V ${.OBJDIR}/unittests/sshbuf/test_sshbuf ; \
+               ARGS=""; \
+               test "x$@" = "xunit-bench" && ARGS="-b"; \
+               test "x${UNITTEST_FAST}" = "x" || ARGS="$$ARGS -f"; \
+               test "x${UNITTEST_SLOW}" = "x" || ARGS="$$ARGS -F"; \
+               test "x${UNITTEST_VERBOSE}" = "x" || ARGS="$$ARGS -v"; \
+               test "x${UNITTEST_BENCH_DETAIL}" = "x" || ARGS="$$ARGS -B"; \
+               test "x${UNITTEST_BENCH_ONLY}" = "x" || ARGS="$$ARGS -O ${UNITTEST_BENCH_ONLY}"; \
+                $$V ${.OBJDIR}/unittests/sshbuf/test_sshbuf $${ARGS}; \
                 $$V ${.OBJDIR}/unittests/sshkey/test_sshkey \
-                       -d ${.CURDIR}/unittests/sshkey/testdata ; \
+                       -d ${.CURDIR}/unittests/sshkey/testdata $${ARGS}; \
                $$V ${.OBJDIR}/unittests/sshsig/test_sshsig \
-                       -d ${.CURDIR}/unittests/sshsig/testdata ; \
+                       -d ${.CURDIR}/unittests/sshsig/testdata $${ARGS}; \
                $$V ${.OBJDIR}/unittests/authopt/test_authopt \
-                       -d ${.CURDIR}/unittests/authopt/testdata ; \
-               $$V ${.OBJDIR}/unittests/bitmap/test_bitmap ; \
-               $$V ${.OBJDIR}/unittests/conversion/test_conversion ; \
-               $$V ${.OBJDIR}/unittests/kex/test_kex ; \
+                       -d ${.CURDIR}/unittests/authopt/testdata $${ARGS}; \
+               $$V ${.OBJDIR}/unittests/bitmap/test_bitmap $${ARGS}; \
+               $$V ${.OBJDIR}/unittests/conversion/test_conversion $${ARGS}; \
+               $$V ${.OBJDIR}/unittests/kex/test_kex $${ARGS}; \
                $$V ${.OBJDIR}/unittests/hostkeys/test_hostkeys \
-                       -d ${.CURDIR}/unittests/hostkeys/testdata ; \
-               $$V ${.OBJDIR}/unittests/match/test_match ; \
-               $$V ${.OBJDIR}/unittests/misc/test_misc ; \
+                       -d ${.CURDIR}/unittests/hostkeys/testdata $${ARGS}; \
+               $$V ${.OBJDIR}/unittests/match/test_match $${ARGS}; \
+               $$V ${.OBJDIR}/unittests/misc/test_misc $${ARGS}; \
                if test "x${TEST_SSH_UTF8}" = "xyes"  ; then \
-                       $$V ${.OBJDIR}/unittests/utf8/test_utf8 ; \
+                       $$V ${.OBJDIR}/unittests/utf8/test_utf8 $${ARGS}; \
                fi \
        fi
index 98e280486ab197e7fb9eacc7e54f4e4a77b5eb4c..ad7fdad84a5357816b7db8e2d372cacacd7b5a62 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile.inc,v 1.16 2024/01/11 01:45:58 djm Exp $
+#      $OpenBSD: Makefile.inc,v 1.17 2025/04/15 04:00:42 djm Exp $
 
 .include <bsd.own.mk>
 .include <bsd.obj.mk>
@@ -7,6 +7,9 @@
 UNITTEST_FAST?= no     # Skip slow tests (e.g. less intensive fuzzing).
 UNITTEST_SLOW?= no     # Include slower tests (e.g. more intensive fuzzing).
 UNITTEST_VERBOSE?= no  # Verbose test output (inc. per-test names).
+UNITTEST_BENCHMARK?= no        # Run unit tests in benchmarking mode.
+UNITTEST_BENCH_DETAIL?=no # Detailed benchmark statistics.
+UNITTEST_BENCH_ONLY?=  # Run only these benchmarks
 
 MALLOC_OPTIONS?=       CFGJRSUX
 TEST_ENV?=             MALLOC_OPTIONS=${MALLOC_OPTIONS}
@@ -69,8 +72,8 @@ DPADD+=${.CURDIR}/../test_helper/libtest_helper.a
 
 .PATH: ${.CURDIR}/${SSHREL}
 
-LDADD+= -lutil
-DPADD+= ${LIBUTIL}
+LDADD+= -lutil -lm
+DPADD+= ${LIBUTIL} ${LIBM}
 
 .if (${OPENSSL:L} == "yes")
 LDADD+= -lcrypto
@@ -82,11 +85,21 @@ DPADD+= ${LIBFIDO2} ${LIBCBOR} ${LIBUSBHID}
 
 UNITTEST_ARGS?=
 
-.if (${UNITTEST_VERBOSE:L} != "no")
+.if (${UNITTEST_VERBOSE:L:R} != "no")
 UNITTEST_ARGS+= -v
 .endif
-.if (${UNITTEST_FAST:L} != "no")
+.if (${UNITTEST_FAST:L:R} != "no")
 UNITTEST_ARGS+= -f
-.elif (${UNITTEST_SLOW:L} != "no")
+.elif (${UNITTEST_SLOW:L:R} != "no")
 UNITTEST_ARGS+= -F
 .endif
+
+.if (${UNITTEST_BENCHMARK:L:R} != "no")
+UNITTEST_ARGS+= -b
+.endif
+.if (${UNITTEST_BENCH_DETAIL:L:R} != "no")
+UNITTEST_ARGS+= -B
+.endif
+.if (${UNITTEST_BENCH_ONLY:L} != "")
+UNITTEST_ARGS+= -O "${UNITTEST_BENCH_ONLY}"
+.endif
index 3045ec708165fe2ae55d456aaed0fd33002f0b1c..8bed7a915dfae46f6489d1aca65b2a8e377e1670 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile,v 1.7 2023/01/15 23:35:10 djm Exp $
+#      $OpenBSD: Makefile,v 1.8 2025/04/15 04:00:42 djm Exp $
 
 PROG=test_authopt
 SRCS=tests.c
@@ -22,6 +22,6 @@ SRCS+=utf8.c
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
-       env ${TEST_ENV} ./${PROG} -d ${.CURDIR}/testdata
+       env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS} -d ${.CURDIR}/testdata
 
 .include <bsd.regress.mk>
index d9e190305e761d7c1c80027b815f2e088f4af767..5285f0db5746c9c193e9c03d623146bb0b0744a4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tests.c,v 1.3 2021/12/14 21:25:27 deraadt Exp $ */
+/*     $OpenBSD: tests.c,v 1.4 2025/04/15 04:00:42 djm Exp $ */
 
 /*
  * Regress test for keys options functions.
@@ -576,3 +576,9 @@ tests(void)
        test_cert_parse();
        test_merge();
 }
+
+void
+benchmarks(void)
+{
+       printf("no benchmarks\n");
+}
index fe30acc773944f8423c2b3113f8c2732b5cc3084..c38cc7918cc1f16559d8040fdedbefc1faca8bc5 100644 (file)
@@ -1,14 +1,15 @@
-#      $OpenBSD: Makefile,v 1.4 2017/12/21 00:41:22 djm Exp $
+#      $OpenBSD: Makefile,v 1.5 2025/04/15 04:00:42 djm Exp $
 
 PROG=test_bitmap
 SRCS=tests.c
 
 # From usr.sbin/ssh
-SRCS+=bitmap.c atomicio.c
+SRCS+=bitmap.c atomicio.c misc.c xmalloc.c fatal.c log.c cleanup.c match.c
+SRCS+=sshbuf.c sshbuf-getput-basic.c sshbuf-misc.c ssherr.c addr.c addrmatch.c
 
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
-       env ${TEST_ENV} ./${PROG}
+       env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS}
 
 .include <bsd.regress.mk>
index 576b863f4066dd5366011214763c2eb7c4f716d8..b8eae231321513101c98189f3c10bdce9a382bd8 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tests.c,v 1.2 2021/12/14 21:25:27 deraadt Exp $ */
+/*     $OpenBSD: tests.c,v 1.3 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Regress test for bitmap.h bitmap API
  *
@@ -23,7 +23,7 @@
 
 #include "bitmap.h"
 
-#define NTESTS 131
+#define DEFAULT_NTESTS 131
 
 void
 tests(void)
@@ -32,10 +32,15 @@ tests(void)
        struct bitmap *b;
        BIGNUM *bn;
        size_t len;
-       int i, j, k, n;
+       int i, j, k, n, ntests = DEFAULT_NTESTS;
        u_char bbuf[1024], bnbuf[1024];
        int r;
 
+       if (test_is_fast())
+               ntests /= 4;
+       else if (test_is_slow())
+               ntests *= 2;
+
        TEST_START("bitmap_new");
        b = bitmap_new();
        ASSERT_PTR_NE(b, NULL);
@@ -44,9 +49,9 @@ tests(void)
        TEST_DONE();
 
        TEST_START("bitmap_set_bit / bitmap_test_bit");
-       for (i = -1; i < NTESTS; i++) {
-               for (j = -1; j < NTESTS; j++) {
-                       for (k = -1; k < NTESTS; k++) {
+       for (i = -1; i < ntests; i++) {
+               for (j = -1; j < ntests; j++) {
+                       for (k = -1; k < ntests; k++) {
                                bitmap_zero(b);
                                BN_clear(bn);
 
@@ -67,7 +72,7 @@ tests(void)
 
                                /* Check perfect match between bitmap and bn */
                                test_subtest_info("match %d/%d/%d", i, j, k);
-                               for (n = 0; n < NTESTS; n++) {
+                               for (n = 0; n < ntests; n++) {
                                        ASSERT_INT_EQ(BN_is_bit_set(bn, n),
                                            bitmap_test_bit(b, n));
                                }
@@ -99,7 +104,7 @@ tests(void)
                                bitmap_zero(b);
                                ASSERT_INT_EQ(bitmap_from_string(b, bnbuf,
                                    len), 0);
-                               for (n = 0; n < NTESTS; n++) {
+                               for (n = 0; n < ntests; n++) {
                                        ASSERT_INT_EQ(BN_is_bit_set(bn, n),
                                            bitmap_test_bit(b, n));
                                }
@@ -107,7 +112,7 @@ tests(void)
                                /* Test clearing bits */
                                test_subtest_info("clear %d/%d/%d",
                                    i, j, k);
-                               for (n = 0; n < NTESTS; n++) {
+                               for (n = 0; n < ntests; n++) {
                                        ASSERT_INT_EQ(bitmap_set_bit(b, n), 0);
                                        ASSERT_INT_EQ(BN_set_bit(bn, n), 1);
                                }
@@ -123,7 +128,7 @@ tests(void)
                                        bitmap_clear_bit(b, k);
                                        BN_clear_bit(bn, k);
                                }
-                               for (n = 0; n < NTESTS; n++) {
+                               for (n = 0; n < ntests; n++) {
                                        ASSERT_INT_EQ(BN_is_bit_set(bn, n),
                                            bitmap_test_bit(b, n));
                                }
@@ -135,4 +140,9 @@ tests(void)
        TEST_DONE();
 #endif
 }
+void
+benchmarks(void)
+{
+       printf("no benchmarks\n");
+}
 
index 5793c49348458257aace4a4f0e1925db373678ba..f9f5859ac5e8f5129b41cc4a845668d187f36549 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile,v 1.4 2021/01/09 12:24:30 dtucker Exp $
+#      $OpenBSD: Makefile,v 1.5 2025/04/15 04:00:42 djm Exp $
 
 PROG=test_conversion
 SRCS=tests.c
@@ -11,6 +11,6 @@ SRCS+=match.c addr.c addrmatch.c
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
-       env ${TEST_ENV} ./${PROG}
+       env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS}
 
 .include <bsd.regress.mk>
index 5b526f7afa07af227e3e427b74b6231b74625761..d65e6326fd4e1b434863a909a2d21c842e02f2d3 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tests.c,v 1.4 2021/12/14 21:25:27 deraadt Exp $ */
+/*     $OpenBSD: tests.c,v 1.5 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Regress test for conversions
  *
@@ -50,3 +50,9 @@ tests(void)
        ASSERT_INT_EQ(convtime("1000000000000000000000w"), -1);
        TEST_DONE();
 }
+
+void
+benchmarks(void)
+{
+       printf("no benchmarks\n");
+}
index 04d93359acaad563987e180e9971baca3b0a1666..79a9d5745419aaad544a5bf4f416352f58a30652 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile,v 1.10 2023/01/15 23:35:10 djm Exp $
+#      $OpenBSD: Makefile,v 1.11 2025/04/15 04:00:42 djm Exp $
 
 PROG=test_hostkeys
 SRCS=tests.c test_iterate.c
@@ -20,6 +20,6 @@ SRCS+=utf8.c
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
-       env ${TEST_ENV} ./${PROG} -d ${.CURDIR}/testdata
+       env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS} -d ${.CURDIR}/testdata
 
 .include <bsd.regress.mk>
index 92c7646ad164106b2cd604067bbd5c82840e32e3..a14ba19b3abe1e838c619868c1faf141626bbf19 100644 (file)
@@ -1,10 +1,14 @@
-/*     $OpenBSD: tests.c,v 1.1 2015/02/16 22:18:34 djm Exp $ */
+/*     $OpenBSD: tests.c,v 1.2 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Regress test for known_hosts-related API.
  *
  * Placed in the public domain
  */
 
+#include <stdio.h>
+
+#include "../test_helper/test_helper.h"
+
 void tests(void);
 void test_iterate(void); /* test_iterate.c */
 
@@ -14,3 +18,8 @@ tests(void)
        test_iterate();
 }
 
+void
+benchmarks(void)
+{
+       printf("no benchmarks\n");
+}
index ca4f0ee38639109450f577ab6e739c5e430fce20..b76ee8edc813ddf4d184212e1b30e874fa16e351 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile,v 1.16 2024/09/09 03:13:39 djm Exp $
+#      $OpenBSD: Makefile,v 1.17 2025/04/15 04:00:42 djm Exp $
 
 PROG=test_kex
 SRCS=tests.c test_kex.c test_proposal.c
@@ -35,7 +35,7 @@ SRCS+=digest-openssl.c
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
-       env ${TEST_ENV} ./${PROG}
+       env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS}
 
 .include <bsd.regress.mk>
 
index caf8f57f75d6f59d0d1aff2d9d9ecfaf42b3cc2c..84dada301b8fbe3f1a90c9af0f7b0b44f5438b96 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: test_kex.c,v 1.9 2024/09/09 03:13:39 djm Exp $ */
+/*     $OpenBSD: test_kex.c,v 1.10 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Regress test KEX
  *
@@ -8,6 +8,7 @@
 #include "includes.h"
 
 #include <sys/types.h>
+#include <sys/time.h>
 #include <stdio.h>
 #ifdef HAVE_STDINT_H
 #include <stdint.h>
@@ -76,7 +77,8 @@ run_kex(struct ssh *client, struct ssh *server)
 }
 
 static void
-do_kex_with_key(char *kex, int keytype, int bits)
+do_kex_with_key(char *kex, char *cipher, char *mac,
+    struct sshkey *key, int keytype, int bits)
 {
        struct ssh *client = NULL, *server = NULL, *server2 = NULL;
        struct sshkey *private, *public;
@@ -85,9 +87,14 @@ do_kex_with_key(char *kex, int keytype, int bits)
        char *myproposal[PROPOSAL_MAX] = { KEX_CLIENT };
        char *keyname = NULL;
 
-       TEST_START("sshkey_generate");
-       ASSERT_INT_EQ(sshkey_generate(keytype, bits, &private), 0);
-       TEST_DONE();
+       if (key != NULL) {
+               private = key;
+               keytype = key->type;
+       } else {
+               TEST_START("sshkey_generate");
+               ASSERT_INT_EQ(sshkey_generate(keytype, bits, &private), 0);
+               TEST_DONE();
+       }
 
        TEST_START("sshkey_from_private");
        ASSERT_INT_EQ(sshkey_from_private(private, &public), 0);
@@ -97,6 +104,14 @@ do_kex_with_key(char *kex, int keytype, int bits)
        memcpy(kex_params.proposal, myproposal, sizeof(myproposal));
        if (kex != NULL)
                kex_params.proposal[PROPOSAL_KEX_ALGS] = kex;
+       if (cipher != NULL) {
+               kex_params.proposal[PROPOSAL_ENC_ALGS_CTOS] = cipher;
+               kex_params.proposal[PROPOSAL_ENC_ALGS_STOC] = cipher;
+       }
+       if (mac != NULL) {
+               kex_params.proposal[PROPOSAL_MAC_ALGS_CTOS] = mac;
+               kex_params.proposal[PROPOSAL_MAC_ALGS_STOC] = mac;
+       }
        keyname = strdup(sshkey_ssh_name(private));
        ASSERT_PTR_NE(keyname, NULL);
        kex_params.proposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = keyname;
@@ -167,7 +182,8 @@ do_kex_with_key(char *kex, int keytype, int bits)
        TEST_DONE();
 
        TEST_START("cleanup");
-       sshkey_free(private);
+       if (key == NULL)
+               sshkey_free(private);
        sshkey_free(public);
        ssh_free(client);
        ssh_free(server);
@@ -179,19 +195,37 @@ do_kex_with_key(char *kex, int keytype, int bits)
 static void
 do_kex(char *kex)
 {
-#if 0
-       log_init("test_kex", SYSLOG_LEVEL_DEBUG3, SYSLOG_FACILITY_AUTH, 1);
-#endif
+       struct sshkey *key = NULL;
+       char name[256];
+
+       if (test_is_benchmark()) {
+               snprintf(name, sizeof(name), "generate %s", kex);
+               TEST_START(name);
+               ASSERT_INT_EQ(sshkey_generate(KEY_ED25519, 0, &key), 0);
+               TEST_DONE();
+               snprintf(name, sizeof(name), "KEX %s", kex);
+               BENCH_START(name);
+               /*
+                * NB. use a cipher/MAC here that requires minimal bits from
+                * the KEX to avoid DH-GEX taking forever.
+                */
+               do_kex_with_key(kex, "aes128-ctr", "hmac-sha2-256", key,
+                   KEY_ED25519, 256);
+               BENCH_FINISH("kex");
+               sshkey_free(key);
+               return;
+       }
+
 #ifdef WITH_OPENSSL
-       do_kex_with_key(kex, KEY_RSA, 2048);
-#ifdef WITH_DSA
-       do_kex_with_key(kex, KEY_DSA, 1024);
-#endif
-#ifdef OPENSSL_HAS_ECC
-       do_kex_with_key(kex, KEY_ECDSA, 256);
-#endif /* OPENSSL_HAS_ECC */
+       do_kex_with_key(kex, NULL, NULL, NULL, KEY_RSA, 2048);
+# ifdef WITH_DSA
+       do_kex_with_key(kex, NULL, NULL, NULL, KEY_DSA, 1024);
+# endif /* WITH_DSA */
+# ifdef OPENSSL_HAS_ECC
+       do_kex_with_key(kex, NULL, NULL, NULL, KEY_ECDSA, 256);
+# endif /* OPENSSL_HAS_ECC */
 #endif /* WITH_OPENSSL */
-       do_kex_with_key(kex, KEY_ED25519, 256);
+       do_kex_with_key(kex, NULL, NULL, NULL, KEY_ED25519, 256);
 }
 
 void
index d3044f033767242ccac931b4145b904013bb7143..a3ef19ef410ae47f96db8e3f3bcca9f91aad5c53 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tests.c,v 1.3 2023/03/06 12:15:47 dtucker Exp $ */
+/*     $OpenBSD: tests.c,v 1.4 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Placed in the public domain
  */
@@ -16,3 +16,10 @@ tests(void)
        kex_proposal_tests();
        kex_proposal_populate_tests();
 }
+
+void
+benchmarks(void)
+{
+       printf("\n");
+       kex_tests();
+}
index 939163d30ef56d4fa4d44fc04c3dc9dc93db504a..7b17e568934415bfa5977ee72dbcfdfea8aa4ebc 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile,v 1.5 2021/01/09 12:24:31 dtucker Exp $
+#      $OpenBSD: Makefile,v 1.6 2025/04/15 04:00:42 djm Exp $
 
 PROG=test_match
 SRCS=tests.c
@@ -11,6 +11,6 @@ SRCS+=cleanup.c atomicio.c addr.c
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
-       env ${TEST_ENV} ./${PROG}
+       env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS}
 
 .include <bsd.regress.mk>
index f00d1f9348fcfc29dad78a1081064526ec17a59e..2ca6c769ae3f4d73f550b4a2b03b83b39113c0d9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tests.c,v 1.8 2021/12/14 21:25:27 deraadt Exp $ */
+/*     $OpenBSD: tests.c,v 1.9 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Regress test for matching functions
  *
@@ -129,3 +129,9 @@ tests(void)
  * int      addr_match_cidr_list(const char *, const char *);
  */
 }
+
+void
+benchmarks(void)
+{
+       printf("no benchmarks\n");
+}
index d2be393ad703ed9705df02d2bd3e65dff61674be..7282be13a66777cbe59349fd698c45a27410ce38 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile,v 1.9 2023/01/06 02:59:50 djm Exp $
+#      $OpenBSD: Makefile,v 1.10 2025/04/15 04:00:42 djm Exp $
 
 PROG=test_misc
 SRCS=tests.c
@@ -28,6 +28,6 @@ SRCS+=        atomicio.c cleanup.c fatal.c
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
-       env ${TEST_ENV} ./${PROG}
+       env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS}
 
 .include <bsd.regress.mk>
index 32699541413e9e85be198b7e7733594e319ab77e..7611a0d3b64575e2ed27c80266e916d3f614b49f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tests.c,v 1.10 2023/01/06 02:59:50 djm Exp $ */
+/*     $OpenBSD: tests.c,v 1.11 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Regress test for misc helper functions.
  *
@@ -39,3 +39,9 @@ tests(void)
        test_hpdelim();
        test_ptimeout();
 }
+
+void
+benchmarks(void)
+{
+       printf("no benchmarks\n");
+}
index 29916a10bc5bcee64ca9c510e51434158615f331..eb801fb3b302538c87e1d9de0b36da41ae9d5937 100644 (file)
@@ -1,10 +1,12 @@
-/*     $OpenBSD: tests.c,v 1.1 2014/04/30 05:32:00 djm Exp $ */
+/*     $OpenBSD: tests.c,v 1.2 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Regress test for sshbuf.h buffer API
  *
  * Placed in the public domain
  */
 
+#include <stdio.h>
+
 #include "../test_helper/test_helper.h"
 
 void sshbuf_tests(void);
@@ -28,3 +30,9 @@ tests(void)
        sshbuf_getput_fuzz_tests();
        sshbuf_fixed();
 }
+
+void
+benchmarks(void)
+{
+       printf("no benchmarks\n");
+}
index 5bf4b65cc055f8002ae6b6e8ece85c18786bc21a..fc744eb7430f2b41170c6b5b07645f5d92597932 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: test_sshkey.c,v 1.25 2024/08/15 00:52:23 djm Exp $ */
+/*     $OpenBSD: test_sshkey.c,v 1.26 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Regress test for sshkey.h key management API
  *
@@ -36,6 +36,7 @@
 #include "ssh2.h"
 
 void sshkey_tests(void);
+void sshkey_benchmarks(void);
 
 static void
 put_opt(struct sshbuf *b, const char *name, const char *value)
@@ -133,6 +134,55 @@ signature_test(struct sshkey *k, struct sshkey *bad, const char *sig_alg,
        free(sig);
 }
 
+static void
+signature_bench(const char *name, int ktype, int bits, const char *sig_alg,
+    const u_char *d, size_t l)
+{
+       struct sshkey *k;
+       size_t len;
+       u_char *sig;
+       char testname[256];
+
+       snprintf(testname, sizeof(testname), "sign %s", name);
+       TEST_START(testname);
+       ASSERT_INT_EQ(sshkey_generate(ktype, bits, &k), 0);
+       ASSERT_PTR_NE(k, NULL);
+
+       BENCH_START(testname);
+       ASSERT_INT_EQ(sshkey_sign(k, &sig, &len, d, l, sig_alg,
+           NULL, NULL, 0), 0);
+       free(sig);
+       BENCH_FINISH("sign");
+
+       sshkey_free(k);
+       TEST_DONE();
+}
+
+static void
+verify_bench(const char *name, int ktype, int bits, const char *sig_alg,
+    const u_char *d, size_t l)
+{
+       struct sshkey *k;
+       size_t len;
+       u_char *sig;
+       char testname[256];
+
+       snprintf(testname, sizeof(testname), "verify %s", name);
+       TEST_START(testname);
+       ASSERT_INT_EQ(sshkey_generate(ktype, bits, &k), 0);
+       ASSERT_PTR_NE(k, NULL);
+
+       ASSERT_INT_EQ(sshkey_sign(k, &sig, &len, d, l, sig_alg,
+           NULL, NULL, 0), 0);
+       BENCH_START(testname);
+       ASSERT_INT_EQ(sshkey_verify(k, sig, len, d, l, NULL, 0, NULL), 0);
+       BENCH_FINISH("verify");
+
+       free(sig);
+       sshkey_free(k);
+       TEST_DONE();
+}
+
 static void
 banana(u_char *s, size_t l)
 {
@@ -165,6 +215,19 @@ signature_tests(struct sshkey *k, struct sshkey *bad, const char *sig_alg)
        }
 }
 
+static void
+signature_benchmark(const char *name, int ktype, int bits,
+    const char *sig_alg, int bench_verify)
+{
+       u_char buf[256];
+
+       banana(buf, sizeof(buf));
+       if (bench_verify)
+               verify_bench(name, ktype, bits, sig_alg, buf, sizeof(buf));
+       else
+               signature_bench(name, ktype, bits, sig_alg, buf, sizeof(buf));
+}
+
 static struct sshkey *
 get_private(const char *n)
 {
@@ -537,3 +600,101 @@ sshkey_tests(void)
        TEST_DONE();
 #endif /* WITH_OPENSSL */
 }
+
+void
+sshkey_benchmarks(void)
+{
+       struct sshkey *k = NULL;
+
+#ifdef WITH_OPENSSL
+       BENCH_START("generate RSA-1024");
+       TEST_START("generate KEY_RSA");
+       ASSERT_INT_EQ(sshkey_generate(KEY_RSA, 1024, &k), 0);
+       ASSERT_PTR_NE(k, NULL);
+       sshkey_free(k);
+       TEST_DONE();
+       BENCH_FINISH("keys");
+
+       BENCH_START("generate RSA-2048");
+       TEST_START("generate KEY_RSA");
+       ASSERT_INT_EQ(sshkey_generate(KEY_RSA, 2048, &k), 0);
+       ASSERT_PTR_NE(k, NULL);
+       sshkey_free(k);
+       TEST_DONE();
+       BENCH_FINISH("keys");
+
+#ifdef WITH_DSA
+       BENCH_START("generate DSA-1024");
+       TEST_START("generate KEY_DSA");
+       ASSERT_INT_EQ(sshkey_generate(KEY_DSA, 1024, &k), 0);
+       ASSERT_PTR_NE(k, NULL);
+       sshkey_free(k);
+       TEST_DONE();
+       BENCH_FINISH("keys");
+#endif
+
+       BENCH_START("generate ECDSA-256");
+       TEST_START("generate KEY_ECDSA");
+       ASSERT_INT_EQ(sshkey_generate(KEY_ECDSA, 256, &k), 0);
+       ASSERT_PTR_NE(k, NULL);
+       sshkey_free(k);
+       TEST_DONE();
+       BENCH_FINISH("keys");
+
+       BENCH_START("generate ECDSA-384");
+       TEST_START("generate KEY_ECDSA");
+       ASSERT_INT_EQ(sshkey_generate(KEY_ECDSA, 384, &k), 0);
+       ASSERT_PTR_NE(k, NULL);
+       sshkey_free(k);
+       TEST_DONE();
+       BENCH_FINISH("keys");
+
+       BENCH_START("generate ECDSA-521");
+       TEST_START("generate KEY_ECDSA");
+       ASSERT_INT_EQ(sshkey_generate(KEY_ECDSA, 521, &k), 0);
+       ASSERT_PTR_NE(k, NULL);
+       sshkey_free(k);
+       TEST_DONE();
+       BENCH_FINISH("keys");
+#endif /* WITH_OPENSSL */
+
+       BENCH_START("generate ED25519");
+       TEST_START("generate KEY_ED25519");
+       ASSERT_INT_EQ(sshkey_generate(KEY_ED25519, 256, &k), 0);
+       ASSERT_PTR_NE(k, NULL);
+       sshkey_free(k);
+       TEST_DONE();
+       BENCH_FINISH("keys");
+
+#ifdef WITH_OPENSSL
+       /* sign */
+       signature_benchmark("RSA-1024/SHA1", KEY_RSA, 1024, "ssh-rsa", 0);
+       signature_benchmark("RSA-1024/SHA256", KEY_RSA, 1024, "rsa-sha2-256", 0);
+       signature_benchmark("RSA-1024/SHA512", KEY_RSA, 1024, "rsa-sha2-512", 0);
+       signature_benchmark("RSA-2048/SHA1", KEY_RSA, 2048, "ssh-rsa", 0);
+       signature_benchmark("RSA-2048/SHA256", KEY_RSA, 2048, "rsa-sha2-256", 0);
+       signature_benchmark("RSA-2048/SHA512", KEY_RSA, 2048, "rsa-sha2-512", 0);
+#ifdef WITH_DSA
+       signature_benchmark("DSA-1024", KEY_DSA, 1024, NULL, 0);
+#endif
+       signature_benchmark("ECDSA-256", KEY_ECDSA, 256, NULL, 0);
+       signature_benchmark("ECDSA-384", KEY_ECDSA, 384, NULL, 0);
+       signature_benchmark("ECDSA-521", KEY_ECDSA, 521, NULL, 0);
+       signature_benchmark("ED25519", KEY_ED25519, 0, NULL, 0);
+
+       /* verify */
+       signature_benchmark("RSA-1024/SHA1", KEY_RSA, 1024, "ssh-rsa", 1);
+       signature_benchmark("RSA-1024/SHA256", KEY_RSA, 1024, "rsa-sha2-256", 1);
+       signature_benchmark("RSA-1024/SHA512", KEY_RSA, 1024, "rsa-sha2-512", 1);
+       signature_benchmark("RSA-2048/SHA1", KEY_RSA, 2048, "ssh-rsa", 1);
+       signature_benchmark("RSA-2048/SHA256", KEY_RSA, 2048, "rsa-sha2-256", 1);
+       signature_benchmark("RSA-2048/SHA512", KEY_RSA, 2048, "rsa-sha2-512", 1);
+#ifdef WITH_DSA
+       signature_benchmark("DSA-1024", KEY_DSA, 1024, NULL, 1);
+#endif
+       signature_benchmark("ECDSA-256", KEY_ECDSA, 256, NULL, 1);
+       signature_benchmark("ECDSA-384", KEY_ECDSA, 384, NULL, 1);
+       signature_benchmark("ECDSA-521", KEY_ECDSA, 521, NULL, 1);
+#endif /* WITH_OPENSSL */
+       signature_benchmark("ED25519", KEY_ED25519, 0, NULL, 1);
+}
index 78aa9223d42bd557518177f152cd755780c6efe6..5511e7b8900d0a89d304acad69a3e2506a279945 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tests.c,v 1.1 2014/06/24 01:14:18 djm Exp $ */
+/*     $OpenBSD: tests.c,v 1.2 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Regress test for sshbuf.h buffer API
  *
@@ -12,6 +12,7 @@
 void sshkey_tests(void);
 void sshkey_file_tests(void);
 void sshkey_fuzz_tests(void);
+void sshkey_benchmarks(void);
 
 void
 tests(void)
@@ -20,3 +21,10 @@ tests(void)
        sshkey_file_tests();
        sshkey_fuzz_tests();
 }
+
+void
+benchmarks(void)
+{
+       printf("\n");
+       sshkey_benchmarks();
+}
index 80966bdd2c273d43ab72eec19d2b15b4fec53eaf..7fcf9488d2702da144176c8db6b757f2fbfeece4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tests.c,v 1.4 2024/01/11 01:45:59 djm Exp $ */
+/*     $OpenBSD: tests.c,v 1.5 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Regress test for sshbuf.h buffer API
  *
@@ -142,3 +142,9 @@ tests(void)
        sshbuf_free(msg);
        free(namespace);
 }
+
+void
+benchmarks(void)
+{
+       printf("no benchmarks\n");
+}
index e23128aa5599548f3a41f77470856889f434423e..b75f7701401b6078b5f8e438e7a0a88ad4ccbe58 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: test_helper.c,v 1.13 2021/12/14 21:25:27 deraadt Exp $        */
+/*     $OpenBSD: test_helper.c,v 1.14 2025/04/15 04:00:42 djm Exp $    */
 /*
  * Copyright (c) 2011 Damien Miller <djm@mindrot.org>
  *
 
 #include <sys/types.h>
 #include <sys/uio.h>
-
-#include <stdarg.h>
+#include <sys/time.h>
+#include <assert.h>
 #include <fcntl.h>
-#include <stdio.h>
+#include <limits.h>
+#include <math.h>
+#include <signal.h>
+#include <stdarg.h>
 #ifdef HAVE_STDINT_H
 # include <stdint.h>
 #endif
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <assert.h>
 #include <unistd.h>
-#include <signal.h>
 
 #ifdef WITH_OPENSSL
 #include <openssl/bn.h>
 # include <vis.h>
 #endif
 
-#define MINIMUM(a, b)    (((a) < (b)) ? (a) : (b))
-
 #include "entropy.h"
 #include "test_helper.h"
 #include "atomicio.h"
+#include "match.h"
+#include "misc.h"
+#include "xmalloc.h"
 
+#define BENCH_FAST_DEADLINE    1
+#define BENCH_NORMAL_DEADLINE  10
+#define BENCH_SLOW_DEADLINE    60
+#define BENCH_SAMPLES_ALLOC    8192
+#define BENCH_COLUMN_WIDTH     40
+
+#define MINIMUM(a, b)    (((a) < (b)) ? (a) : (b))
 #define TEST_CHECK_INT(r, pred) do {           \
                switch (pred) {                 \
                case TEST_EQ:                   \
@@ -123,6 +135,15 @@ static const char *data_dir = NULL;
 static char subtest_info[512];
 static int fast = 0;
 static int slow = 0;
+static int benchmark_detail_statistics = 0;
+
+static int benchmark = 0;
+static const char *bench_name = NULL;
+static char *benchmark_pattern = NULL;
+static struct timespec bench_start_time, bench_finish_time;
+static struct timespec *bench_samples;
+static int bench_skip, bench_nruns, bench_nalloc;
+double bench_accum_secs;
 
 int
 main(int argc, char **argv)
@@ -147,8 +168,17 @@ main(int argc, char **argv)
                }
        }
 
-       while ((ch = getopt(argc, argv, "Ffvqd:")) != -1) {
+       while ((ch = getopt(argc, argv, "O:bBFfvqd:")) != -1) {
                switch (ch) {
+               case 'b':
+                       benchmark = 1;
+                       break;
+               case 'B':
+                       benchmark = benchmark_detail_statistics = 1;
+                       break;
+               case 'O':
+                       benchmark_pattern = xstrdup(optarg);
+                       break;
                case 'F':
                        slow = 1;
                        break;
@@ -168,7 +198,8 @@ main(int argc, char **argv)
                        break;
                default:
                        fprintf(stderr, "Unrecognised command line option\n");
-                       fprintf(stderr, "Usage: %s [-v]\n", __progname);
+                       fprintf(stderr, "Usage: %s [-vqfFbB] [-d data_dir] "
+                           "[-O pattern]\n", __progname);
                        exit(1);
                }
        }
@@ -178,9 +209,12 @@ main(int argc, char **argv)
        if (verbose_mode)
                printf("\n");
 
-       tests();
+       if (benchmark)
+               benchmarks();
+       else
+               tests();
 
-       if (!quiet_mode)
+       if (!quiet_mode && !benchmark)
                printf(" %u tests ok\n", test_number);
        return 0;
 }
@@ -274,7 +308,7 @@ test_done(void)
        active_test_name = NULL;
        if (verbose_mode)
                printf("OK\n");
-       else if (!quiet_mode) {
+       else if (!quiet_mode && !benchmark) {
                printf(".");
                fflush(stdout);
        }
@@ -290,6 +324,12 @@ test_subtest_info(const char *fmt, ...)
        va_end(ap);
 }
 
+int
+test_is_benchmark(void)
+{
+       return benchmark;
+}
+
 void
 ssl_err_check(const char *file, int line)
 {
@@ -382,23 +422,6 @@ assert_string(const char *file, int line, const char *a1, const char *a2,
        test_die();
 }
 
-static char *
-tohex(const void *_s, size_t l)
-{
-       u_int8_t *s = (u_int8_t *)_s;
-       size_t i, j;
-       const char *hex = "0123456789abcdef";
-       char *r = malloc((l * 2) + 1);
-
-       assert(r != NULL);
-       for (i = j = 0; i < l; i++) {
-               r[j++] = hex[(s[i] >> 4) & 0xf];
-               r[j++] = hex[s[i] & 0xf];
-       }
-       r[j] = '\0';
-       return r;
-}
-
 void
 assert_mem(const char *file, int line, const char *a1, const char *a2,
     const void *aa1, const void *aa2, size_t l, enum test_predicate pred)
@@ -593,3 +616,131 @@ assert_ptr(const char *file, int line, const char *a1, const char *a2,
        test_die();
 }
 
+static double
+tstod(const struct timespec *ts)
+{
+       return (double)ts->tv_sec + ((double)ts->tv_nsec / 1000000000.0);
+}
+
+void
+bench_start(const char *file, int line, const char *name)
+{
+       char *cp;
+
+       if (bench_name != NULL) {
+               fprintf(stderr, "\n%s:%d internal error: BENCH_START() called "
+                   "while previous benchmark \"%s\" incomplete",
+                   file, line, bench_name);
+               abort();
+       }
+       cp = xstrdup(name);
+       lowercase(cp);
+       bench_skip = benchmark_pattern != NULL &&
+           match_pattern_list(cp, benchmark_pattern, 1) != 1;
+       free(cp);
+
+       bench_name = name;
+       bench_nruns = 0;
+       if (bench_skip)
+               return;
+       free(bench_samples);
+       bench_nalloc = BENCH_SAMPLES_ALLOC;
+       bench_samples = xcalloc(sizeof(*bench_samples), bench_nalloc);
+       bench_accum_secs = 0;
+}
+
+int
+bench_done(void)
+{
+       return bench_skip || bench_accum_secs >= (fast ? BENCH_FAST_DEADLINE :
+           (slow ? BENCH_SLOW_DEADLINE : BENCH_NORMAL_DEADLINE));
+}
+
+void
+bench_case_start(const char *file, int line)
+{
+       clock_gettime(CLOCK_REALTIME, &bench_start_time);
+}
+
+void
+bench_case_finish(const char *file, int line)
+{
+       struct timespec ts;
+
+       clock_gettime(CLOCK_REALTIME, &bench_finish_time);
+       timespecsub(&bench_finish_time, &bench_start_time, &ts);
+       if (bench_nruns >= bench_nalloc) {
+               if (bench_nalloc >= INT_MAX / 2) {
+                       fprintf(stderr, "\n%s:%d benchmark %s too many samples",
+                           __FILE__, __LINE__, bench_name);
+                       abort();
+               }
+               bench_samples = xrecallocarray(bench_samples, bench_nalloc,
+                   bench_nalloc * 2, sizeof(*bench_samples));
+               bench_nalloc *= 2;
+       }
+       bench_samples[bench_nruns++] = ts;
+       bench_accum_secs += tstod(&ts);
+}
+
+static int
+tscmp(const void *aa, const void *bb)
+{
+       const struct timespec *a = (const struct timespec *)aa;
+       const struct timespec *b = (const struct timespec *)bb;
+
+       if (timespeccmp(a, b, ==))
+               return 0;
+       return timespeccmp(a, b, <) ? -1 : 1;
+}
+
+void
+bench_finish(const char *file, int line, const char *unit)
+{
+       double std_dev = 0, mean_spr, mean_rps, med_spr, med_rps;
+       int i;
+
+       if (bench_skip)
+               goto done;
+
+       if (bench_nruns < 1) {
+               fprintf(stderr, "\n%s:%d benchmark %s never ran", file, line,
+                   bench_name);
+               abort();
+       }
+       /* median */
+       qsort(bench_samples, bench_nruns, sizeof(*bench_samples), tscmp);
+       i = bench_nruns / 2;
+       med_spr = tstod(&bench_samples[i]);
+       if (bench_nruns > 1 && bench_nruns & 1)
+               med_spr = (med_spr + tstod(&bench_samples[i - 1])) / 2.0;
+       med_rps = (med_spr == 0.0) ? INFINITY : 1.0/med_spr;
+       /* mean */
+       mean_spr = bench_accum_secs / (double)bench_nruns;
+       mean_rps = (mean_spr == 0.0) ? INFINITY : 1.0/mean_spr;
+       /* std. dev */
+       std_dev = 0;
+       for (i = 0; i < bench_nruns; i++) {
+               std_dev = tstod(&bench_samples[i]) - mean_spr;
+               std_dev *= std_dev;
+       }
+       std_dev /= (double)bench_nruns;
+       std_dev = sqrt(std_dev);
+       if (benchmark_detail_statistics) {
+               printf("%s: %d runs in %0.3fs, %0.03f/%0.03f ms/%s "
+                   "(mean/median), std.dev %0.03f ms, "
+                   "%0.2f/%0.2f %s/s (mean/median)\n",
+                   bench_name, bench_nruns, bench_accum_secs,
+                   mean_spr * 1000, med_spr * 1000, unit, std_dev * 1000,
+                   mean_rps, med_rps, unit);
+       } else {
+               printf("%-*s %0.2f %s/s\n", BENCH_COLUMN_WIDTH,
+                   bench_name, med_rps, unit);
+       }
+ done:
+       bench_name = NULL;
+       bench_nruns = 0;
+       free(bench_samples);
+       bench_samples = NULL;
+       bench_skip = 0;
+}
index 66302201cec34cdb0c29096d6e62e2c877caa332..23338af38882bb3073bedcabe1cc14a56e990d29 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: test_helper.h,v 1.9 2018/10/17 23:28:05 djm Exp $     */
+/*     $OpenBSD: test_helper.h,v 1.10 2025/04/15 04:00:42 djm Exp $    */
 /*
  * Copyright (c) 2011 Damien Miller <djm@mindrot.org>
  *
@@ -39,6 +39,7 @@ typedef void (test_onerror_func_t)(void *);
 
 /* Supplied by test suite */
 void tests(void);
+void benchmarks(void);
 
 const char *test_data_file(const char *name);
 void test_start(const char *n);
@@ -49,6 +50,7 @@ int test_is_verbose(void);
 int test_is_quiet(void);
 int test_is_fast(void);
 int test_is_slow(void);
+int test_is_benchmark(void);
 void test_subtest_info(const char *fmt, ...)
     __attribute__((format(printf, 1, 2)));
 void ssl_err_check(const char *file, int line);
@@ -285,6 +287,26 @@ void assert_u64(const char *file, int line,
 #define ASSERT_U64_GE(a1, a2) \
        assert_u64(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
 
+/* Benchmarking support */
+#define BENCH_START(name)      \
+       do { \
+               bench_start(__FILE__, __LINE__, name); \
+               while (!bench_done()) { \
+                       bench_case_start(__FILE__, __LINE__); \
+                       do {
+#define BENCH_FINISH(unit) \
+                       } while (0); \
+                       bench_case_finish(__FILE__, __LINE__); \
+               } \
+               bench_finish(__FILE__, __LINE__, unit); \
+       } while (0)
+
+void bench_start(const char *file, int line, const char *name);
+void bench_case_start(const char *file, int line);
+void bench_case_finish(const char *file, int line);
+void bench_finish(const char *file, int line, const char *unit);
+int bench_done(void);
+
 /* Fuzzing support */
 
 struct fuzz;
index f8eec0484f8fa4200bfd34b22ce901f92f9e8f5c..e89536500822fabc9ce40fae0e7f68ee5846d7d4 100644 (file)
@@ -1,14 +1,15 @@
-#      $OpenBSD: Makefile,v 1.5 2017/12/21 00:41:22 djm Exp $
+#      $OpenBSD: Makefile,v 1.6 2025/04/15 04:00:42 djm Exp $
 
 PROG=test_utf8
 SRCS=tests.c
 
 # From usr.bin/ssh
-SRCS+=utf8.c atomicio.c
+SRCS+=utf8.c atomicio.c misc.c xmalloc.c match.c ssherr.c cleanup.c fatal.c
+SRCS+=sshbuf.c sshbuf-getput-basic.c sshbuf-misc.c addr.c addrmatch.c log.c
 
 REGRESS_TARGETS=run-regress-${PROG}
 
 run-regress-${PROG}: ${PROG}
-       env ${TEST_ENV} ./${PROG}
+       env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS}
 
 .include <bsd.regress.mk>
index 8cf524ddb2106ba4e9a6faa042a839d70f0107e2..3fb63415e1ad4cb86cc7b25a513bc6cce9a604af 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tests.c,v 1.4 2017/02/19 00:11:29 djm Exp $ */
+/*     $OpenBSD: tests.c,v 1.5 2025/04/15 04:00:42 djm Exp $ */
 /*
  * Regress test for the utf8.h *mprintf() API
  *
@@ -102,3 +102,9 @@ tests(void)
        one(0, "double_fit", "a\343\201\201", 7, 5, -1, "a\\343");
        one(0, "double_spc", "a\343\201\201", 13, 13, 13, "a\\343\\201\\201");
 }
+
+void
+benchmarks(void)
+{
+       printf("no benchmarks\n");
+}