summaryrefslogtreecommitdiffstats
path: root/src/disk_interface_test.cc
diff options
context:
space:
mode:
authorThiago Farina <tfarina@chromium.org>2011-09-07 17:40:41 (GMT)
committerThiago Farina <tfarina@chromium.org>2011-09-07 17:40:41 (GMT)
commitcf519344cacdbda68550d455b9adc94b6b371924 (patch)
treecdbfe77e1978ef81844811c56f71b72108beda13 /src/disk_interface_test.cc
parente292718907a60c464dbe471ccdc7014731a4b6a2 (diff)
downloadNinja-cf519344cacdbda68550d455b9adc94b6b371924.zip
Ninja-cf519344cacdbda68550d455b9adc94b6b371924.tar.gz
Ninja-cf519344cacdbda68550d455b9adc94b6b371924.tar.bz2
Move DiskInterfaceTest into its own source file.
TEST=ninja_test --gtest_filter=DiskInterface* Signed-off-by: Thiago Farina <tfarina@chromium.org>
Diffstat (limited to 'src/disk_interface_test.cc')
-rw-r--r--src/disk_interface_test.cc131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/disk_interface_test.cc b/src/disk_interface_test.cc
new file mode 100644
index 0000000..ed26975
--- /dev/null
+++ b/src/disk_interface_test.cc
@@ -0,0 +1,131 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <gtest/gtest.h>
+
+#ifdef _WIN32
+#include <io.h>
+#include <windows.h>
+#endif
+
+#include "disk_interface.h"
+
+using namespace std;
+
+namespace {
+
+class DiskInterfaceTest : public testing::Test {
+ public:
+ virtual void SetUp() {
+ // Because we do real disk accesses, we create a temp dir within
+ // the system temporary directory.
+
+ // First change into the system temp dir and save it for cleanup.
+ start_dir_ = GetSystemTempDir();
+ ASSERT_EQ(0, chdir(start_dir_.c_str()));
+
+ // Then create and change into a temporary subdirectory of that.
+ temp_dir_name_ = MakeTempDir();
+ ASSERT_FALSE(temp_dir_name_.empty());
+ ASSERT_EQ(0, chdir(temp_dir_name_.c_str()));
+ }
+
+ virtual void TearDown() {
+ // Move out of the directory we're about to clobber.
+ ASSERT_EQ(0, chdir(start_dir_.c_str()));
+#ifdef _WIN32
+ ASSERT_EQ(0, system(("rmdir /s /q " + temp_dir_name_).c_str()));
+#else
+ ASSERT_EQ(0, system(("rm -rf " + temp_dir_name_).c_str()));
+#endif
+ }
+
+ string GetSystemTempDir() {
+#ifdef _WIN32
+ char buf[1024];
+ if (!GetTempPath(sizeof(buf), buf))
+ return "";
+ return buf;
+#else
+ const char* tempdir = getenv("TMPDIR");
+ if (tempdir)
+ return tempdir;
+ return "/tmp";
+#endif
+ }
+
+ string MakeTempDir() {
+ char name_template[] = "DiskInterfaceTest-XXXXXX";
+ char* name = mkdtemp(name_template);
+ return name ? name : "";
+ }
+
+ string start_dir_;
+ string temp_dir_name_;
+ RealDiskInterface disk_;
+};
+
+TEST_F(DiskInterfaceTest, Stat) {
+ EXPECT_EQ(0, disk_.Stat("nosuchfile"));
+
+#ifdef _WIN32
+ // TODO: find something that stat fails on for Windows.
+#else
+ string too_long_name(512, 'x');
+ EXPECT_EQ(-1, disk_.Stat(too_long_name));
+#endif
+
+#ifdef _WIN32
+ ASSERT_EQ(0, system("cmd.exe /c echo hi > file"));
+#else
+ ASSERT_EQ(0, system("touch file"));
+#endif
+ EXPECT_GT(disk_.Stat("file"), 1);
+}
+
+TEST_F(DiskInterfaceTest, ReadFile) {
+ string err;
+ EXPECT_EQ("", disk_.ReadFile("foobar", &err));
+ EXPECT_EQ("", err);
+
+ const char* kTestFile = "testfile";
+ FILE* f = fopen(kTestFile, "wb");
+ ASSERT_TRUE(f);
+ const char* kTestContent = "test content\nok";
+ fprintf(f, "%s", kTestContent);
+ ASSERT_EQ(0, fclose(f));
+
+ EXPECT_EQ(kTestContent, disk_.ReadFile(kTestFile, &err));
+ EXPECT_EQ("", err);
+}
+
+TEST_F(DiskInterfaceTest, MakeDirs) {
+ EXPECT_TRUE(disk_.MakeDirs("path/with/double//slash/"));
+}
+
+TEST_F(DiskInterfaceTest, RemoveFile) {
+ const char* kFileName = "file-to-remove";
+#ifdef _WIN32
+ string cmd = "cmd /c echo hi > ";
+#else
+ string cmd = "touch ";
+#endif
+ cmd += kFileName;
+ ASSERT_EQ(0, system(cmd.c_str()));
+ EXPECT_EQ(0, disk_.RemoveFile(kFileName));
+ EXPECT_EQ(1, disk_.RemoveFile(kFileName));
+ EXPECT_EQ(1, disk_.RemoveFile("does not exist"));
+}
+
+} // namespace