OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |