147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/fileutils.h" 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h" 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/pathutils.h" 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/stream.h" 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Make sure we can get a temp folder for the later tests. 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(FilesystemTest, GetTemporaryFolder) { 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname path; 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::GetTemporaryFolder(path, true, NULL)); 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test creating a temp file, reading it back in, and deleting it. 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(FilesystemTest, TestOpenFile) { 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname path; 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::GetTemporaryFolder(path, true, NULL)); 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path.SetPathname(Filesystem::TempFilename(path, "ut")); 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org FileStream* fs; 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org char buf[256]; 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t bytes; 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org fs = Filesystem::OpenFile(path, "wb"); 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT_TRUE(fs != NULL); 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(SR_SUCCESS, fs->Write("test", 4, &bytes, NULL)); 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(4U, bytes); 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org delete fs; 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::IsFile(path)); 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org fs = Filesystem::OpenFile(path, "rb"); 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT_TRUE(fs != NULL); 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(SR_SUCCESS, fs->Read(buf, sizeof(buf), &bytes, NULL)); 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(4U, bytes); 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org delete fs; 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::DeleteFile(path)); 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(Filesystem::IsFile(path)); 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test opening a non-existent file. 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(FilesystemTest, TestOpenBadFile) { 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname path; 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::GetTemporaryFolder(path, true, NULL)); 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path.SetFilename("not an actual file"); 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(Filesystem::IsFile(path)); 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org FileStream* fs = Filesystem::OpenFile(path, "rb"); 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(fs != NULL); 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test that CreatePrivateFile fails for existing files and succeeds for 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// non-existent ones. 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(FilesystemTest, TestCreatePrivateFile) { 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname path; 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::GetTemporaryFolder(path, true, NULL)); 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path.SetFilename("private_file_test"); 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // First call should succeed because the file doesn't exist yet. 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::CreatePrivateFile(path)); 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Next call should fail, because now it exists. 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(Filesystem::CreatePrivateFile(path)); 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Verify that we have permission to open the file for reading and writing. 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<FileStream> fs(Filesystem::OpenFile(path, "wb")); 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(fs.get() != NULL); 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Have to close the file on Windows before it will let us delete it. 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org fs.reset(); 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Verify that we have permission to delete the file. 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::DeleteFile(path)); 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test checking for free disk space. 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(FilesystemTest, TestGetDiskFreeSpace) { 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Note that we should avoid picking any file/folder which could be located 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // at the remotely mounted drive/device. 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname path; 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT_TRUE(Filesystem::GetAppDataFolder(&path, true)); 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int64 free1 = 0; 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::IsFolder(path)); 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(Filesystem::IsFile(path)); 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::GetDiskFreeSpace(path, &free1)); 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GT(free1, 0); 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int64 free2 = 0; 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path.AppendFolder("this_folder_doesnt_exist"); 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(Filesystem::IsFolder(path)); 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::IsAbsent(path)); 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::GetDiskFreeSpace(path, &free2)); 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // These should be the same disk, and disk free space should not have changed 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // by more than 1% between the two calls. 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LT(static_cast<int64>(free1 * .9), free2); 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LT(free2, static_cast<int64>(free1 * 1.1)); 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int64 free3 = 0; 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path.clear(); 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(path.empty()); 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::GetDiskFreeSpace(path, &free3)); 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Current working directory may not be where exe is. 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // EXPECT_LT(static_cast<int64>(free1 * .9), free3); 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // EXPECT_LT(free3, static_cast<int64>(free1 * 1.1)); 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GT(free3, 0); 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests that GetCurrentDirectory() returns something. 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(FilesystemTest, TestGetCurrentDirectory) { 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(Filesystem::GetCurrentDirectory().empty()); 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests that GetAppPathname returns something. 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(FilesystemTest, TestGetAppPathname) { 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname path; 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::GetAppPathname(&path)); 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(path.empty()); 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 132