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