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