summaryrefslogtreecommitdiff
path: root/lib/fuzzer/tests
diff options
context:
space:
mode:
authorMatt Morehouse <mascasa@google.com>2017-12-04 19:25:59 +0000
committerMatt Morehouse <mascasa@google.com>2017-12-04 19:25:59 +0000
commitc9d933986ac9833fc9929999b669818be6e60053 (patch)
tree19cd2f04acbe4c2623fd009a89903ac769a291c2 /lib/fuzzer/tests
parent2217d9faa962b3bee8704fbfae796fe342613266 (diff)
[libFuzzer] Encapsulate commands in a class.
Summary: To be more portable (especially w.r.t. platforms without system()), commands should be managed programmatically rather than via string manipulation on the command line. This change introduces Fuzzer::Command, with methods to manage arguments and flags, set output options, and execute the command. Patch By: aarongreen Reviewers: kcc, morehouse Reviewed By: kcc, morehouse Subscribers: llvm-commits, mgorny Differential Revision: https://reviews.llvm.org/D40103 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@319680 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/fuzzer/tests')
-rw-r--r--lib/fuzzer/tests/FuzzerUnittest.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/lib/fuzzer/tests/FuzzerUnittest.cpp b/lib/fuzzer/tests/FuzzerUnittest.cpp
index f3e822636..bba4fd6b9 100644
--- a/lib/fuzzer/tests/FuzzerUnittest.cpp
+++ b/lib/fuzzer/tests/FuzzerUnittest.cpp
@@ -766,6 +766,166 @@ TEST(Fuzzer, ForEachNonZeroByte) {
EXPECT_EQ(Res, Expected);
}
+// FuzzerCommand unit tests. The arguments in the two helper methods below must
+// match.
+static void makeCommandArgs(Vector<std::string> *ArgsToAdd) {
+ assert(ArgsToAdd);
+ ArgsToAdd->clear();
+ ArgsToAdd->push_back("foo");
+ ArgsToAdd->push_back("-bar=baz");
+ ArgsToAdd->push_back("qux");
+ ArgsToAdd->push_back(Command::ignoreRemainingArgs());
+ ArgsToAdd->push_back("quux");
+ ArgsToAdd->push_back("-grault=garply");
+}
+
+static std::string makeCmdLine(const char *separator, const char *suffix) {
+ std::string CmdLine("foo -bar=baz qux ");
+ if (strlen(separator) != 0) {
+ CmdLine += separator;
+ CmdLine += " ";
+ }
+ CmdLine += Command::ignoreRemainingArgs();
+ CmdLine += " quux -grault=garply";
+ if (strlen(suffix) != 0) {
+ CmdLine += " ";
+ CmdLine += suffix;
+ }
+ return CmdLine;
+}
+
+TEST(FuzzerCommand, Create) {
+ std::string CmdLine;
+
+ // Default constructor
+ Command DefaultCmd;
+
+ CmdLine = DefaultCmd.toString();
+ EXPECT_EQ(CmdLine, "");
+
+ // Explicit constructor
+ Vector<std::string> ArgsToAdd;
+ makeCommandArgs(&ArgsToAdd);
+ Command InitializedCmd(ArgsToAdd);
+
+ CmdLine = InitializedCmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("", ""));
+
+ // Compare each argument
+ auto InitializedArgs = InitializedCmd.getArguments();
+ auto i = ArgsToAdd.begin();
+ auto j = InitializedArgs.begin();
+ while (i != ArgsToAdd.end() && j != InitializedArgs.end()) {
+ EXPECT_EQ(*i++, *j++);
+ }
+ EXPECT_EQ(i, ArgsToAdd.end());
+ EXPECT_EQ(j, InitializedArgs.end());
+
+ // Copy constructor
+ Command CopiedCmd(InitializedCmd);
+
+ CmdLine = CopiedCmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("", ""));
+
+ // Assignment operator
+ Command AssignedCmd;
+ AssignedCmd = CopiedCmd;
+
+ CmdLine = AssignedCmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("", ""));
+}
+
+TEST(FuzzerCommand, ModifyArguments) {
+ Vector<std::string> ArgsToAdd;
+ makeCommandArgs(&ArgsToAdd);
+ Command Cmd;
+ std::string CmdLine;
+
+ Cmd.addArguments(ArgsToAdd);
+ CmdLine = Cmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("", ""));
+
+ Cmd.addArgument("waldo");
+ EXPECT_TRUE(Cmd.hasArgument("waldo"));
+
+ CmdLine = Cmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("waldo", ""));
+
+ Cmd.removeArgument("waldo");
+ EXPECT_FALSE(Cmd.hasArgument("waldo"));
+
+ CmdLine = Cmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("", ""));
+}
+
+TEST(FuzzerCommand, ModifyFlags) {
+ Vector<std::string> ArgsToAdd;
+ makeCommandArgs(&ArgsToAdd);
+ Command Cmd(ArgsToAdd);
+ std::string Value, CmdLine;
+ ASSERT_FALSE(Cmd.hasFlag("fred"));
+
+ Value = Cmd.getFlagValue("fred");
+ EXPECT_EQ(Value, "");
+
+ CmdLine = Cmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("", ""));
+
+ Cmd.addFlag("fred", "plugh");
+ EXPECT_TRUE(Cmd.hasFlag("fred"));
+
+ Value = Cmd.getFlagValue("fred");
+ EXPECT_EQ(Value, "plugh");
+
+ CmdLine = Cmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("-fred=plugh", ""));
+
+ Cmd.removeFlag("fred");
+ EXPECT_FALSE(Cmd.hasFlag("fred"));
+
+ Value = Cmd.getFlagValue("fred");
+ EXPECT_EQ(Value, "");
+
+ CmdLine = Cmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("", ""));
+}
+
+TEST(FuzzerCommand, SetOutput) {
+ Vector<std::string> ArgsToAdd;
+ makeCommandArgs(&ArgsToAdd);
+ Command Cmd(ArgsToAdd);
+ std::string CmdLine;
+ ASSERT_FALSE(Cmd.hasOutputFile());
+ ASSERT_FALSE(Cmd.isOutAndErrCombined());
+
+ Cmd.combineOutAndErr(true);
+ EXPECT_TRUE(Cmd.isOutAndErrCombined());
+
+ CmdLine = Cmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("", "2>&1"));
+
+ Cmd.combineOutAndErr(false);
+ EXPECT_FALSE(Cmd.isOutAndErrCombined());
+
+ Cmd.setOutputFile("xyzzy");
+ EXPECT_TRUE(Cmd.hasOutputFile());
+
+ CmdLine = Cmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("", ">xyzzy"));
+
+ Cmd.setOutputFile("thud");
+ EXPECT_TRUE(Cmd.hasOutputFile());
+
+ CmdLine = Cmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("", ">thud"));
+
+ Cmd.combineOutAndErr();
+ EXPECT_TRUE(Cmd.isOutAndErrCombined());
+
+ CmdLine = Cmd.toString();
+ EXPECT_EQ(CmdLine, makeCmdLine("", "2>&1 >thud"));
+}
+
int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();