diff options
author | tyoshino@chromium.org <tyoshino@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-22 07:43:24 +0000 |
---|---|---|
committer | tyoshino@chromium.org <tyoshino@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-22 07:43:24 +0000 |
commit | 07516269ca14f8ef4cf6bfaa721f169290ef7318 (patch) | |
tree | 48b5db5a9942032ea55e0bda6187d4afc1fa6935 /content/browser/streams/stream_unittest.cc | |
parent | 10fbd595e72eb145399ebf94dbd472281cc2b053 (diff) | |
download | chromium_src-07516269ca14f8ef4cf6bfaa721f169290ef7318.zip chromium_src-07516269ca14f8ef4cf6bfaa721f169290ef7318.tar.gz chromium_src-07516269ca14f8ef4cf6bfaa721f169290ef7318.tar.bz2 |
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
Diffstat (limited to 'content/browser/streams/stream_unittest.cc')
-rw-r--r-- | content/browser/streams/stream_unittest.cc | 55 |
1 files changed, 55 insertions, 0 deletions
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<Stream> stream1( + new Stream(registry_.get(), &writer1, url1)); + + GURL url2("blob://stream2"); + scoped_refptr<Stream> 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<net::IOBuffer> 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> 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<net::IOBuffer> 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 |