Index: chrome/browser/nacl_host/pnacl_host_unittest.cc |
diff --git a/chrome/browser/nacl_host/pnacl_host_unittest.cc b/chrome/browser/nacl_host/pnacl_host_unittest.cc |
index fc26d1a224bc4d2e190a5f7beb326548e1ce5047..df4a32d6a49c53c990b43b976cc58f54e4992390 100644 |
--- a/chrome/browser/nacl_host/pnacl_host_unittest.cc |
+++ b/chrome/browser/nacl_host/pnacl_host_unittest.cc |
@@ -32,10 +32,15 @@ class PnaclHostTest : public testing::Test { |
host_ = new PnaclHost(); |
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
host_->InitForTest(temp_dir_.path()); |
- EXPECT_EQ(host_->cache_state_, PnaclHost::CacheReady); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(PnaclHost::CacheReady, host_->cache_state_); |
} |
virtual void TearDown() { |
EXPECT_EQ(0U, host_->pending_translations()); |
+ // Give the host a chance to de-init the backend, and then delete it. |
+ host_->RendererClosing(0); |
+ FlushQueues(); |
+ EXPECT_EQ(PnaclHost::CacheUninitialized, host_->cache_state_); |
delete host_; |
} |
// Flush the blocking pool first, then any tasks it posted to the IO thread. |
@@ -48,6 +53,14 @@ class PnaclHostTest : public testing::Test { |
base::RunLoop().RunUntilIdle(); |
} |
int GetCacheSize() { return host_->disk_cache_->Size(); } |
+ int CacheIsInitialized() { |
+ return host_->cache_state_ == PnaclHost::CacheReady; |
+ } |
+ void ReInitBackend() { |
+ host_->InitForTest(temp_dir_.path()); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(PnaclHost::CacheReady, host_->cache_state_); |
+ } |
public: // Required for derived classes to bind this method |
// Callbacks used by tests which call GetNexeFd. |
@@ -133,6 +146,9 @@ TEST_F(PnaclHostTest, BasicMiss) { |
EXPECT_EQ(2, temp_callback_count_); |
EXPECT_EQ(1U, host_->pending_translations()); |
host_->RendererClosing(0); |
+ FlushQueues(); |
+ // Check that the cache has de-initialized after the last renderer goes away. |
+ EXPECT_FALSE(CacheIsInitialized()); |
} |
TEST_F(PnaclHostTest, BadArguments) { |
@@ -169,6 +185,10 @@ TEST_F(PnaclHostTest, TranslationErrors) { |
FlushQueues(); |
EXPECT_EQ(0U, host_->pending_translations()); |
EXPECT_EQ(0, temp_callback_count_); |
+ // The backend will have been freed when the query comes back and there |
+ // are no pending translations. |
+ EXPECT_FALSE(CacheIsInitialized()); |
+ ReInitBackend(); |
// Check that another request for the same info misses successfully. |
GET_NEXE_FD(0, 0, false, info, false); |
FlushQueues(); |
@@ -401,10 +421,12 @@ TEST_F(PnaclHostTest, ClearTranslationCache) { |
// Since we are using a memory backend, the clear should happen immediately. |
host_->ClearTranslationCacheEntriesBetween( |
base::Time(), base::Time(), base::Bind(cb.callback(), 0)); |
- EXPECT_EQ(0, cb.GetResult(net::ERR_IO_PENDING)); |
- // Check that the translation cache has been cleared |
+ // Check that the translation cache has been cleared before flushing the |
+ // queues, because the backend will be freed once it is. |
EXPECT_EQ(0, GetCacheSize()); |
- host_->RendererClosing(0); |
+ EXPECT_EQ(0, cb.GetResult(net::ERR_IO_PENDING)); |
+ // Now check that the backend has been freed. |
+ EXPECT_FALSE(CacheIsInitialized()); |
} |
} // namespace pnacl |