| 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; |
| 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 |