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