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

Side by Side Diff: net/url_request/url_fetcher_impl_unittest.cc

Issue 12210088: Make the TestServer use an absolute document root path. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: testserver uses absolute docroot path Created 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "net/url_request/url_fetcher_impl.h" 5 #include "net/url_request/url_fetcher_impl.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 23 matching lines...) Expand all
34 namespace net { 34 namespace net {
35 35
36 using base::Time; 36 using base::Time;
37 using base::TimeDelta; 37 using base::TimeDelta;
38 38
39 // TODO(eroman): Add a regression test for http://crbug.com/40505. 39 // TODO(eroman): Add a regression test for http://crbug.com/40505.
40 40
41 namespace { 41 namespace {
42 42
43 // TODO(akalin): Move all the test data to somewhere under net/. 43 // TODO(akalin): Move all the test data to somewhere under net/.
44 const base::FilePath::CharType kDocRoot[] =
45 FILE_PATH_LITERAL("chrome/test/data");
46 const char kTestServerFilePrefix[] = "files/"; 44 const char kTestServerFilePrefix[] = "files/";
47 45
48 class ThrottlingTestURLRequestContext : public TestURLRequestContext { 46 class ThrottlingTestURLRequestContext : public TestURLRequestContext {
49 public: 47 public:
50 ThrottlingTestURLRequestContext() : TestURLRequestContext(true) { 48 ThrottlingTestURLRequestContext() : TestURLRequestContext(true) {
51 set_throttler_manager(&throttler_manager_); 49 set_throttler_manager(&throttler_manager_);
52 Init(); 50 Init();
53 DCHECK(throttler_manager() != NULL); 51 DCHECK(throttler_manager() != NULL);
54 } 52 }
55 53
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 193
196 resolver_.set_ondemand_mode(true); 194 resolver_.set_ondemand_mode(true);
197 resolver_.rules()->AddRule("example.com", "127.0.0.1"); 195 resolver_.rules()->AddRule("example.com", "127.0.0.1");
198 196
199 context_.reset(new TestURLRequestContext(true)); 197 context_.reset(new TestURLRequestContext(true));
200 context_->set_host_resolver(&resolver_); 198 context_->set_host_resolver(&resolver_);
201 context_->Init(); 199 context_->Init();
202 200
203 test_server_.reset(new TestServer(TestServer::TYPE_HTTP, 201 test_server_.reset(new TestServer(TestServer::TYPE_HTTP,
204 TestServer::kLocalhost, 202 TestServer::kLocalhost,
205 base::FilePath(kDocRoot))); 203 TestServer::GetTestDataPath()));
206 ASSERT_TRUE(test_server_->Start()); 204 ASSERT_TRUE(test_server_->Start());
207 205
208 // test_server_.GetURL() returns a URL with 127.0.0.1 (kLocalhost), that is 206 // test_server_.GetURL() returns a URL with 127.0.0.1 (kLocalhost), that is
209 // immediately resolved by the MockHostResolver. Use a hostname instead to 207 // immediately resolved by the MockHostResolver. Use a hostname instead to
210 // trigger an async resolve. 208 // trigger an async resolve.
211 test_url_ = GURL( 209 test_url_ = GURL(
212 base::StringPrintf("http://example.com:%d/defaultresponse", 210 base::StringPrintf("http://example.com:%d/defaultresponse",
213 test_server_->host_port_pair().port())); 211 test_server_->host_port_pair().port()));
214 ASSERT_TRUE(test_url_.is_valid()); 212 ASSERT_TRUE(test_url_.is_valid());
215 } 213 }
(...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after
871 base::PlatformFileError error_code = base::PLATFORM_FILE_OK; 869 base::PlatformFileError error_code = base::PLATFORM_FILE_OK;
872 EXPECT_TRUE(fetcher_->FileErrorOccurred(&error_code)); 870 EXPECT_TRUE(fetcher_->FileErrorOccurred(&error_code));
873 EXPECT_EQ(expected_file_error_, error_code); 871 EXPECT_EQ(expected_file_error_, error_code);
874 } 872 }
875 CleanupAfterFetchComplete(); 873 CleanupAfterFetchComplete();
876 } 874 }
877 875
878 TEST_F(URLFetcherTest, SameThreadsTest) { 876 TEST_F(URLFetcherTest, SameThreadsTest) {
879 TestServer test_server(TestServer::TYPE_HTTP, 877 TestServer test_server(TestServer::TYPE_HTTP,
880 TestServer::kLocalhost, 878 TestServer::kLocalhost,
881 base::FilePath(kDocRoot)); 879 TestServer::GetTestDataPath());
882 ASSERT_TRUE(test_server.Start()); 880 ASSERT_TRUE(test_server.Start());
883 881
884 // Create the fetcher on the main thread. Since IO will happen on the main 882 // Create the fetcher on the main thread. Since IO will happen on the main
885 // thread, this will test URLFetcher's ability to do everything on one 883 // thread, this will test URLFetcher's ability to do everything on one
886 // thread. 884 // thread.
887 CreateFetcher(test_server.GetURL("defaultresponse")); 885 CreateFetcher(test_server.GetURL("defaultresponse"));
888 886
889 MessageLoop::current()->Run(); 887 MessageLoop::current()->Run();
890 } 888 }
891 889
892 TEST_F(URLFetcherTest, DifferentThreadsTest) { 890 TEST_F(URLFetcherTest, DifferentThreadsTest) {
893 TestServer test_server(TestServer::TYPE_HTTP, 891 TestServer test_server(TestServer::TYPE_HTTP,
894 TestServer::kLocalhost, 892 TestServer::kLocalhost,
895 base::FilePath(kDocRoot)); 893 TestServer::GetTestDataPath());
896 ASSERT_TRUE(test_server.Start()); 894 ASSERT_TRUE(test_server.Start());
897 895
898 // Create a separate thread that will create the URLFetcher. The current 896 // Create a separate thread that will create the URLFetcher. The current
899 // (main) thread will do the IO, and when the fetch is complete it will 897 // (main) thread will do the IO, and when the fetch is complete it will
900 // terminate the main thread's message loop; then the other thread's 898 // terminate the main thread's message loop; then the other thread's
901 // message loop will be shut down automatically as the thread goes out of 899 // message loop will be shut down automatically as the thread goes out of
902 // scope. 900 // scope.
903 base::Thread t("URLFetcher test thread"); 901 base::Thread t("URLFetcher test thread");
904 ASSERT_TRUE(t.Start()); 902 ASSERT_TRUE(t.Start());
905 t.message_loop()->PostTask( 903 t.message_loop()->PostTask(
906 FROM_HERE, 904 FROM_HERE,
907 base::Bind(&URLFetcherTest::CreateFetcher, 905 base::Bind(&URLFetcherTest::CreateFetcher,
908 base::Unretained(this), 906 base::Unretained(this),
909 test_server.GetURL("defaultresponse"))); 907 test_server.GetURL("defaultresponse")));
910 908
911 MessageLoop::current()->Run(); 909 MessageLoop::current()->Run();
912 } 910 }
913 911
914 void CancelAllOnIO() { 912 void CancelAllOnIO() {
915 EXPECT_EQ(1, URLFetcherTest::GetNumFetcherCores()); 913 EXPECT_EQ(1, URLFetcherTest::GetNumFetcherCores());
916 URLFetcherImpl::CancelAll(); 914 URLFetcherImpl::CancelAll();
917 EXPECT_EQ(0, URLFetcherTest::GetNumFetcherCores()); 915 EXPECT_EQ(0, URLFetcherTest::GetNumFetcherCores());
918 } 916 }
919 917
920 // Tests to make sure CancelAll() will successfully cancel existing URLFetchers. 918 // Tests to make sure CancelAll() will successfully cancel existing URLFetchers.
921 TEST_F(URLFetcherTest, CancelAll) { 919 TEST_F(URLFetcherTest, CancelAll) {
922 TestServer test_server(TestServer::TYPE_HTTP, 920 TestServer test_server(TestServer::TYPE_HTTP,
923 TestServer::kLocalhost, 921 TestServer::kLocalhost,
924 base::FilePath(kDocRoot)); 922 TestServer::GetTestDataPath());
925 ASSERT_TRUE(test_server.Start()); 923 ASSERT_TRUE(test_server.Start());
926 EXPECT_EQ(0, GetNumFetcherCores()); 924 EXPECT_EQ(0, GetNumFetcherCores());
927 925
928 CreateFetcher(test_server.GetURL("defaultresponse")); 926 CreateFetcher(test_server.GetURL("defaultresponse"));
929 io_message_loop_proxy()->PostTaskAndReply( 927 io_message_loop_proxy()->PostTaskAndReply(
930 FROM_HERE, 928 FROM_HERE,
931 base::Bind(&CancelAllOnIO), 929 base::Bind(&CancelAllOnIO),
932 MessageLoop::QuitClosure()); 930 MessageLoop::QuitClosure());
933 MessageLoop::current()->Run(); 931 MessageLoop::current()->Run();
934 EXPECT_EQ(0, GetNumFetcherCores()); 932 EXPECT_EQ(0, GetNumFetcherCores());
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 ASSERT_TRUE(completed_fetcher_); 1037 ASSERT_TRUE(completed_fetcher_);
1040 1038
1041 // This time the request succeeded. 1039 // This time the request succeeded.
1042 EXPECT_EQ(OK, completed_fetcher_->GetStatus().error()); 1040 EXPECT_EQ(OK, completed_fetcher_->GetStatus().error());
1043 EXPECT_EQ(200, completed_fetcher_->GetResponseCode()); 1041 EXPECT_EQ(200, completed_fetcher_->GetResponseCode());
1044 } 1042 }
1045 1043
1046 TEST_F(URLFetcherPostTest, Basic) { 1044 TEST_F(URLFetcherPostTest, Basic) {
1047 TestServer test_server(TestServer::TYPE_HTTP, 1045 TestServer test_server(TestServer::TYPE_HTTP,
1048 TestServer::kLocalhost, 1046 TestServer::kLocalhost,
1049 base::FilePath(kDocRoot)); 1047 TestServer::GetTestDataPath());
1050 ASSERT_TRUE(test_server.Start()); 1048 ASSERT_TRUE(test_server.Start());
1051 1049
1052 CreateFetcher(test_server.GetURL("echo")); 1050 CreateFetcher(test_server.GetURL("echo"));
1053 MessageLoop::current()->Run(); 1051 MessageLoop::current()->Run();
1054 } 1052 }
1055 1053
1056 TEST_F(URLFetcherPostFileTest, Basic) { 1054 TEST_F(URLFetcherPostFileTest, Basic) {
1057 TestServer test_server(TestServer::TYPE_HTTP, 1055 TestServer test_server(TestServer::TYPE_HTTP,
1058 TestServer::kLocalhost, 1056 TestServer::kLocalhost,
1059 base::FilePath(kDocRoot)); 1057 TestServer::GetTestDataPath());
1060 ASSERT_TRUE(test_server.Start()); 1058 ASSERT_TRUE(test_server.Start());
1061 1059
1062 CreateFetcher(test_server.GetURL("echo")); 1060 CreateFetcher(test_server.GetURL("echo"));
1063 MessageLoop::current()->Run(); 1061 MessageLoop::current()->Run();
1064 } 1062 }
1065 1063
1066 TEST_F(URLFetcherEmptyPostTest, Basic) { 1064 TEST_F(URLFetcherEmptyPostTest, Basic) {
1067 TestServer test_server(TestServer::TYPE_HTTP, 1065 TestServer test_server(TestServer::TYPE_HTTP,
1068 TestServer::kLocalhost, 1066 TestServer::kLocalhost,
1069 base::FilePath(kDocRoot)); 1067 TestServer::GetTestDataPath());
1070 ASSERT_TRUE(test_server.Start()); 1068 ASSERT_TRUE(test_server.Start());
1071 1069
1072 CreateFetcher(test_server.GetURL("echo")); 1070 CreateFetcher(test_server.GetURL("echo"));
1073 MessageLoop::current()->Run(); 1071 MessageLoop::current()->Run();
1074 } 1072 }
1075 1073
1076 TEST_F(URLFetcherUploadProgressTest, Basic) { 1074 TEST_F(URLFetcherUploadProgressTest, Basic) {
1077 TestServer test_server(TestServer::TYPE_HTTP, 1075 TestServer test_server(TestServer::TYPE_HTTP,
1078 TestServer::kLocalhost, 1076 TestServer::kLocalhost,
1079 base::FilePath(kDocRoot)); 1077 TestServer::GetTestDataPath());
1080 ASSERT_TRUE(test_server.Start()); 1078 ASSERT_TRUE(test_server.Start());
1081 1079
1082 CreateFetcher(test_server.GetURL("echo")); 1080 CreateFetcher(test_server.GetURL("echo"));
1083 MessageLoop::current()->Run(); 1081 MessageLoop::current()->Run();
1084 } 1082 }
1085 1083
1086 TEST_F(URLFetcherDownloadProgressTest, Basic) { 1084 TEST_F(URLFetcherDownloadProgressTest, Basic) {
1087 TestServer test_server(TestServer::TYPE_HTTP, 1085 TestServer test_server(TestServer::TYPE_HTTP,
1088 TestServer::kLocalhost, 1086 TestServer::kLocalhost,
1089 base::FilePath(kDocRoot)); 1087 TestServer::GetTestDataPath());
1090 ASSERT_TRUE(test_server.Start()); 1088 ASSERT_TRUE(test_server.Start());
1091 1089
1092 // Get a file large enough to require more than one read into 1090 // Get a file large enough to require more than one read into
1093 // URLFetcher::Core's IOBuffer. 1091 // URLFetcher::Core's IOBuffer.
1094 static const char kFileToFetch[] = "animate1.gif"; 1092 static const char kFileToFetch[] = "animate1.gif";
1095 // Hardcoded file size - it cannot be easily fetched when a remote http server 1093 // Hardcoded file size - it cannot be easily fetched when a remote http server
1096 // is used for testing. 1094 // is used for testing.
1097 static const int64 kFileSize = 19021; 1095 static const int64 kFileSize = 19021;
1098 1096
1099 expected_total_ = kFileSize; 1097 expected_total_ = kFileSize;
1100 1098
1101 CreateFetcher(test_server.GetURL( 1099 CreateFetcher(test_server.GetURL(
1102 std::string(kTestServerFilePrefix) + kFileToFetch)); 1100 std::string(kTestServerFilePrefix) + kFileToFetch));
1103 1101
1104 MessageLoop::current()->Run(); 1102 MessageLoop::current()->Run();
1105 } 1103 }
1106 1104
1107 TEST_F(URLFetcherDownloadProgressCancelTest, CancelWhileProgressReport) { 1105 TEST_F(URLFetcherDownloadProgressCancelTest, CancelWhileProgressReport) {
1108 TestServer test_server(TestServer::TYPE_HTTP, 1106 TestServer test_server(TestServer::TYPE_HTTP,
1109 TestServer::kLocalhost, 1107 TestServer::kLocalhost,
1110 base::FilePath(kDocRoot)); 1108 TestServer::GetTestDataPath());
1111 ASSERT_TRUE(test_server.Start()); 1109 ASSERT_TRUE(test_server.Start());
1112 1110
1113 // Get a file large enough to require more than one read into 1111 // Get a file large enough to require more than one read into
1114 // URLFetcher::Core's IOBuffer. 1112 // URLFetcher::Core's IOBuffer.
1115 static const char kFileToFetch[] = "animate1.gif"; 1113 static const char kFileToFetch[] = "animate1.gif";
1116 CreateFetcher(test_server.GetURL( 1114 CreateFetcher(test_server.GetURL(
1117 std::string(kTestServerFilePrefix) + kFileToFetch)); 1115 std::string(kTestServerFilePrefix) + kFileToFetch));
1118 1116
1119 MessageLoop::current()->Run(); 1117 MessageLoop::current()->Run();
1120 } 1118 }
1121 1119
1122 TEST_F(URLFetcherHeadersTest, Headers) { 1120 TEST_F(URLFetcherHeadersTest, Headers) {
1123 TestServer test_server( 1121 TestServer test_server(
1124 TestServer::TYPE_HTTP, 1122 TestServer::TYPE_HTTP,
1125 TestServer::kLocalhost, 1123 TestServer::kLocalhost,
1126 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 1124 TestServer::GetSourceRelativePath(
1125 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))));
1127 ASSERT_TRUE(test_server.Start()); 1126 ASSERT_TRUE(test_server.Start());
1128 1127
1129 CreateFetcher(test_server.GetURL("files/with-headers.html")); 1128 CreateFetcher(test_server.GetURL("files/with-headers.html"));
1130 MessageLoop::current()->Run(); 1129 MessageLoop::current()->Run();
1131 // The actual tests are in the URLFetcherHeadersTest fixture. 1130 // The actual tests are in the URLFetcherHeadersTest fixture.
1132 } 1131 }
1133 1132
1134 TEST_F(URLFetcherSocketAddressTest, SocketAddress) { 1133 TEST_F(URLFetcherSocketAddressTest, SocketAddress) {
1135 TestServer test_server( 1134 TestServer test_server(
1136 TestServer::TYPE_HTTP, 1135 TestServer::TYPE_HTTP,
1137 TestServer::kLocalhost, 1136 TestServer::kLocalhost,
1138 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 1137 TestServer::GetSourceRelativePath(
1138 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))));
1139 ASSERT_TRUE(test_server.Start()); 1139 ASSERT_TRUE(test_server.Start());
1140 expected_port_ = test_server.host_port_pair().port(); 1140 expected_port_ = test_server.host_port_pair().port();
1141 1141
1142 // Reusing "with-headers.html" but doesn't really matter. 1142 // Reusing "with-headers.html" but doesn't really matter.
1143 CreateFetcher(test_server.GetURL("files/with-headers.html")); 1143 CreateFetcher(test_server.GetURL("files/with-headers.html"));
1144 MessageLoop::current()->Run(); 1144 MessageLoop::current()->Run();
1145 // The actual tests are in the URLFetcherSocketAddressTest fixture. 1145 // The actual tests are in the URLFetcherSocketAddressTest fixture.
1146 } 1146 }
1147 1147
1148 TEST_F(URLFetcherStopOnRedirectTest, StopOnRedirect) { 1148 TEST_F(URLFetcherStopOnRedirectTest, StopOnRedirect) {
1149 TestServer test_server(TestServer::TYPE_HTTP, 1149 TestServer test_server(TestServer::TYPE_HTTP,
1150 TestServer::kLocalhost, 1150 TestServer::kLocalhost,
1151 base::FilePath(kDocRoot)); 1151 TestServer::GetTestDataPath());
1152 ASSERT_TRUE(test_server.Start()); 1152 ASSERT_TRUE(test_server.Start());
1153 1153
1154 CreateFetcher( 1154 CreateFetcher(
1155 test_server.GetURL(std::string("server-redirect?") + kRedirectTarget)); 1155 test_server.GetURL(std::string("server-redirect?") + kRedirectTarget));
1156 MessageLoop::current()->Run(); 1156 MessageLoop::current()->Run();
1157 EXPECT_TRUE(callback_called_); 1157 EXPECT_TRUE(callback_called_);
1158 } 1158 }
1159 1159
1160 TEST_F(URLFetcherProtectTest, Overload) { 1160 TEST_F(URLFetcherProtectTest, Overload) {
1161 TestServer test_server(TestServer::TYPE_HTTP, 1161 TestServer test_server(TestServer::TYPE_HTTP,
1162 TestServer::kLocalhost, 1162 TestServer::kLocalhost,
1163 base::FilePath(kDocRoot)); 1163 TestServer::GetTestDataPath());
1164 ASSERT_TRUE(test_server.Start()); 1164 ASSERT_TRUE(test_server.Start());
1165 1165
1166 GURL url(test_server.GetURL("defaultresponse")); 1166 GURL url(test_server.GetURL("defaultresponse"));
1167 1167
1168 // Registers an entry for test url. It only allows 3 requests to be sent 1168 // Registers an entry for test url. It only allows 3 requests to be sent
1169 // in 200 milliseconds. 1169 // in 200 milliseconds.
1170 scoped_refptr<URLRequestThrottlerEntry> entry( 1170 scoped_refptr<URLRequestThrottlerEntry> entry(
1171 new URLRequestThrottlerEntry( 1171 new URLRequestThrottlerEntry(
1172 request_context()->throttler_manager(), 1172 request_context()->throttler_manager(),
1173 "", 200, 3, 1, 2.0, 0.0, 256)); 1173 "", 200, 3, 1, 2.0, 0.0, 256));
1174 request_context()->throttler_manager()->OverrideEntryForTests(url, entry); 1174 request_context()->throttler_manager()->OverrideEntryForTests(url, entry);
1175 1175
1176 CreateFetcher(url); 1176 CreateFetcher(url);
1177 1177
1178 MessageLoop::current()->Run(); 1178 MessageLoop::current()->Run();
1179 } 1179 }
1180 1180
1181 TEST_F(URLFetcherProtectTest, ServerUnavailable) { 1181 TEST_F(URLFetcherProtectTest, ServerUnavailable) {
1182 TestServer test_server(TestServer::TYPE_HTTP, 1182 TestServer test_server(TestServer::TYPE_HTTP,
1183 TestServer::kLocalhost, 1183 TestServer::kLocalhost,
1184 base::FilePath(kDocRoot)); 1184 TestServer::GetTestDataPath());
1185 ASSERT_TRUE(test_server.Start()); 1185 ASSERT_TRUE(test_server.Start());
1186 1186
1187 GURL url(test_server.GetURL("files/server-unavailable.html")); 1187 GURL url(test_server.GetURL("files/server-unavailable.html"));
1188 1188
1189 // Registers an entry for test url. The backoff time is calculated by: 1189 // Registers an entry for test url. The backoff time is calculated by:
1190 // new_backoff = 2.0 * old_backoff + 0 1190 // new_backoff = 2.0 * old_backoff + 0
1191 // and maximum backoff time is 256 milliseconds. 1191 // and maximum backoff time is 256 milliseconds.
1192 // Maximum retries allowed is set to 11. 1192 // Maximum retries allowed is set to 11.
1193 scoped_refptr<URLRequestThrottlerEntry> entry( 1193 scoped_refptr<URLRequestThrottlerEntry> entry(
1194 new URLRequestThrottlerEntry( 1194 new URLRequestThrottlerEntry(
1195 request_context()->throttler_manager(), 1195 request_context()->throttler_manager(),
1196 "", 200, 3, 1, 2.0, 0.0, 256)); 1196 "", 200, 3, 1, 2.0, 0.0, 256));
1197 request_context()->throttler_manager()->OverrideEntryForTests(url, entry); 1197 request_context()->throttler_manager()->OverrideEntryForTests(url, entry);
1198 1198
1199 CreateFetcher(url); 1199 CreateFetcher(url);
1200 1200
1201 MessageLoop::current()->Run(); 1201 MessageLoop::current()->Run();
1202 } 1202 }
1203 1203
1204 TEST_F(URLFetcherProtectTestPassedThrough, ServerUnavailablePropagateResponse) { 1204 TEST_F(URLFetcherProtectTestPassedThrough, ServerUnavailablePropagateResponse) {
1205 TestServer test_server(TestServer::TYPE_HTTP, 1205 TestServer test_server(TestServer::TYPE_HTTP,
1206 TestServer::kLocalhost, 1206 TestServer::kLocalhost,
1207 base::FilePath(kDocRoot)); 1207 TestServer::GetTestDataPath());
1208 ASSERT_TRUE(test_server.Start()); 1208 ASSERT_TRUE(test_server.Start());
1209 1209
1210 GURL url(test_server.GetURL("files/server-unavailable.html")); 1210 GURL url(test_server.GetURL("files/server-unavailable.html"));
1211 1211
1212 // Registers an entry for test url. The backoff time is calculated by: 1212 // Registers an entry for test url. The backoff time is calculated by:
1213 // new_backoff = 2.0 * old_backoff + 0 1213 // new_backoff = 2.0 * old_backoff + 0
1214 // and maximum backoff time is 150000 milliseconds. 1214 // and maximum backoff time is 150000 milliseconds.
1215 // Maximum retries allowed is set to 11. 1215 // Maximum retries allowed is set to 11.
1216 scoped_refptr<URLRequestThrottlerEntry> entry( 1216 scoped_refptr<URLRequestThrottlerEntry> entry(
1217 new URLRequestThrottlerEntry( 1217 new URLRequestThrottlerEntry(
1218 request_context()->throttler_manager(), 1218 request_context()->throttler_manager(),
1219 "", 200, 3, 100, 2.0, 0.0, 150000)); 1219 "", 200, 3, 100, 2.0, 0.0, 150000));
1220 // Total time if *not* for not doing automatic backoff would be 150s. 1220 // Total time if *not* for not doing automatic backoff would be 150s.
1221 // In reality it should be "as soon as server responds". 1221 // In reality it should be "as soon as server responds".
1222 request_context()->throttler_manager()->OverrideEntryForTests(url, entry); 1222 request_context()->throttler_manager()->OverrideEntryForTests(url, entry);
1223 1223
1224 CreateFetcher(url); 1224 CreateFetcher(url);
1225 1225
1226 MessageLoop::current()->Run(); 1226 MessageLoop::current()->Run();
1227 } 1227 }
1228 1228
1229 TEST_F(URLFetcherBadHTTPSTest, BadHTTPSTest) { 1229 TEST_F(URLFetcherBadHTTPSTest, BadHTTPSTest) {
1230 TestServer::SSLOptions ssl_options( 1230 TestServer::SSLOptions ssl_options(
1231 TestServer::SSLOptions::CERT_EXPIRED); 1231 TestServer::SSLOptions::CERT_EXPIRED);
1232 TestServer test_server(TestServer::TYPE_HTTPS, 1232 TestServer test_server(TestServer::TYPE_HTTPS,
1233 ssl_options, 1233 ssl_options,
1234 base::FilePath(kDocRoot)); 1234 TestServer::GetTestDataPath());
1235 ASSERT_TRUE(test_server.Start()); 1235 ASSERT_TRUE(test_server.Start());
1236 1236
1237 CreateFetcher(test_server.GetURL("defaultresponse")); 1237 CreateFetcher(test_server.GetURL("defaultresponse"));
1238 MessageLoop::current()->Run(); 1238 MessageLoop::current()->Run();
1239 } 1239 }
1240 1240
1241 TEST_F(URLFetcherCancelTest, ReleasesContext) { 1241 TEST_F(URLFetcherCancelTest, ReleasesContext) {
1242 TestServer test_server(TestServer::TYPE_HTTP, 1242 TestServer test_server(TestServer::TYPE_HTTP,
1243 TestServer::kLocalhost, 1243 TestServer::kLocalhost,
1244 base::FilePath(kDocRoot)); 1244 TestServer::GetTestDataPath());
1245 ASSERT_TRUE(test_server.Start()); 1245 ASSERT_TRUE(test_server.Start());
1246 1246
1247 GURL url(test_server.GetURL("files/server-unavailable.html")); 1247 GURL url(test_server.GetURL("files/server-unavailable.html"));
1248 1248
1249 // Create a separate thread that will create the URLFetcher. The current 1249 // Create a separate thread that will create the URLFetcher. The current
1250 // (main) thread will do the IO, and when the fetch is complete it will 1250 // (main) thread will do the IO, and when the fetch is complete it will
1251 // terminate the main thread's message loop; then the other thread's 1251 // terminate the main thread's message loop; then the other thread's
1252 // message loop will be shut down automatically as the thread goes out of 1252 // message loop will be shut down automatically as the thread goes out of
1253 // scope. 1253 // scope.
1254 base::Thread t("URLFetcher test thread"); 1254 base::Thread t("URLFetcher test thread");
1255 ASSERT_TRUE(t.Start()); 1255 ASSERT_TRUE(t.Start());
1256 t.message_loop()->PostTask( 1256 t.message_loop()->PostTask(
1257 FROM_HERE, 1257 FROM_HERE,
1258 base::Bind(&URLFetcherCancelTest::CreateFetcher, 1258 base::Bind(&URLFetcherCancelTest::CreateFetcher,
1259 base::Unretained(this), url)); 1259 base::Unretained(this), url));
1260 1260
1261 MessageLoop::current()->Run(); 1261 MessageLoop::current()->Run();
1262 } 1262 }
1263 1263
1264 TEST_F(URLFetcherCancelTest, CancelWhileDelayedStartTaskPending) { 1264 TEST_F(URLFetcherCancelTest, CancelWhileDelayedStartTaskPending) {
1265 TestServer test_server(TestServer::TYPE_HTTP, 1265 TestServer test_server(TestServer::TYPE_HTTP,
1266 TestServer::kLocalhost, 1266 TestServer::kLocalhost,
1267 base::FilePath(kDocRoot)); 1267 TestServer::GetTestDataPath());
1268 ASSERT_TRUE(test_server.Start()); 1268 ASSERT_TRUE(test_server.Start());
1269 1269
1270 GURL url(test_server.GetURL("files/server-unavailable.html")); 1270 GURL url(test_server.GetURL("files/server-unavailable.html"));
1271 1271
1272 // Register an entry for test url. 1272 // Register an entry for test url.
1273 // Using a sliding window of 4 seconds, and max of 1 request, under a fast 1273 // Using a sliding window of 4 seconds, and max of 1 request, under a fast
1274 // run we expect to have a 4 second delay when posting the Start task. 1274 // run we expect to have a 4 second delay when posting the Start task.
1275 scoped_refptr<URLRequestThrottlerEntry> entry( 1275 scoped_refptr<URLRequestThrottlerEntry> entry(
1276 new URLRequestThrottlerEntry( 1276 new URLRequestThrottlerEntry(
1277 request_context()->throttler_manager(), 1277 request_context()->throttler_manager(),
(...skipping 11 matching lines...) Expand all
1289 t.message_loop()->PostTask( 1289 t.message_loop()->PostTask(
1290 FROM_HERE, 1290 FROM_HERE,
1291 base::Bind(&URLFetcherTest::CreateFetcher, base::Unretained(this), url)); 1291 base::Bind(&URLFetcherTest::CreateFetcher, base::Unretained(this), url));
1292 1292
1293 MessageLoop::current()->Run(); 1293 MessageLoop::current()->Run();
1294 } 1294 }
1295 1295
1296 TEST_F(URLFetcherMultipleAttemptTest, SameData) { 1296 TEST_F(URLFetcherMultipleAttemptTest, SameData) {
1297 TestServer test_server(TestServer::TYPE_HTTP, 1297 TestServer test_server(TestServer::TYPE_HTTP,
1298 TestServer::kLocalhost, 1298 TestServer::kLocalhost,
1299 base::FilePath(kDocRoot)); 1299 TestServer::GetTestDataPath());
1300 ASSERT_TRUE(test_server.Start()); 1300 ASSERT_TRUE(test_server.Start());
1301 1301
1302 // Create the fetcher on the main thread. Since IO will happen on the main 1302 // Create the fetcher on the main thread. Since IO will happen on the main
1303 // thread, this will test URLFetcher's ability to do everything on one 1303 // thread, this will test URLFetcher's ability to do everything on one
1304 // thread. 1304 // thread.
1305 CreateFetcher(test_server.GetURL("defaultresponse")); 1305 CreateFetcher(test_server.GetURL("defaultresponse"));
1306 1306
1307 MessageLoop::current()->Run(); 1307 MessageLoop::current()->Run();
1308 } 1308 }
1309 1309
1310 TEST_F(URLFetcherFileTest, SmallGet) { 1310 TEST_F(URLFetcherFileTest, SmallGet) {
1311 TestServer test_server(TestServer::TYPE_HTTP, 1311 TestServer test_server(TestServer::TYPE_HTTP,
1312 TestServer::kLocalhost, 1312 TestServer::kLocalhost,
1313 base::FilePath(kDocRoot)); 1313 TestServer::GetTestDataPath());
1314 ASSERT_TRUE(test_server.Start()); 1314 ASSERT_TRUE(test_server.Start());
1315 1315
1316 base::ScopedTempDir temp_dir; 1316 base::ScopedTempDir temp_dir;
1317 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1317 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
1318 1318
1319 // Get a small file. 1319 // Get a small file.
1320 static const char kFileToFetch[] = "simple.html"; 1320 static const char kFileToFetch[] = "simple.html";
1321 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch); 1321 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
1322 CreateFetcherForFile( 1322 CreateFetcherForFile(
1323 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch), 1323 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
1324 temp_dir.path().AppendASCII(kFileToFetch)); 1324 temp_dir.path().AppendASCII(kFileToFetch));
1325 1325
1326 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). 1326 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
1327 1327
1328 ASSERT_FALSE(file_util::PathExists(file_path_)) 1328 ASSERT_FALSE(file_util::PathExists(file_path_))
1329 << file_path_.value() << " not removed."; 1329 << file_path_.value() << " not removed.";
1330 } 1330 }
1331 1331
1332 TEST_F(URLFetcherFileTest, LargeGet) { 1332 TEST_F(URLFetcherFileTest, LargeGet) {
1333 TestServer test_server(TestServer::TYPE_HTTP, 1333 TestServer test_server(TestServer::TYPE_HTTP,
1334 TestServer::kLocalhost, 1334 TestServer::kLocalhost,
1335 base::FilePath(kDocRoot)); 1335 TestServer::GetTestDataPath());
1336 ASSERT_TRUE(test_server.Start()); 1336 ASSERT_TRUE(test_server.Start());
1337 1337
1338 base::ScopedTempDir temp_dir; 1338 base::ScopedTempDir temp_dir;
1339 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1339 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
1340 1340
1341 // Get a file large enough to require more than one read into 1341 // Get a file large enough to require more than one read into
1342 // URLFetcher::Core's IOBuffer. 1342 // URLFetcher::Core's IOBuffer.
1343 static const char kFileToFetch[] = "animate1.gif"; 1343 static const char kFileToFetch[] = "animate1.gif";
1344 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch); 1344 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
1345 CreateFetcherForFile( 1345 CreateFetcherForFile(
1346 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch), 1346 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
1347 temp_dir.path().AppendASCII(kFileToFetch)); 1347 temp_dir.path().AppendASCII(kFileToFetch));
1348 1348
1349 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). 1349 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
1350 } 1350 }
1351 1351
1352 TEST_F(URLFetcherFileTest, CanTakeOwnershipOfFile) { 1352 TEST_F(URLFetcherFileTest, CanTakeOwnershipOfFile) {
1353 TestServer test_server(TestServer::TYPE_HTTP, 1353 TestServer test_server(TestServer::TYPE_HTTP,
1354 TestServer::kLocalhost, 1354 TestServer::kLocalhost,
1355 base::FilePath(kDocRoot)); 1355 TestServer::GetTestDataPath());
1356 ASSERT_TRUE(test_server.Start()); 1356 ASSERT_TRUE(test_server.Start());
1357 1357
1358 base::ScopedTempDir temp_dir; 1358 base::ScopedTempDir temp_dir;
1359 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1359 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
1360 1360
1361 // Get a small file. 1361 // Get a small file.
1362 static const char kFileToFetch[] = "simple.html"; 1362 static const char kFileToFetch[] = "simple.html";
1363 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch); 1363 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
1364 CreateFetcherForFile( 1364 CreateFetcherForFile(
1365 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch), 1365 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
1366 temp_dir.path().AppendASCII(kFileToFetch)); 1366 temp_dir.path().AppendASCII(kFileToFetch));
1367 1367
1368 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). 1368 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
1369 1369
1370 MessageLoop::current()->RunUntilIdle(); 1370 MessageLoop::current()->RunUntilIdle();
1371 ASSERT_FALSE(file_util::PathExists(file_path_)) 1371 ASSERT_FALSE(file_util::PathExists(file_path_))
1372 << file_path_.value() << " not removed."; 1372 << file_path_.value() << " not removed.";
1373 } 1373 }
1374 1374
1375 1375
1376 TEST_F(URLFetcherFileTest, OverwriteExistingFile) { 1376 TEST_F(URLFetcherFileTest, OverwriteExistingFile) {
1377 TestServer test_server(TestServer::TYPE_HTTP, 1377 TestServer test_server(TestServer::TYPE_HTTP,
1378 TestServer::kLocalhost, 1378 TestServer::kLocalhost,
1379 base::FilePath(kDocRoot)); 1379 TestServer::GetTestDataPath());
1380 ASSERT_TRUE(test_server.Start()); 1380 ASSERT_TRUE(test_server.Start());
1381 1381
1382 base::ScopedTempDir temp_dir; 1382 base::ScopedTempDir temp_dir;
1383 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1383 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
1384 1384
1385 // Create a file before trying to fetch. 1385 // Create a file before trying to fetch.
1386 static const char kFileToFetch[] = "simple.html"; 1386 static const char kFileToFetch[] = "simple.html";
1387 static const char kData[] = "abcdefghijklmnopqrstuvwxyz"; 1387 static const char kData[] = "abcdefghijklmnopqrstuvwxyz";
1388 file_path_ = temp_dir.path().AppendASCII(kFileToFetch); 1388 file_path_ = temp_dir.path().AppendASCII(kFileToFetch);
1389 const int data_size = arraysize(kData); 1389 const int data_size = arraysize(kData);
1390 ASSERT_EQ(file_util::WriteFile(file_path_, kData, data_size), data_size); 1390 ASSERT_EQ(file_util::WriteFile(file_path_, kData, data_size), data_size);
1391 ASSERT_TRUE(file_util::PathExists(file_path_)); 1391 ASSERT_TRUE(file_util::PathExists(file_path_));
1392 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch); 1392 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
1393 ASSERT_FALSE(file_util::ContentsEqual(file_path_, expected_file_)); 1393 ASSERT_FALSE(file_util::ContentsEqual(file_path_, expected_file_));
1394 1394
1395 // Get a small file. 1395 // Get a small file.
1396 CreateFetcherForFile( 1396 CreateFetcherForFile(
1397 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch), 1397 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
1398 file_path_); 1398 file_path_);
1399 1399
1400 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). 1400 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
1401 } 1401 }
1402 1402
1403 TEST_F(URLFetcherFileTest, TryToOverwriteDirectory) { 1403 TEST_F(URLFetcherFileTest, TryToOverwriteDirectory) {
1404 TestServer test_server(TestServer::TYPE_HTTP, 1404 TestServer test_server(TestServer::TYPE_HTTP,
1405 TestServer::kLocalhost, 1405 TestServer::kLocalhost,
1406 base::FilePath(kDocRoot)); 1406 TestServer::GetTestDataPath());
1407 ASSERT_TRUE(test_server.Start()); 1407 ASSERT_TRUE(test_server.Start());
1408 1408
1409 base::ScopedTempDir temp_dir; 1409 base::ScopedTempDir temp_dir;
1410 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1410 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
1411 1411
1412 // Create a directory before trying to fetch. 1412 // Create a directory before trying to fetch.
1413 static const char kFileToFetch[] = "simple.html"; 1413 static const char kFileToFetch[] = "simple.html";
1414 file_path_ = temp_dir.path().AppendASCII(kFileToFetch); 1414 file_path_ = temp_dir.path().AppendASCII(kFileToFetch);
1415 ASSERT_TRUE(file_util::CreateDirectory(file_path_)); 1415 ASSERT_TRUE(file_util::CreateDirectory(file_path_));
1416 ASSERT_TRUE(file_util::PathExists(file_path_)); 1416 ASSERT_TRUE(file_util::PathExists(file_path_));
1417 1417
1418 // Get a small file. 1418 // Get a small file.
1419 expected_file_error_ = base::PLATFORM_FILE_ERROR_ACCESS_DENIED; 1419 expected_file_error_ = base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
1420 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch); 1420 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
1421 CreateFetcherForFile( 1421 CreateFetcherForFile(
1422 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch), 1422 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
1423 file_path_); 1423 file_path_);
1424 1424
1425 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). 1425 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
1426 1426
1427 MessageLoop::current()->RunUntilIdle(); 1427 MessageLoop::current()->RunUntilIdle();
1428 } 1428 }
1429 1429
1430 TEST_F(URLFetcherFileTest, SmallGetToTempFile) { 1430 TEST_F(URLFetcherFileTest, SmallGetToTempFile) {
1431 TestServer test_server(TestServer::TYPE_HTTP, 1431 TestServer test_server(TestServer::TYPE_HTTP,
1432 TestServer::kLocalhost, 1432 TestServer::kLocalhost,
1433 base::FilePath(kDocRoot)); 1433 TestServer::GetTestDataPath());
1434 ASSERT_TRUE(test_server.Start()); 1434 ASSERT_TRUE(test_server.Start());
1435 1435
1436 // Get a small file. 1436 // Get a small file.
1437 static const char kFileToFetch[] = "simple.html"; 1437 static const char kFileToFetch[] = "simple.html";
1438 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch); 1438 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
1439 CreateFetcherForTempFile( 1439 CreateFetcherForTempFile(
1440 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch)); 1440 test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch));
1441 1441
1442 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). 1442 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
1443 1443
1444 ASSERT_FALSE(file_util::PathExists(file_path_)) 1444 ASSERT_FALSE(file_util::PathExists(file_path_))
1445 << file_path_.value() << " not removed."; 1445 << file_path_.value() << " not removed.";
1446 } 1446 }
1447 1447
1448 TEST_F(URLFetcherFileTest, LargeGetToTempFile) { 1448 TEST_F(URLFetcherFileTest, LargeGetToTempFile) {
1449 TestServer test_server(TestServer::TYPE_HTTP, 1449 TestServer test_server(TestServer::TYPE_HTTP,
1450 TestServer::kLocalhost, 1450 TestServer::kLocalhost,
1451 base::FilePath(kDocRoot)); 1451 TestServer::GetTestDataPath());
1452 ASSERT_TRUE(test_server.Start()); 1452 ASSERT_TRUE(test_server.Start());
1453 1453
1454 // Get a file large enough to require more than one read into 1454 // Get a file large enough to require more than one read into
1455 // URLFetcher::Core's IOBuffer. 1455 // URLFetcher::Core's IOBuffer.
1456 static const char kFileToFetch[] = "animate1.gif"; 1456 static const char kFileToFetch[] = "animate1.gif";
1457 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch); 1457 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
1458 CreateFetcherForTempFile(test_server.GetURL( 1458 CreateFetcherForTempFile(test_server.GetURL(
1459 std::string(kTestServerFilePrefix) + kFileToFetch)); 1459 std::string(kTestServerFilePrefix) + kFileToFetch));
1460 1460
1461 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). 1461 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
1462 } 1462 }
1463 1463
1464 TEST_F(URLFetcherFileTest, CanTakeOwnershipOfTempFile) { 1464 TEST_F(URLFetcherFileTest, CanTakeOwnershipOfTempFile) {
1465 TestServer test_server(TestServer::TYPE_HTTP, 1465 TestServer test_server(TestServer::TYPE_HTTP,
1466 TestServer::kLocalhost, 1466 TestServer::kLocalhost,
1467 base::FilePath(kDocRoot)); 1467 TestServer::GetTestDataPath());
1468 ASSERT_TRUE(test_server.Start()); 1468 ASSERT_TRUE(test_server.Start());
1469 1469
1470 // Get a small file. 1470 // Get a small file.
1471 static const char kFileToFetch[] = "simple.html"; 1471 static const char kFileToFetch[] = "simple.html";
1472 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch); 1472 expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
1473 CreateFetcherForTempFile(test_server.GetURL( 1473 CreateFetcherForTempFile(test_server.GetURL(
1474 std::string(kTestServerFilePrefix) + kFileToFetch)); 1474 std::string(kTestServerFilePrefix) + kFileToFetch));
1475 1475
1476 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). 1476 MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
1477 1477
1478 MessageLoop::current()->RunUntilIdle(); 1478 MessageLoop::current()->RunUntilIdle();
1479 ASSERT_FALSE(file_util::PathExists(file_path_)) 1479 ASSERT_FALSE(file_util::PathExists(file_path_))
1480 << file_path_.value() << " not removed."; 1480 << file_path_.value() << " not removed.";
1481 } 1481 }
1482 1482
1483 } // namespace 1483 } // namespace
1484 1484
1485 } // namespace net 1485 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698