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