1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/*
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *  Use of this source code is governed by a BSD-style license
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *  that can be found in the LICENSE file in the root of the source
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *  tree. An additional intellectual property rights grant can be found
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *  in the file PATENTS.  All contributing project authors may
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *  be found in the AUTHORS file in the root of the source tree.
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testsupport/fileutils.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <cstdio>
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <list>
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string>
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gtest/gtest.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifdef WIN32
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const char* kPathDelimiter = "\\";
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const char* kPathDelimiter = "/";
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const std::string kDummyDir = "file_utils_unittest_dummy_dir";
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const std::string kResourcesDir = "resources";
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const std::string kTestName = "fileutils_unittest";
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const std::string kExtension = "tmp";
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef std::list<std::string> FileList;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace webrtc {
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test fixture to restore the working directory between each test, since some
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// of them change it with chdir during execution (not restored by the
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// gtest framework).
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FileUtilsTest : public testing::Test {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FileUtilsTest() {
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~FileUtilsTest() {}
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Runs before the first test
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void SetUpTestCase() {
44    original_working_dir_ = webrtc::test::WorkingDir();
45    std::string resources_path = original_working_dir_ + kPathDelimiter +
46        kResourcesDir + kPathDelimiter;
47    webrtc::test::CreateDirectory(resources_path);
48
49    files_.push_back(resources_path + kTestName + "." + kExtension);
50    files_.push_back(resources_path + kTestName + "_32." + kExtension);
51    files_.push_back(resources_path + kTestName + "_64." + kExtension);
52    files_.push_back(resources_path + kTestName + "_linux." + kExtension);
53    files_.push_back(resources_path + kTestName + "_mac." + kExtension);
54    files_.push_back(resources_path + kTestName + "_win." + kExtension);
55    files_.push_back(resources_path + kTestName + "_linux_32." + kExtension);
56    files_.push_back(resources_path + kTestName + "_mac_32." + kExtension);
57    files_.push_back(resources_path + kTestName + "_win_32." + kExtension);
58    files_.push_back(resources_path + kTestName + "_linux_64." + kExtension);
59    files_.push_back(resources_path + kTestName + "_mac_64." + kExtension);
60    files_.push_back(resources_path + kTestName + "_win_64." + kExtension);
61
62    // Now that the resources dir exists, write some empty test files into it.
63    for (FileList::iterator file_it = files_.begin();
64        file_it != files_.end(); ++file_it) {
65      FILE* file = fopen(file_it->c_str(), "wb");
66      ASSERT_TRUE(file != NULL) << "Failed to write file: " << file_it->c_str();
67      ASSERT_GT(fprintf(file, "%s",  "Dummy data"), 0);
68      fclose(file);
69    }
70    // Create a dummy subdir that can be chdir'ed into for testing purposes.
71    empty_dummy_dir_ = original_working_dir_ + kPathDelimiter + kDummyDir;
72    webrtc::test::CreateDirectory(empty_dummy_dir_);
73  }
74  static void TearDownTestCase() {
75    // Clean up all resource files written
76    for (FileList::iterator file_it = files_.begin();
77            file_it != files_.end(); ++file_it) {
78      remove(file_it->c_str());
79    }
80    std::remove(empty_dummy_dir_.c_str());
81  }
82  void SetUp() {
83    ASSERT_EQ(chdir(original_working_dir_.c_str()), 0);
84  }
85  void TearDown() {
86    ASSERT_EQ(chdir(original_working_dir_.c_str()), 0);
87  }
88 protected:
89  static FileList files_;
90  static std::string empty_dummy_dir_;
91 private:
92  static std::string original_working_dir_;
93};
94
95FileList FileUtilsTest::files_;
96std::string FileUtilsTest::original_working_dir_ = "";
97std::string FileUtilsTest::empty_dummy_dir_ = "";
98
99// Tests that the project root path is returned for the default working
100// directory that is automatically set when the test executable is launched.
101// The test is not fully testing the implementation, since we cannot be sure
102// of where the executable was launched from.
103// The test will fail if the top level directory is not named "trunk".
104TEST_F(FileUtilsTest, ProjectRootPathFromUnchangedWorkingDir) {
105  std::string path = webrtc::test::ProjectRootPath();
106  std::string expected_end = "trunk";
107  expected_end = kPathDelimiter + expected_end + kPathDelimiter;
108  ASSERT_EQ(path.length() - expected_end.length(), path.find(expected_end));
109}
110
111// Similar to the above test, but for the output dir
112TEST_F(FileUtilsTest, OutputPathFromUnchangedWorkingDir) {
113  std::string path = webrtc::test::OutputPath();
114  std::string expected_end = "out";
115  expected_end = kPathDelimiter + expected_end + kPathDelimiter;
116  ASSERT_EQ(path.length() - expected_end.length(), path.find(expected_end));
117}
118
119// Tests setting the current working directory to a directory three levels
120// deeper from the current one. Then testing that the project path returned
121// is still the same, when the function under test is called again.
122TEST_F(FileUtilsTest, ProjectRootPathFromDeeperWorkingDir) {
123  std::string path = webrtc::test::ProjectRootPath();
124  std::string original_working_dir = path;  // This is the correct project root
125  // Change to a subdirectory path.
126  ASSERT_EQ(0, chdir(empty_dummy_dir_.c_str()));
127  ASSERT_EQ(original_working_dir, webrtc::test::ProjectRootPath());
128}
129
130// Similar to the above test, but for the output dir
131TEST_F(FileUtilsTest, OutputPathFromDeeperWorkingDir) {
132  std::string path = webrtc::test::OutputPath();
133  std::string original_working_dir = path;
134  ASSERT_EQ(0, chdir(empty_dummy_dir_.c_str()));
135  ASSERT_EQ(original_working_dir, webrtc::test::OutputPath());
136}
137
138// Tests with current working directory set to a directory higher up in the
139// directory tree than the project root dir. This case shall return a specified
140// error string as a directory (which will be an invalid path).
141TEST_F(FileUtilsTest, ProjectRootPathFromRootWorkingDir) {
142  // Change current working dir to the root of the current file system
143  // (this will always be "above" our project root dir).
144  ASSERT_EQ(0, chdir(kPathDelimiter));
145  ASSERT_EQ(webrtc::test::kCannotFindProjectRootDir,
146            webrtc::test::ProjectRootPath());
147}
148
149// Similar to the above test, but for the output dir
150TEST_F(FileUtilsTest, OutputPathFromRootWorkingDir) {
151  ASSERT_EQ(0, chdir(kPathDelimiter));
152  ASSERT_EQ("./", webrtc::test::OutputPath());
153}
154
155// Only tests that the code executes
156TEST_F(FileUtilsTest, CreateDirectory) {
157  std::string directory = "fileutils-unittest-empty-dir";
158  // Make sure it's removed if a previous test has failed:
159  std::remove(directory.c_str());
160  ASSERT_TRUE(webrtc::test::CreateDirectory(directory));
161  std::remove(directory.c_str());
162}
163
164TEST_F(FileUtilsTest, WorkingDirReturnsValue) {
165  // Hard to cover all platforms. Just test that it returns something without
166  // crashing:
167  std::string working_dir = webrtc::test::WorkingDir();
168  ASSERT_GT(working_dir.length(), 0u);
169}
170
171// Due to multiple platforms, it is hard to make a complete test for
172// ResourcePath. Manual testing has been performed by removing files and
173// verified the result confirms with the specified documentation for the
174// function.
175TEST_F(FileUtilsTest, ResourcePathReturnsValue) {
176  std::string resource = webrtc::test::ResourcePath(kTestName, kExtension);
177  ASSERT_GT(resource.find(kTestName), 0u);
178  ASSERT_GT(resource.find(kExtension), 0u);
179  ASSERT_EQ(0, chdir(kPathDelimiter));
180  ASSERT_EQ("./", webrtc::test::OutputPath());
181}
182
183TEST_F(FileUtilsTest, GetFileSizeExistingFile) {
184  ASSERT_GT(webrtc::test::GetFileSize(files_.front()), 0u);
185}
186
187TEST_F(FileUtilsTest, GetFileSizeNonExistingFile) {
188  ASSERT_EQ(0u, webrtc::test::GetFileSize("non-existing-file.tmp"));
189}
190
191}  // namespace webrtc
192