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

Side by Side Diff: content/child/url_response_body_consumer_unittest.cc

Issue 1970693002: Use mojo for Chrome Loading, Part 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "content/child/url_response_body_consumer.h"
6
7 #include "base/bind.h"
8 #include "base/callback_forward.h"
9 #include "base/macros.h"
10 #include "base/memory/ptr_util.h"
11 #include "base/run_loop.h"
12 #include "content/child/request_info.h"
13 #include "content/child/resource_dispatcher.h"
14 #include "content/common/resource_messages.h"
15 #include "content/common/resource_request_completion_status.h"
16 #include "content/public/child/request_peer.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18
19 namespace content {
20
21 namespace {
22
23 class TestRequestPeer : public RequestPeer {
24 public:
25 struct Context;
26 explicit TestRequestPeer(Context* context)
27 : context_(context) {}
28
29 void OnUploadProgress(uint64_t position, uint64_t size) override {
30 EXPECT_TRUE(false);
31 }
32
33 bool OnReceivedRedirect(const net::RedirectInfo& redirect_info,
34 const ResourceResponseInfo& info) override {
35 EXPECT_TRUE(false);
36 return false;
37 }
38
39 void OnReceivedResponse(const ResourceResponseInfo& info) override {
40 EXPECT_TRUE(false);
41 }
42
43 void OnDownloadedData(int len, int encoded_data_length) override {
44 EXPECT_TRUE(false);
45 }
46
47 void OnReceivedData(std::unique_ptr<ReceivedData> data) override {
48 EXPECT_FALSE(context_->complete);
49 context_->data.append(data->payload(), data->length());
50 context_->run_loop_quit_closure.Run();
51 }
52
53 void OnCompletedRequest(int error_code,
54 bool was_ignored_by_handler,
55 bool stale_copy_in_cache,
56 const std::string& security_info,
57 const base::TimeTicks& completion_time,
58 int64_t total_transfer_size) override {
59 EXPECT_FALSE(context_->complete);
60 context_->complete = true;
61 context_->error_code = error_code;
62 context_->run_loop_quit_closure.Run();
63 }
64
65 struct Context {
66 // Data received. If downloading to file, remains empty.
67 std::string data;
68 bool complete = false;
69 base::Closure run_loop_quit_closure;
70 int error_code = net::OK;
71 };
72
73 private:
74 Context* context_;
75
76 DISALLOW_COPY_AND_ASSIGN(TestRequestPeer);
77 };
78
79 class URLResponseBodyConsumerTest : public ::testing::Test,
80 public ::IPC::Sender {
81 protected:
82 URLResponseBodyConsumerTest()
83 : dispatcher_(new ResourceDispatcher(this, message_loop_.task_runner())) {
84 }
85
86 ~URLResponseBodyConsumerTest() override {
87 dispatcher_.reset();
88 base::RunLoop().RunUntilIdle();
89 }
90
91 bool Send(IPC::Message* message) override {
92 delete message;
93 return true;
94 }
95
96 std::unique_ptr<RequestInfo> CreateRequestInfo() {
97 std::unique_ptr<RequestInfo> request_info(new RequestInfo);
98 request_info->method = "GET";
99 request_info->url = GURL("http://www.example.com/");
100 return request_info;
101 }
102
103 MojoCreateDataPipeOptions CreateDataPipeOptions() {
104 MojoCreateDataPipeOptions options;
105 options.struct_size = sizeof(MojoCreateDataPipeOptions);
106 options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
107 options.element_num_bytes = 1;
108 options.capacity_num_bytes = 1024;
109 return options;
110 }
111
112 void Run(TestRequestPeer::Context* context) {
113 base::RunLoop run_loop;
114 context->run_loop_quit_closure = run_loop.QuitClosure();
115 run_loop.Run();
116 }
117
118 base::MessageLoop message_loop_;
119 std::unique_ptr<ResourceDispatcher> dispatcher_;
120 static const MojoWriteDataFlags kNone = MOJO_WRITE_DATA_FLAG_NONE;
121 };
122
123 TEST_F(URLResponseBodyConsumerTest, ReceiveData) {
124 TestRequestPeer::Context context;
125 std::unique_ptr<RequestInfo> request_info(CreateRequestInfo());
126 int request_id = dispatcher_->StartAsync(
127 *request_info, nullptr,
128 base::WrapUnique(new TestRequestPeer(&context)),
129 nullptr);
130 mojo::DataPipe data_pipe(CreateDataPipeOptions());
131
132 scoped_refptr<URLResponseBodyConsumer> consumer(new URLResponseBodyConsumer(
133 request_id, dispatcher_.get(), std::move(data_pipe.consumer_handle)));
134
135 mojo::ScopedDataPipeProducerHandle writer =
136 std::move(data_pipe.producer_handle);
137 std::string buffer = "hello";
138 uint32_t size = buffer.size();
139 MojoResult result =
140 mojo::WriteDataRaw(writer.get(), buffer.c_str(), &size, kNone);
141 ASSERT_EQ(MOJO_RESULT_OK, result);
142 ASSERT_EQ(buffer.size(), size);
143
144 Run(&context);
145
146 EXPECT_FALSE(context.complete);
147 EXPECT_EQ("hello", context.data);
148 }
149
150 TEST_F(URLResponseBodyConsumerTest, OnCompleteThenClose) {
151 TestRequestPeer::Context context;
152 std::unique_ptr<RequestInfo> request_info(CreateRequestInfo());
153 int request_id = dispatcher_->StartAsync(
154 *request_info, nullptr,
155 base::WrapUnique(new TestRequestPeer(&context)),
156 nullptr);
157 mojo::DataPipe data_pipe(CreateDataPipeOptions());
158
159 scoped_refptr<URLResponseBodyConsumer> consumer(new URLResponseBodyConsumer(
160 request_id, dispatcher_.get(), std::move(data_pipe.consumer_handle)));
161
162 consumer->OnComplete(ResourceRequestCompletionStatus());
163 mojo::ScopedDataPipeProducerHandle writer =
164 std::move(data_pipe.producer_handle);
165 std::string buffer = "hello";
166 uint32_t size = buffer.size();
167 MojoResult result =
168 mojo::WriteDataRaw(writer.get(), buffer.c_str(), &size, kNone);
169 ASSERT_EQ(MOJO_RESULT_OK, result);
170 ASSERT_EQ(buffer.size(), size);
171 writer.reset();
172
173 Run(&context);
174
175 EXPECT_FALSE(context.complete);
176 EXPECT_EQ("hello", context.data);
177
178 Run(&context);
179
180 EXPECT_TRUE(context.complete);
181 EXPECT_EQ("hello", context.data);
182 }
183
184 TEST_F(URLResponseBodyConsumerTest, CloseThenOnComplete) {
185 TestRequestPeer::Context context;
186 std::unique_ptr<RequestInfo> request_info(CreateRequestInfo());
187 int request_id = dispatcher_->StartAsync(
188 *request_info, nullptr,
189 base::WrapUnique(new TestRequestPeer(&context)),
190 nullptr);
191 mojo::DataPipe data_pipe(CreateDataPipeOptions());
192
193 scoped_refptr<URLResponseBodyConsumer> consumer(new URLResponseBodyConsumer(
194 request_id, dispatcher_.get(), std::move(data_pipe.consumer_handle)));
195
196 ResourceRequestCompletionStatus status;
197 status.error_code = net::ERR_FAILED;
198 data_pipe.producer_handle.reset();
199 consumer->OnComplete(status);
200
201 Run(&context);
202
203 EXPECT_TRUE(context.complete);
204 EXPECT_EQ(net::ERR_FAILED, context.error_code);
205 EXPECT_EQ("", context.data);
206 }
207
208 } // namespace
209
210 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698