Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: blimp/net/thread_pipe_manager_unittest.cc

Issue 1933053003: Used oneof in blimp_message.proto (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added oneof to protocol_control.proto Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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,
Kevin M 2016/05/20 18:28:16 "type" - here and elsewhere
shaktisahu 2016/05/20 22:29:42 Done.
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 = nullptr;
160 CreateMessage(BlimpMessage::INPUT); 156 std::unique_ptr<BlimpMessage> input_message = CreateBlimpMessage(&input);
157 TabControlMessage* tab_control = nullptr;
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
OLDNEW
« blimp/net/thread_pipe_manager.h ('K') | « blimp/net/thread_pipe_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698