blob: 62c96234b7b95c314bf68317cd6b0bec01ef792e [file] [log] [blame]
// Copyright 2017 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 "components/browser_watcher/system_session_analyzer_win.h"
#include <utility>
#include <vector>
#include "base/time/time.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace browser_watcher {
namespace {
const uint16_t kIdSessionStart = 6005U;
const uint16_t kIdSessionEnd = 6006U;
const uint16_t kIdSessionEndUnclean = 6008U;
} // namespace
// Ensure the fetcher retrieves events.
// Note: this test fails if the host system doesn't have at least 1 prior
// session.
TEST(SystemSessionAnalyzerTest, FetchEvents) {
SystemSessionAnalyzer analyzer(1U);
std::vector<SystemSessionAnalyzer::EventInfo> events;
ASSERT_TRUE(analyzer.FetchEvents(&events));
EXPECT_EQ(3U, events.size());
}
// Ensure the fetcher's retrieved events conform to our expectations.
// Note: this test fails if the host system doesn't have at least 1 prior
// session.
TEST(SystemSessionAnalyzerTest, ValidateEvents) {
SystemSessionAnalyzer analyzer(1U);
EXPECT_EQ(SystemSessionAnalyzer::CLEAN,
analyzer.IsSessionUnclean(base::Time::Now()));
}
// Stubs FetchEvents.
class StubSystemSessionAnalyzer : public SystemSessionAnalyzer {
public:
StubSystemSessionAnalyzer() : SystemSessionAnalyzer(10U) {}
bool FetchEvents(std::vector<EventInfo>* event_infos) const override {
DCHECK(event_infos);
*event_infos = events_;
return true;
}
void AddEvent(const EventInfo& info) { events_.push_back(info); }
private:
std::vector<EventInfo> events_;
};
TEST(SystemSessionAnalyzerTest, StandardCase) {
StubSystemSessionAnalyzer analyzer;
base::Time time = base::Time::Now();
analyzer.AddEvent({kIdSessionStart, time});
analyzer.AddEvent(
{kIdSessionEndUnclean, time - base::TimeDelta::FromSeconds(10)});
analyzer.AddEvent({kIdSessionStart, time - base::TimeDelta::FromSeconds(20)});
analyzer.AddEvent({kIdSessionEnd, time - base::TimeDelta::FromSeconds(22)});
analyzer.AddEvent({kIdSessionStart, time - base::TimeDelta::FromSeconds(28)});
EXPECT_EQ(SystemSessionAnalyzer::OUTSIDE_RANGE,
analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(30)));
EXPECT_EQ(SystemSessionAnalyzer::CLEAN,
analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(25)));
EXPECT_EQ(SystemSessionAnalyzer::UNCLEAN,
analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(20)));
EXPECT_EQ(SystemSessionAnalyzer::UNCLEAN,
analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(15)));
EXPECT_EQ(SystemSessionAnalyzer::UNCLEAN,
analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(10)));
EXPECT_EQ(SystemSessionAnalyzer::CLEAN,
analyzer.IsSessionUnclean(time - base::TimeDelta::FromSeconds(5)));
EXPECT_EQ(SystemSessionAnalyzer::CLEAN,
analyzer.IsSessionUnclean(time + base::TimeDelta::FromSeconds(5)));
}
TEST(SystemSessionAnalyzerTest, NoEvent) {
StubSystemSessionAnalyzer analyzer;
EXPECT_EQ(SystemSessionAnalyzer::FAILED,
analyzer.IsSessionUnclean(base::Time::Now()));
}
TEST(SystemSessionAnalyzerTest, TimeInversion) {
StubSystemSessionAnalyzer analyzer;
base::Time time = base::Time::Now();
analyzer.AddEvent({kIdSessionStart, time});
analyzer.AddEvent({kIdSessionEnd, time + base::TimeDelta::FromSeconds(1)});
analyzer.AddEvent({kIdSessionStart, time - base::TimeDelta::FromSeconds(1)});
EXPECT_EQ(SystemSessionAnalyzer::FAILED,
analyzer.IsSessionUnclean(base::Time::Now()));
}
TEST(SystemSessionAnalyzerTest, IdInversion) {
StubSystemSessionAnalyzer analyzer;
base::Time time = base::Time::Now();
analyzer.AddEvent({kIdSessionStart, time});
analyzer.AddEvent({kIdSessionStart, time - base::TimeDelta::FromSeconds(1)});
analyzer.AddEvent({kIdSessionEnd, time - base::TimeDelta::FromSeconds(2)});
EXPECT_EQ(SystemSessionAnalyzer::FAILED,
analyzer.IsSessionUnclean(base::Time::Now()));
}
} // namespace browser_watcher