Add kyua TAP test integration examples
The examples are patterned loosely after the ATF examples, similar to the plain test examples. MFC after: 1 month
This commit is contained in:
parent
c9470efed7
commit
1c3f620ca6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=320443
@ -19,6 +19,7 @@
|
||||
# the auto-generated Kyuafile to recurse into these directories.
|
||||
TESTS_SUBDIRS+= atf
|
||||
TESTS_SUBDIRS+= plain
|
||||
TESTS_SUBDIRS+= tap
|
||||
|
||||
# We leave KYUAFILE unset so that bsd.test.mk auto-generates a Kyuafile
|
||||
# for us based on the contents of the TESTS_SUBDIRS line above. The
|
||||
|
47
share/examples/tests/tests/tap/Kyuafile
Normal file
47
share/examples/tests/tests/tap/Kyuafile
Normal file
@ -0,0 +1,47 @@
|
||||
-- $FreeBSD$
|
||||
--
|
||||
-- Copyright 2013 Google Inc.
|
||||
-- All rights reserved.
|
||||
--
|
||||
-- Redistribution and use in source and binary forms, with or without
|
||||
-- modification, are permitted provided that the following conditions are
|
||||
-- met:
|
||||
--
|
||||
-- * Redistributions of source code must retain the above copyright
|
||||
-- notice, this list of conditions and the following disclaimer.
|
||||
-- * Redistributions in binary form must reproduce the above copyright
|
||||
-- notice, this list of conditions and the following disclaimer in the
|
||||
-- documentation and/or other materials provided with the distribution.
|
||||
-- * Neither the name of Google Inc. nor the names of its contributors
|
||||
-- may be used to endorse or promote products derived from this software
|
||||
-- without specific prior written permission.
|
||||
--
|
||||
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
-- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
-- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
-- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
-- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
syntax(2)
|
||||
|
||||
-- All tests provided by the FreeBSD base system should set the test_suite
|
||||
-- property to FreeBSD. This creates a namespace in the configuration file
|
||||
-- in which specific run-time properties can be passed to the tests below.
|
||||
test_suite('FreeBSD')
|
||||
|
||||
-- Register the various test programs into the test suite defined in this
|
||||
-- directory.
|
||||
--
|
||||
-- Because plain test programs cannot define metadata in their code (they
|
||||
-- have no mechanism to communicate that to Kyua), we can instead define
|
||||
-- any metadata properties in here. These have the exact same meaning as
|
||||
-- their ATF counterparts. These properties are often useful to define
|
||||
-- prerequisites for the execution of the tests.
|
||||
tap_test_program{name='cp_test', required_programs='/bin/cp'}
|
||||
tap_test_program{name='printf_test'}
|
49
share/examples/tests/tests/tap/Makefile
Normal file
49
share/examples/tests/tests/tap/Makefile
Normal file
@ -0,0 +1,49 @@
|
||||
# $FreeBSD$
|
||||
|
||||
# The release package to use for the tests contained within the directory
|
||||
#
|
||||
# This applies to components which rely on ^/projects/release-pkg support
|
||||
# (see UPDATING XXXXXXXXX / svn revision r298107).
|
||||
PACKAGE= tests
|
||||
|
||||
# Directory into which the Kyuafile provided by this directory will be
|
||||
# installed.
|
||||
#
|
||||
# This is always a subdirectory of ${TESTSBASE}/. The remainder of the
|
||||
# path has to match the relative path within the source tree in which
|
||||
# these files are found modulo the tests/ component at the end.
|
||||
#
|
||||
# For example: if this Makefile were in src/bin/cp/tests/, its TESTSDIR
|
||||
# would point at ${TESTSBASE}/bin/cp/.
|
||||
TESTSDIR= ${TESTSBASE}/share/examples/tests/tap
|
||||
|
||||
# List of test programs to build. Note that we can build more than one
|
||||
# test from a single directory, and this is expected.
|
||||
TAP_TESTS_C= printf_test
|
||||
TAP_TESTS_SH= cp_test
|
||||
|
||||
# Tell bsd.test.mk that we are providing a hand-crafted Kyuafile in this
|
||||
# directory. We do so because the file in this directory exists for
|
||||
# documentation purposes.
|
||||
#
|
||||
# In general, however, you should NOT define KYUAFILE at all to allow
|
||||
# bsd.test.mk auto-generate one for you based on the PLAIN_TESTS_*
|
||||
# definitions from above.
|
||||
KYUAFILE= yes
|
||||
|
||||
# Install file1 and file2 as files via bsd.prog.mk. Please note the intentional
|
||||
# ${PACKAGE} namespace of files.
|
||||
#
|
||||
# The basic semantics of this are the same as FILES in bsd.prog.mk, e.g. the
|
||||
# installation of the files can be manipulated via ${PACKAGE}FILESDIR,
|
||||
# ${PACKAGE}FILESMODE, etc.
|
||||
#
|
||||
# Please see comment above about ${PACKAGE}. Feel free to omit the ${PACKAGE}
|
||||
# namespace if release package support isn't needed.
|
||||
${PACKAGE}FILES+= file1
|
||||
CLEANFILES+= file1
|
||||
|
||||
file1:
|
||||
@echo "File 1" > ${.TARGET}
|
||||
|
||||
.include <bsd.test.mk>
|
18
share/examples/tests/tests/tap/Makefile.depend
Normal file
18
share/examples/tests/tests/tap/Makefile.depend
Normal file
@ -0,0 +1,18 @@
|
||||
# $FreeBSD$
|
||||
# Autogenerated - do NOT edit!
|
||||
|
||||
DIRDEPS = \
|
||||
gnu/lib/csu \
|
||||
gnu/lib/libgcc \
|
||||
include \
|
||||
include/xlocale \
|
||||
lib/${CSU_DIR} \
|
||||
lib/libc \
|
||||
lib/libcompiler_rt \
|
||||
|
||||
|
||||
.include <dirdeps.mk>
|
||||
|
||||
.if ${DEP_RELDIR} == ${_DEP_RELDIR}
|
||||
# local dependencies - needed for -jN in clean tree
|
||||
.endif
|
99
share/examples/tests/tests/tap/cp_test.sh
Normal file
99
share/examples/tests/tests/tap/cp_test.sh
Normal file
@ -0,0 +1,99 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2017 Ngie Cooper <ngie@FreeBSD.org>
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||||
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||||
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
#
|
||||
# INTRODUCTION
|
||||
#
|
||||
# This TAP test program mimics the structure and contents of its
|
||||
# ATF-based counterpart. It attempts to represent various test cases
|
||||
# in different separate functions and just calls them all from main.
|
||||
#
|
||||
|
||||
test_num=1
|
||||
TEST_COUNT=4
|
||||
|
||||
result()
|
||||
{
|
||||
local result=$1; shift
|
||||
local result_string
|
||||
|
||||
result_string="$result $test_num"
|
||||
if [ $# -gt 0 ]; then
|
||||
result_string="$result_string - $@"
|
||||
fi
|
||||
echo "$result_string"
|
||||
: $(( test_num += 1 ))
|
||||
}
|
||||
|
||||
# Auxiliary function to compare two files for equality.
|
||||
verify_copy() {
|
||||
if cmp -s "${1}" "${2}"; then
|
||||
result "ok"
|
||||
else
|
||||
result "not ok" "${1} and ${2} differ, but they should be equal"
|
||||
diff -u "${1}" "${2}"
|
||||
fi
|
||||
}
|
||||
|
||||
simple_test() {
|
||||
cp "$(dirname "${0}")/file1" .
|
||||
if cp file1 file2; then
|
||||
result "ok"
|
||||
verify_copy file1 file2
|
||||
else
|
||||
result "not ok" "cp failed"
|
||||
result "not ok" "# SKIP"
|
||||
fi
|
||||
}
|
||||
|
||||
force_test() {
|
||||
echo 'File 3' >file3
|
||||
chmod 400 file3
|
||||
if cp -f file1 file3; then
|
||||
result "ok"
|
||||
verify_copy file1 file3
|
||||
else
|
||||
result "not ok" "cp -f failed"
|
||||
result "not ok" "# SKIP"
|
||||
fi
|
||||
}
|
||||
|
||||
# If you have read the cp_test.sh counterpart in the atf/ directory, you
|
||||
# may think that the sequencing of tests below and the exposed behavior
|
||||
# to the user is very similar. But you'd be wrong.
|
||||
#
|
||||
# There are two major differences with this and the ATF version. First off,
|
||||
# the TAP test doesn't isolate simple_test from force_test, whereas the ATF
|
||||
# version does. Secondly, the test script accepts arbitrary command line
|
||||
# inputs.
|
||||
echo "1..$TEST_COUNT"
|
||||
|
||||
simple_test
|
||||
force_test
|
||||
exit 0
|
185
share/examples/tests/tests/tap/printf_test.c
Normal file
185
share/examples/tests/tests/tap/printf_test.c
Normal file
@ -0,0 +1,185 @@
|
||||
/* $FreeBSD$
|
||||
*
|
||||
* Copyright 2013 Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
/*
|
||||
* INTRODUCTION
|
||||
*
|
||||
* This plain test program mimics the structure and contents of its
|
||||
* ATF-based counterpart. It attempts to represent various test cases
|
||||
* in different separate functions and just calls them all from main().
|
||||
*
|
||||
* In reality, plain test programs can be much simpler. All they have
|
||||
* to do is return 0 on success and non-0 otherwise.
|
||||
*/
|
||||
|
||||
#include <err.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static int failed;
|
||||
static int test_num = 1;
|
||||
|
||||
#define TEST_COUNT 7
|
||||
|
||||
static void
|
||||
fail(const char *fmt, ...)
|
||||
{
|
||||
char *msg;
|
||||
va_list ap;
|
||||
|
||||
failed = 1;
|
||||
|
||||
va_start(ap, fmt);
|
||||
if (vasprintf(&msg, fmt, ap) == -1)
|
||||
err(1, NULL);
|
||||
va_end(ap);
|
||||
printf("not ok %d - %s\n", test_num, msg);
|
||||
free(msg);
|
||||
|
||||
test_num++;
|
||||
}
|
||||
|
||||
static void
|
||||
pass(void)
|
||||
{
|
||||
|
||||
printf("ok %d\n", test_num);
|
||||
test_num++;
|
||||
}
|
||||
|
||||
static void
|
||||
skip(int skip_num)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < skip_num; i++) {
|
||||
printf("not ok %d # SKIP\n", test_num);
|
||||
test_num++;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
snprintf__two_formatters(void)
|
||||
{
|
||||
char buffer[128];
|
||||
|
||||
if (snprintf(buffer, sizeof(buffer), "%s, %s!", "Hello",
|
||||
"tests") <= 0) {
|
||||
fail("snprintf with two formatters failed");
|
||||
skip(1);
|
||||
} else {
|
||||
pass();
|
||||
if (strcmp(buffer, "Hello, tests!") != 0)
|
||||
fail("Bad formatting: got %s", buffer);
|
||||
else
|
||||
pass();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
snprintf__overflow(void)
|
||||
{
|
||||
char buffer[10];
|
||||
|
||||
if (snprintf(buffer, sizeof(buffer), "0123456789abcdef") != 16) {
|
||||
fail("snprintf did not return the expected "
|
||||
"number of characters");
|
||||
skip(1);
|
||||
return;
|
||||
}
|
||||
pass();
|
||||
|
||||
if (strcmp(buffer, "012345678") != 0)
|
||||
fail("Bad formatting: got %s", buffer);
|
||||
else
|
||||
pass();
|
||||
}
|
||||
|
||||
static void
|
||||
fprintf__simple_string(void)
|
||||
{
|
||||
FILE *file;
|
||||
char buffer[128];
|
||||
size_t length;
|
||||
const char *contents = "This is a message\n";
|
||||
|
||||
file = fopen("test.txt", "w+");
|
||||
if (fprintf(file, "%s", contents) <= 0) {
|
||||
fail("fprintf failed to write to file");
|
||||
skip(2);
|
||||
return;
|
||||
}
|
||||
pass();
|
||||
rewind(file);
|
||||
length = fread(buffer, 1, sizeof(buffer) - 1, file);
|
||||
if (length != strlen(contents)) {
|
||||
fail("fread failed");
|
||||
skip(1);
|
||||
return;
|
||||
}
|
||||
pass();
|
||||
buffer[length] = '\0';
|
||||
fclose(file);
|
||||
|
||||
if (strcmp(buffer, contents) != 0)
|
||||
fail("Written and read data differ");
|
||||
else
|
||||
pass();
|
||||
|
||||
/* Of special note here is that we are NOT deleting the temporary
|
||||
* files we created in this test. Kyua takes care of this cleanup
|
||||
* automatically and tests can (and should) rely on this behavior. */
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
/* If you have read the printf_test.c counterpart in the atf/
|
||||
* directory, you may think that the sequencing of tests below and
|
||||
* the exposed behavior to the user is very similar. But you'd be
|
||||
* wrong.
|
||||
*
|
||||
* There are two major differences with this and the ATF version.
|
||||
* The first is that the code below has no provisions to detect
|
||||
* failures in one test and continue running the other tests: the
|
||||
* first failure causes the whole test program to exit. The second
|
||||
* is that this particular main() has no arguments: without ATF,
|
||||
* all test programs may expose a different command-line interface,
|
||||
* and this is an issue for consistency purposes. */
|
||||
printf("1..%d\n", TEST_COUNT);
|
||||
|
||||
snprintf__two_formatters();
|
||||
snprintf__overflow();
|
||||
fprintf__simple_string();
|
||||
|
||||
return (failed);
|
||||
}
|
Loading…
Reference in New Issue
Block a user