15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/test/histogram_tester.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/nacl/nacl_browsertest_util.h"
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/nacl/browser/nacl_browser.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/trusted/service_runtime/nacl_error_code.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/c/private/ppb_nacl_private.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)NACL_BROWSER_TEST_F(NaClBrowserTest, SuccessfulLoadUMA, {
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::HistogramTester histograms;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a NaCl module to generate UMA data.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunLoadTest(FILE_PATH_LITERAL("nacl_load_test.html"));
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure histograms from child processes have been accumulated in the
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser brocess.
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::FetchHistogramsFromChildProcesses();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Did the plugin report success?
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  histograms.ExpectUniqueSample("NaCl.LoadStatus.Plugin",
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                PP_NACL_ERROR_LOAD_SUCCESS, 1);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Did the sel_ldr report success?
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  histograms.ExpectUniqueSample("NaCl.LoadStatus.SelLdr",
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                LOAD_OK, 1);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Check validation cache usage:
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (IsAPnaclTest()) {
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Should have received 3 validation queries:
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // - One for IRT for actual application
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // - Two for two translator nexes
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // The translators don't currently use the IRT, so there is no IRT cache
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // query for those two loads. The PNaCl main nexe comes from a
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // delete-on-close temp file, so it doesn't have a stable identity
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // for validation caching. All three query results should be misses.
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    histograms.ExpectUniqueSample("NaCl.ValidationCache.Query",
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  nacl::NaClBrowser::CACHE_MISS, 3);
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Should have received a cache setting afterwards for IRT and translators.
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    histograms.ExpectUniqueSample("NaCl.ValidationCache.Set",
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  nacl::NaClBrowser::CACHE_HIT, 3);
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // For the open-web, only the IRT is considered a "safe" and
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // identity-cachable file. The nexes and .so files are not.
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Should have one cache query for the IRT.
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    histograms.ExpectUniqueSample("NaCl.ValidationCache.Query",
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  nacl::NaClBrowser::CACHE_MISS, 1);
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Should have received a cache setting afterwards for IRT and translators.
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    histograms.ExpectUniqueSample("NaCl.ValidationCache.Set",
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  nacl::NaClBrowser::CACHE_HIT, 1);
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we have other important histograms.
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!IsAPnaclTest()) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.StartupTime.LoadModule", 1);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.StartupTime.Total", 1);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.Size.Manifest", 1);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.Size.Nexe", 1);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Options.PNaCl.OptLevel", 1);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.Size.Manifest", 1);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.Size.Pexe", 1);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.Size.PNaClTranslatedNexe", 1);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.Size.PexeNexeSizePct", 1);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.PNaClLoadTime.LoadCompiler", 1);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.PNaClLoadTime.LoadLinker", 1);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.PNaClLoadTime.CompileTime", 1);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.PNaClLoadTime.CompileKBPerSec", 1);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.PNaClLoadTime.LinkTime", 1);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount(
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "NaCl.Perf.PNaClLoadTime.PctCompiledWhenFullyDownloaded", 1);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.PNaClLoadTime.TotalUncachedTime", 1);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount(
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "NaCl.Perf.PNaClLoadTime.TotalUncachedKBPerSec", 1);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histograms.ExpectTotalCount("NaCl.Perf.PNaClCache.IsHit", 1);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class NaClBrowserTestNewlibVcacheExtension:
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      public NaClBrowserTestNewlibExtension {
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual base::FilePath::StringType Variant() OVERRIDE {
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return FILE_PATH_LITERAL("extension_vcache_test/newlib");
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(NaClBrowserTestNewlibVcacheExtension,
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       ValidationCacheOfMainNexe) {
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::HistogramTester histograms;
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Hardcoded extension AppID that corresponds to the hardcoded
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // public key in the manifest.json file. We need to load the extension
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // nexe from the same origin, so we can't just try to load the extension
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // nexe as a mime-type handler from a non-extension URL.
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath::StringType full_url =
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      FILE_PATH_LITERAL("chrome-extension://cbcdidchbppangcjoddlpdjlenngjldk/")
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      FILE_PATH_LITERAL("extension_validation_cache.html");
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunNaClIntegrationTest(full_url, true);
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Make sure histograms from child processes have been accumulated in the
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // browser brocess.
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::FetchHistogramsFromChildProcesses();
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Should have received 2 validation queries (one for IRT and one for NEXE),
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // and responded with a miss.
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  histograms.ExpectBucketCount("NaCl.ValidationCache.Query",
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               nacl::NaClBrowser::CACHE_MISS, 2);
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TOTAL should then be 2 queries so far.
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  histograms.ExpectTotalCount("NaCl.ValidationCache.Query", 2);
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Should have received a cache setting afterwards for IRT and nexe.
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  histograms.ExpectBucketCount("NaCl.ValidationCache.Set",
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               nacl::NaClBrowser::CACHE_HIT, 2);
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Load it again to hit the cache.
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunNaClIntegrationTest(full_url, true);
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::FetchHistogramsFromChildProcesses();
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Should have received 2 more validation queries later (IRT and NEXE),
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // and responded with a hit.
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  histograms.ExpectBucketCount("NaCl.ValidationCache.Query",
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               nacl::NaClBrowser::CACHE_HIT, 2);
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TOTAL should then be 4 queries now.
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  histograms.ExpectTotalCount("NaCl.ValidationCache.Query", 4);
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Still only 2 settings.
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  histograms.ExpectTotalCount("NaCl.ValidationCache.Set", 2);
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class NaClBrowserTestGLibcVcacheExtension:
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      public NaClBrowserTestGLibcExtension {
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual base::FilePath::StringType Variant() OVERRIDE {
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return FILE_PATH_LITERAL("extension_vcache_test/glibc");
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(NaClBrowserTestGLibcVcacheExtension,
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       ValidationCacheOfMainNexe) {
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Make sure histograms from child processes have been accumulated in the
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // browser process.
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::HistogramTester histograms;
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Hardcoded extension AppID that corresponds to the hardcoded
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // public key in the manifest.json file. We need to load the extension
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // nexe from the same origin, so we can't just try to load the extension
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // nexe as a mime-type handler from a non-extension URL.
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::FilePath::StringType full_url =
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      FILE_PATH_LITERAL("chrome-extension://cbcdidchbppangcjoddlpdjlenngjldk/")
1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      FILE_PATH_LITERAL("extension_validation_cache.html");
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  RunNaClIntegrationTest(full_url, true);
1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Should have received 9 validation queries, which respond with misses:
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //   - the IRT
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //   - ld.so (the initial nexe)
1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //   - main.nexe
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //   - libppapi_cpp.so
1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //   - libpthread.so.9b15f6a6
1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //   - libstdc++.so.6
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //   - libgcc_s.so.1
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //   - libc.so.9b15f6a6
1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //   - libm.so.9b15f6a6
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  histograms.ExpectBucketCount("NaCl.ValidationCache.Query",
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               nacl::NaClBrowser::CACHE_MISS, 9);
1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // TOTAL should then be 9 queries so far.
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  histograms.ExpectTotalCount("NaCl.ValidationCache.Query", 9);
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Should have received a cache setting afterwards for IRT and nexe.
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  histograms.ExpectBucketCount("NaCl.ValidationCache.Set",
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               nacl::NaClBrowser::CACHE_HIT, 9);
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Load it again to hit the cache.
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  RunNaClIntegrationTest(full_url, true);
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Should have received 9 more validation queries and responded with hits.
1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  histograms.ExpectBucketCount("NaCl.ValidationCache.Query",
1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               nacl::NaClBrowser::CACHE_HIT, 9);
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  histograms.ExpectTotalCount("NaCl.ValidationCache.Query", 18);
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  histograms.ExpectTotalCount("NaCl.ValidationCache.Set", 9);
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Test that validation for the 2 PNaCl translator nexes can be cached.
178116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(NaClBrowserTestPnacl,
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       ValidationCacheOfTranslatorNexes) {
18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::HistogramTester histograms;
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Run a load test w/ one pexe cache identity.
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RunLoadTest(FILE_PATH_LITERAL("pnacl_options.html?use_nmf=o_0"));
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::FetchHistogramsFromChildProcesses();
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Should have received 3 validation queries:
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // - One for IRT for actual application
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // - Two for two translator nexes
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The translators don't currently use the IRT, so there is no IRT cache
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // query for those two loads. The PNaCl main nexe comes from a
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // delete-on-close temp file, so it doesn't have a stable identity
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // for validation caching. All three query results should be misses.
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  histograms.ExpectUniqueSample("NaCl.ValidationCache.Query",
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                nacl::NaClBrowser::CACHE_MISS, 3);
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Should have received a cache setting afterwards for IRT and translators.
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  histograms.ExpectUniqueSample("NaCl.ValidationCache.Set",
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               nacl::NaClBrowser::CACHE_HIT, 3);
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Load the same pexe, but with a different cache identity.
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // This means that translation will actually be redone,
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // forcing the translators to be loaded a second time (but now with
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // cache hits!)
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RunLoadTest(FILE_PATH_LITERAL("pnacl_options.html?use_nmf=o_2"));
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Should now have 3 more queries on top of the previous ones.
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  histograms.ExpectTotalCount("NaCl.ValidationCache.Query", 6);
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // With the 3 extra queries being cache hits.
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  histograms.ExpectBucketCount("NaCl.ValidationCache.Query",
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               nacl::NaClBrowser::CACHE_HIT, 3);
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // No extra cache settings.
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  histograms.ExpectUniqueSample("NaCl.ValidationCache.Set",
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               nacl::NaClBrowser::CACHE_HIT, 3);
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ncbray) convert the rest of nacl_uma.py (currently in the NaCl repo.)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test validation failures and crashes.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace
219