1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file. 4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/pnacl_host.h" 6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <stdio.h> 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/bind.h" 11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/files/scoped_temp_dir.h" 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/run_loop.h" 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/threading/sequenced_worker_pool.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/pnacl_translation_cache.h" 15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/browser_thread.h" 16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_utils.h" 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "net/base/test_completion_callback.h" 19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(OS_WIN) 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define snprintf _snprintf 23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace pnacl { 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Size of a buffer used for writing and reading from a file. 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst size_t kBufferSize = 16u; 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass PnaclHostTest : public testing::Test { 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch protected: 35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PnaclHostTest() 36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : host_(NULL), 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch temp_callback_count_(0), 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch write_callback_count_(0), 39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {} 40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void SetUp() { 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch host_ = new PnaclHost(); 42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_->InitForTest(temp_dir_.path(), true); 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(PnaclHost::CacheReady, host_->cache_state_); 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void TearDown() { 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Give the host a chance to de-init the backend, and then delete it. 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) host_->RendererClosing(0); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(PnaclHost::CacheUninitialized, host_->cache_state_); 53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch delete host_; 54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int GetCacheSize() { return host_->disk_cache_->Size(); } 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int CacheIsInitialized() { 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return host_->cache_state_ == PnaclHost::CacheReady; 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void ReInitBackend() { 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_->InitForTest(temp_dir_.path(), true); 611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(PnaclHost::CacheReady, host_->cache_state_); 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public: // Required for derived classes to bind this method 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Callbacks used by tests which call GetNexeFd. 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // CallbackExpectMiss checks that the fd is valid and a miss is reported, 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // and also writes some data into the file, which is read back by 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // CallbackExpectHit 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void CallbackExpectMiss(const base::File& file, bool is_hit) { 71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_FALSE(is_hit); 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(file.IsValid()); 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::File::Info info; 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::File* mutable_file = const_cast<base::File*>(&file); 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(mutable_file->GetInfo(&info)); 76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(info.is_directory); 77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0LL, info.size); 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char str[kBufferSize]; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memset(str, 0x0, kBufferSize); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci snprintf(str, kBufferSize, "testdata%d", ++write_callback_count_); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kBufferSize, 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<size_t>(mutable_file->Write(0, str, kBufferSize))); 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch temp_callback_count_++; 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void CallbackExpectHit(const base::File& file, bool is_hit) { 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(is_hit); 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(file.IsValid()); 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::File::Info info; 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::File* mutable_file = const_cast<base::File*>(&file); 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(mutable_file->GetInfo(&info)); 91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(info.is_directory); 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kBufferSize, static_cast<size_t>(info.size)); 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char data[kBufferSize]; 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memset(data, 0x0, kBufferSize); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char str[kBufferSize]; 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memset(str, 0x0, kBufferSize); 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci snprintf(str, kBufferSize, "testdata%d", write_callback_count_); 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kBufferSize, 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<size_t>(mutable_file->Read(0, data, kBufferSize))); 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_STREQ(str, data); 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch temp_callback_count_++; 102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch protected: 105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PnaclHost* host_; 106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int temp_callback_count_; 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int write_callback_count_; 108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content::TestBrowserThreadBundle thread_bundle_; 109ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::ScopedTempDir temp_dir_; 110ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 111ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic nacl::PnaclCacheInfo GetTestCacheInfo() { 113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info; 114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch info.pexe_url = GURL("http://www.google.com"); 115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch info.abi_version = 0; 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch info.opt_level = 0; 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) info.has_no_store_header = false; 118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return info; 119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define GET_NEXE_FD(renderer, instance, incognito, info, expect_hit) \ 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) do { \ 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SCOPED_TRACE(""); \ 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) host_->GetNexeFd( \ 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) renderer, \ 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 0, /* ignore render_view_id for now */ \ 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) instance, \ 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) incognito, \ 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) info, \ 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(expect_hit ? &PnaclHostTest::CallbackExpectHit \ 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : &PnaclHostTest::CallbackExpectMiss, \ 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Unretained(this))); \ 133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } while (0) 134ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(PnaclHostTest, BasicMiss) { 136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Test cold miss. 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1U, host_->pending_translations()); 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1U, host_->pending_translations()); 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 143bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch host_->TranslationFinished(0, 0, true); 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Test that a different cache info field also misses. 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch info.etag = std::string("something else"); 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2, temp_callback_count_); 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1U, host_->pending_translations()); 152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch host_->RendererClosing(0); 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Check that the cache has de-initialized after the last renderer goes away. 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FALSE(CacheIsInitialized()); 156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(PnaclHostTest, BadArguments) { 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1U, host_->pending_translations()); 162bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch host_->TranslationFinished(0, 1, true); // nonexistent translation 163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1U, host_->pending_translations()); 164ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch host_->RendererClosing(1); // nonexistent renderer 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1U, host_->pending_translations()); 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 168ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch host_->RendererClosing(0); // close without finishing 169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(PnaclHostTest, BasicHit) { 172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, true); 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 1, false, info, true); 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2, temp_callback_count_); 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(PnaclHostTest, TranslationErrors) { 185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Early abort, before temp file request returns 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, false); 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0, temp_callback_count_); 1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The backend will have been freed when the query comes back and there 1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // are no pending translations. 1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FALSE(CacheIsInitialized()); 1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ReInitBackend(); 196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Check that another request for the same info misses successfully. 197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, true); 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Now try sending the error after the temp file request returns 205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch info.abi_version = 222; 206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2, temp_callback_count_); 209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, false); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Check another successful miss 213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(3, temp_callback_count_); 216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, false); 217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 220424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(PnaclHostTest, OverlappedMissesAfterTempReturn) { 221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1U, host_->pending_translations()); 226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Test that a second request for the same nexe while the first one is still 227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // outstanding eventually hits. 228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 1, false, info, true); 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2U, host_->pending_translations()); 231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The temp file should not be returned to the second request until after the 232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // first is finished translating. 233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, true); 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2, temp_callback_count_); 237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(PnaclHostTest, OverlappedMissesBeforeTempReturn) { 241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 242ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Send the 2nd fd request before the first one returns a temp file. 244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 1, false, info, true); 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2U, host_->pending_translations()); 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2U, host_->pending_translations()); 250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, true); 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 253ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2, temp_callback_count_); 254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(PnaclHostTest, OverlappedHitsBeforeTempReturn) { 258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Store one in the cache and complete it. 260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, true); 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, true); 267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Request the second before the first temp file returns. 268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 1, false, info, true); 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(3, temp_callback_count_); 271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(PnaclHostTest, OverlappedHitsAfterTempReturn) { 275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Store one in the cache and complete it. 277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, true); 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, true); 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 1, false, info, true); 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(3, temp_callback_count_); 288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 291424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(PnaclHostTest, OverlappedMissesRendererClosing) { 292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Send the 2nd fd request from a different renderer. 295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Test that it eventually gets an fd after the first renderer closes. 296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(1, 1, false, info, false); 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2U, host_->pending_translations()); 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2U, host_->pending_translations()); 302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->RendererClosing(0); 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2, temp_callback_count_); 306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1U, host_->pending_translations()); 307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->RendererClosing(1); 308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(PnaclHostTest, Incognito) { 311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, true, info, false); 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, true); 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Check that an incognito translation is not stored in the cache 318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2, temp_callback_count_); 321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, true); 3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Check that an incognito translation can hit from a normal one. 324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, true, info, true); 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(3, temp_callback_count_); 327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 329424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(PnaclHostTest, IncognitoOverlappedMiss) { 330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, true, info, false); 332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 1, false, info, false); 3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Check that both translations have returned misses, (i.e. that the 335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // second one has not blocked on the incognito one) 336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2, temp_callback_count_); 337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, true); 338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 1, true); 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 340ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Same test, but issue the 2nd request after the first has returned a miss. 343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch info.abi_version = 222; 344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, true, info, false); 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(3, temp_callback_count_); 347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 1, false, info, false); 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(4, temp_callback_count_); 350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->RendererClosing(0); 351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 353424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(PnaclHostTest, IncognitoSecondOverlappedMiss) { 354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // If the non-incognito request comes first, it should 355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // behave exactly like OverlappedMissBeforeTempReturn 356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Send the 2nd fd request before the first one returns a temp file. 359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 1, true, info, true); 3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2U, host_->pending_translations()); 3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2U, host_->pending_translations()); 365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, temp_callback_count_); 366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, true); 3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2, temp_callback_count_); 369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that pexes with the no-store header do not get cached. 37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(PnaclHostTest, CacheControlNoStore) { 37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) nacl::PnaclCacheInfo info = GetTestCacheInfo(); 37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) info.has_no_store_header = true; 37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GET_NEXE_FD(0, 0, false, info, false); 3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, temp_callback_count_); 37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) host_->TranslationFinished(0, 0, true); 3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0U, host_->pending_translations()); 38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, GetCacheSize()); 38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that no-store pexes do not wait, but do duplicate translations 38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(PnaclHostTest, NoStoreOverlappedMiss) { 38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) nacl::PnaclCacheInfo info = GetTestCacheInfo(); 38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) info.has_no_store_header = true; 38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GET_NEXE_FD(0, 0, false, info, false); 39058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GET_NEXE_FD(0, 1, false, info, false); 3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 39258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Check that both translations have returned misses, (i.e. that the 39358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // second one has not blocked on the first one) 39458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, temp_callback_count_); 39558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) host_->TranslationFinished(0, 0, true); 39658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) host_->TranslationFinished(0, 1, true); 3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0U, host_->pending_translations()); 39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Same test, but issue the 2nd request after the first has returned a miss. 40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) info.abi_version = 222; 40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GET_NEXE_FD(0, 0, false, info, false); 4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(3, temp_callback_count_); 40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GET_NEXE_FD(0, 1, false, info, false); 4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 40758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(4, temp_callback_count_); 40858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) host_->RendererClosing(0); 40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(PnaclHostTest, ClearTranslationCache) { 412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nacl::PnaclCacheInfo info = GetTestCacheInfo(); 413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Add 2 entries in the cache 414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 0, false, info, false); 415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch info.abi_version = 222; 416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GET_NEXE_FD(0, 1, false, info, false); 4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2, temp_callback_count_); 419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 0, true); 420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host_->TranslationFinished(0, 1, true); 4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RunAllBlockingPoolTasksUntilIdle(); 422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0U, host_->pending_translations()); 423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(2, GetCacheSize()); 424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch net::TestCompletionCallback cb; 425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Since we are using a memory backend, the clear should happen immediately. 42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) host_->ClearTranslationCacheEntriesBetween( 42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Time(), base::Time(), base::Bind(cb.callback(), 0)); 4281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Check that the translation cache has been cleared before flushing the 4291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // queues, because the backend will be freed once it is. 430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0, GetCacheSize()); 4311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0, cb.GetResult(net::ERR_IO_PENDING)); 4321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Now check that the backend has been freed. 4331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FALSE(CacheIsInitialized()); 434ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 435ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A version of PnaclHostTest that initializes cache on disk. 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PnaclHostTestDisk : public PnaclHostTest { 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetUp() { 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_ = new PnaclHost(); 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_->InitForTest(temp_dir_.path(), false); 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(PnaclHost::CacheInitializing, host_->cache_state_); 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DeInit() { 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_->DeInitIfSafe(); 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PnaclHostTestDisk, DeInitWhileInitializing) { 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Since there's no easy way to pump message queues one message at a time, we 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // have to simulate what would happen if 1 DeInitIfsafe task gets queued, then 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // a GetNexeFd gets queued, and then another DeInitIfSafe gets queued before 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the first one runs. We can just shortcut and call DeInitIfSafe while the 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // cache is still initializing. 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeInit(); 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 459ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace pnacl 460