blob: bd7b1f8cebe511a7cd45fa43b5cc01d2e64615e8 [file] [log] [blame]
manzagopdeb62bf2017-03-08 17:00:011// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Sigurdur Asgeirsson5bf01aa82018-01-30 18:59:185#include "components/metrics/system_session_analyzer_win.h"
manzagopdeb62bf2017-03-08 17:00:016
Sigurdur Asgeirsson693534f2018-02-02 19:49:367#include <algorithm>
manzagopdeb62bf2017-03-08 17:00:018#include <utility>
9#include <vector>
10
11#include "base/time/time.h"
12#include "testing/gmock/include/gmock/gmock.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
Sigurdur Asgeirsson5bf01aa82018-01-30 18:59:1815namespace metrics {
manzagopdeb62bf2017-03-08 17:00:0116
17namespace {
18
19const uint16_t kIdSessionStart = 6005U;
20const uint16_t kIdSessionEnd = 6006U;
21const uint16_t kIdSessionEndUnclean = 6008U;
22
23} // namespace
24
25// Ensure the fetcher retrieves events.
manzagopdeb62bf2017-03-08 17:00:0126TEST(SystemSessionAnalyzerTest, FetchEvents) {
Sigurdur Asgeirsson693534f2018-02-02 19:49:3627 SystemSessionAnalyzer analyzer(0);
manzagopdeb62bf2017-03-08 17:00:0128 std::vector<SystemSessionAnalyzer::EventInfo> events;
Sigurdur Asgeirsson693534f2018-02-02 19:49:3629 ASSERT_TRUE(analyzer.FetchEvents(1U, &events));
30 EXPECT_EQ(1U, events.size());
manzagopdeb62bf2017-03-08 17:00:0131}
32
33// Ensure the fetcher's retrieved events conform to our expectations.
34// Note: this test fails if the host system doesn't have at least 1 prior
35// session.
36TEST(SystemSessionAnalyzerTest, ValidateEvents) {
37 SystemSessionAnalyzer analyzer(1U);
38 EXPECT_EQ(SystemSessionAnalyzer::CLEAN,
39 analyzer.IsSessionUnclean(base::Time::Now()));
40}
41
42// Stubs FetchEvents.
43class StubSystemSessionAnalyzer : public SystemSessionAnalyzer {
44 public:
Sigurdur Asgeirsson693534f2018-02-02 19:49:3645 StubSystemSessionAnalyzer(uint32_t max_session_cnt)
46 : SystemSessionAnalyzer(max_session_cnt) {}
manzagopdeb62bf2017-03-08 17:00:0147
Sigurdur Asgeirsson693534f2018-02-02 19:49:3648 bool FetchEvents(size_t requested_events,
49 std::vector<EventInfo>* event_infos) override {
manzagopdeb62bf2017-03-08 17:00:0150 DCHECK(event_infos);
Sigurdur Asgeirsson693534f2018-02-02 19:49:3651 size_t num_to_copy = std::min(requested_events, events_.size());
52 if (num_to_copy) {
53 event_infos->clear();
54 event_infos->insert(event_infos->begin(), events_.begin(),
55 events_.begin() + num_to_copy);
56 events_.erase(events_.begin(), events_.begin() + num_to_copy);
57 }
58
manzagopdeb62bf2017-03-08 17:00:0159 return true;
60 }
61
62 void AddEvent(const EventInfo& info) { events_.push_back(info); }
63
64 private:
65 std::vector<EventInfo> events_;
66};
67
68TEST(SystemSessionAnalyzerTest, StandardCase) {
Sigurdur Asgeirsson693534f2018-02-02 19:49:3669 StubSystemSessionAnalyzer analyzer(2U);
manzagopdeb62bf2017-03-08 17:00:0170
71 base::Time time = base::Time::Now();
72 analyzer.AddEvent({kIdSessionStart, time});
73 analyzer.AddEvent(
74 {kIdSessionEndUnclean, time - base::TimeDelta::FromSeconds(10)});
75 analyzer.AddEvent({kIdSessionStart, time - base::TimeDelta::FromSeconds(20)});
76 analyzer.AddEvent({kIdSessionEnd, time - base::TimeDelta::FromSeconds(22)});
77 analyzer.AddEvent({kIdSessionStart, time - base::TimeDelta::FromSeconds(28)});
78
79 EXPECT_EQ(SystemSessionAnalyzer::OUTSIDE_RANGE,
80 analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(30)));
81 EXPECT_EQ(SystemSessionAnalyzer::CLEAN,
82 analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(25)));
83 EXPECT_EQ(SystemSessionAnalyzer::UNCLEAN,
84 analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(20)));
85 EXPECT_EQ(SystemSessionAnalyzer::UNCLEAN,
86 analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(15)));
87 EXPECT_EQ(SystemSessionAnalyzer::UNCLEAN,
88 analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(10)));
89 EXPECT_EQ(SystemSessionAnalyzer::CLEAN,
90 analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(5)));
91 EXPECT_EQ(SystemSessionAnalyzer::CLEAN,
92 analyzer.IsSessionUnclean(time + base::TimeDelta::FromSeconds(5)));
93}
94
95TEST(SystemSessionAnalyzerTest, NoEvent) {
Sigurdur Asgeirsson693534f2018-02-02 19:49:3696 StubSystemSessionAnalyzer analyzer(0U);
manzagopdeb62bf2017-03-08 17:00:0197 EXPECT_EQ(SystemSessionAnalyzer::FAILED,
98 analyzer.IsSessionUnclean(base::Time::Now()));
99}
100
101TEST(SystemSessionAnalyzerTest, TimeInversion) {
Sigurdur Asgeirsson693534f2018-02-02 19:49:36102 StubSystemSessionAnalyzer analyzer(1U);
manzagopdeb62bf2017-03-08 17:00:01103
104 base::Time time = base::Time::Now();
105 analyzer.AddEvent({kIdSessionStart, time});
106 analyzer.AddEvent({kIdSessionEnd, time + base::TimeDelta::FromSeconds(1)});
107 analyzer.AddEvent({kIdSessionStart, time - base::TimeDelta::FromSeconds(1)});
108
109 EXPECT_EQ(SystemSessionAnalyzer::FAILED,
110 analyzer.IsSessionUnclean(base::Time::Now()));
111}
112
113TEST(SystemSessionAnalyzerTest, IdInversion) {
Sigurdur Asgeirsson693534f2018-02-02 19:49:36114 StubSystemSessionAnalyzer analyzer(1U);
manzagopdeb62bf2017-03-08 17:00:01115
116 base::Time time = base::Time::Now();
117 analyzer.AddEvent({kIdSessionStart, time});
118 analyzer.AddEvent({kIdSessionStart, time - base::TimeDelta::FromSeconds(1)});
119 analyzer.AddEvent({kIdSessionEnd, time - base::TimeDelta::FromSeconds(2)});
120
121 EXPECT_EQ(SystemSessionAnalyzer::FAILED,
122 analyzer.IsSessionUnclean(base::Time::Now()));
123}
124
Sigurdur Asgeirsson5bf01aa82018-01-30 18:59:18125} // namespace metrics