Allow tests to fake stdin/stdout/stderr is a console
We've been unable to effectively test cases where stdin/stdout/stderr
are consoles, because in our test cases they generally aren't. Allow the
command line flags `--fake-std{in,out,err}-is-console` to tell the CLI
to pretend that std{in,out,err} is a console.
This commit is contained in:
committed by
Nick Terrell
parent
031de3c69c
commit
e58a39f84e
+1
-1
@@ -3010,7 +3010,7 @@ int FIO_listMultipleFiles(unsigned numFiles, const char** filenameTable, int dis
|
|||||||
} }
|
} }
|
||||||
|
|
||||||
if (numFiles == 0) {
|
if (numFiles == 0) {
|
||||||
if (!IS_CONSOLE(stdin)) {
|
if (!UTIL_isConsole(stdin)) {
|
||||||
DISPLAYLEVEL(1, "zstd: --list does not support reading from standard input \n");
|
DISPLAYLEVEL(1, "zstd: --list does not support reading from standard input \n");
|
||||||
}
|
}
|
||||||
DISPLAYLEVEL(1, "No files given \n");
|
DISPLAYLEVEL(1, "No files given \n");
|
||||||
|
|||||||
@@ -127,6 +127,10 @@ extern "C" {
|
|||||||
|
|
||||||
/*-*********************************************
|
/*-*********************************************
|
||||||
* Detect if isatty() and fileno() are available
|
* Detect if isatty() and fileno() are available
|
||||||
|
*
|
||||||
|
* Note: Use UTIL_isConsole() for the zstd CLI
|
||||||
|
* instead, as it allows faking is console for
|
||||||
|
* testing.
|
||||||
************************************************/
|
************************************************/
|
||||||
#if (defined(__linux__) && (PLATFORM_POSIX_VERSION > 1)) \
|
#if (defined(__linux__) && (PLATFORM_POSIX_VERSION > 1)) \
|
||||||
|| (PLATFORM_POSIX_VERSION >= 200112L) \
|
|| (PLATFORM_POSIX_VERSION >= 200112L) \
|
||||||
|
|||||||
@@ -288,6 +288,34 @@ int UTIL_isLink(const char* infilename)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int g_fakeStdinIsConsole = 0;
|
||||||
|
static int g_fakeStderrIsConsole = 0;
|
||||||
|
static int g_fakeStdoutIsConsole = 0;
|
||||||
|
|
||||||
|
int UTIL_isConsole(FILE* file)
|
||||||
|
{
|
||||||
|
if (file == stdin && g_fakeStdinIsConsole)
|
||||||
|
return 1;
|
||||||
|
if (file == stderr && g_fakeStderrIsConsole)
|
||||||
|
return 1;
|
||||||
|
if (file == stdout && g_fakeStdoutIsConsole)
|
||||||
|
return 1;
|
||||||
|
return IS_CONSOLE(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UTIL_fakeStdinIsConsole(void)
|
||||||
|
{
|
||||||
|
g_fakeStdinIsConsole = 1;
|
||||||
|
}
|
||||||
|
void UTIL_fakeStdoutIsConsole(void)
|
||||||
|
{
|
||||||
|
g_fakeStdoutIsConsole = 1;
|
||||||
|
}
|
||||||
|
void UTIL_fakeStderrIsConsole(void)
|
||||||
|
{
|
||||||
|
g_fakeStderrIsConsole = 1;
|
||||||
|
}
|
||||||
|
|
||||||
U64 UTIL_getFileSize(const char* infilename)
|
U64 UTIL_getFileSize(const char* infilename)
|
||||||
{
|
{
|
||||||
stat_t statbuf;
|
stat_t statbuf;
|
||||||
|
|||||||
@@ -175,6 +175,20 @@ int UTIL_isCompressedFile(const char* infilename, const char *extensionList[]);
|
|||||||
int UTIL_isLink(const char* infilename);
|
int UTIL_isLink(const char* infilename);
|
||||||
int UTIL_isFIFO(const char* infilename);
|
int UTIL_isFIFO(const char* infilename);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns with the given file descriptor is a console.
|
||||||
|
* Allows faking whether stdin/stdout/stderr is a console
|
||||||
|
* using UTIL_fake*IsConsole().
|
||||||
|
*/
|
||||||
|
int UTIL_isConsole(FILE* file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pretends that stdin/stdout/stderr is a console for testing.
|
||||||
|
*/
|
||||||
|
void UTIL_fakeStdinIsConsole(void);
|
||||||
|
void UTIL_fakeStdoutIsConsole(void);
|
||||||
|
void UTIL_fakeStderrIsConsole(void);
|
||||||
|
|
||||||
#define UTIL_FILESIZE_UNKNOWN ((U64)(-1))
|
#define UTIL_FILESIZE_UNKNOWN ((U64)(-1))
|
||||||
U64 UTIL_getFileSize(const char* infilename);
|
U64 UTIL_getFileSize(const char* infilename);
|
||||||
U64 UTIL_getTotalFileSize(const char* const * fileNamesTable, unsigned nbFiles);
|
U64 UTIL_getTotalFileSize(const char* const * fileNamesTable, unsigned nbFiles);
|
||||||
|
|||||||
+8
-5
@@ -27,8 +27,8 @@
|
|||||||
/*-************************************
|
/*-************************************
|
||||||
* Dependencies
|
* Dependencies
|
||||||
**************************************/
|
**************************************/
|
||||||
#include "platform.h" /* IS_CONSOLE, PLATFORM_POSIX_VERSION */
|
#include "platform.h" /* PLATFORM_POSIX_VERSION */
|
||||||
#include "util.h" /* UTIL_HAS_CREATEFILELIST, UTIL_createFileList */
|
#include "util.h" /* UTIL_HAS_CREATEFILELIST, UTIL_createFileList, UTIL_isConsole */
|
||||||
#include <stdlib.h> /* getenv */
|
#include <stdlib.h> /* getenv */
|
||||||
#include <string.h> /* strcmp, strlen */
|
#include <string.h> /* strcmp, strlen */
|
||||||
#include <stdio.h> /* fprintf(), stdin, stdout, stderr */
|
#include <stdio.h> /* fprintf(), stdin, stdout, stderr */
|
||||||
@@ -987,6 +987,9 @@ int main(int argCount, const char* argv[])
|
|||||||
if (!strcmp(argument, "--no-progress")) { FIO_setProgressSetting(FIO_ps_never); continue; }
|
if (!strcmp(argument, "--no-progress")) { FIO_setProgressSetting(FIO_ps_never); continue; }
|
||||||
if (!strcmp(argument, "--progress")) { FIO_setProgressSetting(FIO_ps_always); continue; }
|
if (!strcmp(argument, "--progress")) { FIO_setProgressSetting(FIO_ps_always); continue; }
|
||||||
if (!strcmp(argument, "--exclude-compressed")) { FIO_setExcludeCompressedFile(prefs, 1); continue; }
|
if (!strcmp(argument, "--exclude-compressed")) { FIO_setExcludeCompressedFile(prefs, 1); continue; }
|
||||||
|
if (!strcmp(argument, "--fake-stdin-is-console")) { UTIL_fakeStdinIsConsole(); continue; }
|
||||||
|
if (!strcmp(argument, "--fake-stdout-is-console")) { UTIL_fakeStdoutIsConsole(); continue; }
|
||||||
|
if (!strcmp(argument, "--fake-stderr-is-console")) { UTIL_fakeStderrIsConsole(); continue; }
|
||||||
|
|
||||||
/* long commands with arguments */
|
/* long commands with arguments */
|
||||||
#ifndef ZSTD_NODICT
|
#ifndef ZSTD_NODICT
|
||||||
@@ -1437,12 +1440,12 @@ int main(int argCount, const char* argv[])
|
|||||||
/* Check if input/output defined as console; trigger an error in this case */
|
/* Check if input/output defined as console; trigger an error in this case */
|
||||||
if (!forceStdin
|
if (!forceStdin
|
||||||
&& (UTIL_searchFileNamesTable(filenames, stdinmark) != -1)
|
&& (UTIL_searchFileNamesTable(filenames, stdinmark) != -1)
|
||||||
&& IS_CONSOLE(stdin) ) {
|
&& UTIL_isConsole(stdin) ) {
|
||||||
DISPLAYLEVEL(1, "stdin is a console, aborting\n");
|
DISPLAYLEVEL(1, "stdin is a console, aborting\n");
|
||||||
CLEAN_RETURN(1);
|
CLEAN_RETURN(1);
|
||||||
}
|
}
|
||||||
if ( (!outFileName || !strcmp(outFileName, stdoutmark))
|
if ( (!outFileName || !strcmp(outFileName, stdoutmark))
|
||||||
&& IS_CONSOLE(stdout)
|
&& UTIL_isConsole(stdout)
|
||||||
&& (UTIL_searchFileNamesTable(filenames, stdinmark) != -1)
|
&& (UTIL_searchFileNamesTable(filenames, stdinmark) != -1)
|
||||||
&& !forceStdout
|
&& !forceStdout
|
||||||
&& operation!=zom_decompress ) {
|
&& operation!=zom_decompress ) {
|
||||||
@@ -1479,7 +1482,7 @@ int main(int argCount, const char* argv[])
|
|||||||
/* No status message in pipe mode (stdin - stdout) */
|
/* No status message in pipe mode (stdin - stdout) */
|
||||||
hasStdout = outFileName && !strcmp(outFileName,stdoutmark);
|
hasStdout = outFileName && !strcmp(outFileName,stdoutmark);
|
||||||
|
|
||||||
if ((hasStdout || !IS_CONSOLE(stderr)) && (g_displayLevel==2)) g_displayLevel=1;
|
if ((hasStdout || !UTIL_isConsole(stderr)) && (g_displayLevel==2)) g_displayLevel=1;
|
||||||
|
|
||||||
/* IO Stream/File */
|
/* IO Stream/File */
|
||||||
FIO_setHasStdoutOutput(fCtx, hasStdout);
|
FIO_setHasStdoutOutput(fCtx, hasStdout);
|
||||||
|
|||||||
Reference in New Issue
Block a user