OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/thread_pipe_manager.h" | 5 #include "blimp/net/thread_pipe_manager.h" |
6 | 6 |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
11 #include "base/threading/sequenced_task_runner_handle.h" | 11 #include "base/threading/sequenced_task_runner_handle.h" |
12 #include "base/threading/thread.h" | 12 #include "base/threading/thread.h" |
13 #include "blimp/common/create_blimp_message.h" | |
13 #include "blimp/net/blimp_message_thread_pipe.h" | 14 #include "blimp/net/blimp_message_thread_pipe.h" |
14 #include "blimp/net/browser_connection_handler.h" | 15 #include "blimp/net/browser_connection_handler.h" |
15 #include "blimp/net/test_common.h" | 16 #include "blimp/net/test_common.h" |
16 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" |
17 #include "net/base/test_completion_callback.h" | 18 #include "net/base/test_completion_callback.h" |
18 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
20 | 21 |
21 using testing::_; | 22 using testing::_; |
22 using testing::SaveArg; | 23 using testing::SaveArg; |
23 | 24 |
24 namespace blimp { | 25 namespace blimp { |
25 namespace { | 26 namespace { |
26 | 27 |
27 std::unique_ptr<BlimpMessage> CreateMessage(BlimpMessage::Type type) { | |
28 std::unique_ptr<BlimpMessage> output(new BlimpMessage); | |
29 output->set_type(type); | |
30 return output; | |
31 } | |
32 | |
33 // A feature that registers itself with ThreadPipeManager. | 28 // A feature that registers itself with ThreadPipeManager. |
34 class FakeFeature { | 29 class FakeFeature { |
35 public: | 30 public: |
36 FakeFeature(BlimpMessage::Type type, ThreadPipeManager* pipe_manager_) { | 31 FakeFeature(BlimpMessage::FeatureCase type, |
32 ThreadPipeManager* pipe_manager_) { | |
37 outgoing_message_processor_ = | 33 outgoing_message_processor_ = |
38 pipe_manager_->RegisterFeature(type, &incoming_message_processor_); | 34 pipe_manager_->RegisterFeature(type, &incoming_message_processor_); |
39 } | 35 } |
40 | 36 |
41 ~FakeFeature() {} | 37 ~FakeFeature() {} |
42 | 38 |
43 BlimpMessageProcessor* outgoing_message_processor() { | 39 BlimpMessageProcessor* outgoing_message_processor() { |
44 return outgoing_message_processor_.get(); | 40 return outgoing_message_processor_.get(); |
45 } | 41 } |
46 | 42 |
47 MockBlimpMessageProcessor* incoming_message_processor() { | 43 MockBlimpMessageProcessor* incoming_message_processor() { |
48 return &incoming_message_processor_; | 44 return &incoming_message_processor_; |
49 } | 45 } |
50 | 46 |
51 private: | 47 private: |
52 testing::StrictMock<MockBlimpMessageProcessor> incoming_message_processor_; | 48 testing::StrictMock<MockBlimpMessageProcessor> incoming_message_processor_; |
53 std::unique_ptr<BlimpMessageProcessor> outgoing_message_processor_; | 49 std::unique_ptr<BlimpMessageProcessor> outgoing_message_processor_; |
54 }; | 50 }; |
55 | 51 |
56 // A feature peer on |thread_| that forwards incoming messages to | 52 // A feature peer on |thread_| that forwards incoming messages to |
57 // |message_processor|. | 53 // |message_processor|. |
58 class FakeFeaturePeer : public BlimpMessageProcessor { | 54 class FakeFeaturePeer : public BlimpMessageProcessor { |
59 public: | 55 public: |
60 FakeFeaturePeer(BlimpMessage::Type type, | 56 FakeFeaturePeer(BlimpMessage::FeatureCase type, |
61 BlimpMessageProcessor* message_processor, | 57 BlimpMessageProcessor* message_processor, |
62 const scoped_refptr<base::SequencedTaskRunner>& task_runner) | 58 const scoped_refptr<base::SequencedTaskRunner>& task_runner) |
63 : type_(type), | 59 : type_(type), |
64 message_processor_(message_processor), | 60 message_processor_(message_processor), |
65 task_runner_(task_runner) {} | 61 task_runner_(task_runner) {} |
66 | 62 |
67 ~FakeFeaturePeer() override {} | 63 ~FakeFeaturePeer() override {} |
68 | 64 |
69 private: | 65 private: |
70 void ForwardMessage(std::unique_ptr<BlimpMessage> message) { | 66 void ForwardMessage(std::unique_ptr<BlimpMessage> message) { |
71 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 67 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
72 message_processor_->ProcessMessage(std::move(message), | 68 message_processor_->ProcessMessage(std::move(message), |
73 net::CompletionCallback()); | 69 net::CompletionCallback()); |
74 } | 70 } |
75 | 71 |
76 // BlimpMessageProcessor implementation. | 72 // BlimpMessageProcessor implementation. |
77 void ProcessMessage(std::unique_ptr<BlimpMessage> message, | 73 void ProcessMessage(std::unique_ptr<BlimpMessage> message, |
78 const net::CompletionCallback& callback) override { | 74 const net::CompletionCallback& callback) override { |
79 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 75 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
80 ASSERT_EQ(type_, message->type()); | 76 ASSERT_EQ(type_, message->feature_case()); |
81 base::MessageLoop::current()->PostTask( | 77 base::MessageLoop::current()->PostTask( |
82 FROM_HERE, base::Bind(&FakeFeaturePeer::ForwardMessage, | 78 FROM_HERE, base::Bind(&FakeFeaturePeer::ForwardMessage, |
83 base::Unretained(this), base::Passed(&message))); | 79 base::Unretained(this), base::Passed(&message))); |
84 if (!callback.is_null()) | 80 if (!callback.is_null()) |
85 callback.Run(net::OK); | 81 callback.Run(net::OK); |
86 } | 82 } |
87 | 83 |
88 BlimpMessage::Type type_; | 84 BlimpMessage::FeatureCase type_; |
89 BlimpMessageProcessor* message_processor_ = nullptr; | 85 BlimpMessageProcessor* message_processor_ = nullptr; |
90 scoped_refptr<base::SequencedTaskRunner> task_runner_; | 86 scoped_refptr<base::SequencedTaskRunner> task_runner_; |
91 }; | 87 }; |
92 | 88 |
93 // A browser connection handler that returns FakeFeaturePeer to allow it | 89 // A browser connection handler that returns FakeFeaturePeer to allow it |
94 // forwarding message back so that FakeFeature can check message it receives | 90 // forwarding message back so that FakeFeature can check message it receives |
95 // with one it just sent. | 91 // with one it just sent. |
96 class FakeBrowserConnectionHandler : public BrowserConnectionHandler { | 92 class FakeBrowserConnectionHandler : public BrowserConnectionHandler { |
97 public: | 93 public: |
98 FakeBrowserConnectionHandler( | 94 FakeBrowserConnectionHandler( |
99 const scoped_refptr<base::SequencedTaskRunner>& task_runner) | 95 const scoped_refptr<base::SequencedTaskRunner>& task_runner) |
100 : task_runner_(task_runner) {} | 96 : task_runner_(task_runner) {} |
101 std::unique_ptr<BlimpMessageProcessor> RegisterFeature( | 97 std::unique_ptr<BlimpMessageProcessor> RegisterFeature( |
102 BlimpMessage::Type type, | 98 BlimpMessage::FeatureCase type, |
103 BlimpMessageProcessor* incoming_processor) override { | 99 BlimpMessageProcessor* incoming_processor) override { |
104 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 100 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
105 return base::WrapUnique( | 101 return base::WrapUnique( |
106 new FakeFeaturePeer(type, incoming_processor, task_runner_)); | 102 new FakeFeaturePeer(type, incoming_processor, task_runner_)); |
107 } | 103 } |
108 | 104 |
109 private: | 105 private: |
110 scoped_refptr<base::SequencedTaskRunner> task_runner_; | 106 scoped_refptr<base::SequencedTaskRunner> task_runner_; |
111 }; | 107 }; |
112 | 108 |
113 } // namespace | 109 } // namespace |
114 | 110 |
115 class ThreadPipeManagerTest : public testing::Test { | 111 class ThreadPipeManagerTest : public testing::Test { |
116 public: | 112 public: |
117 ThreadPipeManagerTest() : thread_("IoThread") {} | 113 ThreadPipeManagerTest() : thread_("IoThread") {} |
118 | 114 |
119 ~ThreadPipeManagerTest() override {} | 115 ~ThreadPipeManagerTest() override {} |
120 | 116 |
121 void SetUp() override { | 117 void SetUp() override { |
122 ASSERT_TRUE(thread_.Start()); | 118 ASSERT_TRUE(thread_.Start()); |
123 connection_handler_ = base::WrapUnique( | 119 connection_handler_ = base::WrapUnique( |
124 new FakeBrowserConnectionHandler(thread_.task_runner())); | 120 new FakeBrowserConnectionHandler(thread_.task_runner())); |
125 pipe_manager_ = base::WrapUnique(new ThreadPipeManager( | 121 pipe_manager_ = base::WrapUnique(new ThreadPipeManager( |
126 thread_.task_runner(), base::SequencedTaskRunnerHandle::Get(), | 122 thread_.task_runner(), base::SequencedTaskRunnerHandle::Get(), |
127 connection_handler_.get())); | 123 connection_handler_.get())); |
128 | 124 |
129 input_feature_.reset( | 125 input_feature_.reset( |
130 new FakeFeature(BlimpMessage::INPUT, pipe_manager_.get())); | 126 new FakeFeature(BlimpMessage::kInput, pipe_manager_.get())); |
131 tab_control_feature_.reset( | 127 tab_control_feature_.reset( |
132 new FakeFeature(BlimpMessage::TAB_CONTROL, pipe_manager_.get())); | 128 new FakeFeature(BlimpMessage::kTabControl, pipe_manager_.get())); |
133 } | 129 } |
134 | 130 |
135 void TearDown() override { SynchronizeWithThread(); } | 131 void TearDown() override { SynchronizeWithThread(); } |
136 | 132 |
137 // Synchronize with |thread_| to ensure that any pending work is done. | 133 // Synchronize with |thread_| to ensure that any pending work is done. |
138 void SynchronizeWithThread() { | 134 void SynchronizeWithThread() { |
139 net::TestCompletionCallback cb; | 135 net::TestCompletionCallback cb; |
140 thread_.task_runner()->PostTaskAndReply(FROM_HERE, | 136 thread_.task_runner()->PostTaskAndReply(FROM_HERE, |
141 base::Bind(&base::DoNothing), | 137 base::Bind(&base::DoNothing), |
142 base::Bind(cb.callback(), net::OK)); | 138 base::Bind(cb.callback(), net::OK)); |
143 ASSERT_EQ(net::OK, cb.WaitForResult()); | 139 ASSERT_EQ(net::OK, cb.WaitForResult()); |
144 } | 140 } |
145 | 141 |
146 protected: | 142 protected: |
147 base::MessageLoop message_loop_; | 143 base::MessageLoop message_loop_; |
148 std::unique_ptr<BrowserConnectionHandler> connection_handler_; | 144 std::unique_ptr<BrowserConnectionHandler> connection_handler_; |
149 std::unique_ptr<ThreadPipeManager> pipe_manager_; | 145 std::unique_ptr<ThreadPipeManager> pipe_manager_; |
150 base::Thread thread_; | 146 base::Thread thread_; |
151 | 147 |
152 std::unique_ptr<FakeFeature> input_feature_; | 148 std::unique_ptr<FakeFeature> input_feature_; |
153 std::unique_ptr<FakeFeature> tab_control_feature_; | 149 std::unique_ptr<FakeFeature> tab_control_feature_; |
154 }; | 150 }; |
155 | 151 |
156 // Features send out message and receive the same message due to | 152 // Features send out message and receive the same message due to |
157 // |FakeFeaturePeer| loops the message back on |thread_|. | 153 // |FakeFeaturePeer| loops the message back on |thread_|. |
158 TEST_F(ThreadPipeManagerTest, MessageSentIsReceived) { | 154 TEST_F(ThreadPipeManagerTest, MessageSentIsReceived) { |
159 std::unique_ptr<BlimpMessage> input_message = | 155 InputMessage* input; |
160 CreateMessage(BlimpMessage::INPUT); | 156 TabControlMessage* tab_control; |
Wez
2016/05/18 01:53:31
nit: Move this to come immediately before tab_cont
shaktisahu
2016/05/18 03:55:42
Done.
| |
157 std::unique_ptr<BlimpMessage> input_message = CreateBlimpMessage(&input); | |
161 std::unique_ptr<BlimpMessage> tab_control_message = | 158 std::unique_ptr<BlimpMessage> tab_control_message = |
162 CreateMessage(BlimpMessage::TAB_CONTROL); | 159 CreateBlimpMessage(&tab_control); |
163 | 160 |
164 EXPECT_CALL(*(input_feature_->incoming_message_processor()), | 161 EXPECT_CALL(*(input_feature_->incoming_message_processor()), |
165 MockableProcessMessage(EqualsProto(*input_message), _)) | 162 MockableProcessMessage(EqualsProto(*input_message), _)) |
166 .RetiresOnSaturation(); | 163 .RetiresOnSaturation(); |
167 EXPECT_CALL(*(tab_control_feature_->incoming_message_processor()), | 164 EXPECT_CALL(*(tab_control_feature_->incoming_message_processor()), |
168 MockableProcessMessage(EqualsProto(*tab_control_message), _)) | 165 MockableProcessMessage(EqualsProto(*tab_control_message), _)) |
169 .RetiresOnSaturation(); | 166 .RetiresOnSaturation(); |
170 | 167 |
171 net::TestCompletionCallback cb1; | 168 net::TestCompletionCallback cb1; |
172 input_feature_->outgoing_message_processor()->ProcessMessage( | 169 input_feature_->outgoing_message_processor()->ProcessMessage( |
173 std::move(input_message), cb1.callback()); | 170 std::move(input_message), cb1.callback()); |
174 net::TestCompletionCallback cb2; | 171 net::TestCompletionCallback cb2; |
175 tab_control_feature_->outgoing_message_processor()->ProcessMessage( | 172 tab_control_feature_->outgoing_message_processor()->ProcessMessage( |
176 std::move(tab_control_message), cb2.callback()); | 173 std::move(tab_control_message), cb2.callback()); |
177 | 174 |
178 EXPECT_EQ(net::OK, cb1.WaitForResult()); | 175 EXPECT_EQ(net::OK, cb1.WaitForResult()); |
179 EXPECT_EQ(net::OK, cb2.WaitForResult()); | 176 EXPECT_EQ(net::OK, cb2.WaitForResult()); |
180 } | 177 } |
181 | 178 |
182 } // namespace blimp | 179 } // namespace blimp |
OLD | NEW |