diff --git a/net/net.gyp b/net/net.gyp index 3f1d79364a21ee..7f6a7fc0e860b1 100644 --- a/net/net.gyp +++ b/net/net.gyp @@ -1939,6 +1939,8 @@ 'tools/quic/test_tools/quic_client_peer.h', 'tools/quic/test_tools/quic_epoll_connection_helper_peer.cc', 'tools/quic/test_tools/quic_epoll_connection_helper_peer.h', + 'tools/quic/test_tools/quic_in_memory_cache_peer.h', + 'tools/quic/test_tools/quic_in_memory_cache_peer.cc', 'tools/quic/test_tools/quic_test_client.cc', 'tools/quic/test_tools/quic_test_client.h', 'tools/quic/test_tools/quic_test_utils.cc', @@ -2665,6 +2667,7 @@ 'tools/flip_server/epoll_server.h', 'tools/flip_server/http_message_constants.cc', 'tools/flip_server/http_message_constants.h', + 'tools/flip_server/noop_balsa_visitor.h', 'tools/flip_server/split.h', 'tools/flip_server/split.cc', ], diff --git a/net/tools/flip_server/balsa_visitor_interface.h b/net/tools/flip_server/balsa_visitor_interface.h index 75283acf7e29b6..25427239d4d93e 100644 --- a/net/tools/flip_server/balsa_visitor_interface.h +++ b/net/tools/flip_server/balsa_visitor_interface.h @@ -178,4 +178,3 @@ class BalsaVisitorInterface { } // namespace net #endif // NET_TOOLS_FLIP_SERVER_BALSA_VISITOR_INTERFACE_H_ - diff --git a/net/tools/flip_server/noop_balsa_visitor.h b/net/tools/flip_server/noop_balsa_visitor.h new file mode 100644 index 00000000000000..04f4aa6dff0285 --- /dev/null +++ b/net/tools/flip_server/noop_balsa_visitor.h @@ -0,0 +1,60 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Provides empty BalsaVisitorInterface overrides for convenience. +// Intended to be used as a base class for BalsaVisitorInterface subclasses that +// only need to override a small number of methods. + +#ifndef NET_TOOLS_FLIP_SERVER_NOOP_BALSA_VISITOR_H_ +#define NET_TOOLS_FLIP_SERVER_NOOP_BALSA_VISITOR_H_ + +#include "net/tools/flip_server/balsa_visitor_interface.h" + +namespace net { + +// See file comment above. +class NoOpBalsaVisitor : public BalsaVisitorInterface { + public: + NoOpBalsaVisitor() { } + virtual ~NoOpBalsaVisitor() { } + + virtual void ProcessBodyInput(const char* input, size_t size) OVERRIDE { } + virtual void ProcessBodyData(const char* input, size_t size) OVERRIDE { } + virtual void ProcessHeaderInput(const char* input, size_t size) OVERRIDE { } + virtual void ProcessTrailerInput(const char* input, size_t size) OVERRIDE { } + virtual void ProcessHeaders(const BalsaHeaders& headers) OVERRIDE { } + + virtual void ProcessRequestFirstLine(const char* line_input, + size_t line_length, + const char* method_input, + size_t method_length, + const char* request_uri_input, + size_t request_uri_length, + const char* version_input, + size_t version_length) OVERRIDE { } + virtual void ProcessResponseFirstLine(const char* line_input, + size_t line_length, + const char* version_input, + size_t version_length, + const char* status_input, + size_t status_length, + const char* reason_input, + size_t reason_length) OVERRIDE { } + virtual void ProcessChunkLength(size_t chunk_length) OVERRIDE { } + virtual void ProcessChunkExtensions(const char* input, size_t size) OVERRIDE { + } + virtual void HeaderDone() OVERRIDE { } + virtual void MessageDone() OVERRIDE { } + virtual void HandleHeaderError(BalsaFrame* framer) OVERRIDE { } + virtual void HandleHeaderWarning(BalsaFrame* framer) OVERRIDE { } + virtual void HandleChunkingError(BalsaFrame* framer) OVERRIDE { } + virtual void HandleBodyError(BalsaFrame* framer) OVERRIDE { } + + private: + DISALLOW_COPY_AND_ASSIGN(NoOpBalsaVisitor); +}; + +} // namespace net + +#endif // NET_TOOLS_FLIP_SERVER_NOOP_BALSA_VISITOR_H_ diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc index 95b6648d0c9e32..1aa03f04b8f8b7 100644 --- a/net/tools/quic/end_to_end_test.cc +++ b/net/tools/quic/end_to_end_test.cc @@ -25,6 +25,7 @@ #include "net/tools/quic/test_tools/http_message_test_utils.h" #include "net/tools/quic/test_tools/quic_client_peer.h" #include "net/tools/quic/test_tools/quic_epoll_connection_helper_peer.h" +#include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" #include "net/tools/quic/test_tools/quic_test_client.h" #include "net/tools/quic/test_tools/server_thread.h" #include "testing/gtest/include/gtest/gtest.h" @@ -58,11 +59,6 @@ void GenerateBody(string* body, int length) { } class EndToEndTest : public ::testing::TestWithParam { - public: - static void SetUpTestCase() { - QuicInMemoryCache::GetInstance()->ResetForTests(); - } - protected: EndToEndTest() : server_hostname_("example.com"), @@ -76,6 +72,7 @@ class EndToEndTest : public ::testing::TestWithParam { client_config_.SetDefaults(); server_config_.SetDefaults(); + QuicInMemoryCachePeer::ResetForTests(); AddToCache("GET", kLargeRequest, "HTTP/1.1", "200", "OK", kFooResponseBody); AddToCache("GET", "https://www.google.com/foo", "HTTP/1.1", "200", "OK", kFooResponseBody); @@ -84,6 +81,10 @@ class EndToEndTest : public ::testing::TestWithParam { version_ = GetParam(); } + virtual ~EndToEndTest() { + QuicInMemoryCachePeer::ResetForTests(); + } + virtual QuicTestClient* CreateQuicClient() { QuicTestClient* client = new QuicTestClient(server_address_, server_hostname_, @@ -131,7 +132,7 @@ class EndToEndTest : public ::testing::TestWithParam { StringPiece response_code, StringPiece response_detail, StringPiece body) { - QuicInMemoryCache::GetInstance()->AddOrVerifyResponse( + QuicInMemoryCache::GetInstance()->AddSimpleResponse( method, path, version, response_code, response_detail, body); } diff --git a/net/tools/quic/quic_in_memory_cache.cc b/net/tools/quic/quic_in_memory_cache.cc index 8e97f553ac08b3..791e15f0be0db4 100644 --- a/net/tools/quic/quic_in_memory_cache.cc +++ b/net/tools/quic/quic_in_memory_cache.cc @@ -8,6 +8,7 @@ #include "base/files/file_enumerator.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" +#include "net/tools/flip_server/balsa_headers.h" using base::FilePath; using base::StringPiece; @@ -20,20 +21,17 @@ using std::string; namespace net { namespace tools { -std::string FLAGS_quic_in_memory_cache_dir = "/tmp/quic-data"; +std::string FLAGS_quic_in_memory_cache_dir = ""; namespace { // BalsaVisitor implementation (glue) which caches response bodies. -class CachingBalsaVisitor : public BalsaVisitorInterface { +class CachingBalsaVisitor : public NoOpBalsaVisitor { public: CachingBalsaVisitor() : done_framing_(false) {} virtual void ProcessBodyData(const char* input, size_t size) OVERRIDE { AppendToBody(input, size); } - virtual void ProcessTrailers(const BalsaHeaders& trailer) { - LOG(DFATAL) << "Trailers not supported."; - } virtual void MessageDone() OVERRIDE { done_framing_ = true; } @@ -43,8 +41,6 @@ class CachingBalsaVisitor : public BalsaVisitorInterface { virtual void HandleHeaderWarning(BalsaFrame* framer) OVERRIDE { UnhandledError(); } - virtual void HandleTrailerError(BalsaFrame* framer) { UnhandledError(); } - virtual void HandleTrailerWarning(BalsaFrame* framer) { UnhandledError(); } virtual void HandleChunkingError(BalsaFrame* framer) OVERRIDE { UnhandledError(); } @@ -54,20 +50,6 @@ class CachingBalsaVisitor : public BalsaVisitorInterface { void UnhandledError() { LOG(DFATAL) << "Unhandled error framing HTTP."; } - virtual void ProcessBodyInput(const char*, size_t) OVERRIDE {} - virtual void ProcessHeaderInput(const char*, size_t) OVERRIDE {} - virtual void ProcessTrailerInput(const char*, size_t) OVERRIDE {} - virtual void ProcessHeaders(const net::BalsaHeaders&) OVERRIDE {} - virtual void ProcessRequestFirstLine( - const char*, size_t, const char*, size_t, - const char*, size_t, const char*, size_t) OVERRIDE {} - virtual void ProcessResponseFirstLine( - const char*, size_t, const char*, - size_t, const char*, size_t, const char*, size_t) OVERRIDE {} - virtual void ProcessChunkLength(size_t) OVERRIDE {} - virtual void ProcessChunkExtensions(const char*, size_t) OVERRIDE {} - virtual void HeaderDone() OVERRIDE {} - void AppendToBody(const char* input, size_t size) { body_.append(input, size); } @@ -81,6 +63,7 @@ class CachingBalsaVisitor : public BalsaVisitorInterface { } // namespace +// static QuicInMemoryCache* QuicInMemoryCache::GetInstance() { return Singleton::get(); } @@ -94,12 +77,12 @@ const QuicInMemoryCache::Response* QuicInMemoryCache::GetResponse( return it->second; } -void QuicInMemoryCache::AddOrVerifyResponse(StringPiece method, - StringPiece path, - StringPiece version, - StringPiece response_code, - StringPiece response_detail, - StringPiece body) { +void QuicInMemoryCache::AddSimpleResponse(StringPiece method, + StringPiece path, + StringPiece version, + StringPiece response_code, + StringPiece response_detail, + StringPiece body) { BalsaHeaders request_headers, response_headers; request_headers.SetRequestFirstlineFromStringPieces(method, path, @@ -110,18 +93,7 @@ void QuicInMemoryCache::AddOrVerifyResponse(StringPiece method, response_headers.AppendHeader("content-length", base::IntToString(body.length())); - // Check if response already exists and matches. - const QuicInMemoryCache::Response* cached_response = - GetResponse(request_headers); - if (cached_response == NULL) { - AddResponse(request_headers, response_headers, body); - return; - } - string cached_response_headers_str, response_headers_str; - cached_response->headers().DumpToString(&cached_response_headers_str); - response_headers.DumpToString(&response_headers_str); - CHECK_EQ(cached_response_headers_str, response_headers_str); - CHECK_EQ(cached_response->body(), body); + AddResponse(request_headers, response_headers, body); } void QuicInMemoryCache::AddResponse(const BalsaHeaders& request_headers, @@ -130,6 +102,7 @@ void QuicInMemoryCache::AddResponse(const BalsaHeaders& request_headers, LOG(INFO) << "Adding response for: " << GetKey(request_headers); if (ContainsKey(responses_, GetKey(request_headers))) { LOG(DFATAL) << "Response for given request already exists!"; + return; } Response* new_response = new Response(); new_response->set_headers(response_headers); @@ -137,12 +110,12 @@ void QuicInMemoryCache::AddResponse(const BalsaHeaders& request_headers, responses_[GetKey(request_headers)] = new_response; } -void QuicInMemoryCache::ResetForTests() { - STLDeleteValues(&responses_); +QuicInMemoryCache::QuicInMemoryCache() { Initialize(); } -QuicInMemoryCache::QuicInMemoryCache() { +void QuicInMemoryCache::ResetForTests() { + STLDeleteValues(&responses_); Initialize(); } diff --git a/net/tools/quic/quic_in_memory_cache.h b/net/tools/quic/quic_in_memory_cache.h index 94f524a7616b8a..43b692e6416e28 100644 --- a/net/tools/quic/quic_in_memory_cache.h +++ b/net/tools/quic/quic_in_memory_cache.h @@ -12,12 +12,17 @@ #include "base/strings/string_piece.h" #include "net/tools/flip_server/balsa_frame.h" #include "net/tools/flip_server/balsa_headers.h" +#include "net/tools/flip_server/noop_balsa_visitor.h" template struct DefaultSingletonTraits; namespace net { namespace tools { +namespace test { +class QuicInMemoryCachePeer; +} // namespace + extern std::string FLAGS_quic_in_memory_cache_dir; class QuicServer; @@ -51,6 +56,8 @@ class QuicInMemoryCache { DISALLOW_COPY_AND_ASSIGN(Response); }; + + // Returns the singleton instance of the cache. static QuicInMemoryCache* GetInstance(); // Retrieve a response from this cache for a given request. @@ -58,30 +65,32 @@ class QuicInMemoryCache { // Currently, responses are selected based on request URI only. const Response* GetResponse(const BalsaHeaders& request_headers) const; - // Adds a response to the cache if no matching entry exists. - // Otherwise it verifies that the existing entry matches. - void AddOrVerifyResponse(base::StringPiece method, - base::StringPiece path, - base::StringPiece version, - base::StringPiece response_code, - base::StringPiece response_detail, - base::StringPiece body); + // Adds a simple response to the cache. The response headers will + // only contain the "content-length" header with the lenght of |body|. + void AddSimpleResponse(base::StringPiece method, + base::StringPiece path, + base::StringPiece version, + base::StringPiece response_code, + base::StringPiece response_detail, + base::StringPiece body); // Add a response to the cache. void AddResponse(const BalsaHeaders& request_headers, const BalsaHeaders& response_headers, base::StringPiece response_body); - void ResetForTests(); - private: typedef base::hash_map ResponseMap; friend struct DefaultSingletonTraits; + friend class test::QuicInMemoryCachePeer; QuicInMemoryCache(); ~QuicInMemoryCache(); + void ResetForTests(); + void Initialize(); + std::string GetKey(const BalsaHeaders& response_headers) const; // Cached responses. diff --git a/net/tools/quic/quic_in_memory_cache_test.cc b/net/tools/quic/quic_in_memory_cache_test.cc index 065ecc3b4372aa..a31a986d234165 100644 --- a/net/tools/quic/quic_in_memory_cache_test.cc +++ b/net/tools/quic/quic_in_memory_cache_test.cc @@ -11,6 +11,7 @@ #include "base/strings/string_piece.h" #include "net/tools/flip_server/balsa_headers.h" #include "net/tools/quic/quic_in_memory_cache.h" +#include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" #include "testing/gtest/include/gtest/gtest.h" using base::IntToString; @@ -39,7 +40,7 @@ class QuicInMemoryCacheTest : public ::testing::Test { } virtual void SetUp() { - QuicInMemoryCache::GetInstance()->ResetForTests(); + QuicInMemoryCachePeer::ResetForTests(); } // This method was copied from end_to_end_test.cc in this directory. diff --git a/net/tools/quic/quic_reliable_server_stream_test.cc b/net/tools/quic/quic_reliable_server_stream_test.cc index 53533a35cb1cb5..9de67fa4cb38fe 100644 --- a/net/tools/quic/quic_reliable_server_stream_test.cc +++ b/net/tools/quic/quic_reliable_server_stream_test.cc @@ -12,6 +12,7 @@ #include "net/tools/quic/quic_in_memory_cache.h" #include "net/tools/quic/quic_spdy_server_stream.h" #include "net/tools/quic/spdy_utils.h" +#include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" #include "net/tools/quic/test_tools/quic_test_utils.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -80,7 +81,7 @@ class QuicReliableServerStreamTest : public ::testing::Test { } static void SetUpTestCase() { - QuicInMemoryCache::GetInstance()->ResetForTests(); + QuicInMemoryCachePeer::ResetForTests(); } virtual void SetUp() { diff --git a/net/tools/quic/test_tools/quic_in_memory_cache_peer.cc b/net/tools/quic/test_tools/quic_in_memory_cache_peer.cc new file mode 100644 index 00000000000000..feb506e49c86eb --- /dev/null +++ b/net/tools/quic/test_tools/quic_in_memory_cache_peer.cc @@ -0,0 +1,20 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" + +#include "net/tools/quic/quic_in_memory_cache.h" + +namespace net { +namespace tools { +namespace test { + +// static +void QuicInMemoryCachePeer::ResetForTests() { + QuicInMemoryCache::GetInstance()->ResetForTests(); +} + +} // namespace test +} // namespace tools +} // namespace net diff --git a/net/tools/quic/test_tools/quic_in_memory_cache_peer.h b/net/tools/quic/test_tools/quic_in_memory_cache_peer.h new file mode 100644 index 00000000000000..b5996bd7505619 --- /dev/null +++ b/net/tools/quic/test_tools/quic_in_memory_cache_peer.h @@ -0,0 +1,27 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_TOOLS_QUIC_TEST_TOOLS_QUIC_IN_MEMORY_CACHE_PEER_H_ +#define NET_TOOLS_QUIC_TEST_TOOLS_QUIC_IN_MEMORY_CACHE_PEER_H_ + +#include "net/tools/quic/quic_in_memory_cache.h" + +namespace net { +namespace tools { +namespace test { + +class QuicInMemoryCachePeer { + public: + // Resets the singleton QuicInMemoryCache to a fresh state. + static void ResetForTests(); + + private: + DISALLOW_COPY_AND_ASSIGN(QuicInMemoryCachePeer); +}; + +} // namespace test +} // namespace tools +} // namespace net + +#endif // NET_TOOLS_QUIC_TEST_TOOLS_QUIC_IN_MEMORY_CACHE_PEER_H_