blob: b95de72ec503e59821a9ef0f4082ec3942eca9fc [file] [log] [blame]
// Copyright 2019 PDFium 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 "core/fxcrt/cfx_timer.h"
#include <memory>
#include "core/fxcrt/timerhandler_iface.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/base/ptr_util.h"
using testing::_;
using testing::DoAll;
using testing::Return;
using testing::SaveArg;
class MockTimerScheduler : public TimerHandlerIface {
public:
MOCK_METHOD2(SetTimer, int(int32_t uElapse, TimerCallback lpTimerFunc));
MOCK_METHOD1(KillTimer, void(int32_t nID));
};
class MockTimerCallback : public CFX_Timer::CallbackIface {
public:
MOCK_METHOD0(OnTimerFired, void());
};
TEST(CFX_Timer, ValidTimers) {
TimerHandlerIface::TimerCallback fn1 = nullptr;
TimerHandlerIface::TimerCallback fn2 = nullptr;
MockTimerScheduler scheduler;
EXPECT_CALL(scheduler, SetTimer(100, _))
.WillOnce(DoAll(SaveArg<1>(&fn1), Return(1001)));
EXPECT_CALL(scheduler, SetTimer(200, _))
.WillOnce(DoAll(SaveArg<1>(&fn2), Return(1002)));
EXPECT_CALL(scheduler, KillTimer(1001));
EXPECT_CALL(scheduler, KillTimer(1002));
MockTimerCallback cb1;
EXPECT_CALL(cb1, OnTimerFired()).Times(1);
MockTimerCallback cb2;
EXPECT_CALL(cb2, OnTimerFired()).Times(2);
auto timer1 = pdfium::MakeUnique<CFX_Timer>(&scheduler, &cb1, 100);
auto timer2 = pdfium::MakeUnique<CFX_Timer>(&scheduler, &cb2, 200);
EXPECT_TRUE(timer1->HasValidID());
EXPECT_TRUE(timer2->HasValidID());
// Fire some timers.
ASSERT_TRUE(fn1);
ASSERT_TRUE(fn2);
(*fn1)(1001);
(*fn1)(1002);
(*fn1)(1002);
}
TEST(CFX_Timer, MisbehavingEmbedder) {
TimerHandlerIface::TimerCallback fn1 = nullptr;
MockTimerScheduler scheduler;
EXPECT_CALL(scheduler, SetTimer(100, _))
.WillOnce(DoAll(SaveArg<1>(&fn1), Return(1001)));
EXPECT_CALL(scheduler, KillTimer(1001));
MockTimerCallback cb1;
EXPECT_CALL(cb1, OnTimerFired()).Times(0);
{
auto timer1 = pdfium::MakeUnique<CFX_Timer>(&scheduler, &cb1, 100);
EXPECT_TRUE(timer1->HasValidID());
// Fire callback with bad arguments.
ASSERT_TRUE(fn1);
(*fn1)(-1);
(*fn1)(0);
(*fn1)(1002);
}
// Fire callback against stale timer.
(*fn1)(1001);
}