// Copyright 2019 The Fuchsia 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 "logger/channel_mapper.h"

#include <vector>

#include "./gtest.h"

namespace cobalt {
namespace logger {

TEST(ChannelMapper, TestBasicMapper) {
  ChannelMapper mapper(
      {"debug-channel-1", "debug-channel-2", "debug-channel-3"});

  // Only debug channels should map to DEBUG.
  EXPECT_EQ(mapper.ToReleaseStage("debug-channel-1"), ReleaseStage::DEBUG);
  EXPECT_EQ(mapper.ToReleaseStage("debug-channel-2"), ReleaseStage::DEBUG);
  EXPECT_EQ(mapper.ToReleaseStage("debug-channel-3"), ReleaseStage::DEBUG);

  // Anything else should map to GA.
  EXPECT_EQ(mapper.ToReleaseStage(""), ReleaseStage::GA);
  EXPECT_EQ(mapper.ToReleaseStage("<unknown>"), ReleaseStage::GA);
  EXPECT_EQ(mapper.ToReleaseStage("<unset>"), ReleaseStage::GA);
  EXPECT_EQ(mapper.ToReleaseStage("prod-main"), ReleaseStage::GA);
}

TEST(ChannelMapper, TestMapper) {
  ChannelMapper mapper({
      {ReleaseStage::DEBUG, {"debug-channel-1", "debug-channel-2"}},
      {ReleaseStage::FISHFOOD, {"fishfood-channel"}},
      {ReleaseStage::DOGFOOD, {"dogfood-channel-1", "dogfood-channel-2"}},
  });

  // Only debug channels should map to DEBUG.
  EXPECT_EQ(mapper.ToReleaseStage("debug-channel-1"), ReleaseStage::DEBUG);
  EXPECT_EQ(mapper.ToReleaseStage("debug-channel-2"), ReleaseStage::DEBUG);

  // Only fishfood channels should map to FISHFOOD.
  EXPECT_EQ(mapper.ToReleaseStage("fishfood-channel"), ReleaseStage::FISHFOOD);

  // Only dogfood channels should map to DOGFOOD.
  EXPECT_EQ(mapper.ToReleaseStage("dogfood-channel-1"), ReleaseStage::DOGFOOD);
  EXPECT_EQ(mapper.ToReleaseStage("dogfood-channel-2"), ReleaseStage::DOGFOOD);

  // Anything else should map to GA.
  EXPECT_EQ(mapper.ToReleaseStage(""), ReleaseStage::GA);
  EXPECT_EQ(mapper.ToReleaseStage("<unknown>"), ReleaseStage::GA);
  EXPECT_EQ(mapper.ToReleaseStage("<unset>"), ReleaseStage::GA);
  EXPECT_EQ(mapper.ToReleaseStage("prod-main"), ReleaseStage::GA);
}

}  // namespace logger
}  // namespace cobalt
