// Copyright (c) 2011 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/mount_info.h"

#include <base/files/file_util.h>
#include <base/strings/stringprintf.h>
#include <gtest/gtest.h>

using base::FilePath;
using std::string;
using std::vector;

namespace cros_disks {

class MountInfoTest : public ::testing::Test {
 public:
  void SetUp() override {
    string content =
      "14 12 0:3 / /proc rw,noexec - proc none rw\n"
      "15 12 0:12 / /sys rw,noexec - sysfs none rw\n"
      "16 12 0:13 / /tmp rw,nodev - tmpfs /tmp rw\n"
      "18 13 0:14 / /dev/shm rw,noexec - tmpfs shmfs rw\n"
      "21 12 8:1 /var /var rw,noexec - ext3 /dev/sda1 rw\n"
      "22 12 8:1 /home /home rw,nodev - ext3 /dev/sda1 rw\n"
      "30 26 11:0 / /media/Test\\0401 ro - vfat /dev/sdb1 ro\n";

    FilePath mount_file;
    ASSERT_TRUE(base::CreateTemporaryFile(&mount_file));
    ASSERT_EQ(content.size(),
              base::WriteFile(mount_file, content.c_str(), content.size()));
    mount_file_ = mount_file.value();
  }

  void TearDown() override {
    ASSERT_TRUE(base::DeleteFile(FilePath(mount_file_), false));
  }

 protected:
  string mount_file_;
  MountInfo manager_;
};

TEST_F(MountInfoTest, ConvertOctalStringToInt) {
  EXPECT_EQ(-1, manager_.ConvertOctalStringToInt(""));
  EXPECT_EQ(-1, manager_.ConvertOctalStringToInt("0"));
  EXPECT_EQ(-1, manager_.ConvertOctalStringToInt("00"));
  EXPECT_EQ(-1, manager_.ConvertOctalStringToInt("0000"));
  EXPECT_EQ(-1, manager_.ConvertOctalStringToInt("800"));
  EXPECT_EQ(-1, manager_.ConvertOctalStringToInt("080"));
  EXPECT_EQ(-1, manager_.ConvertOctalStringToInt("008"));

  for (int decimal = 0; decimal < 256; ++decimal) {
    string octal = base::StringPrintf("%03o", decimal);
    EXPECT_EQ(decimal, manager_.ConvertOctalStringToInt(octal));
  }
}

TEST_F(MountInfoTest, DecodePath) {
  EXPECT_EQ("Test", manager_.DecodePath("Test"));
  EXPECT_EQ("Test ", manager_.DecodePath("Test\\040"));
  EXPECT_EQ("Test 1", manager_.DecodePath("Test\\0401"));
  EXPECT_EQ(" Test 1", manager_.DecodePath("\\040Test\\0401"));
  EXPECT_EQ("Test\\040", manager_.DecodePath("Test\\134040"));
  EXPECT_EQ("Test\\04", manager_.DecodePath("Test\\04"));
  EXPECT_EQ("Test\\800", manager_.DecodePath("Test\\800"));
}

TEST_F(MountInfoTest, GetMountPaths) {
  EXPECT_TRUE(manager_.RetrieveFromFile(mount_file_));

  vector<string> expected_paths = {"/var", "/home"};
  EXPECT_TRUE(expected_paths == manager_.GetMountPaths("/dev/sda1"));

  expected_paths = {"/media/Test 1"};
  EXPECT_TRUE(expected_paths == manager_.GetMountPaths("/dev/sdb1"));

  expected_paths.clear();
  EXPECT_TRUE(expected_paths == manager_.GetMountPaths("/dev/sdc1"));
}

TEST_F(MountInfoTest, HasMountPath) {
  EXPECT_TRUE(manager_.RetrieveFromFile(mount_file_));
  EXPECT_FALSE(manager_.HasMountPath(""));
  EXPECT_FALSE(manager_.HasMountPath("/"));
  EXPECT_FALSE(manager_.HasMountPath("/dev/sda1"));
  EXPECT_FALSE(manager_.HasMountPath("/dev/sdb1"));
  EXPECT_FALSE(manager_.HasMountPath("/nonexistent-path"));
  EXPECT_TRUE(manager_.HasMountPath("/dev/shm"));
  EXPECT_TRUE(manager_.HasMountPath("/home"));
  EXPECT_TRUE(manager_.HasMountPath("/media/Test 1"));
  EXPECT_TRUE(manager_.HasMountPath("/proc"));
  EXPECT_TRUE(manager_.HasMountPath("/sys"));
  EXPECT_TRUE(manager_.HasMountPath("/tmp"));
  EXPECT_TRUE(manager_.HasMountPath("/var"));
}

TEST_F(MountInfoTest, RetrieveFromFile) {
  EXPECT_TRUE(manager_.RetrieveFromFile(mount_file_));
}

TEST_F(MountInfoTest, RetrieveFromCurrentProcess) {
  EXPECT_TRUE(manager_.RetrieveFromCurrentProcess());
  EXPECT_TRUE(manager_.HasMountPath("/proc"));
}

}  // namespace cros_disks
