#include "components/breadcrumbs/core/breadcrumb_manager.h"
#include <string>
#include <vector>
#include "base/strings/string_number_conversions.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
namespace breadcrumbs {
namespace {
void AddEvent(const std::string& event) {
BreadcrumbManager::GetInstance().AddEvent(event);
}
void SetPreviousSessionEvents(const std::vector<std::string>& events) {
BreadcrumbManager::GetInstance().SetPreviousSessionEvents(events);
}
}
class BreadcrumbManagerTest : public PlatformTest {
protected:
BreadcrumbManagerTest() = default;
base::test::TaskEnvironment task_env_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
};
TEST_F(BreadcrumbManagerTest, AddEvent) {
const std::string event_message = "event";
AddEvent(event_message);
const auto& events = BreadcrumbManager::GetInstance().GetEvents();
ASSERT_EQ(1u, events.size());
EXPECT_EQ("0:00:00 event", events.front());
}
TEST_F(BreadcrumbManagerTest, MaxEvents) {
const auto& events = BreadcrumbManager::GetInstance().GetEvents();
ASSERT_EQ(0u, events.size());
AddEvent("first event");
for (size_t i = 0u; i < kMaxBreadcrumbs - 1; i++) {
AddEvent("middle event");
}
ASSERT_EQ(kMaxBreadcrumbs, events.size());
AddEvent("last event");
EXPECT_EQ(kMaxBreadcrumbs, events.size());
EXPECT_EQ("0:00:00 middle event", events.front());
EXPECT_EQ("0:00:00 last event", events.back());
}
TEST_F(BreadcrumbManagerTest, EventTimestampsFormatted) {
const auto& events = BreadcrumbManager::GetInstance().GetEvents();
AddEvent("event1");
EXPECT_EQ("0:00:00 event1", events.back());
task_env_.FastForwardBy(base::Seconds(100));
AddEvent("event2");
EXPECT_EQ("0:01:40 event2", events.back());
task_env_.FastForwardBy(base::Hours(100));
AddEvent("event3");
EXPECT_EQ("100:01:40 event3", events.back());
task_env_.FastForwardBy(base::Minutes(100));
AddEvent("event4");
EXPECT_EQ("101:41:40 event4", events.back());
}
TEST_F(BreadcrumbManagerTest, SetPreviousSessionEvents) {
const auto& events = BreadcrumbManager::GetInstance().GetEvents();
ASSERT_EQ(0u, events.size());
std::vector<std::string> previous_events;
previous_events.push_back("0:00:00 event 1");
previous_events.push_back("0:00:00 event 2");
SetPreviousSessionEvents(previous_events);
EXPECT_EQ(2u, events.size());
EXPECT_EQ("0:00:00 event 1", events.front());
EXPECT_EQ("0:00:00 event 2", events.back());
previous_events.clear();
previous_events.push_back("0:00:00 event 3");
SetPreviousSessionEvents(previous_events);
EXPECT_EQ(3u, events.size());
EXPECT_EQ("0:00:00 event 3", events.front());
}
TEST_F(BreadcrumbManagerTest, SetPreviousSessionEventsMaxEvents) {
const auto& events = BreadcrumbManager::GetInstance().GetEvents();
AddEvent("current event");
ASSERT_EQ(1u, events.size());
const std::string previous_event = "0:00:00 previous event ";
std::vector<std::string> oversized_events;
oversized_events.reserve(kMaxBreadcrumbs);
int previous_event_num = 1;
for (size_t i = 0u; i < kMaxBreadcrumbs; i++) {
oversized_events.push_back(previous_event +
base::NumberToString(previous_event_num));
previous_event_num++;
}
ASSERT_EQ(kMaxBreadcrumbs, oversized_events.size());
SetPreviousSessionEvents(oversized_events);
EXPECT_EQ(kMaxBreadcrumbs, events.size());
EXPECT_EQ("0:00:00 previous event 2", events.front());
EXPECT_EQ("0:00:00 current event", events.back());
}
}