File: breadcrumb_manager_unittest.cc

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (139 lines) | stat: -rw-r--r-- 4,904 bytes parent folder | download | duplicates (8)
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