# install target below.
#
HEADERS = aes.h app.h assertions.h boolean.h backtrace.h base32.h base64.h \
- bind9.h buffer.h bufferlist.h commandline.h \
+ bind9.h buffer.h bufferlist.h cmocka.h commandline.h \
counter.h crc64.h deprecated.h entropy.h errno.h \
endian.h error.h event.h eventclass.h file.h formatcheck.h \
fsaccess.h hash.h heap.h hex.h hmacmd5.h hmacsha.h \
--- /dev/null
+/*
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, you can obtain one at https://mozilla.org/MPL/2.0/.
+ *
+ * See the COPYRIGHT file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+
+/*! \file isc/cmocka.h */
+
+#pragma once
+
+#include <cmocka.h>
+
+#include <isc/lang.h>
+
+ISC_LANG_BEGINDECLS
+
+/*
+ * Copy the test identified by 'name' from 'tests' to 'selected'.
+ */
+#define cmocka_add_test_byname(tests, name, selected) \
+ _cmocka_add_test_byname(tests, sizeof(tests) / sizeof(tests[0]), name, \
+ selected, \
+ sizeof(selected) / sizeof(selected[0]))
+
+static inline bool
+_cmocka_add_test_byname(const struct CMUnitTest *tests, size_t ntests,
+ const char *name, struct CMUnitTest *selected,
+ size_t nselected) {
+ size_t i, j;
+
+ for (i = 0; i < ntests && tests[i].name != NULL; i++) {
+ if (strcmp(tests[i].name, name) != 0) {
+ continue;
+ }
+ for (j = 0; j < nselected && selected[j].name != NULL; j++) {
+ if (strcmp(tests[j].name, name) == 0) {
+ break;
+ }
+ }
+ if (j < nselected && selected[j].name == NULL) {
+ selected[j] = tests[i];
+ }
+ return (true);
+ }
+ return (false);
+}
+
+ISC_LANG_ENDDECLS
#include <unistd.h>
#define UNIT_TESTING
-#include <cmocka.h>
+#include <isc/cmocka.h>
#include <isc/commandline.h>
#include <isc/condition.h>
#include <isc/mem.h>
_setup, _teardown),
#endif
};
+ struct CMUnitTest selected[sizeof(tests) / sizeof(tests[0])];
int c;
- while ((c = isc_commandline_parse(argc, argv, "v")) != -1) {
+ memset(selected, 0, sizeof(selected));
+
+ while ((c = isc_commandline_parse(argc, argv, "t:v")) != -1) {
switch (c) {
+ case 't':
+ if (!cmocka_add_test_byname(
+ tests, isc_commandline_argument, selected))
+ {
+ fprintf(stderr, "unknown test '%s'\n",
+ isc_commandline_argument);
+ exit(1);
+ }
+ break;
case 'v':
verbose = true;
break;
}
}
-
- return (cmocka_run_group_tests(tests, NULL, NULL));
+ if (selected[0].name != NULL) {
+ return (cmocka_run_group_tests(selected, NULL, NULL));
+ } else {
+ return (cmocka_run_group_tests(tests, NULL, NULL));
+ }
}
#else /* HAVE_CMOCKA */
./lib/isc/include/isc/boolean.h C 2018,2019,2020
./lib/isc/include/isc/buffer.h C 1998,1999,2000,2001,2002,2004,2005,2006,2007,2008,2010,2012,2014,2016,2017,2018,2019,2020
./lib/isc/include/isc/bufferlist.h C 1999,2000,2001,2004,2005,2006,2007,2016,2018,2019,2020
+./lib/isc/include/isc/cmocka.h C 2020
./lib/isc/include/isc/commandline.h C 1999,2000,2001,2004,2005,2006,2007,2015,2016,2018,2019,2020
./lib/isc/include/isc/counter.h C 2014,2016,2018,2019,2020
./lib/isc/include/isc/crc64.h C 2013,2016,2018,2019,2020