OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2014 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 #include "remoting/host/ack_or_timeout_reporter.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/callback.h" | |
9 #include "base/location.h" | |
10 #include "base/memory/weak_ptr.h" | |
11 #include "base/time/time.h" | |
12 | |
13 #include "testing/gmock/include/gmock/gmock.h" | |
14 #include "testing/gtest/include/gtest/gtest.h" | |
15 | |
16 using testing::_; | |
17 using testing::DoAll; | |
18 using testing::SaveArg; | |
19 using testing::Return; | |
20 | |
21 namespace remoting { | |
22 | |
23 class MockSequencedTaskRunner : public base::SequencedTaskRunner { | |
24 public: | |
25 MOCK_METHOD3(PostDelayedTask, | |
26 bool(const tracked_objects::Location&, | |
27 const base::Closure&, | |
28 base::TimeDelta)); | |
29 | |
30 MOCK_CONST_METHOD0(RunsTasksOnCurrentThread, bool()); | |
31 | |
32 MOCK_METHOD3(PostNonNestableDelayedTask, | |
33 bool(const tracked_objects::Location&, | |
34 const base::Closure&, | |
35 base::TimeDelta)); | |
36 | |
37 private: | |
38 ~MockSequencedTaskRunner() {} | |
39 }; | |
40 | |
41 class MockFunctionThatAcks { | |
42 public: | |
43 MOCK_CONST_METHOD1(Run, void(const base::Closure&)); | |
44 }; | |
45 | |
46 class MockAckOrTimeoutCallback { | |
47 public: | |
48 MOCK_CONST_METHOD1(Run, void(AckOrTimeout)); | |
49 }; | |
50 | |
51 const base::TimeDelta kTestTimeout = base::TimeDelta::FromSeconds(123); | |
52 | |
53 static void CallReportAckOrTimeoutAndCaptureCallbacks( | |
54 const base::Callback<void(AckOrTimeout)>& ack_or_timeout_callback, | |
55 /* out */ base::Closure* captured_ack_callback, | |
56 /* out */ base::Closure* captured_timeout_callback) { | |
57 // Setup mocks. | |
58 MockFunctionThatAcks mock_function_that_acks; | |
59 scoped_refptr<MockSequencedTaskRunner> mock_task_runner( | |
60 new MockSequencedTaskRunner()); | |
61 | |
62 // Capture |captured_ack_callback| and |captured_timeout_callback|. | |
63 EXPECT_CALL(mock_function_that_acks, Run(_)) | |
64 .WillOnce(SaveArg<0>(captured_ack_callback)); | |
65 EXPECT_CALL(*mock_task_runner, PostDelayedTask(_, _, kTestTimeout)) | |
66 .WillOnce(DoAll(SaveArg<1>(captured_timeout_callback), Return(true))); | |
Wez
2014/12/09 00:51:58
You shouldn't be checking for this call; tests sho
Łukasz Anforowicz
2014/12/09 18:47:07
I also don't like tight coupling between tests and
| |
67 | |
68 // Call function-under-test. | |
69 ReportAckOrTimeout(base::Bind(&MockFunctionThatAcks::Run, | |
70 base::Unretained(&mock_function_that_acks)), | |
71 kTestTimeout, mock_task_runner, ack_or_timeout_callback); | |
72 } | |
73 | |
74 TEST(AckOrTimeoutReporterTest, FirstAckCalledAsynchronously) { | |
75 MockAckOrTimeoutCallback mock_ack_or_timeout_callback; | |
76 base::WeakPtrFactory<MockAckOrTimeoutCallback> weak_factory( | |
77 &mock_ack_or_timeout_callback); | |
78 | |
79 base::Closure captured_ack_callback; | |
80 base::Closure captured_timeout_callback; | |
81 | |
82 // |mock_ack_or_timeout_callback| should not be called until | |
83 // |captured_ack_callback| or |captured_timeout_callback| is called. | |
84 EXPECT_CALL(mock_ack_or_timeout_callback, Run(_)).Times(0); | |
85 | |
86 CallReportAckOrTimeoutAndCaptureCallbacks( | |
87 base::Bind(&MockAckOrTimeoutCallback::Run, weak_factory.GetWeakPtr()), | |
88 &captured_ack_callback, &captured_timeout_callback); | |
89 ASSERT_FALSE(captured_ack_callback.is_null()); | |
90 ASSERT_FALSE(captured_timeout_callback.is_null()); | |
91 | |
92 { | |
93 // |mock_ack_or_timeout_callback| should be called as soon as | |
94 // |captured_ack_callback| runs. | |
95 EXPECT_CALL(mock_ack_or_timeout_callback, Run(AckOrTimeout::Ack)); | |
96 captured_ack_callback.Run(); | |
97 } | |
98 | |
99 // |ack_or_timeout_callback| should be dropped after being called once. | |
100 // This expectation is depended on by |MinimumHeartbeatSupporter| to | |
101 // manage its lifetime (i.e. release references to self after getting an | |
102 // ack). | |
103 EXPECT_FALSE(weak_factory.HasWeakPtrs()); | |
104 | |
105 // It should be safe to call the callbacks multiple times. | |
106 // We are veryfying that such callbacks do not trigger | |
Lambros
2014/12/06 01:25:05
nit: verifying
Łukasz Anforowicz
2014/12/09 18:47:07
Done.
| |
107 // ack_or_timeout_callback by having EXPECT_CALL...Times(0) above. | |
108 captured_ack_callback.Run(); | |
109 captured_timeout_callback.Run(); | |
110 } | |
111 | |
112 TEST(AckOrTimeoutReporterTest, FirstTimeoutCalledAsynchronously) { | |
113 MockAckOrTimeoutCallback mock_ack_or_timeout_callback; | |
114 base::WeakPtrFactory<MockAckOrTimeoutCallback> weak_factory( | |
115 &mock_ack_or_timeout_callback); | |
116 | |
117 base::Closure captured_ack_callback; | |
118 base::Closure captured_timeout_callback; | |
119 | |
120 // |mock_ack_or_timeout_callback| should not be called until | |
121 // |captured_ack_callback| or |captured_timeout_callback| is called. | |
122 EXPECT_CALL(mock_ack_or_timeout_callback, Run(_)).Times(0); | |
123 | |
124 CallReportAckOrTimeoutAndCaptureCallbacks( | |
125 base::Bind(&MockAckOrTimeoutCallback::Run, weak_factory.GetWeakPtr()), | |
126 &captured_ack_callback, &captured_timeout_callback); | |
127 ASSERT_FALSE(captured_ack_callback.is_null()); | |
128 ASSERT_FALSE(captured_timeout_callback.is_null()); | |
129 | |
130 { | |
131 // |mock_ack_or_timeout_callback| should be called as soon as | |
132 // |captured_ack_callback| runs. | |
133 EXPECT_CALL(mock_ack_or_timeout_callback, Run(AckOrTimeout::Timeout)); | |
134 captured_timeout_callback.Run(); | |
135 } | |
136 | |
137 // |ack_or_timeout_callback| should be dropped after being called once. | |
138 // This expectation is depended on by |MinimumHeartbeatSupporter| to | |
139 // manage its lifetime (i.e. release references to self after getting an | |
140 // ack). | |
141 EXPECT_FALSE(weak_factory.HasWeakPtrs()); | |
142 | |
143 // It should be safe to call the callbacks multiple times. | |
144 // We are veryfying that such callbacks do not trigger | |
145 // ack_or_timeout_callback by having EXPECT_CALL...Times(0) above. | |
146 captured_ack_callback.Run(); | |
147 captured_timeout_callback.Run(); | |
148 } | |
149 | |
150 } // namespace remoting | |
OLD | NEW |