// 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/error_logger.h"

#include <sstream>
#include <string>

#include <gtest/gtest.h>

namespace cros_disks {
namespace {

static_assert(!FORMAT_ERROR_NONE,
              "FORMAT_ERROR_NONE must convert to false in boolean context");

static_assert(!MOUNT_ERROR_NONE,
              "MOUNT_ERROR_NONE must convert to false in boolean context");

static_assert(!PARTITION_ERROR_NONE,
              "PARTITION_ERROR_NONE must convert to false in boolean context");

static_assert(!RENAME_ERROR_NONE,
              "RENAME_ERROR_NONE must convert to false in boolean context");

template <typename T>
std::string ToString(T error) {
  std::ostringstream out;
  out << error << std::flush;
  return out.str();
}

TEST(ErrorLogger, FormatErrorType) {
  EXPECT_EQ(ToString(FORMAT_ERROR_NONE), "FORMAT_ERROR_NONE");
  EXPECT_EQ(ToString(FORMAT_ERROR_UNKNOWN), "FORMAT_ERROR_UNKNOWN");
  EXPECT_EQ(ToString(FORMAT_ERROR_INTERNAL), "FORMAT_ERROR_INTERNAL");
  EXPECT_EQ(ToString(FORMAT_ERROR_INVALID_DEVICE_PATH),
            "FORMAT_ERROR_INVALID_DEVICE_PATH");
  EXPECT_EQ(ToString(FORMAT_ERROR_DEVICE_BEING_FORMATTED),
            "FORMAT_ERROR_DEVICE_BEING_FORMATTED");
  EXPECT_EQ(ToString(FORMAT_ERROR_UNSUPPORTED_FILESYSTEM),
            "FORMAT_ERROR_UNSUPPORTED_FILESYSTEM");
  EXPECT_EQ(ToString(FORMAT_ERROR_FORMAT_PROGRAM_NOT_FOUND),
            "FORMAT_ERROR_FORMAT_PROGRAM_NOT_FOUND");
  EXPECT_EQ(ToString(FORMAT_ERROR_FORMAT_PROGRAM_FAILED),
            "FORMAT_ERROR_FORMAT_PROGRAM_FAILED");
  EXPECT_EQ(ToString(FORMAT_ERROR_DEVICE_NOT_ALLOWED),
            "FORMAT_ERROR_DEVICE_NOT_ALLOWED");
  EXPECT_EQ(ToString(FORMAT_ERROR_INVALID_OPTIONS),
            "FORMAT_ERROR_INVALID_OPTIONS");
  EXPECT_EQ(ToString(FORMAT_ERROR_LONG_NAME), "FORMAT_ERROR_LONG_NAME");
  EXPECT_EQ(ToString(FORMAT_ERROR_INVALID_CHARACTER),
            "FORMAT_ERROR_INVALID_CHARACTER");
  EXPECT_EQ(ToString(FormatErrorType(987654)), "FORMAT_ERROR_987654");
}

TEST(ErrorLogger, MountErrorType) {
  EXPECT_EQ(ToString(MOUNT_ERROR_NONE), "MOUNT_ERROR_NONE");
  EXPECT_EQ(ToString(MOUNT_ERROR_UNKNOWN), "MOUNT_ERROR_UNKNOWN");
  EXPECT_EQ(ToString(MOUNT_ERROR_INTERNAL), "MOUNT_ERROR_INTERNAL");
  EXPECT_EQ(ToString(MOUNT_ERROR_INVALID_ARGUMENT),
            "MOUNT_ERROR_INVALID_ARGUMENT");
  EXPECT_EQ(ToString(MOUNT_ERROR_INVALID_PATH), "MOUNT_ERROR_INVALID_PATH");
  EXPECT_EQ(ToString(MOUNT_ERROR_PATH_ALREADY_MOUNTED),
            "MOUNT_ERROR_PATH_ALREADY_MOUNTED");
  EXPECT_EQ(ToString(MOUNT_ERROR_PATH_NOT_MOUNTED),
            "MOUNT_ERROR_PATH_NOT_MOUNTED");
  EXPECT_EQ(ToString(MOUNT_ERROR_DIRECTORY_CREATION_FAILED),
            "MOUNT_ERROR_DIRECTORY_CREATION_FAILED");
  EXPECT_EQ(ToString(MOUNT_ERROR_INVALID_MOUNT_OPTIONS),
            "MOUNT_ERROR_INVALID_MOUNT_OPTIONS");
  EXPECT_EQ(ToString(MOUNT_ERROR_INVALID_UNMOUNT_OPTIONS),
            "MOUNT_ERROR_INVALID_UNMOUNT_OPTIONS");
  EXPECT_EQ(ToString(MOUNT_ERROR_INSUFFICIENT_PERMISSIONS),
            "MOUNT_ERROR_INSUFFICIENT_PERMISSIONS");
  EXPECT_EQ(ToString(MOUNT_ERROR_MOUNT_PROGRAM_NOT_FOUND),
            "MOUNT_ERROR_MOUNT_PROGRAM_NOT_FOUND");
  EXPECT_EQ(ToString(MOUNT_ERROR_MOUNT_PROGRAM_FAILED),
            "MOUNT_ERROR_MOUNT_PROGRAM_FAILED");
  EXPECT_EQ(ToString(MOUNT_ERROR_NEED_PASSWORD), "MOUNT_ERROR_NEED_PASSWORD");
  EXPECT_EQ(ToString(MOUNT_ERROR_INVALID_DEVICE_PATH),
            "MOUNT_ERROR_INVALID_DEVICE_PATH");
  EXPECT_EQ(ToString(MOUNT_ERROR_UNKNOWN_FILESYSTEM),
            "MOUNT_ERROR_UNKNOWN_FILESYSTEM");
  EXPECT_EQ(ToString(MOUNT_ERROR_UNSUPPORTED_FILESYSTEM),
            "MOUNT_ERROR_UNSUPPORTED_FILESYSTEM");
  EXPECT_EQ(ToString(MOUNT_ERROR_INVALID_ARCHIVE),
            "MOUNT_ERROR_INVALID_ARCHIVE");
  EXPECT_EQ(ToString(MOUNT_ERROR_UNSUPPORTED_ARCHIVE),
            "MOUNT_ERROR_UNSUPPORTED_ARCHIVE");
  EXPECT_EQ(ToString(MountErrorType(987654)), "MOUNT_ERROR_987654");
}

TEST(ErrorLogger, PartitionErrorType) {
  EXPECT_EQ(ToString(PARTITION_ERROR_NONE), "PARTITION_ERROR_NONE");
  EXPECT_EQ(ToString(PARTITION_ERROR_UNKNOWN), "PARTITION_ERROR_UNKNOWN");
  EXPECT_EQ(ToString(PARTITION_ERROR_INTERNAL), "PARTITION_ERROR_INTERNAL");
  EXPECT_EQ(ToString(PARTITION_ERROR_INVALID_DEVICE_PATH),
            "PARTITION_ERROR_INVALID_DEVICE_PATH");
  EXPECT_EQ(ToString(PARTITION_ERROR_DEVICE_BEING_PARTITIONED),
            "PARTITION_ERROR_DEVICE_BEING_PARTITIONED");
  EXPECT_EQ(ToString(PARTITION_ERROR_PROGRAM_NOT_FOUND),
            "PARTITION_ERROR_PROGRAM_NOT_FOUND");
  EXPECT_EQ(ToString(PARTITION_ERROR_PROGRAM_FAILED),
            "PARTITION_ERROR_PROGRAM_FAILED");
  EXPECT_EQ(ToString(PARTITION_ERROR_DEVICE_NOT_ALLOWED),
            "PARTITION_ERROR_DEVICE_NOT_ALLOWED");
  EXPECT_EQ(ToString(PartitionErrorType(987654)), "PARTITION_ERROR_987654");
}

TEST(ErrorLogger, RenameErrorType) {
  EXPECT_EQ(ToString(RENAME_ERROR_NONE), "RENAME_ERROR_NONE");
  EXPECT_EQ(ToString(RENAME_ERROR_UNKNOWN), "RENAME_ERROR_UNKNOWN");
  EXPECT_EQ(ToString(RENAME_ERROR_INTERNAL), "RENAME_ERROR_INTERNAL");
  EXPECT_EQ(ToString(RENAME_ERROR_INVALID_DEVICE_PATH),
            "RENAME_ERROR_INVALID_DEVICE_PATH");
  EXPECT_EQ(ToString(RENAME_ERROR_DEVICE_BEING_RENAMED),
            "RENAME_ERROR_DEVICE_BEING_RENAMED");
  EXPECT_EQ(ToString(RENAME_ERROR_UNSUPPORTED_FILESYSTEM),
            "RENAME_ERROR_UNSUPPORTED_FILESYSTEM");
  EXPECT_EQ(ToString(RENAME_ERROR_RENAME_PROGRAM_NOT_FOUND),
            "RENAME_ERROR_RENAME_PROGRAM_NOT_FOUND");
  EXPECT_EQ(ToString(RENAME_ERROR_RENAME_PROGRAM_FAILED),
            "RENAME_ERROR_RENAME_PROGRAM_FAILED");
  EXPECT_EQ(ToString(RENAME_ERROR_DEVICE_NOT_ALLOWED),
            "RENAME_ERROR_DEVICE_NOT_ALLOWED");
  EXPECT_EQ(ToString(RENAME_ERROR_LONG_NAME), "RENAME_ERROR_LONG_NAME");
  EXPECT_EQ(ToString(RENAME_ERROR_INVALID_CHARACTER),
            "RENAME_ERROR_INVALID_CHARACTER");
  EXPECT_EQ(ToString(RenameErrorType(987654)), "RENAME_ERROR_987654");
}

}  // namespace
}  // namespace cros_disks
