From 07516269ca14f8ef4cf6bfaa721f169290ef7318 Mon Sep 17 00:00:00 2001 From: "tyoshino@chromium.org" Date: Thu, 22 Aug 2013 07:43:24 +0000 Subject: Limit the total memory usage for Stream instances Stream instances report their memory usage to StreamRegistry to get approval. If rejected, they unregisters themselves. writer_ and reader_ are cleared immediately when memory usage violation happens. Added task runner DCHECKs to ByteStreamReaderImpl and ByteStreamWriterImpl so that we can check we're not violating thread restriction. BUG=169957 Review URL: https://chromiumcodereview.appspot.com/22908008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@218933 0039d316-1c4b-4281-b951-d872f2087c98 --- content/browser/streams/stream_unittest.cc | 55 ++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'content/browser/streams/stream_unittest.cc') diff --git a/content/browser/streams/stream_unittest.cc b/content/browser/streams/stream_unittest.cc index c0077b7..2e0386b 100644 --- a/content/browser/streams/stream_unittest.cc +++ b/content/browser/streams/stream_unittest.cc @@ -250,4 +250,59 @@ TEST_F(StreamTest, UnregisterStream) { ASSERT_FALSE(stream2.get()); } +TEST_F(StreamTest, MemoryExceedMemoryUsageLimit) { + TestStreamWriter writer1; + TestStreamWriter writer2; + + GURL url1("blob://stream"); + scoped_refptr stream1( + new Stream(registry_.get(), &writer1, url1)); + + GURL url2("blob://stream2"); + scoped_refptr stream2( + new Stream(registry_.get(), &writer2, url2)); + + const int kMaxMemoryUsage = 1500000; + registry_->set_max_memory_usage_for_testing(kMaxMemoryUsage); + + const int kBufferSize = 1000000; + scoped_refptr buffer(NewIOBuffer(kBufferSize)); + writer1.Write(stream1.get(), buffer, kBufferSize); + // Make transfer happen. + base::MessageLoop::current()->RunUntilIdle(); + + writer2.Write(stream2.get(), buffer, kBufferSize); + + // Written data (1000000 * 2) exceeded limit (1500000). |stream2| should be + // unregistered with |registry_|. + EXPECT_EQ(NULL, registry_->GetStream(url2).get()); + + writer1.Write(stream1.get(), buffer, kMaxMemoryUsage - kBufferSize); + // Should be accepted since stream2 is unregistered and the new data is not + // so big to exceed the limit. + EXPECT_FALSE(registry_->GetStream(url1).get() == NULL); +} + +TEST_F(StreamTest, UnderMemoryUsageLimit) { + TestStreamWriter writer; + TestStreamReader reader; + + GURL url("blob://stream"); + scoped_refptr stream(new Stream(registry_.get(), &writer, url)); + EXPECT_TRUE(stream->SetReadObserver(&reader)); + + registry_->set_max_memory_usage_for_testing(1500000); + + const int kBufferSize = 1000000; + scoped_refptr buffer(NewIOBuffer(kBufferSize)); + writer.Write(stream.get(), buffer, kBufferSize); + + // Run loop to make |reader| consume the data. + base::MessageLoop::current()->RunUntilIdle(); + + writer.Write(stream.get(), buffer, kBufferSize); + + EXPECT_EQ(stream.get(), registry_->GetStream(url).get()); +} + } // namespace content -- cgit v1.1