aboutsummaryrefslogtreecommitdiff
path: root/find_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'find_test.cc')
-rw-r--r--find_test.cc102
1 files changed, 100 insertions, 2 deletions
diff --git a/find_test.cc b/find_test.cc
index ebdfa98..2ee7e39 100644
--- a/find_test.cc
+++ b/find_test.cc
@@ -17,13 +17,16 @@
#include "find.h"
#include <string>
+#include <unistd.h>
+#include "fileutil.h"
#include "strutil.h"
+int FindUnitTests();
+
int main(int argc, char* argv[]) {
if (argc == 1) {
- fprintf(stderr, "TODO: Write unit tests\n");
- return 1;
+ return FindUnitTests();
}
InitFindEmulator();
@@ -48,3 +51,98 @@ int main(int argc, char* argv[]) {
printf("%.*s\n", SPF(tok));
}
}
+
+string Run(const string& cmd) {
+ string s;
+ int ret = RunCommand("/bin/sh", "-c", cmd, RedirectStderr::NONE, &s);
+
+ if (ret != 0) {
+ fprintf(stderr, "Failed to run `%s`\n", cmd.c_str());
+ exit(ret);
+ }
+
+ return s;
+}
+
+static bool unit_test_failed = false;
+
+void CompareFind(const string& cmd) {
+ string native = Run(cmd);
+
+ FindCommand fc;
+ if (!fc.Parse(cmd)) {
+ fprintf(stderr, "Find emulator cannot parse `%s`\n", cmd.c_str());
+ exit(1);
+ }
+ string emulated;
+ if (!FindEmulator::Get()->HandleFind(cmd, fc, Loc(), &emulated)) {
+ fprintf(stderr, "Find emulator cannot parse `%s`\n", cmd.c_str());
+ exit(1);
+ }
+
+ vector<StringPiece> nativeWords;
+ vector<StringPiece> emulatedWords;
+
+ WordScanner(native).Split(&nativeWords);
+ WordScanner(emulated).Split(&emulatedWords);
+
+ if (nativeWords != emulatedWords) {
+ fprintf(stderr, "Failed to match `%s`:\n", cmd.c_str());
+
+ auto nativeIter = nativeWords.begin();
+ auto emulatedIter = emulatedWords.begin();
+ fprintf(stderr, "%-20s %-20s\n", "Native:", "Emulated:");
+ while (nativeIter != nativeWords.end() || emulatedIter != emulatedWords.end()) {
+ fprintf(stderr, " %-20s %-20s\n",
+ (nativeIter == nativeWords.end()) ? "" : (*nativeIter++).as_string().c_str(),
+ (emulatedIter == emulatedWords.end()) ? "" : (*emulatedIter++).as_string().c_str());
+ }
+ fprintf(stderr, "------------------------------------------\n");
+ unit_test_failed = true;
+ }
+}
+
+int FindUnitTests() {
+ Run("rm -rf out/find");
+ Run("mkdir -p out/find");
+ if (chdir("out/find")) {
+ perror("Failed to chdir(out/find)");
+ return 1;
+ }
+
+ // Set up files under out/find:
+ // drwxr-x--- top
+ // lrwxrwxrwx top/E -> missing
+ // lrwxrwxrwx top/C -> A
+ // -rw-r----- top/a
+ // drwxr-x--- top/A
+ // lrwxrwxrwx top/A/D -> B
+ // -rw-r----- top/A/b
+ // drwxr-x--- top/A/B
+ // -rw-r----- top/A/B/z
+ Run("mkdir -p top/A/B");
+ Run("cd top && ln -s A C");
+ Run("cd top/A && ln -s B D");
+ Run("cd top && ln -s missing E");
+ Run("touch top/a top/A/b top/A/B/z");
+
+ InitFindEmulator();
+
+ CompareFind("find .");
+ CompareFind("find -L .");
+
+ CompareFind("find top/C");
+ CompareFind("find top/C/.");
+ CompareFind("find -L top/C");
+ CompareFind("find -L top/C/.");
+
+ CompareFind("cd top && find C");
+ CompareFind("cd top && find -L C");
+ CompareFind("cd top/C && find .");
+
+ CompareFind("cd top/C && find D/./z");
+
+ CompareFind("find .//top");
+
+ return unit_test_failed ? 1 : 0;
+}