1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef COMPONENTS_VIZ_TEST_BEGIN_FRAME_SOURCE_TEST_H_
6 #define COMPONENTS_VIZ_TEST_BEGIN_FRAME_SOURCE_TEST_H_
7 
8 #include "base/trace_event/traced_value.h"
9 #include "components/viz/common/frame_sinks/begin_frame_source.h"
10 #include "components/viz/test/begin_frame_args_test.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 
14 // Macros to help set up expected calls on the MockBeginFrameObserver.
15 #define EXPECT_BEGIN_FRAME_DROP(obs, source_id, sequence_number, frame_time, \
16                                 deadline, interval)                          \
17   EXPECT_CALL((obs), OnBeginFrame(CreateBeginFrameArgsForTesting(            \
18                          BEGINFRAME_FROM_HERE, source_id, sequence_number,   \
19                          frame_time, deadline, interval)))                   \
20       .Times(1)                                                              \
21       .InSequence((obs).sequence)
22 
23 #define EXPECT_BEGIN_FRAME_USED(obs, source_id, sequence_number, frame_time, \
24                                 deadline, interval)                          \
25   EXPECT_CALL((obs), OnBeginFrame(CreateBeginFrameArgsForTesting(            \
26                          BEGINFRAME_FROM_HERE, source_id, sequence_number,   \
27                          frame_time, deadline, interval)))                   \
28       .InSequence((obs).sequence)                                            \
29       .WillOnce(::testing::SaveArg<0>(&((obs).last_begin_frame_args)))
30 
31 #define EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_id, sequence_number,        \
32                                        frame_time, deadline, interval)         \
33   EXPECT_CALL(                                                                 \
34       (obs), OnBeginFrame(CreateBeginFrameArgsForTesting(                      \
35                  BEGINFRAME_FROM_HERE, source_id, sequence_number, frame_time, \
36                  deadline, interval, BeginFrameArgs::MISSED)))                 \
37       .InSequence((obs).sequence)                                              \
38       .WillOnce(::testing::SaveArg<0>(&((obs).last_begin_frame_args)))
39 
40 #define EXPECT_BEGIN_FRAME_ARGS_DROP(obs, args) \
41   EXPECT_CALL((obs), OnBeginFrame(args)).Times(1).InSequence((obs).sequence)
42 
43 #define EXPECT_BEGIN_FRAME_ARGS_USED(obs, args) \
44   EXPECT_CALL((obs), OnBeginFrame(args))        \
45       .InSequence((obs).sequence)               \
46       .WillOnce(::testing::SaveArg<0>(&((obs).last_begin_frame_args)))
47 
48 #define EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, paused)         \
49   EXPECT_CALL((obs), OnBeginFrameSourcePausedChanged(paused)) \
50       .Times(1)                                               \
51       .InSequence((obs).sequence)
52 
53 // Macros to send BeginFrameArgs on a FakeBeginFrameSink (and verify
54 // resulting observer behaviour).
55 #define SEND_BEGIN_FRAME(args_equal_to, source, sequence_number, frame_time, \
56                          deadline, interval)                                 \
57   {                                                                          \
58     BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs();         \
59     BeginFrameArgs new_args = CreateBeginFrameArgsForTesting(                \
60         BEGINFRAME_FROM_HERE, (source).source_id(), sequence_number,         \
61         frame_time, deadline, interval);                                     \
62     ASSERT_FALSE(old_args == new_args);                                      \
63     (source).TestOnBeginFrame(new_args);                                     \
64     EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs());         \
65   }
66 
67 // When dropping LastUsedBeginFrameArgs **shouldn't** change.
68 #define SEND_BEGIN_FRAME_DROP(source, sequence_number, frame_time, deadline, \
69                               interval)                                      \
70   SEND_BEGIN_FRAME(old_args, source, sequence_number, frame_time, deadline,  \
71                    interval);
72 
73 // When used LastUsedBeginFrameArgs **should** be updated.
74 #define SEND_BEGIN_FRAME_USED(source, sequence_number, frame_time, deadline, \
75                               interval)                                      \
76   SEND_BEGIN_FRAME(new_args, source, sequence_number, frame_time, deadline,  \
77                    interval);
78 
79 namespace viz {
80 
81 class MockBeginFrameObserver : public BeginFrameObserver {
82  public:
83   MOCK_METHOD1(OnBeginFrame, void(const BeginFrameArgs&));
84   MOCK_CONST_METHOD0(LastUsedBeginFrameArgs, const BeginFrameArgs&());
85   MOCK_METHOD1(OnBeginFrameSourcePausedChanged, void(bool));
86   MOCK_CONST_METHOD0(WantsAnimateOnlyBeginFrames, bool());
87   MOCK_CONST_METHOD0(IsRoot, bool());
88 
89   virtual void AsValueInto(base::trace_event::TracedValue* dict) const;
90 
91   // A value different from the normal default returned by a
92   // BeginFrameObserver so it is easiable traced back here.
93   static const BeginFrameArgs kDefaultBeginFrameArgs;
94 
95   MockBeginFrameObserver();
96   ~MockBeginFrameObserver() override;
97 
98   BeginFrameArgs last_begin_frame_args;
99   ::testing::Sequence sequence;
100 };
101 
102 }  // namespace viz
103 
104 #endif  // COMPONENTS_VIZ_TEST_BEGIN_FRAME_SOURCE_TEST_H_
105