OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "blimp/net/blimp_message_checkpointer.h" | 5 #include "blimp/net/blimp_message_checkpointer.h" |
6 | 6 |
7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
9 #include "base/test/test_mock_time_task_runner.h" | 9 #include "base/test/test_mock_time_task_runner.h" |
10 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 class MockCheckpointObserver : public BlimpMessageCheckpointObserver { | 25 class MockCheckpointObserver : public BlimpMessageCheckpointObserver { |
26 public: | 26 public: |
27 MockCheckpointObserver() {} | 27 MockCheckpointObserver() {} |
28 ~MockCheckpointObserver() override {} | 28 ~MockCheckpointObserver() override {} |
29 | 29 |
30 MOCK_METHOD1(OnMessageCheckpoint, void(int64_t)); | 30 MOCK_METHOD1(OnMessageCheckpoint, void(int64_t)); |
31 }; | 31 }; |
32 | 32 |
33 } // namespace | 33 } // namespace |
34 | 34 |
35 static std::unique_ptr<BlimpMessage> CreateExpectedAckMessage(int64_t id) { | |
36 std::unique_ptr<BlimpMessage> message = base::WrapUnique(new BlimpMessage); | |
37 message->set_type(BlimpMessage::PROTOCOL_CONTROL); | |
38 ProtocolControlMessage* protocol_control = | |
39 message->mutable_protocol_control(); | |
40 protocol_control->set_type(ProtocolControlMessage::CHECKPOINT_ACK); | |
41 CheckpointAckMessage* checkpoint_ack = | |
42 protocol_control->mutable_checkpoint_ack(); | |
43 checkpoint_ack->set_checkpoint_id(id); | |
44 return message; | |
45 } | |
46 | |
47 class BlimpMessageCheckpointerTest : public testing::Test { | 35 class BlimpMessageCheckpointerTest : public testing::Test { |
48 public: | 36 public: |
49 BlimpMessageCheckpointerTest() | 37 BlimpMessageCheckpointerTest() |
50 : runner_(new base::TestMockTimeTaskRunner), runner_handle_(runner_) {} | 38 : runner_(new base::TestMockTimeTaskRunner), runner_handle_(runner_) {} |
51 | 39 |
52 ~BlimpMessageCheckpointerTest() override {} | 40 ~BlimpMessageCheckpointerTest() override {} |
53 | 41 |
54 int64_t SimulateIncomingMessage() { | 42 int64_t SimulateIncomingMessage() { |
55 std::unique_ptr<BlimpMessage> message(new BlimpMessage); | 43 InputMessage* input = nullptr; |
| 44 std::unique_ptr<BlimpMessage> message(CreateBlimpMessage(&input)); |
56 message->set_message_id(++message_id_); | 45 message->set_message_id(++message_id_); |
57 message->set_type(BlimpMessage::INPUT); | |
58 checkpointer_->ProcessMessage( | 46 checkpointer_->ProcessMessage( |
59 std::move(message), | 47 std::move(message), |
60 base::Bind(&BlimpMessageCheckpointerTest::IncomingCompletionCallback, | 48 base::Bind(&BlimpMessageCheckpointerTest::IncomingCompletionCallback, |
61 base::Unretained(this))); | 49 base::Unretained(this))); |
62 return message_id_; | 50 return message_id_; |
63 } | 51 } |
64 | 52 |
65 void SetUp() override { | 53 void SetUp() override { |
66 checkpointer_ = base::WrapUnique(new BlimpMessageCheckpointer( | 54 checkpointer_ = base::WrapUnique(new BlimpMessageCheckpointer( |
67 &incoming_processor_, &outgoing_processor_, &checkpoint_observer_)); | 55 &incoming_processor_, &outgoing_processor_, &checkpoint_observer_)); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 | 94 |
107 // Delete the checkpointer, then simulate completion of processing. | 95 // Delete the checkpointer, then simulate completion of processing. |
108 // TestCompletionCallback should not fire, so no expectations. | 96 // TestCompletionCallback should not fire, so no expectations. |
109 checkpointer_ = nullptr; | 97 checkpointer_ = nullptr; |
110 captured_cb_.Run(net::OK); | 98 captured_cb_.Run(net::OK); |
111 } | 99 } |
112 | 100 |
113 TEST_F(BlimpMessageCheckpointerTest, SingleMessageAck) { | 101 TEST_F(BlimpMessageCheckpointerTest, SingleMessageAck) { |
114 EXPECT_CALL(incoming_processor_, MockableProcessMessage(_, _)) | 102 EXPECT_CALL(incoming_processor_, MockableProcessMessage(_, _)) |
115 .WillOnce(SaveArg<1>(&captured_cb_)); | 103 .WillOnce(SaveArg<1>(&captured_cb_)); |
116 std::unique_ptr<BlimpMessage> expected_ack = CreateExpectedAckMessage(1); | 104 std::unique_ptr<BlimpMessage> expected_ack = CreateCheckpointAckMessage(1); |
117 EXPECT_CALL(outgoing_processor_, | 105 EXPECT_CALL(outgoing_processor_, |
118 MockableProcessMessage(EqualsProto(*expected_ack), _)); | 106 MockableProcessMessage(EqualsProto(*expected_ack), _)); |
119 EXPECT_CALL(*this, IncomingCompletionCallback(net::OK)); | 107 EXPECT_CALL(*this, IncomingCompletionCallback(net::OK)); |
120 | 108 |
121 // Simulate an incoming message. | 109 // Simulate an incoming message. |
122 SimulateIncomingMessage(); | 110 SimulateIncomingMessage(); |
123 | 111 |
124 // Fast-forward time to verify that an ACK message is sent. | 112 // Fast-forward time to verify that an ACK message is sent. |
125 captured_cb_.Run(net::OK); | 113 captured_cb_.Run(net::OK); |
126 runner_->FastForwardBy(base::TimeDelta::FromSeconds(2)); | 114 runner_->FastForwardBy(base::TimeDelta::FromSeconds(2)); |
127 } | 115 } |
128 | 116 |
129 TEST_F(BlimpMessageCheckpointerTest, BatchMessageAck) { | 117 TEST_F(BlimpMessageCheckpointerTest, BatchMessageAck) { |
130 EXPECT_CALL(incoming_processor_, MockableProcessMessage(_, _)) | 118 EXPECT_CALL(incoming_processor_, MockableProcessMessage(_, _)) |
131 .Times(10) | 119 .Times(10) |
132 .WillRepeatedly(SaveArg<1>(&captured_cb_)); | 120 .WillRepeatedly(SaveArg<1>(&captured_cb_)); |
133 std::unique_ptr<BlimpMessage> expected_ack = CreateExpectedAckMessage(10); | 121 std::unique_ptr<BlimpMessage> expected_ack = CreateCheckpointAckMessage(10); |
134 EXPECT_CALL(outgoing_processor_, | 122 EXPECT_CALL(outgoing_processor_, |
135 MockableProcessMessage(EqualsProto(*expected_ack), _)); | 123 MockableProcessMessage(EqualsProto(*expected_ack), _)); |
136 EXPECT_CALL(*this, IncomingCompletionCallback(net::OK)).Times(10); | 124 EXPECT_CALL(*this, IncomingCompletionCallback(net::OK)).Times(10); |
137 | 125 |
138 // Simulate ten incoming messages. | 126 // Simulate ten incoming messages. |
139 for (int i = 0; i < 10; ++i) { | 127 for (int i = 0; i < 10; ++i) { |
140 SimulateIncomingMessage(); | 128 SimulateIncomingMessage(); |
141 captured_cb_.Run(net::OK); | 129 captured_cb_.Run(net::OK); |
142 } | 130 } |
143 | 131 |
144 // Fast-forward time to verify that only a single ACK message is sent. | 132 // Fast-forward time to verify that only a single ACK message is sent. |
145 runner_->FastForwardBy(base::TimeDelta::FromSeconds(2)); | 133 runner_->FastForwardBy(base::TimeDelta::FromSeconds(2)); |
146 } | 134 } |
147 | 135 |
148 TEST_F(BlimpMessageCheckpointerTest, MultipleAcks) { | 136 TEST_F(BlimpMessageCheckpointerTest, MultipleAcks) { |
149 EXPECT_CALL(incoming_processor_, MockableProcessMessage(_, _)) | 137 EXPECT_CALL(incoming_processor_, MockableProcessMessage(_, _)) |
150 .Times(2) | 138 .Times(2) |
151 .WillRepeatedly(SaveArg<1>(&captured_cb_)); | 139 .WillRepeatedly(SaveArg<1>(&captured_cb_)); |
152 std::unique_ptr<BlimpMessage> expected_ack1 = CreateExpectedAckMessage(1); | 140 std::unique_ptr<BlimpMessage> expected_ack1 = CreateCheckpointAckMessage(1); |
153 EXPECT_CALL(outgoing_processor_, | 141 EXPECT_CALL(outgoing_processor_, |
154 MockableProcessMessage(EqualsProto(*expected_ack1), _)); | 142 MockableProcessMessage(EqualsProto(*expected_ack1), _)); |
155 std::unique_ptr<BlimpMessage> expected_ack2 = CreateExpectedAckMessage(2); | 143 std::unique_ptr<BlimpMessage> expected_ack2 = CreateCheckpointAckMessage(2); |
156 EXPECT_CALL(outgoing_processor_, | 144 EXPECT_CALL(outgoing_processor_, |
157 MockableProcessMessage(EqualsProto(*expected_ack2), _)); | 145 MockableProcessMessage(EqualsProto(*expected_ack2), _)); |
158 EXPECT_CALL(*this, IncomingCompletionCallback(net::OK)).Times(2); | 146 EXPECT_CALL(*this, IncomingCompletionCallback(net::OK)).Times(2); |
159 | 147 |
160 // Simulate an incoming messages and fast-forward to get the ACK. | 148 // Simulate an incoming messages and fast-forward to get the ACK. |
161 SimulateIncomingMessage(); | 149 SimulateIncomingMessage(); |
162 captured_cb_.Run(net::OK); | 150 captured_cb_.Run(net::OK); |
163 runner_->FastForwardBy(base::TimeDelta::FromSeconds(2)); | 151 runner_->FastForwardBy(base::TimeDelta::FromSeconds(2)); |
164 | 152 |
165 // And do it again to verify we get a fresh ACK. | 153 // And do it again to verify we get a fresh ACK. |
166 SimulateIncomingMessage(); | 154 SimulateIncomingMessage(); |
167 captured_cb_.Run(net::OK); | 155 captured_cb_.Run(net::OK); |
168 runner_->FastForwardBy(base::TimeDelta::FromSeconds(2)); | 156 runner_->FastForwardBy(base::TimeDelta::FromSeconds(2)); |
169 } | 157 } |
170 | 158 |
171 TEST_F(BlimpMessageCheckpointerTest, IncomingAckMessage) { | 159 TEST_F(BlimpMessageCheckpointerTest, IncomingAckMessage) { |
172 EXPECT_CALL(*this, IncomingCompletionCallback(net::OK)); | 160 EXPECT_CALL(*this, IncomingCompletionCallback(net::OK)); |
173 EXPECT_CALL(checkpoint_observer_, OnMessageCheckpoint(10)); | 161 EXPECT_CALL(checkpoint_observer_, OnMessageCheckpoint(10)); |
174 | 162 |
175 // Simulate an incoming message. | 163 // Simulate an incoming message. |
176 std::unique_ptr<BlimpMessage> ack_message = CreateCheckpointAckMessage(10); | 164 std::unique_ptr<BlimpMessage> ack_message = CreateCheckpointAckMessage(10); |
177 checkpointer_->ProcessMessage( | 165 checkpointer_->ProcessMessage( |
178 std::move(ack_message), | 166 std::move(ack_message), |
179 base::Bind(&BlimpMessageCheckpointerTest::IncomingCompletionCallback, | 167 base::Bind(&BlimpMessageCheckpointerTest::IncomingCompletionCallback, |
180 base::Unretained(this))); | 168 base::Unretained(this))); |
181 } | 169 } |
182 | 170 |
183 } // namespace blimp | 171 } // namespace blimp |
OLD | NEW |