• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "core/fxcrt/cfx_timer.h"
6 
7 #include <memory>
8 
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 using testing::_;
13 using testing::DoAll;
14 using testing::Return;
15 using testing::SaveArg;
16 
17 class MockTimerScheduler : public CFX_Timer::HandlerIface {
18  public:
19   MOCK_METHOD2(SetTimer, int(int32_t uElapse, TimerCallback lpTimerFunc));
20   MOCK_METHOD1(KillTimer, void(int32_t nID));
21 };
22 
23 class MockTimerCallback : public CFX_Timer::CallbackIface {
24  public:
25   MOCK_METHOD0(OnTimerFired, void());
26 };
27 
TEST(CFX_Timer,ValidTimers)28 TEST(CFX_Timer, ValidTimers) {
29   CFX_Timer::HandlerIface::TimerCallback fn1 = nullptr;
30   CFX_Timer::HandlerIface::TimerCallback fn2 = nullptr;
31 
32   MockTimerScheduler scheduler;
33   EXPECT_CALL(scheduler, SetTimer(100, _))
34       .WillOnce(DoAll(SaveArg<1>(&fn1), Return(1001)));
35   EXPECT_CALL(scheduler, SetTimer(200, _))
36       .WillOnce(DoAll(SaveArg<1>(&fn2), Return(1002)));
37   EXPECT_CALL(scheduler, KillTimer(1001));
38   EXPECT_CALL(scheduler, KillTimer(1002));
39 
40   MockTimerCallback cb1;
41   EXPECT_CALL(cb1, OnTimerFired()).Times(1);
42 
43   MockTimerCallback cb2;
44   EXPECT_CALL(cb2, OnTimerFired()).Times(2);
45 
46   auto timer1 = std::make_unique<CFX_Timer>(&scheduler, &cb1, 100);
47   auto timer2 = std::make_unique<CFX_Timer>(&scheduler, &cb2, 200);
48   EXPECT_TRUE(timer1->HasValidID());
49   EXPECT_TRUE(timer2->HasValidID());
50 
51   // Fire some timers.
52   ASSERT_TRUE(fn1);
53   ASSERT_TRUE(fn2);
54   (*fn1)(1001);
55   (*fn1)(1002);
56   (*fn1)(1002);
57 }
58 
TEST(CFX_Timer,MisbehavingEmbedder)59 TEST(CFX_Timer, MisbehavingEmbedder) {
60   CFX_Timer::HandlerIface::TimerCallback fn1 = nullptr;
61 
62   MockTimerScheduler scheduler;
63   EXPECT_CALL(scheduler, SetTimer(100, _))
64       .WillOnce(DoAll(SaveArg<1>(&fn1), Return(1001)));
65   EXPECT_CALL(scheduler, KillTimer(1001));
66 
67   MockTimerCallback cb1;
68   EXPECT_CALL(cb1, OnTimerFired()).Times(0);
69 
70   {
71     auto timer1 = std::make_unique<CFX_Timer>(&scheduler, &cb1, 100);
72     EXPECT_TRUE(timer1->HasValidID());
73 
74     // Fire callback with bad arguments.
75     ASSERT_TRUE(fn1);
76     (*fn1)(-1);
77     (*fn1)(0);
78     (*fn1)(1002);
79   }
80 
81   // Fire callback against stale timer.
82   (*fn1)(1001);
83 }
84