1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#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 {
// Adds `event` to the BreadcrumbManager.
void AddEvent(const std::string& event) {
BreadcrumbManager::GetInstance().AddEvent(event);
}
void SetPreviousSessionEvents(const std::vector<std::string>& events) {
BreadcrumbManager::GetInstance().SetPreviousSessionEvents(events);
}
} // namespace
// Test fixture for testing BreadcrumbManager class.
class BreadcrumbManagerTest : public PlatformTest {
protected:
BreadcrumbManagerTest() = default;
base::test::TaskEnvironment task_env_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
};
// Tests that an event is logged and returned.
TEST_F(BreadcrumbManagerTest, AddEvent) {
const std::string event_message = "event";
AddEvent(event_message);
const auto& events = BreadcrumbManager::GetInstance().GetEvents();
ASSERT_EQ(1u, events.size());
// Events returned from `GetEvents` will have a timestamp prepended.
EXPECT_EQ("0:00:00 event", events.front());
}
// Tests that no more than `kMaxBreadcrumbs` events are stored.
TEST_F(BreadcrumbManagerTest, MaxEvents) {
const auto& events = BreadcrumbManager::GetInstance().GetEvents();
ASSERT_EQ(0u, events.size());
// Add `kMaxBreadcrumbs` events to fill the event log.
AddEvent("first event");
for (size_t i = 0u; i < kMaxBreadcrumbs - 1; i++) {
AddEvent("middle event");
}
ASSERT_EQ(kMaxBreadcrumbs, events.size());
// Add one more event; the oldest event should be removed to keep the number
// of events limited to `kMaxBreadcrumbs`.
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());
}
// Tests that event timestamps are formatted as expected.
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());
}
// Tests that previous session events are inserted at the start of the event
// log.
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);
// The previous session events should have been added to the event log.
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);
// The previous session events should be at the front of the event log.
EXPECT_EQ(3u, events.size());
EXPECT_EQ("0:00:00 event 3", events.front());
}
// Tests that no more than `kMaxBreadcrumbs` events are stored after previous
// session events are retrieved.
TEST_F(BreadcrumbManagerTest, SetPreviousSessionEventsMaxEvents) {
const auto& events = BreadcrumbManager::GetInstance().GetEvents();
AddEvent("current event");
ASSERT_EQ(1u, events.size());
// Set the previous session events to a large list of events, such that the
// event log will become oversized when it's inserted.
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);
// The oldest previous event should have been removed to keep the number of
// events limited to `kMaxBreadcrumbs`.
EXPECT_EQ(kMaxBreadcrumbs, events.size());
EXPECT_EQ("0:00:00 previous event 2", events.front());
EXPECT_EQ("0:00:00 current event", events.back());
}
} // namespace breadcrumbs
|