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

#include <base/basictypes.h>
#include <gtest/gtest.h>

using std::string;

namespace cros_disks {

class MetricsTest : public ::testing::Test {
 protected:
  Metrics metrics_;
};

TEST_F(MetricsTest, GetArchiveType) {
  EXPECT_EQ(Metrics::kArchiveUnknown, metrics_.GetArchiveType(""));
  EXPECT_EQ(Metrics::kArchiveUnknown, metrics_.GetArchiveType("txt"));
  EXPECT_EQ(Metrics::kArchiveZip, metrics_.GetArchiveType("zip"));
}

TEST_F(MetricsTest, GetFilesystemType) {
  EXPECT_EQ(Metrics::kFilesystemUnknown, metrics_.GetFilesystemType(""));
  EXPECT_EQ(Metrics::kFilesystemVFAT, metrics_.GetFilesystemType("vfat"));
  EXPECT_EQ(Metrics::kFilesystemExFAT, metrics_.GetFilesystemType("exfat"));
  EXPECT_EQ(Metrics::kFilesystemNTFS, metrics_.GetFilesystemType("ntfs"));
  EXPECT_EQ(Metrics::kFilesystemHFSPlus, metrics_.GetFilesystemType("hfsplus"));
  EXPECT_EQ(Metrics::kFilesystemExt2, metrics_.GetFilesystemType("ext2"));
  EXPECT_EQ(Metrics::kFilesystemExt3, metrics_.GetFilesystemType("ext3"));
  EXPECT_EQ(Metrics::kFilesystemExt4, metrics_.GetFilesystemType("ext4"));
  EXPECT_EQ(Metrics::kFilesystemISO9660, metrics_.GetFilesystemType("iso9660"));
  EXPECT_EQ(Metrics::kFilesystemUDF, metrics_.GetFilesystemType("udf"));
  EXPECT_EQ(Metrics::kFilesystemOther, metrics_.GetFilesystemType("xfs"));
  EXPECT_EQ(Metrics::kFilesystemOther, metrics_.GetFilesystemType("btrfs"));
}

}  // namespace cros_disks
