// Copyright 2018 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 <memory>
#include <string>

#include "base/files/scoped_temp_dir.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/drive/chromeos/drive_file_util.h"
#include "components/drive/chromeos/drive_test_util.h"
#include "components/drive/chromeos/fake_free_disk_space_getter.h"
#include "components/drive/chromeos/file_cache.h"
#include "components/drive/chromeos/resource_metadata.h"
#include "components/drive/drive.pb.h"
#include "components/drive/file_system_core_util.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "google_apis/drive/drive_switches.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace drive {
namespace internal {
namespace {

// The start page token of the resource metadata used in DriveFileUtilTest.
constexpr char kTestStartPageToken[] = "123456";

// Creates a ResourceEntry for a directory with explicitly set resource_id.
ResourceEntry CreateDirectoryEntryWithResourceId(
    const std::string& title,
    const std::string& resource_id,
    const std::string& parent_local_id) {
  ResourceEntry entry;
  entry.set_title(title);
  entry.set_resource_id(resource_id);
  entry.set_parent_local_id(parent_local_id);
  entry.mutable_file_info()->set_is_directory(true);
  entry.mutable_directory_specific_info()->set_start_page_token(
      kTestStartPageToken);
  return entry;
}

void AddTeamDriveRootEntry(ResourceMetadata* resource_metadata,
                           const std::string& team_drive_id,
                           const std::string& team_drive_name) {
  std::string local_id;
  ASSERT_EQ(FILE_ERROR_OK, resource_metadata->GetIdByPath(
                               util::GetDriveTeamDrivesRootPath(), &local_id));

  std::string root_local_id = local_id;
  ASSERT_EQ(FILE_ERROR_OK,
            resource_metadata->AddEntry(
                CreateDirectoryEntryWithResourceId(
                    team_drive_name, team_drive_id, root_local_id),
                &local_id));
}

}  // namespace

// Tests for methods running on the blocking task runner.
class DriveFileUtilTest : public testing::Test {
 protected:
  void SetUp() override {
    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());

    metadata_storage_.reset(new ResourceMetadataStorage(
        temp_dir_.GetPath(), base::ThreadTaskRunnerHandle::Get().get()));
    ASSERT_TRUE(metadata_storage_->Initialize());

    fake_free_disk_space_getter_ = std::make_unique<FakeFreeDiskSpaceGetter>();
    cache_.reset(new FileCache(metadata_storage_.get(), temp_dir_.GetPath(),
                               base::ThreadTaskRunnerHandle::Get().get(),
                               fake_free_disk_space_getter_.get()));
    ASSERT_TRUE(cache_->Initialize());

    resource_metadata_.reset(
        new ResourceMetadata(metadata_storage_.get(), cache_.get(),
                             base::ThreadTaskRunnerHandle::Get()));

    ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->Initialize());
  }

  base::ScopedTempDir temp_dir_;
  content::TestBrowserThreadBundle thread_bundle_;
  std::unique_ptr<ResourceMetadataStorage, test_util::DestroyHelperForTests>
      metadata_storage_;
  std::unique_ptr<FakeFreeDiskSpaceGetter> fake_free_disk_space_getter_;
  std::unique_ptr<FileCache, test_util::DestroyHelperForTests> cache_;
  std::unique_ptr<ResourceMetadata, test_util::DestroyHelperForTests>
      resource_metadata_;
};

TEST_F(DriveFileUtilTest, TeamDriveStartPageToken) {
  constexpr char kTeamDriveId[] = "team_drive_id_1";
  constexpr char kTeamDriveName[] = "My Team Drive";
  constexpr char kStartPageToken[] = "123456";

  AddTeamDriveRootEntry(resource_metadata_.get(), kTeamDriveId, kTeamDriveName);

  EXPECT_EQ(FILE_ERROR_OK, SetStartPageToken(resource_metadata_.get(),
                                             kTeamDriveId, kStartPageToken));
  std::string start_page_token;
  EXPECT_EQ(FILE_ERROR_OK, GetStartPageToken(resource_metadata_.get(),
                                             kTeamDriveId, &start_page_token));
  EXPECT_EQ(kStartPageToken, start_page_token);
}

TEST_F(DriveFileUtilTest, TeamDriveStartPageToken_NoEntry) {
  constexpr char kTeamDriveId[] = "team_drive_id_1";
  constexpr char kStartPageToken[] = "123456";

  EXPECT_EQ(FILE_ERROR_NOT_FOUND,
            SetStartPageToken(resource_metadata_.get(), kTeamDriveId,
                              kStartPageToken));
  std::string start_page_token;
  EXPECT_EQ(FILE_ERROR_NOT_FOUND,
            GetStartPageToken(resource_metadata_.get(), kTeamDriveId,
                              &start_page_token));
}

}  // namespace internal
}  // namespace drive
