|
Packit |
b1f7ae |
/*
|
|
Packit |
b1f7ae |
* Copyright (c) 2013-2017, Intel Corporation
|
|
Packit |
b1f7ae |
*
|
|
Packit |
b1f7ae |
* Redistribution and use in source and binary forms, with or without
|
|
Packit |
b1f7ae |
* modification, are permitted provided that the following conditions are met:
|
|
Packit |
b1f7ae |
*
|
|
Packit |
b1f7ae |
* * Redistributions of source code must retain the above copyright notice,
|
|
Packit |
b1f7ae |
* this list of conditions and the following disclaimer.
|
|
Packit |
b1f7ae |
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
Packit |
b1f7ae |
* this list of conditions and the following disclaimer in the documentation
|
|
Packit |
b1f7ae |
* and/or other materials provided with the distribution.
|
|
Packit |
b1f7ae |
* * Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit |
b1f7ae |
* may be used to endorse or promote products derived from this software
|
|
Packit |
b1f7ae |
* without specific prior written permission.
|
|
Packit |
b1f7ae |
*
|
|
Packit |
b1f7ae |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit |
b1f7ae |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit |
b1f7ae |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
Packit |
b1f7ae |
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
Packit |
b1f7ae |
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
Packit |
b1f7ae |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
Packit |
b1f7ae |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
Packit |
b1f7ae |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
Packit |
b1f7ae |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
Packit |
b1f7ae |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
Packit |
b1f7ae |
* POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
b1f7ae |
*/
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
#include "ptunit.h"
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
#include <stdlib.h>
|
|
Packit |
b1f7ae |
#include <stdio.h>
|
|
Packit |
b1f7ae |
#include <inttypes.h>
|
|
Packit |
b1f7ae |
#include <string.h>
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
struct ptunit_srcloc ptunit_mk_srcloc(const char *file, uint32_t line)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
struct ptunit_srcloc srcloc;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
srcloc.file = file;
|
|
Packit |
b1f7ae |
srcloc.line = line;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return srcloc;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
struct ptunit_result ptunit_mk_failed_signed_int(const char *expr,
|
|
Packit |
b1f7ae |
const char *cmp,
|
|
Packit |
b1f7ae |
struct ptunit_srcloc where,
|
|
Packit |
b1f7ae |
int64_t actual,
|
|
Packit |
b1f7ae |
int64_t expected)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
struct ptunit_result result;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
result.type = ptur_failed_signed_int;
|
|
Packit |
b1f7ae |
result.failed.where = where;
|
|
Packit |
b1f7ae |
result.failed.variant.signed_int.expr = expr;
|
|
Packit |
b1f7ae |
result.failed.variant.signed_int.cmp = cmp;
|
|
Packit |
b1f7ae |
result.failed.variant.signed_int.expected = expected;
|
|
Packit |
b1f7ae |
result.failed.variant.signed_int.actual = actual;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return result;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
struct ptunit_result ptunit_mk_failed_unsigned_int(const char *expr,
|
|
Packit |
b1f7ae |
const char *cmp,
|
|
Packit |
b1f7ae |
struct ptunit_srcloc where,
|
|
Packit |
b1f7ae |
int64_t actual,
|
|
Packit |
b1f7ae |
int64_t expected)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
struct ptunit_result result;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
result.type = ptur_failed_unsigned_int;
|
|
Packit |
b1f7ae |
result.failed.where = where;
|
|
Packit |
b1f7ae |
result.failed.variant.unsigned_int.expr = expr;
|
|
Packit |
b1f7ae |
result.failed.variant.unsigned_int.cmp = cmp;
|
|
Packit |
b1f7ae |
result.failed.variant.unsigned_int.expected = expected;
|
|
Packit |
b1f7ae |
result.failed.variant.unsigned_int.actual = actual;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return result;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
struct ptunit_result ptunit_mk_failed_pointer(const char *expr,
|
|
Packit |
b1f7ae |
const char *cmp,
|
|
Packit |
b1f7ae |
struct ptunit_srcloc where,
|
|
Packit |
b1f7ae |
const void *actual,
|
|
Packit |
b1f7ae |
const void *expected)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
struct ptunit_result result;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
result.type = ptur_failed_pointer;
|
|
Packit |
b1f7ae |
result.failed.where = where;
|
|
Packit |
b1f7ae |
result.failed.variant.pointer.expr = expr;
|
|
Packit |
b1f7ae |
result.failed.variant.pointer.cmp = cmp;
|
|
Packit |
b1f7ae |
result.failed.variant.pointer.expected = expected;
|
|
Packit |
b1f7ae |
result.failed.variant.pointer.actual = actual;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return result;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
static char *dupstr(const char *str)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
char *dup;
|
|
Packit |
b1f7ae |
size_t len;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!str)
|
|
Packit |
b1f7ae |
str = "(null)";
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
len = strlen(str);
|
|
Packit |
b1f7ae |
dup = malloc(len + 1);
|
|
Packit |
b1f7ae |
if (!dup)
|
|
Packit |
b1f7ae |
return NULL;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
strncpy(dup, str, len);
|
|
Packit |
b1f7ae |
dup[len] = 0;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return dup;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
struct ptunit_result ptunit_mk_failed_str(const char *expr,
|
|
Packit |
b1f7ae |
const char *cmp,
|
|
Packit |
b1f7ae |
struct ptunit_srcloc where,
|
|
Packit |
b1f7ae |
const char *actual,
|
|
Packit |
b1f7ae |
const char *expected)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
struct ptunit_result result;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
result.type = ptur_failed_str;
|
|
Packit |
b1f7ae |
result.failed.where = where;
|
|
Packit |
b1f7ae |
result.failed.variant.str.expr = expr;
|
|
Packit |
b1f7ae |
result.failed.variant.str.cmp = cmp;
|
|
Packit |
b1f7ae |
result.failed.variant.str.expected = dupstr(expected);
|
|
Packit |
b1f7ae |
result.failed.variant.str.actual = dupstr(actual);
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return result;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
struct ptunit_result ptunit_mk_passed(void)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
struct ptunit_result result;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
memset(&result, 0, sizeof(result));
|
|
Packit |
b1f7ae |
result.type = ptur_passed;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return result;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
struct ptunit_result ptunit_mk_skipped(void)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
struct ptunit_result result;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
memset(&result, 0, sizeof(result));
|
|
Packit |
b1f7ae |
result.type = ptur_skipped;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return result;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
struct ptunit_test ptunit_mk_test(const char *name, const char *args)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
struct ptunit_test test;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
test.name = name;
|
|
Packit |
b1f7ae |
test.args = args;
|
|
Packit |
b1f7ae |
test.result = ptunit_mk_skipped();
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return test;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
void ptunit_fini_test(struct ptunit_test *test)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
if (!test)
|
|
Packit |
b1f7ae |
return;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
switch (test->result.type) {
|
|
Packit |
b1f7ae |
case ptur_skipped:
|
|
Packit |
b1f7ae |
case ptur_passed:
|
|
Packit |
b1f7ae |
case ptur_failed_signed_int:
|
|
Packit |
b1f7ae |
case ptur_failed_unsigned_int:
|
|
Packit |
b1f7ae |
case ptur_failed_pointer:
|
|
Packit |
b1f7ae |
break;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
case ptur_failed_str:
|
|
Packit |
b1f7ae |
free(test->result.failed.variant.str.expected);
|
|
Packit |
b1f7ae |
free(test->result.failed.variant.str.actual);
|
|
Packit |
b1f7ae |
break;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
struct ptunit_suite ptunit_mk_suite(int argc, char **argv)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
struct ptunit_suite suite;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
memset(&suite, 0, sizeof(suite));
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (argc && argv)
|
|
Packit |
b1f7ae |
suite.name = argv[0];
|
|
Packit |
b1f7ae |
return suite;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
static void ptunit_print_test(const struct ptunit_test *test)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
fprintf(stderr, "%s", test->name);
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (test->args)
|
|
Packit |
b1f7ae |
fprintf(stderr, "(%s)", test->args);
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
fprintf(stderr, ": ");
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
static const char *basename(const char *file)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
const char *base;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!file)
|
|
Packit |
b1f7ae |
return NULL;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
for (base = file + strlen(file); base != file; base -= 1) {
|
|
Packit |
b1f7ae |
char ch;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
ch = base[-1];
|
|
Packit |
b1f7ae |
if ((ch == '/') || (ch == '\\'))
|
|
Packit |
b1f7ae |
break;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return base;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
static void ptunit_print_srcloc(const struct ptunit_test *test)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
const char *file;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
switch (test->result.type) {
|
|
Packit |
b1f7ae |
case ptur_passed:
|
|
Packit |
b1f7ae |
case ptur_skipped:
|
|
Packit |
b1f7ae |
fprintf(stderr, "n/a: ");
|
|
Packit |
b1f7ae |
break;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
case ptur_failed_signed_int:
|
|
Packit |
b1f7ae |
case ptur_failed_unsigned_int:
|
|
Packit |
b1f7ae |
case ptur_failed_pointer:
|
|
Packit |
b1f7ae |
case ptur_failed_str:
|
|
Packit |
b1f7ae |
file = basename(test->result.failed.where.file);
|
|
Packit |
b1f7ae |
if (!file)
|
|
Packit |
b1f7ae |
file = "<unknown>";
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
fprintf(stderr, "%s:%" PRIu32 ": ", file,
|
|
Packit |
b1f7ae |
test->result.failed.where.line);
|
|
Packit |
b1f7ae |
break;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
static void ptunit_report_test(const struct ptunit_test *test)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
switch (test->result.type) {
|
|
Packit |
b1f7ae |
case ptur_skipped:
|
|
Packit |
b1f7ae |
case ptur_passed:
|
|
Packit |
b1f7ae |
return;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
case ptur_failed_signed_int:
|
|
Packit |
b1f7ae |
ptunit_print_test(test);
|
|
Packit |
b1f7ae |
ptunit_print_srcloc(test);
|
|
Packit |
b1f7ae |
fprintf(stderr, "%s [%" PRId64 "%s%" PRId64 "] failed.\n",
|
|
Packit |
b1f7ae |
test->result.failed.variant.signed_int.expr,
|
|
Packit |
b1f7ae |
test->result.failed.variant.signed_int.actual,
|
|
Packit |
b1f7ae |
test->result.failed.variant.signed_int.cmp,
|
|
Packit |
b1f7ae |
test->result.failed.variant.signed_int.expected);
|
|
Packit |
b1f7ae |
return;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
case ptur_failed_unsigned_int:
|
|
Packit |
b1f7ae |
ptunit_print_test(test);
|
|
Packit |
b1f7ae |
ptunit_print_srcloc(test);
|
|
Packit |
b1f7ae |
fprintf(stderr, "%s [0x%" PRIx64 "%s0x%" PRIx64 "] failed.\n",
|
|
Packit |
b1f7ae |
test->result.failed.variant.unsigned_int.expr,
|
|
Packit |
b1f7ae |
test->result.failed.variant.unsigned_int.actual,
|
|
Packit |
b1f7ae |
test->result.failed.variant.unsigned_int.cmp,
|
|
Packit |
b1f7ae |
test->result.failed.variant.unsigned_int.expected);
|
|
Packit |
b1f7ae |
return;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
case ptur_failed_pointer:
|
|
Packit |
b1f7ae |
ptunit_print_test(test);
|
|
Packit |
b1f7ae |
ptunit_print_srcloc(test);
|
|
Packit |
b1f7ae |
fprintf(stderr, "%s [%p%s%p] failed.\n",
|
|
Packit |
b1f7ae |
test->result.failed.variant.pointer.expr,
|
|
Packit |
b1f7ae |
test->result.failed.variant.pointer.actual,
|
|
Packit |
b1f7ae |
test->result.failed.variant.pointer.cmp,
|
|
Packit |
b1f7ae |
test->result.failed.variant.pointer.expected);
|
|
Packit |
b1f7ae |
return;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
case ptur_failed_str:
|
|
Packit |
b1f7ae |
ptunit_print_test(test);
|
|
Packit |
b1f7ae |
ptunit_print_srcloc(test);
|
|
Packit |
b1f7ae |
fprintf(stderr, "%s [%s%s%s] failed.\n",
|
|
Packit |
b1f7ae |
test->result.failed.variant.str.expr,
|
|
Packit |
b1f7ae |
test->result.failed.variant.str.actual,
|
|
Packit |
b1f7ae |
test->result.failed.variant.str.cmp,
|
|
Packit |
b1f7ae |
test->result.failed.variant.str.expected);
|
|
Packit |
b1f7ae |
return;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
ptunit_print_test(test);
|
|
Packit |
b1f7ae |
fprintf(stderr, "bad result type: 0x%" PRIx32 ".\n", test->result.type);
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
void ptunit_log_test(struct ptunit_suite *suite,
|
|
Packit |
b1f7ae |
const struct ptunit_test *test)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
if (!test)
|
|
Packit |
b1f7ae |
return;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (suite) {
|
|
Packit |
b1f7ae |
suite->nr_tests += 1;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (test->result.type == ptur_skipped)
|
|
Packit |
b1f7ae |
suite->nr_skips += 1;
|
|
Packit |
b1f7ae |
else if (test->result.type != ptur_passed)
|
|
Packit |
b1f7ae |
suite->nr_fails += 1;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
ptunit_report_test(test);
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
void ptunit_report(const struct ptunit_suite *suite)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
if (!suite)
|
|
Packit |
b1f7ae |
return;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (suite->name)
|
|
Packit |
b1f7ae |
fprintf(stdout, "%s: ", suite->name);
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
fprintf(stdout,
|
|
Packit |
b1f7ae |
"tests: %" PRIu32 ", passes: %" PRIu32 ", fails: %" PRIu32,
|
|
Packit |
b1f7ae |
suite->nr_tests,
|
|
Packit |
b1f7ae |
suite->nr_tests - (suite->nr_fails + suite->nr_skips),
|
|
Packit |
b1f7ae |
suite->nr_fails);
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (suite->nr_skips)
|
|
Packit |
b1f7ae |
fprintf(stdout, " (skipped: %" PRIu32 ")", suite->nr_skips);
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
fprintf(stdout, "\n");
|
|
Packit |
b1f7ae |
}
|