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

Side by Side Diff: http_fetcher_unittest.cc

Issue 5835004: AU: MultiHttpFetcher cleanup/rewrite (Closed) Base URL: http://git.chromium.org/git/update_engine.git@master
Patch Set: Created 10 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium OS 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 <unistd.h> 5 #include <unistd.h>
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
11 #include <base/logging.h> 11 #include <base/logging.h>
12 #include <base/scoped_ptr.h> 12 #include <base/scoped_ptr.h>
13 #include <base/string_util.h> 13 #include <base/string_util.h>
14 #include <glib.h> 14 #include <glib.h>
15 #include <gtest/gtest.h> 15 #include <gtest/gtest.h>
16 16
17 #include "update_engine/libcurl_http_fetcher.h" 17 #include "update_engine/libcurl_http_fetcher.h"
18 #include "update_engine/mock_http_fetcher.h" 18 #include "update_engine/mock_http_fetcher.h"
19 #include "update_engine/multi_http_fetcher.h" 19 #include "update_engine/multi_range_http_fetcher.h"
20 #include "update_engine/proxy_resolver.h" 20 #include "update_engine/proxy_resolver.h"
21 21
22 using std::make_pair; 22 using std::make_pair;
23 using std::string; 23 using std::string;
24 using std::vector; 24 using std::vector;
25 25
26 namespace chromeos_update_engine { 26 namespace chromeos_update_engine {
27 27
28 namespace { 28 namespace {
29 // WARNING, if you update these, you must also update test_http_server.cc. 29 // WARNING, if you update these, you must also update test_http_server.cc.
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 bool IsMulti() const { return false; } 163 bool IsMulti() const { return false; }
164 typedef PythonHttpServer HttpServer; 164 typedef PythonHttpServer HttpServer;
165 void IgnoreServerAborting(HttpServer* server) const { 165 void IgnoreServerAborting(HttpServer* server) const {
166 PythonHttpServer *pyserver = reinterpret_cast<PythonHttpServer*>(server); 166 PythonHttpServer *pyserver = reinterpret_cast<PythonHttpServer*>(server);
167 pyserver->validate_quit_ = false; 167 pyserver->validate_quit_ = false;
168 } 168 }
169 DirectProxyResolver proxy_resolver_; 169 DirectProxyResolver proxy_resolver_;
170 }; 170 };
171 171
172 template <> 172 template <>
173 class HttpFetcherTest<MultiHttpFetcher<LibcurlHttpFetcher> > 173 class HttpFetcherTest<MultiRangeHTTPFetcher>
174 : public HttpFetcherTest<LibcurlHttpFetcher> { 174 : public HttpFetcherTest<LibcurlHttpFetcher> {
175 public: 175 public:
176 HttpFetcher* NewLargeFetcher() { 176 HttpFetcher* NewLargeFetcher() {
177 MultiHttpFetcher<LibcurlHttpFetcher> *ret = 177 ProxyResolver* resolver =
178 new MultiHttpFetcher<LibcurlHttpFetcher>( 178 reinterpret_cast<ProxyResolver*>(&proxy_resolver_);
179 reinterpret_cast<ProxyResolver*>(&proxy_resolver_)); 179 MultiRangeHTTPFetcher *ret =
180 MultiHttpFetcher<LibcurlHttpFetcher>::RangesVect 180 new MultiRangeHTTPFetcher(new LibcurlHttpFetcher(resolver));
181 MultiRangeHTTPFetcher::RangesVect
181 ranges(1, make_pair(0, -1)); 182 ranges(1, make_pair(0, -1));
182 ret->set_ranges(ranges); 183 ret->set_ranges(ranges);
183 // Speed up test execution. 184 // Speed up test execution.
184 ret->set_idle_seconds(1); 185 ret->set_idle_seconds(1);
185 ret->set_retry_seconds(1); 186 ret->set_retry_seconds(1);
186 ret->SetConnectionAsExpensive(false); 187 ret->SetConnectionAsExpensive(false);
187 ret->SetBuildType(false); 188 ret->SetBuildType(false);
188 return ret; 189 return ret;
189 } 190 }
190 bool IsMulti() const { return true; } 191 bool IsMulti() const { return true; }
191 DirectProxyResolver proxy_resolver_; 192 DirectProxyResolver proxy_resolver_;
192 }; 193 };
193 194
194 typedef ::testing::Types<LibcurlHttpFetcher, 195 typedef ::testing::Types<LibcurlHttpFetcher,
195 MockHttpFetcher, 196 MockHttpFetcher,
196 MultiHttpFetcher<LibcurlHttpFetcher> > 197 MultiRangeHTTPFetcher>
197 HttpFetcherTestTypes; 198 HttpFetcherTestTypes;
198 TYPED_TEST_CASE(HttpFetcherTest, HttpFetcherTestTypes); 199 TYPED_TEST_CASE(HttpFetcherTest, HttpFetcherTestTypes);
199 200
200 namespace { 201 namespace {
201 class HttpFetcherTestDelegate : public HttpFetcherDelegate { 202 class HttpFetcherTestDelegate : public HttpFetcherDelegate {
202 public: 203 public:
203 virtual void ReceivedBytes(HttpFetcher* fetcher, 204 virtual void ReceivedBytes(HttpFetcher* fetcher,
204 const char* bytes, int length) { 205 const char* bytes, int length) {
205 char str[length + 1]; 206 char str[length + 1];
206 memset(str, 0, length + 1); 207 memset(str, 0, length + 1);
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 ADD_FAILURE(); 645 ADD_FAILURE();
645 } 646 }
646 scoped_ptr<HttpFetcher> fetcher_; 647 scoped_ptr<HttpFetcher> fetcher_;
647 int expected_response_code_; 648 int expected_response_code_;
648 string data; 649 string data;
649 GMainLoop* loop_; 650 GMainLoop* loop_;
650 }; 651 };
651 652
652 void MultiTest(HttpFetcher* fetcher_in, 653 void MultiTest(HttpFetcher* fetcher_in,
653 const string& url, 654 const string& url,
654 const MultiHttpFetcher<LibcurlHttpFetcher>::RangesVect& ranges, 655 const MultiRangeHTTPFetcher::RangesVect& ranges,
655 const string& expected_prefix, 656 const string& expected_prefix,
656 off_t expected_size, 657 off_t expected_size,
657 int expected_response_code) { 658 int expected_response_code) {
658 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); 659 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
659 { 660 {
660 MultiHttpFetcherTestDelegate delegate(expected_response_code); 661 MultiHttpFetcherTestDelegate delegate(expected_response_code);
661 delegate.loop_ = loop; 662 delegate.loop_ = loop;
662 delegate.fetcher_.reset(fetcher_in); 663 delegate.fetcher_.reset(fetcher_in);
663 MultiHttpFetcher<LibcurlHttpFetcher>* multi_fetcher = 664 MultiRangeHTTPFetcher* multi_fetcher =
664 dynamic_cast<MultiHttpFetcher<LibcurlHttpFetcher>*>(fetcher_in); 665 dynamic_cast<MultiRangeHTTPFetcher*>(fetcher_in);
665 ASSERT_TRUE(multi_fetcher); 666 ASSERT_TRUE(multi_fetcher);
666 multi_fetcher->set_ranges(ranges); 667 multi_fetcher->set_ranges(ranges);
667 multi_fetcher->SetConnectionAsExpensive(false); 668 multi_fetcher->SetConnectionAsExpensive(false);
668 multi_fetcher->SetBuildType(false); 669 multi_fetcher->SetBuildType(false);
669 multi_fetcher->set_delegate(&delegate); 670 multi_fetcher->set_delegate(&delegate);
670 671
671 StartTransferArgs start_xfer_args = {multi_fetcher, url}; 672 StartTransferArgs start_xfer_args = {multi_fetcher, url};
672 673
673 g_timeout_add(0, StartTransfer, &start_xfer_args); 674 g_timeout_add(0, StartTransfer, &start_xfer_args);
674 g_main_loop_run(loop); 675 g_main_loop_run(loop);
675 676
676 EXPECT_EQ(expected_size, delegate.data.size()); 677 EXPECT_EQ(expected_size, delegate.data.size());
677 EXPECT_EQ(expected_prefix, 678 EXPECT_EQ(expected_prefix,
678 string(delegate.data.data(), expected_prefix.size())); 679 string(delegate.data.data(), expected_prefix.size()));
679 } 680 }
680 g_main_loop_unref(loop); 681 g_main_loop_unref(loop);
681 } 682 }
682 } // namespace {} 683 } // namespace {}
683 684
684 TYPED_TEST(HttpFetcherTest, MultiHttpFetcherSimpleTest) { 685 TYPED_TEST(HttpFetcherTest, MultiHttpFetcherSimpleTest) {
685 if (!this->IsMulti()) 686 if (!this->IsMulti())
686 return; 687 return;
687 typename TestFixture::HttpServer server; 688 typename TestFixture::HttpServer server;
688 ASSERT_TRUE(server.started_); 689 ASSERT_TRUE(server.started_);
689 690
690 MultiHttpFetcher<LibcurlHttpFetcher>::RangesVect ranges; 691 MultiRangeHTTPFetcher::RangesVect ranges;
691 ranges.push_back(make_pair(0, 25)); 692 ranges.push_back(make_pair(0, 25));
692 ranges.push_back(make_pair(99, -1)); 693 ranges.push_back(make_pair(99, -1));
693 MultiTest(this->NewLargeFetcher(), 694 MultiTest(this->NewLargeFetcher(),
694 this->BigUrl(), 695 this->BigUrl(),
695 ranges, 696 ranges,
696 "abcdefghijabcdefghijabcdejabcdefghijabcdef", 697 "abcdefghijabcdefghijabcdejabcdefghijabcdef",
697 kBigSize - (99 - 25), 698 kBigSize - (99 - 25),
698 206); 699 206);
699 } 700 }
700 701
701 TYPED_TEST(HttpFetcherTest, MultiHttpFetcherLengthLimitTest) { 702 TYPED_TEST(HttpFetcherTest, MultiHttpFetcherLengthLimitTest) {
702 if (!this->IsMulti()) 703 if (!this->IsMulti())
703 return; 704 return;
704 typename TestFixture::HttpServer server; 705 typename TestFixture::HttpServer server;
705 ASSERT_TRUE(server.started_); 706 ASSERT_TRUE(server.started_);
706 707
707 MultiHttpFetcher<LibcurlHttpFetcher>::RangesVect ranges; 708 MultiRangeHTTPFetcher::RangesVect ranges;
708 ranges.push_back(make_pair(0, 24)); 709 ranges.push_back(make_pair(0, 24));
709 MultiTest(this->NewLargeFetcher(), 710 MultiTest(this->NewLargeFetcher(),
710 this->BigUrl(), 711 this->BigUrl(),
711 ranges, 712 ranges,
712 "abcdefghijabcdefghijabcd", 713 "abcdefghijabcdefghijabcd",
713 24, 714 24,
714 200); 715 200);
715 } 716 }
716 717
717 TYPED_TEST(HttpFetcherTest, MultiHttpFetcherMultiEndTest) { 718 TYPED_TEST(HttpFetcherTest, MultiHttpFetcherMultiEndTest) {
718 if (!this->IsMulti()) 719 if (!this->IsMulti())
719 return; 720 return;
720 typename TestFixture::HttpServer server; 721 typename TestFixture::HttpServer server;
721 ASSERT_TRUE(server.started_); 722 ASSERT_TRUE(server.started_);
722 723
723 MultiHttpFetcher<LibcurlHttpFetcher>::RangesVect ranges; 724 MultiRangeHTTPFetcher::RangesVect ranges;
724 ranges.push_back(make_pair(kBigSize - 2, -1)); 725 ranges.push_back(make_pair(kBigSize - 2, -1));
725 ranges.push_back(make_pair(kBigSize - 3, -1)); 726 ranges.push_back(make_pair(kBigSize - 3, -1));
726 MultiTest(this->NewLargeFetcher(), 727 MultiTest(this->NewLargeFetcher(),
727 this->BigUrl(), 728 this->BigUrl(),
728 ranges, 729 ranges,
729 "ijhij", 730 "ijhij",
730 5, 731 5,
731 206); 732 206);
732 } 733 }
733 734
734 TYPED_TEST(HttpFetcherTest, MultiHttpFetcherInsufficientTest) { 735 TYPED_TEST(HttpFetcherTest, MultiHttpFetcherInsufficientTest) {
735 if (!this->IsMulti()) 736 if (!this->IsMulti())
736 return; 737 return;
737 typename TestFixture::HttpServer server; 738 typename TestFixture::HttpServer server;
738 ASSERT_TRUE(server.started_); 739 ASSERT_TRUE(server.started_);
739 740
740 MultiHttpFetcher<LibcurlHttpFetcher>::RangesVect ranges; 741 MultiRangeHTTPFetcher::RangesVect ranges;
741 ranges.push_back(make_pair(kBigSize - 2, 4)); 742 ranges.push_back(make_pair(kBigSize - 2, 4));
742 for (int i = 0; i < 2; ++i) { 743 for (int i = 0; i < 2; ++i) {
744 LOG(INFO) << "i = " << i;
743 MultiTest(this->NewLargeFetcher(), 745 MultiTest(this->NewLargeFetcher(),
744 this->BigUrl(), 746 this->BigUrl(),
745 ranges, 747 ranges,
746 "ij", 748 "ij",
747 2, 749 2,
748 0); 750 0);
749 ranges.push_back(make_pair(0, 5)); 751 ranges.push_back(make_pair(0, 5));
750 } 752 }
751 } 753 }
752 754
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 StartTransferArgs start_xfer_args = 798 StartTransferArgs start_xfer_args =
797 { fetcher.get(), LocalServerUrlForPath(this->SmallUrl()) }; 799 { fetcher.get(), LocalServerUrlForPath(this->SmallUrl()) };
798 800
799 g_timeout_add(0, StartTransfer, &start_xfer_args); 801 g_timeout_add(0, StartTransfer, &start_xfer_args);
800 g_main_loop_run(loop); 802 g_main_loop_run(loop);
801 g_main_loop_unref(loop); 803 g_main_loop_unref(loop);
802 } 804 }
803 } 805 }
804 806
805 } // namespace chromeos_update_engine 807 } // namespace chromeos_update_engine
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698