// Copyright (c) 2012 The Chromium 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 "chromeos/network/network_event_log.h"

#include <algorithm>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/format_macros.h"
#include "base/string_split.h"
#include "base/stringprintf.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace chromeos {

class NetworkEventLogTest : public testing::Test {
 public:
  NetworkEventLogTest() {
  }

  virtual void SetUp() OVERRIDE {
    network_event_log::Initialize();
  }

  virtual void TearDown() OVERRIDE {
    network_event_log::Shutdown();
  }

 protected:
  std::string SkipTime(const std::string& input) {
    std::string output;
    std::vector<std::string> lines;
    base::SplitString(input, '\n', &lines);
    for (size_t i = 0; i < lines.size(); ++i) {
      size_t n = lines[i].find(']');
      if (n != std::string::npos)
        output += lines[i].substr(n+2) + '\n';
    }
    return output;
  }

  size_t CountLines(const std::string& input) {
    return std::count(input.begin(), input.end(), '\n');
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(NetworkEventLogTest);
};

TEST_F(NetworkEventLogTest, TestNetworkEvents) {
  std::string output_none = network_event_log::GetAsString(
      network_event_log::OLDEST_FIRST, 0);
  EXPECT_EQ("No Log Entries.", output_none);

  network_event_log::AddEntry("module1", "event1", "description1");
  network_event_log::AddEntry("module2", "event2", "description2");
  network_event_log::AddEntry("module3", "event3", "description3");
  network_event_log::AddEntry("module3", "event3", "description3");

  const std::string expected_output_oldest_first(
      "module1:event1: description1\n"
      "module2:event2: description2\n"
      "module3:event3: description3 (2)\n");
  std::string output_oldest_first = network_event_log::GetAsString(
      network_event_log::OLDEST_FIRST, 0);
  output_oldest_first = SkipTime(output_oldest_first);
  EXPECT_EQ(expected_output_oldest_first, output_oldest_first);

  const std::string expected_output_oldest_first_short(
      "module2:event2: description2\n"
      "module3:event3: description3 (2)\n");
  std::string output_oldest_first_short = network_event_log::GetAsString(
      network_event_log::OLDEST_FIRST, 2);
  output_oldest_first_short = SkipTime(output_oldest_first_short);
  EXPECT_EQ(expected_output_oldest_first_short, output_oldest_first_short);

  const std::string expected_output_newest_first(
      "module3:event3: description3 (2)\n"
      "module2:event2: description2\n"
      "module1:event1: description1\n");
  std::string output_newest_first = network_event_log::GetAsString(
      network_event_log::NEWEST_FIRST, 0);
  output_newest_first = SkipTime(output_newest_first);
  EXPECT_EQ(expected_output_newest_first, output_newest_first);

  const std::string expected_output_newest_first_short(
      "module3:event3: description3 (2)\n"
      "module2:event2: description2\n");
  std::string output_newest_first_short = network_event_log::GetAsString(
      network_event_log::NEWEST_FIRST, 2);
  output_newest_first_short = SkipTime(output_newest_first_short);
  EXPECT_EQ(expected_output_newest_first_short, output_newest_first_short);
}

TEST_F(NetworkEventLogTest, TestMaxNetworkEvents) {
  const size_t entries_to_add =
      network_event_log::kMaxNetworkEventLogEntries + 3;
  for (size_t i = 0; i < entries_to_add; ++i)
    network_event_log::AddEntry("test", StringPrintf("event_%"PRIuS, i), "");

  std::string output = GetAsString(network_event_log::OLDEST_FIRST, 0);
  size_t output_lines = CountLines(output);
  EXPECT_EQ(network_event_log::kMaxNetworkEventLogEntries, output_lines);
}

}  // namespace chromeos