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:
Enji Cooper 2017-06-28 08:22:04 +00:00
parent c9470efed7
commit 1c3f620ca6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=320443
6 changed files with 399 additions and 0 deletions

View File

@ -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

View 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'}

View 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>

View 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

View 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

View 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);
}