Index: net/url_request/url_request_quic_unittest.cc |
diff --git a/net/url_request/url_request_quic_unittest.cc b/net/url_request/url_request_quic_unittest.cc |
index f435d61cdf19d8a52a3461fe1de2828859dc3901..6546823d0bff072dfdeb41d29006f8e93f4ff7b4 100644 |
--- a/net/url_request/url_request_quic_unittest.cc |
+++ b/net/url_request/url_request_quic_unittest.cc |
@@ -5,6 +5,7 @@ |
#include <memory> |
#include "base/files/file_path.h" |
+#include "base/files/file_enumerator.h" |
#include "base/macros.h" |
#include "base/memory/ptr_util.h" |
#include "base/run_loop.h" |
@@ -19,6 +20,8 @@ |
#include "net/log/test_net_log.h" |
#include "net/log/test_net_log_entry.h" |
#include "net/quic/chromium/crypto/proof_source_chromium.h" |
+#include "net/quic/platform/api/quic_str_cat.h" |
+#include "net/quic/platform/api/quic_text_utils.h" |
#include "net/quic/test_tools/crypto_test_utils.h" |
#include "net/test/cert_test_util.h" |
#include "net/test/gtest_util.h" |
@@ -45,6 +48,14 @@ const char kTestServerHost[] = "test.example.com"; |
const char kHelloPath[] = "/hello.txt"; |
const char kHelloBodyValue[] = "Hello from QUIC Server"; |
const int kHelloStatus = 200; |
+// First push resource. |
+// const char kPush1Path[] = "/push1.txt"; |
+// const char kPush1BodyValue[] = "First Pushed Resource from QUIC Server"; |
+// const int kPush1Status = 200; |
+// Second push resource. |
+// const char kPush2Path[] = "/push2.txt"; |
+// const char kPush2BodyValue[] = "Second Pushed Resource from QUIC Server"; |
+// const int kPush2Status = 200; |
class URLRequestQuicTest : public ::testing::Test { |
protected: |
@@ -100,10 +111,15 @@ class URLRequestQuicTest : public ::testing::Test { |
net::TestNetLogEntry::List entries; |
net_log_.GetEntries(&entries); |
+ EXPECT_EQ(0u, entries.size()); |
+ |
for (const auto& entry : entries) { |
- if (entry.type == type) |
+ if (entry.type == type) { |
+ LOG(ERROR) << entry.GetParamsJson(); |
entry_list->push_back(entry); |
+ } |
} |
+ LOG(ERROR) << "size: " << entry_list->size(); |
} |
unsigned int GetRstErrorCountReceivedByServer( |
@@ -112,12 +128,57 @@ class URLRequestQuicTest : public ::testing::Test { |
->GetRstErrorCount(error_code); |
} |
+ int GetPushPromiseSent() const { |
+ return (static_cast<QuicSimpleDispatcher*>(server_->dispatcher())) |
+ ->push_promise_sent_; |
+ } |
+ |
private: |
void StartQuicServer() { |
// Set up in-memory cache. |
+ std::string response_body("hello response"); |
+ int NumResources = 5; |
+ std::list<QuicHttpResponseCache::ServerPushInfo> push_resources; |
+ for (int i = 0; i < NumResources; ++i) { |
+ std::string path = "/server_push_src" + QuicTextUtils::Uint64ToString(i); |
+ std::string url = "https://test.example.com" + path; |
+ QuicUrl resource_url(url); |
+ LOG(ERROR) << "url: " << url; |
+ std::string body = QuicStrCat("This is server push response body for ", path); |
+ SpdyHeaderBlock response_headers; |
+ response_headers[":version"] = "HTTP/1.1"; |
+ response_headers[":status"] = "200"; |
+ response_headers["content-length"] = |
+ QuicTextUtils::Uint64ToString(body.size()); |
+ push_resources.push_back( |
+ QuicHttpResponseCache::ServerPushInfo(resource_url, response_headers.Clone(), i, body)); |
+ } |
+ |
response_cache_.AddSimpleResponse(kTestServerHost, kHelloPath, kHelloStatus, |
kHelloBodyValue); |
- response_cache_.InitializeFromDirectory(ServerPushCacheDirectory()); |
+ |
+ LOG(ERROR) << "==== zhongyi: adding " << push_resources.size() << " pushes"; |
+ response_cache_.AddSimpleResponseWithServerPushResources( |
+ kTestServerHost, "/index3.html", 200, response_body, push_resources); |
+ EXPECT_EQ(100u, response_cache_.GetServerPushResources("test.example.com/index3.html").size()); |
+ |
+ // response_cache_.InitializeFromDirectory(GetServerPushResourceDirectory()); |
+ LOG(ERROR) << "=========== compare the directory path ==================="; |
+ LOG(ERROR) << "test server " << GetServerPushResourceDirectory().AsUTF8Unsafe(); |
+ LOG(ERROR) << "ServerPushCacheDirectory: " << ServerPushCacheDirectory(); |
+ LOG(ERROR) << "cert file dir: " << GetTestCertsDirectory().AsUTF8Unsafe(); |
+ |
+ base::FileEnumerator iter(GetServerPushResourceDirectory(), true, base::FileEnumerator::FILES); |
+ int count = 0; |
+ for (base::FilePath file = iter.Next(); !file.value().empty(); file = iter.Next()) { |
+ count ++; |
+ } |
+ LOG(ERROR) << "@@@@ In TEST: of the file size: " << count; |
+ |
+ // response_cache_.InitializeFromDirectory(ServerPushCacheDirectory()); |
+ response_cache_.InitializeFromDirectory(ServerPushCacheDirectory(), GetServerPushResourceDirectory()); |
+ |
+ EXPECT_EQ(100u, response_cache_.GetServerPushResources("test.example.com/index2.html").size()); |
net::QuicConfig config; |
// Set up server certs. |
std::unique_ptr<net::ProofSourceChromium> proof_source( |
@@ -150,6 +211,7 @@ class URLRequestQuicTest : public ::testing::Test { |
PathService::Get(base::DIR_SOURCE_ROOT, &path); |
path = path.AppendASCII("net").AppendASCII("data").AppendASCII( |
"quic_http_response_cache_data_with_push"); |
+ LOG(ERROR) << "path.MaybeAsASCII: " << path.MaybeAsASCII(); |
// The file path is known to be an ascii string. |
return path.MaybeAsASCII(); |
} |
@@ -280,6 +342,33 @@ TEST_F(URLRequestQuicTest, CancelPushIfCached) { |
request->Start(); |
ASSERT_TRUE(request->is_pending()); |
base::RunLoop().Run(); |
+ run_loop.Run(); |
+ |
+ EXPECT_TRUE(request->status().is_success()); |
+ |
+ // Verify the reset error count received on the server side. |
+ EXPECT_EQ(1u, GetRstErrorCountReceivedByServer(QUIC_STREAM_CANCELLED)); |
+} |
+ |
+TEST_F(URLRequestQuicTest, DoNotCancelPushIfNotFoundInCache) { |
+ base::RunLoop run_loop; |
+ WaitForCompletionNetworkDelegate network_delegate( |
+ run_loop.QuitClosure(), /*num_expected_requests=*/1); |
+ SetNetworkDelegate(&network_delegate); |
+ |
+ Init(); |
+ // Send a request to /index2.hmtl which pushes /kitten-1.jpg and /favicon.ico |
+ // and shouldn't cancel any since neither is in cache. |
+ CheckLoadTimingDelegate delegate(false); |
+ std::string url = |
+ base::StringPrintf("https://%s%s", kTestServerHost, "/index2.html"); |
+ std::unique_ptr<URLRequest> request = |
+ CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate); |
+ |
+ request->Start(); |
+ ASSERT_TRUE(request->is_pending()); |
+ |
+ run_loop.Run(); |
// Extract net logs on client side to verify push lookup transactions. |
net::TestNetLogEntry::List entries; |
@@ -287,29 +376,10 @@ TEST_F(URLRequestQuicTest, CancelPushIfCached) { |
EXPECT_EQ(4u, entries.size()); |
- std::string value; |
- int net_error; |
- std::string push_url_1 = |
- base::StringPrintf("https://%s%s", kTestServerHost, "/kitten-1.jpg"); |
- std::string push_url_2 = |
- base::StringPrintf("https://%s%s", kTestServerHost, "/favicon.ico"); |
- |
- EXPECT_TRUE(entries[0].GetStringValue("push_url", &value)); |
- EXPECT_EQ(value, push_url_1); |
- // No net error code for this lookup transaction, the push is found. |
- EXPECT_FALSE(entries[1].GetIntegerValue("net_error", &net_error)); |
- |
- EXPECT_TRUE(entries[2].GetStringValue("push_url", &value)); |
- EXPECT_EQ(value, push_url_2); |
- // Net error code -400 is found for this lookup transaction, the push is not |
- // found in the cache. |
- EXPECT_TRUE(entries[3].GetIntegerValue("net_error", &net_error)); |
- EXPECT_EQ(net_error, -400); |
- |
EXPECT_TRUE(request->status().is_success()); |
// Verify the reset error count received on the server side. |
- EXPECT_EQ(1u, GetRstErrorCountReceivedByServer(QUIC_STREAM_CANCELLED)); |
+ EXPECT_EQ(0u, GetRstErrorCountReceivedByServer(QUIC_STREAM_CANCELLED)); |
} |
TEST_F(URLRequestQuicTest, CancelPushIfCached2) { |
@@ -364,112 +434,192 @@ TEST_F(URLRequestQuicTest, CancelPushIfCached2) { |
ASSERT_TRUE(request->is_pending()); |
base::RunLoop().Run(); |
+ run_loop.Run(); |
// Extract net logs on client side to verify push lookup transactions. |
net::TestNetLogEntry::List entries; |
ExtractNetLog(NetLogEventType::SERVER_PUSH_LOOKUP_TRANSACTION, &entries); |
EXPECT_EQ(4u, entries.size()); |
- std::string value; |
- int net_error; |
- std::string push_url_1 = |
- base::StringPrintf("https://%s%s", kTestServerHost, "/kitten-1.jpg"); |
- std::string push_url_2 = |
- base::StringPrintf("https://%s%s", kTestServerHost, "/favicon.ico"); |
- |
- EXPECT_TRUE(entries[0].GetStringValue("push_url", &value)); |
- EXPECT_EQ(value, push_url_1); |
- // No net error code for this lookup transaction, the push is found. |
- EXPECT_FALSE(entries[1].GetIntegerValue("net_error", &net_error)); |
- |
- EXPECT_TRUE(entries[2].GetStringValue("push_url", &value)); |
- EXPECT_EQ(value, push_url_2); |
- // No net error code for this lookup transaction, the push is found. |
- EXPECT_FALSE(entries[3].GetIntegerValue("net_error", &net_error)); |
- |
EXPECT_TRUE(request->status().is_success()); |
// Verify the reset error count received on the server side. |
EXPECT_EQ(2u, GetRstErrorCountReceivedByServer(QUIC_STREAM_CANCELLED)); |
} |
-TEST_F(URLRequestQuicTest, DoNotCancelPushIfNotFoundInCache) { |
+// Tests that if two requests use the same QUIC session, the second request |
+// should not have |LoadTimingInfo::connect_timing|. |
+TEST_F(URLRequestQuicTest, TestTwoRequests) { |
base::RunLoop run_loop; |
WaitForCompletionNetworkDelegate network_delegate( |
- run_loop.QuitClosure(), /*num_expected_requests=*/1); |
+ run_loop.QuitClosure(), /*num_expected_requests=*/2); |
SetNetworkDelegate(&network_delegate); |
+ Init(); |
+ CheckLoadTimingDelegate delegate(false); |
+ delegate.set_quit_on_complete(false); |
+ std::string url = |
+ base::StringPrintf("https://%s%s", kTestServerHost, kHelloPath); |
+ std::unique_ptr<URLRequest> request = |
+ CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate); |
+ CheckLoadTimingDelegate delegate2(true); |
+ delegate2.set_quit_on_complete(false); |
+ std::unique_ptr<URLRequest> request2 = |
+ CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate2); |
+ request->Start(); |
+ request2->Start(); |
+ ASSERT_TRUE(request->is_pending()); |
+ ASSERT_TRUE(request2->is_pending()); |
+ run_loop.Run(); |
+ |
+ EXPECT_TRUE(request->status().is_success()); |
+ EXPECT_TRUE(request2->status().is_success()); |
+ EXPECT_EQ(kHelloBodyValue, delegate.data_received()); |
+ EXPECT_EQ(kHelloBodyValue, delegate2.data_received()); |
+} |
+ |
+// Tests that if two requests use the same QUIC session, the second request |
+// should not have |LoadTimingInfo::connect_timing|. |
+TEST_F(URLRequestQuicTest, TestTwoRequestsSecondPush) { |
+ base::RunLoop run_loop; |
+ WaitForCompletionNetworkDelegate network_delegate( |
+ run_loop.QuitClosure(), /*num_expected_requests=*/2); |
+ SetNetworkDelegate(&network_delegate); |
Init(); |
- // Send a request to /index2.hmtl which pushes /kitten-1.jpg and /favicon.ico |
- // and shouldn't cancel any since neither is in cache. |
CheckLoadTimingDelegate delegate(false); |
+ delegate.set_quit_on_complete(false); |
std::string url = |
base::StringPrintf("https://%s%s", kTestServerHost, "/index2.html"); |
+ std::string url2 = |
+ base::StringPrintf("https://%s%s", kTestServerHost, "/favicon.ico"); |
+ |
std::unique_ptr<URLRequest> request = |
CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate); |
+ CheckLoadTimingDelegate delegate2(true); |
+ delegate2.set_quit_on_complete(false); |
+ std::unique_ptr<URLRequest> request2 = |
+ CreateRequest(GURL(url2), DEFAULT_PRIORITY, &delegate2); |
request->Start(); |
ASSERT_TRUE(request->is_pending()); |
- base::RunLoop().Run(); |
+ request2->Start(); |
+ run_loop.Run(); |
+ EXPECT_TRUE(request->status().is_success()); |
+ EXPECT_TRUE(request2->status().is_success()); |
+ EXPECT_EQ(kHelloBodyValue, delegate.data_received()); |
+ EXPECT_EQ(kHelloBodyValue, delegate2.data_received()); |
- // Extract net logs on client side to verify push lookup transactions. |
net::TestNetLogEntry::List entries; |
- ExtractNetLog(NetLogEventType::SERVER_PUSH_LOOKUP_TRANSACTION, &entries); |
- |
+ // ExtractNetLog(NetLogEventType::SERVER_PUSH_LOOKUP_TRANSACTION, &entries); |
+ // EXPECT_EQ(4u, entries.size()); |
+ ExtractNetLog(NetLogEventType::QUIC_SESSION_PUSH_PROMISE_RECEIVED, &entries); |
EXPECT_EQ(4u, entries.size()); |
+ EXPECT_EQ(100, GetPushPromiseSent()); |
+} |
- std::string value; |
- int net_error; |
- std::string push_url_1 = |
- base::StringPrintf("https://%s%s", kTestServerHost, "/kitten-1.jpg"); |
- std::string push_url_2 = |
- base::StringPrintf("https://%s%s", kTestServerHost, "/favicon.ico"); |
+TEST_F(URLRequestQuicTest, TestRequestsSentPush) { |
+ base::RunLoop run_loop; |
+ WaitForCompletionNetworkDelegate network_delegate( |
+ run_loop.QuitClosure(), /*num_expected_requests=*/1); |
+ SetNetworkDelegate(&network_delegate); |
+ Init(); |
+ CheckLoadTimingDelegate delegate(false); |
+ delegate.set_quit_on_complete(false); |
+ std::string url = |
+ base::StringPrintf("https://%s%s", kTestServerHost, "/index2.html"); |
- EXPECT_TRUE(entries[0].GetStringValue("push_url", &value)); |
- EXPECT_EQ(value, push_url_1); |
- EXPECT_TRUE(entries[1].GetIntegerValue("net_error", &net_error)); |
- EXPECT_EQ(net_error, -400); |
+ std::unique_ptr<URLRequest> request = |
+ CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate); |
- EXPECT_TRUE(entries[2].GetStringValue("push_url", &value)); |
- EXPECT_EQ(value, push_url_2); |
- EXPECT_TRUE(entries[3].GetIntegerValue("net_error", &net_error)); |
- EXPECT_EQ(net_error, -400); |
+ request->Start(); |
+ ASSERT_TRUE(request->is_pending()); |
+ run_loop.Run(); |
EXPECT_TRUE(request->status().is_success()); |
+ EXPECT_EQ(kHelloBodyValue, delegate.data_received()); |
- // Verify the reset error count received on the server side. |
- EXPECT_EQ(0u, GetRstErrorCountReceivedByServer(QUIC_STREAM_CANCELLED)); |
+ net::TestNetLogEntry::List entries; |
+ // ExtractNetLog(NetLogEventType::SERVER_PUSH_LOOKUP_TRANSACTION, &entries); |
+ // EXPECT_EQ(4u, entries.size()); |
+ ExtractNetLog(NetLogEventType::QUIC_SESSION_PUSH_PROMISE_RECEIVED, &entries); |
+ EXPECT_EQ(4u, entries.size()); |
+ EXPECT_EQ(100, GetPushPromiseSent()); |
} |
-// Tests that if two requests use the same QUIC session, the second request |
-// should not have |LoadTimingInfo::connect_timing|. |
-TEST_F(URLRequestQuicTest, TestTwoRequests) { |
+TEST_F(URLRequestQuicTest, TestGetRequest2) { |
+ Init(); |
+ CheckLoadTimingDelegate delegate(false); |
+ std::string url = |
+ base::StringPrintf("https://%s%s", kTestServerHost, "/index2.html"); |
+ std::unique_ptr<URLRequest> request = |
+ CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate); |
+ |
+ request->Start(); |
+ ASSERT_TRUE(request->is_pending()); |
+ base::RunLoop().Run(); |
+ |
+ EXPECT_TRUE(request->status().is_success()); |
+ EXPECT_EQ(kHelloBodyValue, delegate.data_received()); |
+ |
+ net::TestNetLogEntry::List entries; |
+ // ExtractNetLog(NetLogEventType::SERVER_PUSH_LOOKUP_TRANSACTION, &entries); |
+ // EXPECT_EQ(4u, entries.size()); |
+ ExtractNetLog(NetLogEventType::QUIC_SESSION_PUSH_PROMISE_RECEIVED, &entries); |
+ EXPECT_EQ(4u, entries.size()); |
+ EXPECT_EQ(100, GetPushPromiseSent()); |
+} |
+ |
+TEST_F(URLRequestQuicTest, TestRequestsSentPush3ManualAdd) { |
base::RunLoop run_loop; |
WaitForCompletionNetworkDelegate network_delegate( |
- run_loop.QuitClosure(), /*num_expected_requests=*/2); |
+ run_loop.QuitClosure(), /*num_expected_requests=*/1); |
SetNetworkDelegate(&network_delegate); |
Init(); |
CheckLoadTimingDelegate delegate(false); |
delegate.set_quit_on_complete(false); |
std::string url = |
- base::StringPrintf("https://%s%s", kTestServerHost, kHelloPath); |
+ base::StringPrintf("https://%s%s", kTestServerHost, "/index3.html"); |
+ |
std::unique_ptr<URLRequest> request = |
CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate); |
- CheckLoadTimingDelegate delegate2(true); |
- delegate2.set_quit_on_complete(false); |
- std::unique_ptr<URLRequest> request2 = |
- CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate2); |
request->Start(); |
- request2->Start(); |
ASSERT_TRUE(request->is_pending()); |
- ASSERT_TRUE(request2->is_pending()); |
run_loop.Run(); |
EXPECT_TRUE(request->status().is_success()); |
- EXPECT_TRUE(request2->status().is_success()); |
EXPECT_EQ(kHelloBodyValue, delegate.data_received()); |
- EXPECT_EQ(kHelloBodyValue, delegate2.data_received()); |
+ |
+ net::TestNetLogEntry::List entries; |
+ // ExtractNetLog(NetLogEventType::SERVER_PUSH_LOOKUP_TRANSACTION, &entries); |
+ // EXPECT_EQ(4u, entries.size()); |
+ ExtractNetLog(NetLogEventType::QUIC_SESSION_PUSH_PROMISE_RECEIVED, &entries); |
+ EXPECT_EQ(100u, entries.size()); |
+ EXPECT_EQ(100, GetPushPromiseSent()); |
} |
+TEST_F(URLRequestQuicTest, TestGetRequest3ManualAddPush) { |
+ Init(); |
+ CheckLoadTimingDelegate delegate(false); |
+ std::string url = |
+ base::StringPrintf("https://%s%s", kTestServerHost, "/index3.html"); |
+ std::unique_ptr<URLRequest> request = |
+ CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate); |
+ |
+ request->Start(); |
+ ASSERT_TRUE(request->is_pending()); |
+ base::RunLoop().Run(); |
+ |
+ EXPECT_TRUE(request->status().is_success()); |
+ EXPECT_EQ(kHelloBodyValue, delegate.data_received()); |
+ |
+ net::TestNetLogEntry::List entries; |
+ // ExtractNetLog(NetLogEventType::SERVER_PUSH_LOOKUP_TRANSACTION, &entries); |
+ // EXPECT_EQ(4u, entries.size()); |
+ ExtractNetLog(NetLogEventType::QUIC_SESSION_PUSH_PROMISE_RECEIVED, &entries); |
+ EXPECT_EQ(100u, entries.size()); |
+ EXPECT_EQ(100, GetPushPromiseSent()); |
+} |
+ |
+ |
} // namespace net |