#include "test.h"
static const char *cvf_err =
"a f\n"
"a l\n";
static const char *tf_out =
"f\n"
"l\n";
static const char *xvf_err =
"x f\n"
"x l\n";
static const char * tvf_contains = "l link to f";
DEFINE_TEST(test_stdio)
{
FILE *filelist;
char *p;
size_t s;
int r;
assertUmask(0);
assertMakeFile("f", 0755, "abc");
assertMakeHardlink("l", "f");
filelist = fopen("filelist", "w");
assert(filelist != NULL);
fprintf(filelist, "f\n");
fprintf(filelist, "l\n");
fclose(filelist);
r = systemf("%s cf archive f l >cf.out 2>cf.err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("cf.out");
assertEmptyFile("cf.err");
r = systemf("%s cvf archive f l >cvf.out 2>cvf.err", testprog);
assertEqualInt(r, 0);
failure("'cv' writes filenames to stderr, nothing to stdout (SUSv2)\n"
"Note that GNU tar writes the file list to stdout by default.");
assertEmptyFile("cvf.out");
assertTextFileContents(cvf_err, "cvf.err");
r = systemf("%s cvf - f l >cvf-.out 2>cvf-.err", testprog);
assertEqualInt(r, 0);
failure("cvf - should write archive to stdout");
failure("cvf - should write file list to stderr (SUSv2)");
assertEqualFile("cvf.err", "cvf-.err");
r = systemf("%s tf cvf-.out >cvf-tf.out 2>cvf-tf.err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("cvf-tf.err");
assertTextFileContents(tf_out, "cvf-tf.out");
r = systemf("%s tf archive >tf.out 2>tf.err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("tf.err");
failure("'t' mode should write results to stdout");
assertTextFileContents(tf_out, "tf.out");
r = systemf("%s tvf archive >tvf.out 2>tvf.err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("tvf.err");
failure("'tv' mode should write results to stdout");
p = slurpfile(&s, "%s", "tvf.out");
assert(strstr(p, tvf_contains) != NULL);
free(p);
r = systemf("%s tvf - < archive >tvf-.out 2>tvf-.err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("tvf-.err");
failure("'tvf-' mode should write the same results as 'tvf'");
assertEqualFile("tvf.out", "tvf-.out");
r = systemf("%s xf archive >xf.out 2>xf.err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("xf.err");
assertEmptyFile("xf.out");
r = systemf("%s xvf archive >xvf.out 2>xvf.err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("xvf.out");
assertTextFileContents(xvf_err, "xvf.err");
r = systemf("%s xvOf archive >xvOf.out 2>xvOf.err", testprog);
assertEqualInt(r, 0);
p = slurpfile(&s, "xvOf.out");
assertEqualInt((int)s, 3);
assertEqualMem(p, "abc", 3);
assertEqualFile("xvf.err", "xvOf.err");
free(p);
r = systemf("%s xvf - < archive >xvf-.out 2>xvf-.err", testprog);
assertEqualInt(r, 0);
assertEmptyFile("xvf-.out");
assertEqualFile("xvf.err", "xvf-.err");
}