// Copyright 2020 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 "smbfs/samba_interface_impl.h"

#include <sys/stat.h>
#include <sys/types.h>

#include <utility>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace smbfs {
namespace {

constexpr char kUsername[] = "my-username";

class TestSambaInterfaceImpl : public SambaInterfaceImpl {
 public:
  TestSambaInterfaceImpl() : SambaInterfaceImpl() {}
};

}  // namespace

class SambaInterfaceImplTest : public testing::Test {};

TEST_F(SambaInterfaceImplTest, MakeStatModeBitsFromDOSAttributes) {
  TestSambaInterfaceImpl samba_impl;

  // Check: The directory attribute sets the directory type bit.
  uint16_t dos_attrs = SMBC_DOS_MODE_DIRECTORY;
  mode_t out_mode = samba_impl.MakeStatModeBitsFromDOSAttributes(dos_attrs);
  EXPECT_TRUE(out_mode & S_IFDIR);
  EXPECT_FALSE(out_mode & S_IFREG);

  // Check: Absence of the directory attribute sets the file type bit.
  dos_attrs = 0;
  out_mode = samba_impl.MakeStatModeBitsFromDOSAttributes(dos_attrs);
  EXPECT_TRUE(out_mode & S_IFREG);
  EXPECT_FALSE(out_mode & S_IFDIR);

  // Check: Special attributes (without the directory attribute) set the file
  // type bit.
  dos_attrs = SMBC_DOS_MODE_ARCHIVE;
  out_mode = samba_impl.MakeStatModeBitsFromDOSAttributes(dos_attrs);
  EXPECT_TRUE(out_mode & S_IFREG);

  dos_attrs = SMBC_DOS_MODE_SYSTEM;
  out_mode = samba_impl.MakeStatModeBitsFromDOSAttributes(dos_attrs);
  EXPECT_TRUE(out_mode & S_IFREG);

  dos_attrs = SMBC_DOS_MODE_HIDDEN;
  out_mode = samba_impl.MakeStatModeBitsFromDOSAttributes(dos_attrs);
  EXPECT_TRUE(out_mode & S_IFREG);

  // Check: Absence of the read-only attribute sets the user write bit.
  dos_attrs = 0;
  out_mode = samba_impl.MakeStatModeBitsFromDOSAttributes(dos_attrs);
  EXPECT_TRUE(out_mode & S_IWUSR);

  // Check: Presence of the read-only attribute clears the user write bit.
  dos_attrs = SMBC_DOS_MODE_READONLY;
  out_mode = samba_impl.MakeStatModeBitsFromDOSAttributes(dos_attrs);
  EXPECT_FALSE(out_mode & S_IWUSR);

  dos_attrs = SMBC_DOS_MODE_READONLY | SMBC_DOS_MODE_DIRECTORY;
  out_mode = samba_impl.MakeStatModeBitsFromDOSAttributes(dos_attrs);
  EXPECT_TRUE(out_mode & (S_IFDIR | S_IWUSR));
}

TEST_F(SambaInterfaceImplTest, UpdateCredentials) {
  TestSambaInterfaceImpl samba_impl;

  EXPECT_FALSE(samba_impl.credentials_);
  samba_impl.UpdateCredentials(
      std::make_unique<SmbCredential>("" /* workgroup */, kUsername, nullptr));

  EXPECT_TRUE(samba_impl.credentials_);
  EXPECT_EQ(samba_impl.credentials_->username, kUsername);
}

}  // namespace smbfs
