openssl/test/testutil/basic_output.c
Richard Levitte 8dce4aa2d9 TESTUTIL: Separate TAP output and other output by BIO filter
Output that's supposed to be understood by a TAP parser gets its own
BIOs (|tap_out| and |tap_err|), and is only used internally within
testutils.  |bio_out| and |bio_err| is now only used for output that
shouldn't be parsed by the TAP parser, and all output written to those
BIOs are therefore always made to look like comments (it gets prefixed
with "# ").

Indentation and prefixing with "# " is reworked to use BIO_f_prefix(),
which allows us to throw away the internal BIO_f_tap().

The indentation level is now adjusted via a special function.

Fixes #12054

Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/12057)
2020-06-06 19:18:30 +02:00

103 lines
2.4 KiB
C

/*
* Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include "../testutil.h"
#include "output.h"
#include "tu_local.h"
#include <openssl/crypto.h>
#include <openssl/bio.h>
/* These are available for any test program */
BIO *bio_out = NULL;
BIO *bio_err = NULL;
/* These are available for TAP output only (internally) */
static BIO *tap_out = NULL;
static BIO *tap_err = NULL;
void test_open_streams(void)
{
tap_out = BIO_new_fp(stdout, BIO_NOCLOSE | BIO_FP_TEXT);
tap_err = BIO_new_fp(stderr, BIO_NOCLOSE | BIO_FP_TEXT);
#ifdef __VMS
tap_out = BIO_push(BIO_new(BIO_f_linebuffer()), tap_out);
tap_err = BIO_push(BIO_new(BIO_f_linebuffer()), tap_err);
#endif
tap_out = BIO_push(BIO_new(BIO_f_prefix()), tap_out);
tap_err = BIO_push(BIO_new(BIO_f_prefix()), tap_err);
bio_out = BIO_push(BIO_new(BIO_f_prefix()), tap_out);
bio_err = BIO_push(BIO_new(BIO_f_prefix()), tap_err);
BIO_set_prefix(bio_out, "# ");
BIO_set_prefix(bio_err, "# ");
OPENSSL_assert(bio_out != NULL);
OPENSSL_assert(bio_err != NULL);
}
void test_adjust_streams_tap_level(int level)
{
BIO_set_indent(tap_out, level);
BIO_set_indent(tap_err, level);
}
void test_close_streams(void)
{
/*
* The rest of the chain is freed by the BIO_free_all() calls below, so
* we only need to free the last one in the bio_out and bio_err chains.
*/
BIO_free(bio_out);
BIO_free(bio_err);
BIO_free_all(tap_out);
BIO_free_all(tap_err);
}
int test_vprintf_stdout(const char *fmt, va_list ap)
{
return BIO_vprintf(bio_out, fmt, ap);
}
int test_vprintf_stderr(const char *fmt, va_list ap)
{
return BIO_vprintf(bio_err, fmt, ap);
}
int test_flush_stdout(void)
{
return BIO_flush(bio_out);
}
int test_flush_stderr(void)
{
return BIO_flush(bio_err);
}
int test_vprintf_tapout(const char *fmt, va_list ap)
{
return BIO_vprintf(tap_out, fmt, ap);
}
int test_vprintf_taperr(const char *fmt, va_list ap)
{
return BIO_vprintf(tap_err, fmt, ap);
}
int test_flush_tapout(void)
{
return BIO_flush(tap_out);
}
int test_flush_taperr(void)
{
return BIO_flush(tap_err);
}