test: add more cases for shellTest
This commit is contained in:
1 parent
2681016ffb
commit
c5f5c74a37
1 file changed
+157
+157
@@ -307,3 +307,160 @@ KTEST(shellExtractRedirectsOutputAppend)
|
|||||||
KT_TRUE(t, redirect.appendOut);
|
KT_TRUE(t, redirect.appendOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KTEST(shellExtractRedirectsInputAndOutputTogetherKeepRealArgs)
|
||||||
|
{
|
||||||
|
char text[] = "sort -r < in.txt > out.txt";
|
||||||
|
char* argv[8];
|
||||||
|
int argc = shellTokenize(text, argv, 8);
|
||||||
|
ShellRedirect redirect;
|
||||||
|
bool ok = shellExtractRedirects(argv, &argc, &redirect);
|
||||||
|
KT_TRUE(t, ok);
|
||||||
|
KT_EQ(t, argc, 2);
|
||||||
|
KT_STREQ(t, argv[0], "sort");
|
||||||
|
KT_STREQ(t, argv[1], "-r");
|
||||||
|
KT_STREQ(t, redirect.inPath, "in.txt");
|
||||||
|
KT_STREQ(t, redirect.outPath, "out.txt");
|
||||||
|
KT_FALSE(t, redirect.appendOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
KTEST(shellExtractRedirectsOperatorsCanComeBeforeRealArgs)
|
||||||
|
{
|
||||||
|
/* A real shell accepts redirection operators anywhere on the line, not
|
||||||
|
only trailing -- "> out.txt cat file.txt" is a weird but legal way
|
||||||
|
to write "cat file.txt > out.txt". */
|
||||||
|
char text[] = "> out.txt cat file.txt";
|
||||||
|
char* argv[8];
|
||||||
|
int argc = shellTokenize(text, argv, 8);
|
||||||
|
ShellRedirect redirect;
|
||||||
|
bool ok = shellExtractRedirects(argv, &argc, &redirect);
|
||||||
|
KT_TRUE(t, ok);
|
||||||
|
KT_EQ(t, argc, 2);
|
||||||
|
KT_STREQ(t, argv[0], "cat");
|
||||||
|
KT_STREQ(t, argv[1], "file.txt");
|
||||||
|
KT_STREQ(t, redirect.outPath, "out.txt");
|
||||||
|
}
|
||||||
|
|
||||||
|
KTEST(shellExtractRedirectsLastOutputOperatorWins)
|
||||||
|
{
|
||||||
|
char text[] = "cat > a.txt >> b.txt";
|
||||||
|
char* argv[8];
|
||||||
|
int argc = shellTokenize(text, argv, 8);
|
||||||
|
ShellRedirect redirect;
|
||||||
|
bool ok = shellExtractRedirects(argv, &argc, &redirect);
|
||||||
|
KT_TRUE(t, ok);
|
||||||
|
KT_EQ(t, argc, 1);
|
||||||
|
KT_STREQ(t, argv[0], "cat");
|
||||||
|
KT_STREQ(t, redirect.outPath, "b.txt");
|
||||||
|
KT_TRUE(t, redirect.appendOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
KTEST(shellExtractRedirectsDanglingOperatorFailsWithoutMutating)
|
||||||
|
{
|
||||||
|
char text[] = "cat file.txt >";
|
||||||
|
char* argv[8];
|
||||||
|
int argc = shellTokenize(text, argv, 8);
|
||||||
|
int originalArgc = argc;
|
||||||
|
ShellRedirect redirect;
|
||||||
|
bool ok = shellExtractRedirects(argv, &argc, &redirect);
|
||||||
|
KT_FALSE(t, ok);
|
||||||
|
KT_EQ(t, argc, originalArgc);
|
||||||
|
KT_STREQ(t, argv[0], "cat");
|
||||||
|
KT_STREQ(t, argv[1], "file.txt");
|
||||||
|
KT_STREQ(t, argv[2], ">");
|
||||||
|
}
|
||||||
|
|
||||||
|
KTEST(shellExtractRedirectsNoTokensYieldsNoRedirects)
|
||||||
|
{
|
||||||
|
char* argv[1];
|
||||||
|
int argc = 0;
|
||||||
|
ShellRedirect redirect;
|
||||||
|
bool ok = shellExtractRedirects(argv, &argc, &redirect);
|
||||||
|
KT_TRUE(t, ok);
|
||||||
|
KT_EQ(t, argc, 0);
|
||||||
|
KT_NULL(t, redirect.inPath);
|
||||||
|
KT_NULL(t, redirect.outPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* `2>`/`2>>` (stderr redirection) are a separate operator family from
|
||||||
|
`<`/`>`/`>>` above, targeting fd 2 instead of fd 0/fd 1 -- covered on
|
||||||
|
their own (truncate, append, combined with stdout, last-one-wins,
|
||||||
|
dangling) plus one case proving the two families never interfere with
|
||||||
|
each other even when both appear on the same line. */
|
||||||
|
|
||||||
|
KTEST(shellExtractRedirectsErrTruncate)
|
||||||
|
{
|
||||||
|
char text[] = "prog 2> err.txt";
|
||||||
|
char* argv[8];
|
||||||
|
int argc = shellTokenize(text, argv, 8);
|
||||||
|
ShellRedirect redirect;
|
||||||
|
bool ok = shellExtractRedirects(argv, &argc, &redirect);
|
||||||
|
KT_TRUE(t, ok);
|
||||||
|
KT_EQ(t, argc, 1);
|
||||||
|
KT_STREQ(t, argv[0], "prog");
|
||||||
|
KT_NULL(t, redirect.inPath);
|
||||||
|
KT_NULL(t, redirect.outPath);
|
||||||
|
KT_NOTNULL(t, redirect.errPath);
|
||||||
|
KT_STREQ(t, redirect.errPath, "err.txt");
|
||||||
|
KT_FALSE(t, redirect.appendErr);
|
||||||
|
}
|
||||||
|
|
||||||
|
KTEST(shellExtractRedirectsErrAppend)
|
||||||
|
{
|
||||||
|
char text[] = "prog 2>> err.txt";
|
||||||
|
char* argv[8];
|
||||||
|
int argc = shellTokenize(text, argv, 8);
|
||||||
|
ShellRedirect redirect;
|
||||||
|
bool ok = shellExtractRedirects(argv, &argc, &redirect);
|
||||||
|
KT_TRUE(t, ok);
|
||||||
|
KT_EQ(t, argc, 1);
|
||||||
|
KT_STREQ(t, argv[0], "prog");
|
||||||
|
KT_STREQ(t, redirect.errPath, "err.txt");
|
||||||
|
KT_TRUE(t, redirect.appendErr);
|
||||||
|
}
|
||||||
|
|
||||||
|
KTEST(shellExtractRedirectsStdoutAndStderrTogetherKeepRealArgs)
|
||||||
|
{
|
||||||
|
char text[] = "sort -r > out.txt 2> err.txt";
|
||||||
|
char* argv[8];
|
||||||
|
int argc = shellTokenize(text, argv, 8);
|
||||||
|
ShellRedirect redirect;
|
||||||
|
bool ok = shellExtractRedirects(argv, &argc, &redirect);
|
||||||
|
KT_TRUE(t, ok);
|
||||||
|
KT_EQ(t, argc, 2);
|
||||||
|
KT_STREQ(t, argv[0], "sort");
|
||||||
|
KT_STREQ(t, argv[1], "-r");
|
||||||
|
KT_STREQ(t, redirect.outPath, "out.txt");
|
||||||
|
KT_FALSE(t, redirect.appendOut);
|
||||||
|
KT_STREQ(t, redirect.errPath, "err.txt");
|
||||||
|
KT_FALSE(t, redirect.appendErr);
|
||||||
|
}
|
||||||
|
|
||||||
|
KTEST(shellExtractRedirectsLastErrOperatorWins)
|
||||||
|
{
|
||||||
|
char text[] = "cat 2> a.txt 2>> b.txt";
|
||||||
|
char* argv[8];
|
||||||
|
int argc = shellTokenize(text, argv, 8);
|
||||||
|
ShellRedirect redirect;
|
||||||
|
bool ok = shellExtractRedirects(argv, &argc, &redirect);
|
||||||
|
KT_TRUE(t, ok);
|
||||||
|
KT_EQ(t, argc, 1);
|
||||||
|
KT_STREQ(t, argv[0], "cat");
|
||||||
|
KT_STREQ(t, redirect.errPath, "b.txt");
|
||||||
|
KT_TRUE(t, redirect.appendErr);
|
||||||
|
}
|
||||||
|
|
||||||
|
KTEST(shellExtractRedirectsDanglingErrOperatorFailsWithoutMutating)
|
||||||
|
{
|
||||||
|
char text[] = "cat file.txt 2>";
|
||||||
|
char* argv[8];
|
||||||
|
int argc = shellTokenize(text, argv, 8);
|
||||||
|
int originalArgc = argc;
|
||||||
|
ShellRedirect redirect;
|
||||||
|
bool ok = shellExtractRedirects(argv, &argc, &redirect);
|
||||||
|
KT_FALSE(t, ok);
|
||||||
|
KT_EQ(t, argc, originalArgc);
|
||||||
|
KT_STREQ(t, argv[0], "cat");
|
||||||
|
KT_STREQ(t, argv[1], "file.txt");
|
||||||
|
KT_STREQ(t, argv[2], "2>");
|
||||||
|
}
|
||||||
|
|
||||||
Reference in new issue
Block a user