if ((script->result != 0 && script->result != -ENOEXEC) ||
script->output != NULL) {
- printf(" OUTPUT: %s\n",
- script->output == NULL ? "" : script->output);
+ /* Empty output is informative so always print it on failure */
+ const char *t = script->output == NULL ? "" : script->output;
+ size_t len = strlen(t);
+ char output[len+1];
+ size_t p;
+ char *t1, *t2;
+
+ strlcpy(output, t, sizeof(output));
+
+ /*
+ * Strip trailing newlines, they are clutter and
+ * interfere with multi-line detection
+ */
+ p = len - 1;
+ while (p >= 0 && output[p] == '\n') {
+ output[p] = '\0';
+ p--;
+ }
+
+ /* If the output is a single line then print it inline */
+ t2 = strchr(output, '\n');
+ if (t2 == NULL) {
+ printf(" OUTPUT: %s\n", output);
+ return;
+ }
+
+ /*
+ * More than 1 line. Print a header and then each
+ * line, with suitable indent. There are more general
+ * ways to do this, but let's maintain intermediate
+ * blank lines (e.g. strv_split() loses blank lines).
+ */
+ printf(" OUTPUT:\n");
+ t1 = output;
+ do {
+ /*
+ * Points to newline character. t2 initially
+ * set non-NULL outside loop because this loop
+ * only covers multi-line output.
+ */
+ *t2 = '\0';
+
+
+ printf(" %s\n", t1);
+ t1 = t2 + 1;
+
+ if (t1 >= output + len) {
+ break;
+ }
+
+ /* strchrnul() would be awesome, but isn't portable */
+ t2 = strchr(t1, '\n');
+ if (t2 == NULL) {
+ t2 = output + len;
+ }
+ } while (true);
}
}
ok <<EOF
01.disabled DISABLED
02.enabled OK DURATION DATETIME
- OUTPUT: Running event verbosemultiline
-There are multiple output lines
-
-^^^ including blank lines...
+ OUTPUT:
+ Running event verbosemultiline
+ There are multiple output lines
+
+ ^^^ including blank lines...
EOF
simple_test status random verbosemultiline
+ok_null
+simple_test run 10 random verbosemultilinenonl
+
+ok <<EOF
+01.disabled DISABLED
+02.enabled OK DURATION DATETIME
+ OUTPUT:
+ Running event verbosemultilinenonl
+ Multiple output lines
+
+ No trailing newline
+EOF
+simple_test status random verbosemultilinenonl
+
required_result 8 <<EOF
Event verbosemultilinefailure in random failed
EOF
required_result 2 <<EOF
01.disabled DISABLED
02.enabled ERROR DURATION DATETIME
- OUTPUT: Failing event verbosemultilinefailure
-There are multiple output lines
-
-args: verbosemultilinefailure with some args
+ OUTPUT:
+ Failing event verbosemultilinefailure
+ There are multiple output lines
+
+ args: verbosemultilinefailure with some args
EOF
simple_test status random verbosemultilinefailure