19888Sandreas@sandberg.pp.se/*
29888Sandreas@sandberg.pp.se * Copyright (c) 2013, Andreas Sandberg
39888Sandreas@sandberg.pp.se * All rights reserved.
49888Sandreas@sandberg.pp.se *
59888Sandreas@sandberg.pp.se * Redistribution and use in source and binary forms, with or without
69888Sandreas@sandberg.pp.se * modification, are permitted provided that the following conditions
79888Sandreas@sandberg.pp.se * are met:
89888Sandreas@sandberg.pp.se *
99888Sandreas@sandberg.pp.se * 1. Redistributions of source code must retain the above copyright
109888Sandreas@sandberg.pp.se *    notice, this list of conditions and the following disclaimer.
119888Sandreas@sandberg.pp.se * 2. Redistributions in binary form must reproduce the above
129888Sandreas@sandberg.pp.se *    copyright notice, this list of conditions and the following
139888Sandreas@sandberg.pp.se *    disclaimer in the documentation and/or other materials provided
149888Sandreas@sandberg.pp.se *    with the distribution.
159888Sandreas@sandberg.pp.se *
169888Sandreas@sandberg.pp.se * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179888Sandreas@sandberg.pp.se * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189888Sandreas@sandberg.pp.se * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
199888Sandreas@sandberg.pp.se * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
209888Sandreas@sandberg.pp.se * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
219888Sandreas@sandberg.pp.se * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
229888Sandreas@sandberg.pp.se * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
239888Sandreas@sandberg.pp.se * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
249888Sandreas@sandberg.pp.se * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
259888Sandreas@sandberg.pp.se * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
269888Sandreas@sandberg.pp.se * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
279888Sandreas@sandberg.pp.se * OF THE POSSIBILITY OF SUCH DAMAGE.
289888Sandreas@sandberg.pp.se */
299888Sandreas@sandberg.pp.se
309888Sandreas@sandberg.pp.se#include "test_helper.h"
319888Sandreas@sandberg.pp.se
329888Sandreas@sandberg.pp.se#include <assert.h>
339888Sandreas@sandberg.pp.se#include <stdarg.h>
349888Sandreas@sandberg.pp.se#include <stdlib.h>
359888Sandreas@sandberg.pp.se
369888Sandreas@sandberg.pp.seunsigned test_current = 0;
379888Sandreas@sandberg.pp.seunsigned test_count = 0;
389888Sandreas@sandberg.pp.seunsigned test_fail_count = 0;
399888Sandreas@sandberg.pp.se
409888Sandreas@sandberg.pp.sevoid
419888Sandreas@sandberg.pp.setest_init(unsigned no_tests)
429888Sandreas@sandberg.pp.se{
439888Sandreas@sandberg.pp.se    assert(test_count == 0 && test_current == 0);
449888Sandreas@sandberg.pp.se
459888Sandreas@sandberg.pp.se    test_count = no_tests;
469888Sandreas@sandberg.pp.se    test_current = 1;
479888Sandreas@sandberg.pp.se    test_fail_count = 0;
489888Sandreas@sandberg.pp.se
499888Sandreas@sandberg.pp.se    printf("1..%u\n", no_tests);
509888Sandreas@sandberg.pp.se}
519888Sandreas@sandberg.pp.se
529888Sandreas@sandberg.pp.sevoid
539888Sandreas@sandberg.pp.setest_exit()
549888Sandreas@sandberg.pp.se{
559888Sandreas@sandberg.pp.se    if (test_fail_count)
569888Sandreas@sandberg.pp.se        exit(EXIT_FAILURE);
579888Sandreas@sandberg.pp.se    else
589888Sandreas@sandberg.pp.se        exit(EXIT_SUCCESS);
599888Sandreas@sandberg.pp.se}
609888Sandreas@sandberg.pp.se
619888Sandreas@sandberg.pp.sevoid
629888Sandreas@sandberg.pp.setest_bail(const char *fmt, ...)
639888Sandreas@sandberg.pp.se{
649888Sandreas@sandberg.pp.se    va_list ap;
659888Sandreas@sandberg.pp.se    va_start(ap, fmt);
669888Sandreas@sandberg.pp.se
679888Sandreas@sandberg.pp.se    printf("Bail out! ");
689888Sandreas@sandberg.pp.se    vprintf(fmt, ap);
699888Sandreas@sandberg.pp.se    printf("\n");
709888Sandreas@sandberg.pp.se
719888Sandreas@sandberg.pp.se    va_end(ap);
729888Sandreas@sandberg.pp.se
739888Sandreas@sandberg.pp.se    exit(EXIT_FAILURE);
749888Sandreas@sandberg.pp.se}
759888Sandreas@sandberg.pp.se
769888Sandreas@sandberg.pp.sevoid
779888Sandreas@sandberg.pp.setest_diag(const char *fmt, ...)
789888Sandreas@sandberg.pp.se{
799888Sandreas@sandberg.pp.se    va_list ap;
809888Sandreas@sandberg.pp.se    va_start(ap, fmt);
819888Sandreas@sandberg.pp.se
829888Sandreas@sandberg.pp.se    printf("# ");
839888Sandreas@sandberg.pp.se    vprintf(fmt, ap);
849888Sandreas@sandberg.pp.se    printf("\n");
859888Sandreas@sandberg.pp.se
869888Sandreas@sandberg.pp.se    va_end(ap);
879888Sandreas@sandberg.pp.se}
889888Sandreas@sandberg.pp.se
899888Sandreas@sandberg.pp.sestatic void
909888Sandreas@sandberg.pp.setest_vstatus(const char *status, const char *test,
919888Sandreas@sandberg.pp.se             const char *directive,
929888Sandreas@sandberg.pp.se             const char *fmt_why, va_list ap)
939888Sandreas@sandberg.pp.se{
949888Sandreas@sandberg.pp.se    printf("%s %i", status, test_current);
959888Sandreas@sandberg.pp.se
969888Sandreas@sandberg.pp.se    if (test && test[0] != '\0')
979888Sandreas@sandberg.pp.se        printf(" - %s", test);
989888Sandreas@sandberg.pp.se
999888Sandreas@sandberg.pp.se    if (directive && directive[0] != '\0') {
1009888Sandreas@sandberg.pp.se        printf(" # %s ", directive);
1019888Sandreas@sandberg.pp.se        if (fmt_why && fmt_why[0] != '\0')
1029888Sandreas@sandberg.pp.se            vprintf(fmt_why, ap);
1039888Sandreas@sandberg.pp.se    }
1049888Sandreas@sandberg.pp.se    printf("\n");
1059888Sandreas@sandberg.pp.se
1069888Sandreas@sandberg.pp.se    ++test_current;
1079888Sandreas@sandberg.pp.se}
1089888Sandreas@sandberg.pp.se
1099888Sandreas@sandberg.pp.sestatic void __attribute__((format (printf, 4, 5)))
1109888Sandreas@sandberg.pp.setest_status(const char *status, const char *test,
1119888Sandreas@sandberg.pp.se            const char *directive,
1129888Sandreas@sandberg.pp.se            const char *fmt_why, ...)
1139888Sandreas@sandberg.pp.se{
1149888Sandreas@sandberg.pp.se    va_list ap;
1159888Sandreas@sandberg.pp.se    va_start(ap, fmt_why);
1169888Sandreas@sandberg.pp.se
1179888Sandreas@sandberg.pp.se    test_vstatus(status, test, directive, fmt_why, ap);
1189888Sandreas@sandberg.pp.se
1199888Sandreas@sandberg.pp.se    va_end(ap);
1209888Sandreas@sandberg.pp.se}
1219888Sandreas@sandberg.pp.se
1229888Sandreas@sandberg.pp.sevoid
1239888Sandreas@sandberg.pp.setest_ok(const char *test)
1249888Sandreas@sandberg.pp.se{
1259888Sandreas@sandberg.pp.se    test_status("ok", test, NULL, NULL);
1269888Sandreas@sandberg.pp.se}
1279888Sandreas@sandberg.pp.se
1289888Sandreas@sandberg.pp.sevoid
1299888Sandreas@sandberg.pp.setest_fail(const char *test)
1309888Sandreas@sandberg.pp.se{
1319888Sandreas@sandberg.pp.se    test_status("not ok", test, NULL, NULL);
1329888Sandreas@sandberg.pp.se    ++test_fail_count;
1339888Sandreas@sandberg.pp.se}
1349888Sandreas@sandberg.pp.se
1359888Sandreas@sandberg.pp.sevoid
1369888Sandreas@sandberg.pp.setest_skip(const char *test, const char *fmt_why, ...)
1379888Sandreas@sandberg.pp.se{
1389888Sandreas@sandberg.pp.se    va_list ap;
1399888Sandreas@sandberg.pp.se    va_start(ap, fmt_why);
1409888Sandreas@sandberg.pp.se
1419888Sandreas@sandberg.pp.se    test_vstatus("ok", test, "SKIP", fmt_why, ap);
1429888Sandreas@sandberg.pp.se
1439888Sandreas@sandberg.pp.se    va_end(ap);
1449888Sandreas@sandberg.pp.se}
1459888Sandreas@sandberg.pp.se
1469888Sandreas@sandberg.pp.sevoid
1479888Sandreas@sandberg.pp.setest_todo(const char *test, const char *fmt_why, ...)
1489888Sandreas@sandberg.pp.se{
1499888Sandreas@sandberg.pp.se    va_list ap;
1509888Sandreas@sandberg.pp.se    va_start(ap, fmt_why);
1519888Sandreas@sandberg.pp.se
1529888Sandreas@sandberg.pp.se    test_vstatus("not ok", test, "TODO", fmt_why, ap);
1539888Sandreas@sandberg.pp.se
1549888Sandreas@sandberg.pp.se    va_end(ap);
1559888Sandreas@sandberg.pp.se
1569888Sandreas@sandberg.pp.se    ++test_fail_count;
1579888Sandreas@sandberg.pp.se}
158