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