// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "storage/browser/fileapi/external_mount_points.h"

#include <stddef.h>

#include <string>

#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/stl_util.h"
#include "storage/browser/fileapi/file_system_url.h"
#include "storage/common/fileapi/file_system_mount_option.h"
#include "testing/gtest/include/gtest/gtest.h"

#define FPL FILE_PATH_LITERAL

#if defined(FILE_PATH_USES_DRIVE_LETTERS)
#define DRIVE FPL("C:")
#else
#define DRIVE
#endif

using storage::FileSystemURL;

namespace content {

TEST(ExternalMountPointsTest, AddMountPoint) {
  scoped_refptr<storage::ExternalMountPoints> mount_points(
      storage::ExternalMountPoints::CreateRefCounted());

  struct TestCase {
    // The mount point's name.
    const char* const name;
    // The mount point's path.
    const base::FilePath::CharType* const path;
    // Whether the mount point registration should succeed.
    bool success;
    // Path returned by GetRegisteredPath. nullptr if the method is expected to
    // fail.
    const base::FilePath::CharType* const registered_path;
  };

  const TestCase kTestCases[] = {
    // Valid mount point.
    {"test", DRIVE FPL("/foo/test"), true, DRIVE FPL("/foo/test")},
    // Valid mount point with only one path component.
    {"bbb", DRIVE FPL("/bbb"), true, DRIVE FPL("/bbb")},
    // Existing mount point path is substring of the mount points path.
    {"test11", DRIVE FPL("/foo/test11"), true, DRIVE FPL("/foo/test11")},
    // Path substring of an existing path.
    {"test1", DRIVE FPL("/foo/test1"), true, DRIVE FPL("/foo/test1")},
    // Empty mount point name and path.
    {"", DRIVE FPL(""), false, nullptr},
    // Empty mount point name.
    {"", DRIVE FPL("/ddd"), false, nullptr},
    // Empty mount point path.
    {"empty_path", FPL(""), true, FPL("")},
    // Name different from path's base name.
    {"not_base_name", DRIVE FPL("/x/y/z"), true, DRIVE FPL("/x/y/z")},
    // References parent.
    {"invalid", DRIVE FPL("../foo/invalid"), false, nullptr},
    // Relative path.
    {"relative", DRIVE FPL("foo/relative"), false, nullptr},
    // Existing mount point path.
    {"path_exists", DRIVE FPL("/foo/test"), false, nullptr},
    // Mount point with the same name exists.
    {"test", DRIVE FPL("/foo/a/test_name_exists"), false,
     DRIVE FPL("/foo/test")},
    // Child of an existing mount point.
    {"a1", DRIVE FPL("/foo/test/a"), false, nullptr},
    // Parent of an existing mount point.
    {"foo1", DRIVE FPL("/foo"), false, nullptr},
    // Bit bigger depth.
    {"g", DRIVE FPL("/foo/a/b/c/d/e/f/g"), true,
     DRIVE FPL("/foo/a/b/c/d/e/f/g")},
    // Sibling mount point (with similar name) exists.
    {"ff", DRIVE FPL("/foo/a/b/c/d/e/ff"), true,
     DRIVE FPL("/foo/a/b/c/d/e/ff")},
    // Lexicographically last among existing mount points.
    {"yyy", DRIVE FPL("/zzz/yyy"), true, DRIVE FPL("/zzz/yyy")},
    // Parent of the lexicographically last mount point.
    {"zzz1", DRIVE FPL("/zzz"), false, nullptr},
    // Child of the lexicographically last mount point.
    {"xxx1", DRIVE FPL("/zzz/yyy/xxx"), false, nullptr},
    // Lexicographically first among existing mount points.
    {"b", DRIVE FPL("/a/b"), true, DRIVE FPL("/a/b")},
    // Parent of lexicographically first mount point.
    {"a2", DRIVE FPL("/a"), false, nullptr},
    // Child of lexicographically last mount point.
    {"c1", DRIVE FPL("/a/b/c"), false, nullptr},
    // Parent to all of the mount points.
    {"root", DRIVE FPL("/"), false, nullptr},
    // Path contains .. component.
    {"funky", DRIVE FPL("/tt/fun/../funky"), false, nullptr},
    // Windows separators.
#if defined(FILE_PATH_USES_WIN_SEPARATORS)
    {"win", DRIVE FPL("\\try\\separators\\win"), true,
     DRIVE FPL("\\try\\separators\\win")},
    {"win1", DRIVE FPL("\\try/separators\\win1"), true,
     DRIVE FPL("\\try/separators\\win1")},
    {"win2", DRIVE FPL("\\try/separators\\win"), false, nullptr},
#else
    {"win", DRIVE FPL("\\separators\\win"), false, nullptr},
    {"win1", DRIVE FPL("\\try/separators\\win1"), false, nullptr},
#endif
    // Win separators, but relative path.
    {"win2", DRIVE FPL("try\\separators\\win2"), false, nullptr},
  };

  // Test adding mount points.
  for (const auto& test : kTestCases) {
    EXPECT_EQ(test.success,
              mount_points->RegisterFileSystem(
                  test.name, storage::kFileSystemTypeNativeLocal,
                  storage::FileSystemMountOption(), base::FilePath(test.path)))
        << "Adding mount point: " << test.name << " with path " << test.path;
  }

  // Test that final mount point presence state is as expected.
  for (size_t i = 0; i < base::size(kTestCases); ++i) {
    base::FilePath found_path;
    EXPECT_EQ(kTestCases[i].registered_path != nullptr,
              mount_points->GetRegisteredPath(kTestCases[i].name, &found_path))
        << "Test case: " << i;

    if (kTestCases[i].registered_path) {
      base::FilePath expected_path(kTestCases[i].registered_path);
      EXPECT_EQ(expected_path.NormalizePathSeparators(), found_path);
    }
  }
}

TEST(ExternalMountPointsTest, GetVirtualPath) {
  scoped_refptr<storage::ExternalMountPoints> mount_points(
      storage::ExternalMountPoints::CreateRefCounted());

  mount_points->RegisterFileSystem("c",
                                   storage::kFileSystemTypeNativeLocal,
                                   storage::FileSystemMountOption(),
                                   base::FilePath(DRIVE FPL("/a/b/c")));
  // Note that "/a/b/c" < "/a/b/c(1)" < "/a/b/c/".
  mount_points->RegisterFileSystem("c(1)",
                                   storage::kFileSystemTypeNativeLocal,
                                   storage::FileSystemMountOption(),
                                   base::FilePath(DRIVE FPL("/a/b/c(1)")));
  mount_points->RegisterFileSystem("x",
                                   storage::kFileSystemTypeNativeLocal,
                                   storage::FileSystemMountOption(),
                                   base::FilePath(DRIVE FPL("/z/y/x")));
  mount_points->RegisterFileSystem("o",
                                   storage::kFileSystemTypeNativeLocal,
                                   storage::FileSystemMountOption(),
                                   base::FilePath(DRIVE FPL("/m/n/o")));
  // A mount point whose name does not match its path base name.
  mount_points->RegisterFileSystem("mount",
                                   storage::kFileSystemTypeNativeLocal,
                                   storage::FileSystemMountOption(),
                                   base::FilePath(DRIVE FPL("/root/foo")));
  // A mount point with an empty path.
  mount_points->RegisterFileSystem("empty_path",
                                   storage::kFileSystemTypeNativeLocal,
                                   storage::FileSystemMountOption(),
                                   base::FilePath());

  struct TestCase {
    const base::FilePath::CharType* const local_path;
    bool success;
    const base::FilePath::CharType* const virtual_path;
  };

  const TestCase kTestCases[] = {
    // Empty path.
    { FPL(""), false, FPL("") },
    // No registered mount point (but is parent to a mount point).
    { DRIVE FPL("/a/b"), false, FPL("") },
    // No registered mount point (but is parent to a mount point).
    { DRIVE FPL("/z/y"), false, FPL("") },
    // No registered mount point (but is parent to a mount point).
    { DRIVE FPL("/m/n"), false, FPL("") },
    // No registered mount point.
    { DRIVE FPL("/foo/mount"), false, FPL("") },
    // An existing mount point path is substring.
    { DRIVE FPL("/a/b/c1"), false, FPL("") },
    // No leading /.
    { DRIVE FPL("a/b/c"), false, FPL("") },
    // Sibling to a root path.
    { DRIVE FPL("/a/b/d/e"), false, FPL("") },
    // Sibling to a root path.
    { DRIVE FPL("/z/y/v/u"), false, FPL("") },
    // Sibling to a root path.
    { DRIVE FPL("/m/n/p/q"), false, FPL("") },
    // Mount point root path.
    { DRIVE FPL("/a/b/c"), true, FPL("c") },
    // Mount point root path.
    { DRIVE FPL("/z/y/x"), true, FPL("x") },
    // Mount point root path.
    { DRIVE FPL("/m/n/o"), true, FPL("o") },
    // Mount point child path.
    { DRIVE FPL("/a/b/c/d/e"), true, FPL("c/d/e") },
    // Mount point child path.
    { DRIVE FPL("/z/y/x/v/u"), true, FPL("x/v/u") },
    // Mount point child path.
    { DRIVE FPL("/m/n/o/p/q"), true, FPL("o/p/q") },
    // Name doesn't match mount point path base name.
    { DRIVE FPL("/root/foo/a/b/c"), true, FPL("mount/a/b/c") },
    { DRIVE FPL("/root/foo"), true, FPL("mount") },
    // Mount point contains character whose ASCII code is smaller than file path
    // separator's.
    { DRIVE FPL("/a/b/c(1)/d/e"), true, FPL("c(1)/d/e") },
#if defined(FILE_PATH_USES_WIN_SEPARATORS)
    // Path with win separators mixed in.
    { DRIVE FPL("/a\\b\\c/d"), true, FPL("c/d") },
#endif
  };

  for (const auto& test_case : kTestCases) {
    // Initialize virtual path with a value.
    base::FilePath virtual_path(DRIVE FPL("/mount"));
    base::FilePath local_path(test_case.local_path);
    EXPECT_EQ(test_case.success,
              mount_points->GetVirtualPath(local_path, &virtual_path))
        << "Resolving " << test_case.local_path;

    // There are no guarantees for |virtual_path| value if |GetVirtualPath|
    // fails.
    if (!test_case.success)
      continue;

    base::FilePath expected_virtual_path(test_case.virtual_path);
    EXPECT_EQ(expected_virtual_path.NormalizePathSeparators(), virtual_path)
        << "Resolving " << test_case.local_path;
  }
}

TEST(ExternalMountPointsTest, HandlesFileSystemMountType) {
  scoped_refptr<storage::ExternalMountPoints> mount_points(
      storage::ExternalMountPoints::CreateRefCounted());

  const GURL test_origin("http://chromium.org");
  const base::FilePath test_path(FPL("/mount"));

  // Should handle External File System.
  EXPECT_TRUE(mount_points->HandlesFileSystemMountType(
      storage::kFileSystemTypeExternal));

  // Shouldn't handle the rest.
  EXPECT_FALSE(mount_points->HandlesFileSystemMountType(
      storage::kFileSystemTypeIsolated));
  EXPECT_FALSE(mount_points->HandlesFileSystemMountType(
      storage::kFileSystemTypeTemporary));
  EXPECT_FALSE(mount_points->HandlesFileSystemMountType(
      storage::kFileSystemTypePersistent));
  EXPECT_FALSE(
      mount_points->HandlesFileSystemMountType(storage::kFileSystemTypeTest));
  // Not even if it's external subtype.
  EXPECT_FALSE(mount_points->HandlesFileSystemMountType(
      storage::kFileSystemTypeNativeLocal));
  EXPECT_FALSE(mount_points->HandlesFileSystemMountType(
      storage::kFileSystemTypeRestrictedNativeLocal));
  EXPECT_FALSE(
      mount_points->HandlesFileSystemMountType(storage::kFileSystemTypeDrive));
  EXPECT_FALSE(mount_points->HandlesFileSystemMountType(
      storage::kFileSystemTypeSyncable));
}

TEST(ExternalMountPointsTest, CreateCrackedFileSystemURL) {
  scoped_refptr<storage::ExternalMountPoints> mount_points(
      storage::ExternalMountPoints::CreateRefCounted());

  const GURL kTestOrigin("http://chromium.org");

  mount_points->RegisterFileSystem("c",
                                   storage::kFileSystemTypeNativeLocal,
                                   storage::FileSystemMountOption(),
                                   base::FilePath(DRIVE FPL("/a/b/c")));
  mount_points->RegisterFileSystem("c(1)",
                                   storage::kFileSystemTypeDrive,
                                   storage::FileSystemMountOption(),
                                   base::FilePath(DRIVE FPL("/a/b/c(1)")));
  mount_points->RegisterFileSystem("empty_path",
                                   storage::kFileSystemTypeSyncable,
                                   storage::FileSystemMountOption(),
                                   base::FilePath());
  mount_points->RegisterFileSystem("mount",
                                   storage::kFileSystemTypeDrive,
                                   storage::FileSystemMountOption(),
                                   base::FilePath(DRIVE FPL("/root")));

  // Try cracking invalid GURL.
  FileSystemURL invalid = mount_points->CrackURL(GURL("http://chromium.og"));
  EXPECT_FALSE(invalid.is_valid());

  // Try cracking isolated path.
  FileSystemURL isolated = mount_points->CreateCrackedFileSystemURL(
      kTestOrigin, storage::kFileSystemTypeIsolated, base::FilePath(FPL("c")));
  EXPECT_FALSE(isolated.is_valid());

  // Try native local which is not cracked.
  FileSystemURL native_local = mount_points->CreateCrackedFileSystemURL(
      kTestOrigin,
      storage::kFileSystemTypeNativeLocal,
      base::FilePath(FPL("c")));
  EXPECT_FALSE(native_local.is_valid());

  struct TestCase {
    const base::FilePath::CharType* const path;
    bool expect_valid;
    storage::FileSystemType expect_type;
    const base::FilePath::CharType* const expect_path;
    const char* const expect_fs_id;
  };

  const TestCase kTestCases[] = {
    {FPL("c/d/e"), true, storage::kFileSystemTypeNativeLocal,
     DRIVE FPL("/a/b/c/d/e"), "c"},
    {FPL("c(1)/d/e"), true, storage::kFileSystemTypeDrive,
     DRIVE FPL("/a/b/c(1)/d/e"), "c(1)"},
    {FPL("c(1)"), true, storage::kFileSystemTypeDrive, DRIVE FPL("/a/b/c(1)"),
     "c(1)"},
    {FPL("empty_path/a"), true, storage::kFileSystemTypeSyncable, FPL("a"),
     "empty_path"},
    {FPL("empty_path"), true, storage::kFileSystemTypeSyncable, FPL(""),
     "empty_path"},
    {FPL("mount/a/b"), true, storage::kFileSystemTypeDrive,
     DRIVE FPL("/root/a/b"), "mount"},
    {FPL("mount"), true, storage::kFileSystemTypeDrive, DRIVE FPL("/root"),
     "mount"},
    {FPL("cc"), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    {FPL(""), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    {FPL(".."), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    // Absolte paths.
    {FPL("/c/d/e"), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    {FPL("/c(1)/d/e"), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    {FPL("/empty_path"), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    // PAth references parent.
    {FPL("c/d/../e"), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    {FPL("/empty_path/a/../b"), false, storage::kFileSystemTypeUnknown, FPL(""),
     ""},
#if defined(FILE_PATH_USES_WIN_SEPARATORS)
    {FPL("c/d\\e"), true, storage::kFileSystemTypeNativeLocal,
     DRIVE FPL("/a/b/c/d/e"), "c"},
    {FPL("mount\\a\\b"), true, storage::kFileSystemTypeDrive,
     DRIVE FPL("/root/a/b"), "mount"},
#endif
  };

  for (size_t i = 0; i < base::size(kTestCases); ++i) {
    FileSystemURL cracked = mount_points->CreateCrackedFileSystemURL(
        kTestOrigin,
        storage::kFileSystemTypeExternal,
        base::FilePath(kTestCases[i].path));

    EXPECT_EQ(kTestCases[i].expect_valid, cracked.is_valid())
        << "Test case index: " << i;

    if (!kTestCases[i].expect_valid)
      continue;

    EXPECT_EQ(kTestOrigin, cracked.origin())
        << "Test case index: " << i;
    EXPECT_EQ(kTestCases[i].expect_type, cracked.type())
        << "Test case index: " << i;
    EXPECT_EQ(base::FilePath(
        kTestCases[i].expect_path).NormalizePathSeparators(), cracked.path())
        << "Test case index: " << i;
    EXPECT_EQ(base::FilePath(kTestCases[i].path).NormalizePathSeparators(),
                       cracked.virtual_path())
        << "Test case index: " << i;
    EXPECT_EQ(kTestCases[i].expect_fs_id, cracked.filesystem_id())
        << "Test case index: " << i;
    EXPECT_EQ(storage::kFileSystemTypeExternal, cracked.mount_type())
        << "Test case index: " << i;
  }
}

TEST(ExternalMountPointsTest, CrackVirtualPath) {
  scoped_refptr<storage::ExternalMountPoints> mount_points(
      storage::ExternalMountPoints::CreateRefCounted());

  const GURL kTestOrigin("http://chromium.org");

  mount_points->RegisterFileSystem("c",
                                   storage::kFileSystemTypeNativeLocal,
                                   storage::FileSystemMountOption(),
                                   base::FilePath(DRIVE FPL("/a/b/c")));
  mount_points->RegisterFileSystem("c(1)",
                                   storage::kFileSystemTypeDrive,
                                   storage::FileSystemMountOption(),
                                   base::FilePath(DRIVE FPL("/a/b/c(1)")));
  mount_points->RegisterFileSystem("empty_path",
                                   storage::kFileSystemTypeSyncable,
                                   storage::FileSystemMountOption(),
                                   base::FilePath());
  mount_points->RegisterFileSystem("mount",
                                   storage::kFileSystemTypeDrive,
                                   storage::FileSystemMountOption(),
                                   base::FilePath(DRIVE FPL("/root")));

  struct TestCase {
    const base::FilePath::CharType* const path;
    bool expect_valid;
    storage::FileSystemType expect_type;
    const base::FilePath::CharType* const expect_path;
    const char* const expect_name;
  };

  const TestCase kTestCases[] = {
    {FPL("c/d/e"), true, storage::kFileSystemTypeNativeLocal,
     DRIVE FPL("/a/b/c/d/e"), "c"},
    {FPL("c(1)/d/e"), true, storage::kFileSystemTypeDrive,
     DRIVE FPL("/a/b/c(1)/d/e"), "c(1)"},
    {FPL("c(1)"), true, storage::kFileSystemTypeDrive, DRIVE FPL("/a/b/c(1)"),
     "c(1)"},
    {FPL("empty_path/a"), true, storage::kFileSystemTypeSyncable, FPL("a"),
     "empty_path"},
    {FPL("empty_path"), true, storage::kFileSystemTypeSyncable, FPL(""),
     "empty_path"},
    {FPL("mount/a/b"), true, storage::kFileSystemTypeDrive,
     DRIVE FPL("/root/a/b"), "mount"},
    {FPL("mount"), true, storage::kFileSystemTypeDrive, DRIVE FPL("/root"),
     "mount"},
    {FPL("cc"), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    {FPL(""), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    {FPL(".."), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    // Absolte paths.
    {FPL("/c/d/e"), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    {FPL("/c(1)/d/e"), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    {FPL("/empty_path"), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    // PAth references parent.
    {FPL("c/d/../e"), false, storage::kFileSystemTypeUnknown, FPL(""), ""},
    {FPL("/empty_path/a/../b"), false, storage::kFileSystemTypeUnknown, FPL(""),
     ""},
#if defined(FILE_PATH_USES_WIN_SEPARATORS)
    {FPL("c/d\\e"), true, storage::kFileSystemTypeNativeLocal,
     DRIVE FPL("/a/b/c/d/e"), "c"},
    {FPL("mount\\a\\b"), true, storage::kFileSystemTypeDrive,
     DRIVE FPL("/root/a/b"), "mount"},
#endif
  };

  for (size_t i = 0; i < base::size(kTestCases); ++i) {
    std::string cracked_name;
    storage::FileSystemType cracked_type;
    std::string cracked_id;
    base::FilePath cracked_path;
    storage::FileSystemMountOption cracked_option;
    EXPECT_EQ(kTestCases[i].expect_valid,
              mount_points->CrackVirtualPath(base::FilePath(kTestCases[i].path),
                  &cracked_name, &cracked_type, &cracked_id, &cracked_path,
                  &cracked_option))
        << "Test case index: " << i;

    if (!kTestCases[i].expect_valid)
      continue;

    EXPECT_EQ(kTestCases[i].expect_type, cracked_type)
        << "Test case index: " << i;
    EXPECT_EQ(base::FilePath(
        kTestCases[i].expect_path).NormalizePathSeparators(), cracked_path)
        << "Test case index: " << i;
    EXPECT_EQ(kTestCases[i].expect_name, cracked_name)
        << "Test case index: " << i;
    // As of now we don't mount other filesystems with non-empty filesystem_id
    // onto external mount points.
    EXPECT_TRUE(cracked_id.empty()) << "Test case index: " << i;
  }
}

TEST(ExternalMountPointsTest, MountOption) {
  scoped_refptr<storage::ExternalMountPoints> mount_points(
      storage::ExternalMountPoints::CreateRefCounted());

  mount_points->RegisterFileSystem(
      "nosync", storage::kFileSystemTypeNativeLocal,
      storage::FileSystemMountOption(
          storage::FlushPolicy::NO_FLUSH_ON_COMPLETION),
      base::FilePath(DRIVE FPL("/nosync")));
  mount_points->RegisterFileSystem(
      "sync", storage::kFileSystemTypeNativeLocal,
      storage::FileSystemMountOption(storage::FlushPolicy::FLUSH_ON_COMPLETION),
      base::FilePath(DRIVE FPL("/sync")));

  std::string name;
  storage::FileSystemType type;
  std::string cracked_id;
  storage::FileSystemMountOption option;
  base::FilePath path;
  EXPECT_TRUE(mount_points->CrackVirtualPath(
      base::FilePath(FPL("nosync/file")), &name, &type, &cracked_id, &path,
      &option));
  EXPECT_EQ(storage::FlushPolicy::NO_FLUSH_ON_COMPLETION,
            option.flush_policy());
  EXPECT_TRUE(mount_points->CrackVirtualPath(
      base::FilePath(FPL("sync/file")), &name, &type, &cracked_id, &path,
      &option));
  EXPECT_EQ(storage::FlushPolicy::FLUSH_ON_COMPLETION, option.flush_policy());
}

}  // namespace content

