| // 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 |