Make sure that apps/openssl prefixes its output with '# ' during tests
authorRichard Levitte <levitte@openssl.org>
Sun, 28 Jan 2018 08:49:46 +0000 (09:49 +0100)
committerRichard Levitte <levitte@openssl.org>
Thu, 1 Feb 2018 06:10:48 +0000 (07:10 +0100)
The reason to do this is that some output might start with an 'ok',
which TAP catches and takes for TAP output.  The TAP compatible way is
to make all output it shouldn't catch look like comments.

We do this by setting the environment variable HARNESS_OSSL_PREFIX
during tests.  When that is set, apps/openssl uses BIO_f_linebuffer
and sets its prefix to the content of that environment variable.

Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/5224)

apps/apps.c
apps/apps.h
apps/openssl.c
util/perl/OpenSSL/Test.pm

index 834cedd5a33db8f623301cce115e0648f59de605..0438bdb9bf783eec718cb490706c0ecb0387a345 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
  *
  * Licensed under the OpenSSL license (the "License").  You may not use
  * this file except in compliance with the License.  You can obtain a copy
@@ -2428,14 +2428,26 @@ BIO *dup_bio_in(int format)
                       BIO_NOCLOSE | (istext(format) ? BIO_FP_TEXT : 0));
 }
 
+static BIO_METHOD *prefix_method = NULL;
+
 BIO *dup_bio_out(int format)
 {
     BIO *b = BIO_new_fp(stdout,
                         BIO_NOCLOSE | (istext(format) ? BIO_FP_TEXT : 0));
+    void *prefix = NULL;
+
 #ifdef OPENSSL_SYS_VMS
     if (istext(format))
         b = BIO_push(BIO_new(BIO_f_linebuffer()), b);
 #endif
+
+    if (istext(format) && (prefix = getenv("HARNESS_OSSL_PREFIX")) != NULL) {
+        if (prefix_method == NULL)
+            prefix_method = apps_bf_prefix();
+        b = BIO_push(BIO_new(prefix_method), b);
+        BIO_ctrl(b, PREFIX_CTRL_SET_PREFIX, 0, prefix);
+    }
+
     return b;
 }
 
@@ -2450,6 +2462,12 @@ BIO *dup_bio_err(int format)
     return b;
 }
 
+void destroy_prefix_method()
+{
+    BIO_meth_free(prefix_method);
+    prefix_method = NULL;
+}
+
 void unbuffer(FILE *fp)
 {
 /*
index 272b967d18a08556f0ef0972e4d2099355095c8f..daaef369bce9d9ce96d1843dd8c07a29ecc762f7 100644 (file)
@@ -55,6 +55,12 @@ BIO_METHOD *apps_bf_prefix(void);
  * remains unlikely for the foreseeable future and beyond.
  */
 #define PREFIX_CTRL_SET_PREFIX  (1 << 15)
+/*
+ * apps_bf_prefix() returns a dynamically created BIO_METHOD, which we
+ * need to destroy at some point.  When created internally, it's stored
+ * in an internal pointer which can be freed with the following function
+ */
+void destroy_prefix_method(void);
 
 BIO *dup_bio_in(int format);
 BIO *dup_bio_out(int format);
index fe1eabdede777044bc15bba9d9b2e2f981059a5a..fffa05e1c7a1af719461221afed020b307bd8543 100644 (file)
@@ -93,6 +93,7 @@ static int apps_startup()
 static void apps_shutdown()
 {
     destroy_ui_method();
+    destroy_prefix_method();
 }
 
 static char *make_config_name()
index 4afbf8551c06578d7747874adc2f8aa29c6fab62..e363a484731184825972520efdf7da9e60d7a14a 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
+# Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
 #
 # Licensed under the OpenSSL license (the "License").  You may not use
 # this file except in compliance with the License.  You can obtain a copy
@@ -476,7 +476,9 @@ sub run {
        }
        close $pipe;
     } else {
+       $ENV{HARNESS_OSSL_PREFIX} = "# ";
        system("$prefix$cmd");
+       delete $ENV{HARNESS_OSSL_PREFIX};
     }
     $e = ($? & 0x7f) ? ($? & 0x7f)|0x80 : ($? >> 8);
     $r = $hooks{exit_checker}->($e);