| 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 |