// Copyright 2019 The Chromium OS 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 "cros-disks/smbfs_helper.h"

#include <string>

#include <base/check_op.h>
#include <base/files/file_path.h>
#include <base/strings/string_split.h>
#include <brillo/process/process_reaper.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "cros-disks/fuse_mounter.h"
#include "cros-disks/mock_platform.h"
#include "cros-disks/mount_options.h"
#include "cros-disks/platform.h"
#include "cros-disks/uri.h"

using testing::_;
using testing::DoAll;
using testing::HasSubstr;
using testing::Return;
using testing::SetArgPointee;
using testing::UnorderedElementsAre;

namespace cros_disks {

namespace {

const base::FilePath kMountDir("/mount_point");
const Uri kSomeSource("smbfs", "foobarbaz");

std::vector<std::string> ParseOptions(const SandboxedProcess& sandbox) {
  CHECK_EQ(2, sandbox.arguments().size());
  CHECK_EQ("-o", sandbox.arguments()[0]);
  return base::SplitString(sandbox.arguments()[1], ",",
                           base::WhitespaceHandling::KEEP_WHITESPACE,
                           base::SplitResult::SPLIT_WANT_ALL);
}

// Mock Platform implementation for testing.
class PlatformForTest : public MockPlatform {
 public:
  PlatformForTest() = default;

  bool GetUserAndGroupId(const std::string& name,
                         uid_t* uid,
                         gid_t* gid) const override {
    if (name == "fuse-smbfs") {
      if (uid)
        *uid = 123;
      if (gid)
        *gid = 456;
      return true;
    }
    return false;
  }
};

}  // namespace

class SmbfsHelperTest : public ::testing::Test {
 public:
  SmbfsHelperTest() : helper_(&platform_, &process_reaper_) {
  }

 protected:
  MountErrorType ConfigureSandbox(const std::string& source,
                                  std::vector<std::string>* args) {
    FakeSandboxedProcess sandbox;
    MountErrorType error =
        helper_.ConfigureSandbox(source, kMountDir, {}, &sandbox);
    if (error == MOUNT_ERROR_NONE) {
      *args = ParseOptions(sandbox);
    }
    return error;
  }

  PlatformForTest platform_;
  brillo::ProcessReaper process_reaper_;
  SmbfsHelper helper_;
};

TEST_F(SmbfsHelperTest, CreateMounter) {
  std::vector<std::string> args;
  EXPECT_EQ(MOUNT_ERROR_NONE, ConfigureSandbox(kSomeSource.value(), &args));
  EXPECT_THAT(
      args, UnorderedElementsAre("uid=1000", "gid=1001", "mojo_id=foobarbaz"));
}

TEST_F(SmbfsHelperTest, CanMount) {
  base::FilePath name;
  EXPECT_TRUE(helper_.CanMount("smbfs://foo", {}, &name));
  EXPECT_FALSE(helper_.CanMount("smbfss://foo", {}, &name));
  EXPECT_FALSE(helper_.CanMount("smb://foo", {}, &name));
  EXPECT_TRUE(helper_.CanMount("smbfs://", {}, &name));
}

}  // namespace cros_disks
