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

Side by Side Diff: components/update_client/request_sender_unittest.cc

Issue 1685323002: Implement CUP signing in UpdateClient. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase and remove duplicated code comment. Created 4 years, 10 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "base/macros.h" 5 #include "base/macros.h"
6 #include "base/memory/ref_counted.h" 6 #include "base/memory/ref_counted.h"
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/run_loop.h" 8 #include "base/run_loop.h"
9 #include "base/strings/string_util.h"
9 #include "base/thread_task_runner_handle.h" 10 #include "base/thread_task_runner_handle.h"
10 #include "components/update_client/request_sender.h" 11 #include "components/update_client/request_sender.h"
11 #include "components/update_client/test_configurator.h" 12 #include "components/update_client/test_configurator.h"
12 #include "components/update_client/url_request_post_interceptor.h" 13 #include "components/update_client/url_request_post_interceptor.h"
13 #include "net/url_request/url_fetcher.h" 14 #include "net/url_request/url_fetcher.h"
14 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
15 16
16 namespace update_client { 17 namespace update_client {
17 18
18 namespace { 19 namespace {
19 20
20 const char kUrl1[] = "https://localhost2/path1"; 21 const char kUrl1[] = "https://localhost2/path1";
21 const char kUrl2[] = "https://localhost2/path2"; 22 const char kUrl2[] = "https://localhost2/path2";
22 const char kUrlPath1[] = "path1"; 23 const char kUrlPath1[] = "path1";
23 const char kUrlPath2[] = "path2"; 24 const char kUrlPath2[] = "path2";
24 25
26 // TODO(sorin): refactor as a utility function for unit tests.
27 base::FilePath test_file(const char* file) {
28 base::FilePath path;
29 PathService::Get(base::DIR_SOURCE_ROOT, &path);
30 return path.AppendASCII("components")
31 .AppendASCII("test")
32 .AppendASCII("data")
33 .AppendASCII("update_client")
34 .AppendASCII(file);
35 }
36
25 } // namespace 37 } // namespace
26 38
27 class RequestSenderTest : public testing::Test { 39 class RequestSenderTest : public testing::Test {
28 public: 40 public:
29 RequestSenderTest(); 41 RequestSenderTest();
30 ~RequestSenderTest() override; 42 ~RequestSenderTest() override;
31 43
32 // Overrides from testing::Test. 44 // Overrides from testing::Test.
33 void SetUp() override; 45 void SetUp() override;
34 void TearDown() override; 46 void TearDown() override;
35 47
36 void RequestSenderComplete(const net::URLFetcher* source); 48 void RequestSenderComplete(int error, const std::string& response);
37 49
38 protected: 50 protected:
39 void Quit(); 51 void Quit();
40 void RunThreads(); 52 void RunThreads();
41 void RunThreadsUntilIdle(); 53 void RunThreadsUntilIdle();
42 54
43 scoped_refptr<TestConfigurator> config_; 55 scoped_refptr<TestConfigurator> config_;
44 scoped_ptr<RequestSender> request_sender_; 56 scoped_ptr<RequestSender> request_sender_;
45 scoped_ptr<InterceptorFactory> interceptor_factory_; 57 scoped_ptr<InterceptorFactory> interceptor_factory_;
46 58
47 URLRequestPostInterceptor* post_interceptor_1_; // Owned by the factory. 59 URLRequestPostInterceptor* post_interceptor_1_; // Owned by the factory.
48 URLRequestPostInterceptor* post_interceptor_2_; // Owned by the factory. 60 URLRequestPostInterceptor* post_interceptor_2_; // Owned by the factory.
49 61
50 const net::URLFetcher* url_fetcher_source_; 62 int error_;
63 std::string response_;
51 64
52 private: 65 private:
53 base::MessageLoopForIO loop_; 66 base::MessageLoopForIO loop_;
54 base::Closure quit_closure_; 67 base::Closure quit_closure_;
55 68
56 DISALLOW_COPY_AND_ASSIGN(RequestSenderTest); 69 DISALLOW_COPY_AND_ASSIGN(RequestSenderTest);
57 }; 70 };
58 71
59 RequestSenderTest::RequestSenderTest() 72 RequestSenderTest::RequestSenderTest()
60 : post_interceptor_1_(nullptr), 73 : post_interceptor_1_(nullptr), post_interceptor_2_(nullptr), error_(0) {}
61 post_interceptor_2_(nullptr),
62 url_fetcher_source_(nullptr) {
63 }
64 74
65 RequestSenderTest::~RequestSenderTest() { 75 RequestSenderTest::~RequestSenderTest() {}
66 }
67 76
68 void RequestSenderTest::SetUp() { 77 void RequestSenderTest::SetUp() {
69 config_ = new TestConfigurator(base::ThreadTaskRunnerHandle::Get(), 78 config_ = new TestConfigurator(base::ThreadTaskRunnerHandle::Get(),
70 base::ThreadTaskRunnerHandle::Get()); 79 base::ThreadTaskRunnerHandle::Get());
71 interceptor_factory_.reset( 80 interceptor_factory_.reset(
72 new InterceptorFactory(base::ThreadTaskRunnerHandle::Get())); 81 new InterceptorFactory(base::ThreadTaskRunnerHandle::Get()));
73 post_interceptor_1_ = 82 post_interceptor_1_ =
74 interceptor_factory_->CreateInterceptorForPath(kUrlPath1); 83 interceptor_factory_->CreateInterceptorForPath(kUrlPath1);
75 post_interceptor_2_ = 84 post_interceptor_2_ =
76 interceptor_factory_->CreateInterceptorForPath(kUrlPath2); 85 interceptor_factory_->CreateInterceptorForPath(kUrlPath2);
(...skipping 30 matching lines...) Expand all
107 116
108 void RequestSenderTest::RunThreadsUntilIdle() { 117 void RequestSenderTest::RunThreadsUntilIdle() {
109 base::RunLoop().RunUntilIdle(); 118 base::RunLoop().RunUntilIdle();
110 } 119 }
111 120
112 void RequestSenderTest::Quit() { 121 void RequestSenderTest::Quit() {
113 if (!quit_closure_.is_null()) 122 if (!quit_closure_.is_null())
114 quit_closure_.Run(); 123 quit_closure_.Run();
115 } 124 }
116 125
117 void RequestSenderTest::RequestSenderComplete(const net::URLFetcher* source) { 126 void RequestSenderTest::RequestSenderComplete(int error,
118 url_fetcher_source_ = source; 127 const std::string& response) {
128 error_ = error;
129 response_ = response;
130
119 Quit(); 131 Quit();
120 } 132 }
121 133
122 // Tests that when a request to the first url succeeds, the subsequent urls are 134 // Tests that when a request to the first url succeeds, the subsequent urls are
123 // not tried. 135 // not tried.
124 TEST_F(RequestSenderTest, RequestSendSuccess) { 136 TEST_F(RequestSenderTest, RequestSendSuccess) {
125 EXPECT_TRUE(post_interceptor_1_->ExpectRequest(new PartialMatch("test"))); 137 EXPECT_TRUE(post_interceptor_1_->ExpectRequest(
138 new PartialMatch("test"), test_file("updatecheck_reply_1.xml")));
126 139
127 std::vector<GURL> urls; 140 std::vector<GURL> urls;
128 urls.push_back(GURL(kUrl1)); 141 urls.push_back(GURL(kUrl1));
129 urls.push_back(GURL(kUrl2)); 142 urls.push_back(GURL(kUrl2));
130 request_sender_.reset(new RequestSender(config_)); 143 request_sender_.reset(new RequestSender(config_));
131 request_sender_->Send("test", urls, 144 request_sender_->Send(false, "test", urls,
132 base::Bind(&RequestSenderTest::RequestSenderComplete, 145 base::Bind(&RequestSenderTest::RequestSenderComplete,
133 base::Unretained(this))); 146 base::Unretained(this)));
134 RunThreads(); 147 RunThreads();
135 148
136 EXPECT_EQ(1, post_interceptor_1_->GetHitCount()) 149 EXPECT_EQ(1, post_interceptor_1_->GetHitCount())
137 << post_interceptor_1_->GetRequestsAsString(); 150 << post_interceptor_1_->GetRequestsAsString();
138 EXPECT_EQ(1, post_interceptor_1_->GetCount()) 151 EXPECT_EQ(1, post_interceptor_1_->GetCount())
139 << post_interceptor_1_->GetRequestsAsString(); 152 << post_interceptor_1_->GetRequestsAsString();
140 153
154 // Sanity check the request.
141 EXPECT_STREQ("test", post_interceptor_1_->GetRequests()[0].c_str()); 155 EXPECT_STREQ("test", post_interceptor_1_->GetRequests()[0].c_str());
142 EXPECT_EQ(GURL(kUrl1), url_fetcher_source_->GetOriginalURL()); 156
143 EXPECT_EQ(200, url_fetcher_source_->GetResponseCode()); 157 // Check the response post conditions.
158 EXPECT_EQ(0, error_);
159 EXPECT_TRUE(base::StartsWith(response_,
160 "<?xml version='1.0' encoding='UTF-8'?>",
161 base::CompareCase::SENSITIVE));
162 EXPECT_EQ(443ul, response_.size());
144 } 163 }
145 164
146 // Tests that the request succeeds using the second url after the first url 165 // Tests that the request succeeds using the second url after the first url
147 // has failed. 166 // has failed.
148 TEST_F(RequestSenderTest, RequestSendSuccessWithFallback) { 167 TEST_F(RequestSenderTest, RequestSendSuccessWithFallback) {
149 EXPECT_TRUE( 168 EXPECT_TRUE(
150 post_interceptor_1_->ExpectRequest(new PartialMatch("test"), 403)); 169 post_interceptor_1_->ExpectRequest(new PartialMatch("test"), 403));
151 EXPECT_TRUE(post_interceptor_2_->ExpectRequest(new PartialMatch("test"))); 170 EXPECT_TRUE(post_interceptor_2_->ExpectRequest(new PartialMatch("test")));
152 171
153 std::vector<GURL> urls; 172 std::vector<GURL> urls;
154 urls.push_back(GURL(kUrl1)); 173 urls.push_back(GURL(kUrl1));
155 urls.push_back(GURL(kUrl2)); 174 urls.push_back(GURL(kUrl2));
156 request_sender_.reset(new RequestSender(config_)); 175 request_sender_.reset(new RequestSender(config_));
157 request_sender_->Send("test", urls, 176 request_sender_->Send(false, "test", urls,
158 base::Bind(&RequestSenderTest::RequestSenderComplete, 177 base::Bind(&RequestSenderTest::RequestSenderComplete,
159 base::Unretained(this))); 178 base::Unretained(this)));
160 RunThreads(); 179 RunThreads();
161 180
162 EXPECT_EQ(1, post_interceptor_1_->GetHitCount()) 181 EXPECT_EQ(1, post_interceptor_1_->GetHitCount())
163 << post_interceptor_1_->GetRequestsAsString(); 182 << post_interceptor_1_->GetRequestsAsString();
164 EXPECT_EQ(1, post_interceptor_1_->GetCount()) 183 EXPECT_EQ(1, post_interceptor_1_->GetCount())
165 << post_interceptor_1_->GetRequestsAsString(); 184 << post_interceptor_1_->GetRequestsAsString();
166 EXPECT_EQ(1, post_interceptor_2_->GetHitCount()) 185 EXPECT_EQ(1, post_interceptor_2_->GetHitCount())
167 << post_interceptor_2_->GetRequestsAsString(); 186 << post_interceptor_2_->GetRequestsAsString();
168 EXPECT_EQ(1, post_interceptor_2_->GetCount()) 187 EXPECT_EQ(1, post_interceptor_2_->GetCount())
169 << post_interceptor_2_->GetRequestsAsString(); 188 << post_interceptor_2_->GetRequestsAsString();
170 189
171 EXPECT_STREQ("test", post_interceptor_1_->GetRequests()[0].c_str()); 190 EXPECT_STREQ("test", post_interceptor_1_->GetRequests()[0].c_str());
172 EXPECT_STREQ("test", post_interceptor_2_->GetRequests()[0].c_str()); 191 EXPECT_STREQ("test", post_interceptor_2_->GetRequests()[0].c_str());
173 EXPECT_EQ(GURL(kUrl2), url_fetcher_source_->GetOriginalURL()); 192 EXPECT_EQ(0, error_);
174 EXPECT_EQ(200, url_fetcher_source_->GetResponseCode());
175 } 193 }
176 194
177 // Tests that the request fails when both urls have failed. 195 // Tests that the request fails when both urls have failed.
178 TEST_F(RequestSenderTest, RequestSendFailed) { 196 TEST_F(RequestSenderTest, RequestSendFailed) {
179 EXPECT_TRUE( 197 EXPECT_TRUE(
180 post_interceptor_1_->ExpectRequest(new PartialMatch("test"), 403)); 198 post_interceptor_1_->ExpectRequest(new PartialMatch("test"), 403));
181 EXPECT_TRUE( 199 EXPECT_TRUE(
182 post_interceptor_2_->ExpectRequest(new PartialMatch("test"), 403)); 200 post_interceptor_2_->ExpectRequest(new PartialMatch("test"), 403));
183 201
184 std::vector<GURL> urls; 202 std::vector<GURL> urls;
185 urls.push_back(GURL(kUrl1)); 203 urls.push_back(GURL(kUrl1));
186 urls.push_back(GURL(kUrl2)); 204 urls.push_back(GURL(kUrl2));
187 request_sender_.reset(new RequestSender(config_)); 205 request_sender_.reset(new RequestSender(config_));
188 request_sender_->Send("test", urls, 206 request_sender_->Send(false, "test", urls,
189 base::Bind(&RequestSenderTest::RequestSenderComplete, 207 base::Bind(&RequestSenderTest::RequestSenderComplete,
190 base::Unretained(this))); 208 base::Unretained(this)));
191 RunThreads(); 209 RunThreads();
192 210
193 EXPECT_EQ(1, post_interceptor_1_->GetHitCount()) 211 EXPECT_EQ(1, post_interceptor_1_->GetHitCount())
194 << post_interceptor_1_->GetRequestsAsString(); 212 << post_interceptor_1_->GetRequestsAsString();
195 EXPECT_EQ(1, post_interceptor_1_->GetCount()) 213 EXPECT_EQ(1, post_interceptor_1_->GetCount())
196 << post_interceptor_1_->GetRequestsAsString(); 214 << post_interceptor_1_->GetRequestsAsString();
197 EXPECT_EQ(1, post_interceptor_2_->GetHitCount()) 215 EXPECT_EQ(1, post_interceptor_2_->GetHitCount())
198 << post_interceptor_2_->GetRequestsAsString(); 216 << post_interceptor_2_->GetRequestsAsString();
199 EXPECT_EQ(1, post_interceptor_2_->GetCount()) 217 EXPECT_EQ(1, post_interceptor_2_->GetCount())
200 << post_interceptor_2_->GetRequestsAsString(); 218 << post_interceptor_2_->GetRequestsAsString();
201 219
202 EXPECT_STREQ("test", post_interceptor_1_->GetRequests()[0].c_str()); 220 EXPECT_STREQ("test", post_interceptor_1_->GetRequests()[0].c_str());
203 EXPECT_STREQ("test", post_interceptor_2_->GetRequests()[0].c_str()); 221 EXPECT_STREQ("test", post_interceptor_2_->GetRequests()[0].c_str());
204 EXPECT_EQ(GURL(kUrl2), url_fetcher_source_->GetOriginalURL()); 222 EXPECT_EQ(403, error_);
205 EXPECT_EQ(403, url_fetcher_source_->GetResponseCode());
206 } 223 }
207 224
208 // Tests that the request fails when no urls are provided. 225 // Tests that the request fails when no urls are provided.
209 TEST_F(RequestSenderTest, RequestSendFailedNoUrls) { 226 TEST_F(RequestSenderTest, RequestSendFailedNoUrls) {
210 std::vector<GURL> urls; 227 std::vector<GURL> urls;
211 request_sender_.reset(new RequestSender(config_)); 228 request_sender_.reset(new RequestSender(config_));
212 request_sender_->Send("test", urls, 229 request_sender_->Send(false, "test", urls,
213 base::Bind(&RequestSenderTest::RequestSenderComplete, 230 base::Bind(&RequestSenderTest::RequestSenderComplete,
214 base::Unretained(this))); 231 base::Unretained(this)));
215 RunThreads(); 232 RunThreads();
216 233
217 EXPECT_EQ(nullptr, url_fetcher_source_); 234 EXPECT_EQ(-1, error_);
235 }
236
237 // Tests that a CUP request fails if the response is not signed.
238 TEST_F(RequestSenderTest, RequestSendCupError) {
239 EXPECT_TRUE(post_interceptor_1_->ExpectRequest(
240 new PartialMatch("test"), test_file("updatecheck_reply_1.xml")));
241
242 std::vector<GURL> urls;
243 urls.push_back(GURL(kUrl1));
244 request_sender_.reset(new RequestSender(config_));
245 request_sender_->Send(true, "test", urls,
246 base::Bind(&RequestSenderTest::RequestSenderComplete,
247 base::Unretained(this)));
248 RunThreads();
249
250 EXPECT_EQ(1, post_interceptor_1_->GetHitCount())
251 << post_interceptor_1_->GetRequestsAsString();
252 EXPECT_EQ(1, post_interceptor_1_->GetCount())
253 << post_interceptor_1_->GetRequestsAsString();
254
255 EXPECT_STREQ("test", post_interceptor_1_->GetRequests()[0].c_str());
256 EXPECT_EQ(RequestSender::kErrorResponseNotTrusted, error_);
257 EXPECT_TRUE(response_.empty());
218 } 258 }
219 259
220 } // namespace update_client 260 } // namespace update_client
OLDNEW
« no previous file with comments | « components/update_client/request_sender.cc ('k') | components/update_client/test_configurator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698