// 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 "sync/internal_api/debug_info_event_listener.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace syncer {

typedef testing::Test DebugInfoEventListenerTest;

TEST_F(DebugInfoEventListenerTest, VerifyEventsAdded) {
  DebugInfoEventListener debug_info_event_listener;
  debug_info_event_listener.CreateAndAddEvent(
      sync_pb::DebugEventInfo::ENCRYPTION_COMPLETE);
  ASSERT_EQ(debug_info_event_listener.events_.size(), 1U);
  const sync_pb::DebugEventInfo& debug_info =
      debug_info_event_listener.events_.back();
  ASSERT_TRUE(debug_info.has_type());
  ASSERT_EQ(debug_info.type(), sync_pb::DebugEventInfo::ENCRYPTION_COMPLETE);
}

TEST_F(DebugInfoEventListenerTest, VerifyQueueSize) {
  DebugInfoEventListener debug_info_event_listener;
  for (int i = 0; i < 10; ++i) {
    debug_info_event_listener.CreateAndAddEvent(
        sync_pb::DebugEventInfo::ENCRYPTION_COMPLETE);
  }
  ASSERT_EQ(debug_info_event_listener.events_.size(), kMaxEntries);
}

TEST_F(DebugInfoEventListenerTest, VerifyGetAndClearEvents) {
  DebugInfoEventListener debug_info_event_listener;
  debug_info_event_listener.CreateAndAddEvent(
      sync_pb::DebugEventInfo::ENCRYPTION_COMPLETE);
  ASSERT_EQ(debug_info_event_listener.events_.size(), 1U);
  sync_pb::DebugInfo debug_info;
  debug_info_event_listener.GetAndClearDebugInfo(&debug_info);
  ASSERT_EQ(debug_info_event_listener.events_.size(), 0U);
  ASSERT_EQ(debug_info.events_size(), 1);
  ASSERT_TRUE(debug_info.events(0).has_type());
  ASSERT_EQ(debug_info.events(0).type(),
      sync_pb::DebugEventInfo::ENCRYPTION_COMPLETE);
}

}  // namespace syncer
