Index: net/socket/ssl_client_socket_unittest.cc |
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc |
index b80aa4ddf5af432f12e54a5e7a7012dea7cd1b0a..1331dd02994f527a591d0a5ca97240520c7bc6af 100644 |
--- a/net/socket/ssl_client_socket_unittest.cc |
+++ b/net/socket/ssl_client_socket_unittest.cc |
@@ -18,6 +18,10 @@ |
#include "base/single_thread_task_runner.h" |
#include "base/threading/thread_task_runner_handle.h" |
#include "base/time/time.h" |
+#include "base/trace_event/memory_allocator_dump.h" |
+#include "base/trace_event/process_memory_dump.h" |
+#include "base/trace_event/trace_event_argument.h" |
+#include "base/values.h" |
#include "net/base/address_list.h" |
#include "net/base/io_buffer.h" |
#include "net/base/net_errors.h" |
@@ -3674,4 +3678,75 @@ TEST_F(SSLClientSocketTest, AccessDeniedClientCerts) { |
EXPECT_THAT(rv, IsError(ERR_BAD_SSL_CLIENT_AUTH_CERT)); |
} |
+// Basic test for dumping memory stats. |
+TEST_F(SSLClientSocketTest, DumpMemoryStats) { |
+ ASSERT_TRUE(StartTestServer(SpawnedTestServer::SSLOptions())); |
+ |
+ int rv; |
+ ASSERT_TRUE(CreateAndConnectSSLClientSocket(SSLConfig(), &rv)); |
+ EXPECT_THAT(rv, IsOk()); |
+ |
+ base::trace_event::MemoryDumpArgs dump_args = { |
+ base::trace_event::MemoryDumpLevelOfDetail::DETAILED}; |
+ std::unique_ptr<base::trace_event::ProcessMemoryDump> process_memory_dump( |
+ new base::trace_event::ProcessMemoryDump(nullptr, dump_args)); |
+ base::trace_event::MemoryAllocatorDump* parent_dump1 = |
+ process_memory_dump->CreateAllocatorDump("parent1"); |
+ sock_->DumpMemoryStats(process_memory_dump.get(), |
+ parent_dump1->absolute_name()); |
+ |
+ // Write the request. |
+ std::string request_text = "GET / HTTP/1.1\r\n\r\n"; |
+ scoped_refptr<IOBuffer> request_buffer(new StringIOBuffer(request_text)); |
+ TestCompletionCallback write_callback; |
+ rv = write_callback.GetResult(sock_->Write( |
+ request_buffer.get(), request_text.size(), write_callback.callback())); |
+ EXPECT_EQ(static_cast<int>(request_text.size()), rv); |
+ |
+ // Read the response. |
+ TestCompletionCallback read_callback; |
+ scoped_refptr<IOBuffer> buf(new IOBuffer(4096)); |
+ rv = sock_->Read(buf.get(), 4096, read_callback.callback()); |
+ rv = read_callback.WaitForResult(); |
+ EXPECT_GT(rv, 0); |
+ |
+ // Dump memory again and check that |buffer_size| should contain read buffer. |
+ base::trace_event::MemoryAllocatorDump* parent_dump3 = |
+ process_memory_dump->CreateAllocatorDump("parent2"); |
+ sock_->DumpMemoryStats(process_memory_dump.get(), |
+ parent_dump3->absolute_name()); |
+ |
+ const base::trace_event::ProcessMemoryDump::AllocatorDumpsMap& |
+ allocator_dumps = process_memory_dump->allocator_dumps(); |
+ bool did_dump[] = {false, false}; |
+ // Checks that there are three dumps because DumpMemoryStats() is invoked |
+ // before writing the request, before reading the response and after reading |
+ // the response. |
+ for (const auto& pair : allocator_dumps) { |
+ const std::string& dump_name = pair.first; |
+ if (dump_name.find("ssl_socket") == std::string::npos) |
+ return; |
+ std::unique_ptr<base::Value> raw_attrs = |
+ pair.second->attributes_for_testing()->ToBaseValue(); |
+ base::DictionaryValue* attrs; |
+ ASSERT_TRUE(raw_attrs->GetAsDictionary(&attrs)); |
+ base::DictionaryValue* buffer_size_attrs; |
+ ASSERT_TRUE(attrs->GetDictionary("buffer_size", &buffer_size_attrs)); |
+ std::string buffer_size; |
+ ASSERT_TRUE(buffer_size_attrs->GetString("value", &buffer_size)); |
+ ASSERT_TRUE(attrs->HasKey("serialized_cert_size")); |
+ ASSERT_TRUE(attrs->HasKey("serialized_cert_count")); |
+ if (dump_name.find("parent1/ssl_socket") != std::string::npos) { |
+ did_dump[0] = true; |
+ ASSERT_EQ("0", buffer_size); |
+ } |
+ if (dump_name.find("parent2/ssl_socket") != std::string::npos) { |
+ did_dump[1] = true; |
+ // Buffer size should take into account the read buffer size. |
davidben
2016/12/07 19:42:58
Perhaps:
// The buffers should be released if the
xunjieli
2016/12/07 20:32:25
But in this case, the buffer size is not equals to
|
+ ASSERT_NE("0", buffer_size); |
+ } |
+ } |
+ EXPECT_THAT(did_dump, testing::ElementsAre(true, true)); |
+} |
+ |
} // namespace net |