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