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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/files/file.h"
8e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/files/file_enumerator.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/lazy_instance.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/thread_test_helper.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/browser_main_loop.h"
176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_class_factory.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/indexed_db/indexed_db_context_impl.h"
196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/browser/indexed_db/mock_browsertest_indexed_db_class_factory.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test.h"
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test_utils.h"
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h"
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "net/base/escape.h"
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/base/net_errors.h"
34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h"
35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/test/embedded_test_server/http_request.h"
36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/test/embedded_test_server/http_response.h"
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/database/database_util.h"
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::QuotaManager;
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::DatabaseUtil;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This browser test is aimed towards exercising the IndexedDB bindings and
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the actual implementation that lives in the browser side.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IndexedDBBrowserTest : public ContentBrowserTest {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IndexedDBBrowserTest() : disk_usage_(-1) {}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    GetTestClassFactory()->Reset();
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    IndexedDBClassFactory::SetIndexedDBClassFactoryGetter(GetIDBClassFactory);
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ContentBrowserTest::SetUp();
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    IndexedDBClassFactory::SetIndexedDBClassFactoryGetter(NULL);
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ContentBrowserTest::TearDown();
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void FailOperation(FailClass failure_class,
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                     FailMethod failure_method,
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                     int fail_on_instance_num,
666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                     int fail_on_call_num) {
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    GetTestClassFactory()->FailOperation(
686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        failure_class, failure_method, fail_on_instance_num, fail_on_call_num);
696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SimpleTest(const GURL& test_url, bool incognito = false) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The test page will perform tests on IndexedDB, then navigate to either
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // a #pass or #fail ref.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Shell* the_browser = incognito ? CreateOffTheRecordBrowser() : shell();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    VLOG(0) << "Navigating to URL and blocking.";
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigateToURLBlockUntilNavigationsComplete(the_browser, test_url, 2);
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    VLOG(0) << "Navigation done.";
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string result =
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        the_browser->web_contents()->GetLastCommittedURL().ref();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (result != "pass") {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string js_result;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ASSERT_TRUE(ExecuteScriptAndExtractString(
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          the_browser->web_contents(),
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "window.domAutomationController.send(getLog())",
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &js_result));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FAIL() << "Failed: " << js_result;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NavigateAndWaitForTitle(Shell* shell,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const char* filename,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const char* hash,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const char* expected_string) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = GetTestUrl("indexeddb", filename);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hash)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url = GURL(url.spec() + hash);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 expected_title16(ASCIIToUTF16(expected_string));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TitleWatcher title_watcher(shell->web_contents(), expected_title16);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NavigateToURL(shell, url);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_title16, title_watcher.WaitAndGetTitle());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  IndexedDBContextImpl* GetContext() {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StoragePartition* partition =
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDefaultStoragePartition(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            shell()->web_contents()->GetBrowserContext());
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return static_cast<IndexedDBContextImpl*>(partition->GetIndexedDBContext());
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetQuota(int quotaKilobytes) {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int kTemporaryStorageQuotaSize = quotaKilobytes
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        * 1024 * QuotaManager::kPerHostTemporaryPortion;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetTempQuota(kTemporaryStorageQuotaSize,
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BrowserContext::GetDefaultStoragePartition(
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            shell()->web_contents()->GetBrowserContext())->GetQuotaManager());
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void SetTempQuota(int64 bytes, scoped_refptr<QuotaManager> qm) {
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::PostTask(
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          BrowserThread::IO, FROM_HERE,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(&IndexedDBBrowserTest::SetTempQuota, bytes, qm));
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    qm->SetTemporaryGlobalOverrideQuota(bytes, storage::QuotaCallback());
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Don't return until the quota has been set.
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_refptr<base::ThreadTestHelper> helper(new base::ThreadTestHelper(
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(helper->Run());
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int64 RequestDiskUsage() {
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PostTaskAndReplyWithResult(
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        GetContext()->TaskRunner(),
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        FROM_HERE,
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::Bind(&IndexedDBContext::GetOriginDiskUsage,
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   GetContext(),
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   GURL("file:///")),
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::Bind(&IndexedDBBrowserTest::DidGetDiskUsage, this));
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<base::ThreadTestHelper> helper(new base::ThreadTestHelper(
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        BrowserMainLoop::GetInstance()->indexed_db_thread()->
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            message_loop_proxy()));
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(helper->Run());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Wait for DidGetDiskUsage to be called.
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return disk_usage_;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  static MockBrowserTestIndexedDBClassFactory* GetTestClassFactory() {
1546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    static ::base::LazyInstance<MockBrowserTestIndexedDBClassFactory>::Leaky
1556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        s_factory = LAZY_INSTANCE_INITIALIZER;
1566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return s_factory.Pointer();
1576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  static IndexedDBClassFactory* GetIDBClassFactory() {
1606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return GetTestClassFactory();
1616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidGetDiskUsage(int64 bytes) {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_GT(bytes, 0);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    disk_usage_ = bytes;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 disk_usage_;
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IndexedDBBrowserTest);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, CursorTest) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "cursor_test.html"));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, CursorTestIncognito) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "cursor_test.html"),
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             true /* incognito */);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, CursorPrefetch) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "cursor_prefetch.html"));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, IndexTest) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "index_test.html"));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, KeyPathTest) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "key_path_test.html"));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, TransactionGetTest) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "transaction_get_test.html"));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, KeyTypesTest) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "key_types_test.html"));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, ObjectStoreTest) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "object_store_test.html"));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, DatabaseTest) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "database_test.html"));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, TransactionTest) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "transaction_test.html"));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, CallbackAccounting) {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "callback_accounting.html"));
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, DoesntHangTest) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "transaction_run_forever.html"));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashTab(shell()->web_contents());
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "transaction_not_blocked.html"));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, Bug84933Test) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url = GetTestUrl("indexeddb", "bug_84933.html");
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Just navigate to the URL. Test will crash if it fails.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLBlockUntilNavigationsComplete(shell(), url, 1);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, Bug106883Test) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url = GetTestUrl("indexeddb", "bug_106883.html");
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Just navigate to the URL. Test will crash if it fails.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLBlockUntilNavigationsComplete(shell(), url, 1);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, Bug109187Test) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url = GetTestUrl("indexeddb", "bug_109187.html");
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Just navigate to the URL. Test will crash if it fails.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLBlockUntilNavigationsComplete(shell(), url, 1);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IndexedDBBrowserTestWithLowQuota : public IndexedDBBrowserTest {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  IndexedDBBrowserTestWithLowQuota() {}
248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int kInitialQuotaKilobytes = 5000;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetQuota(kInitialQuotaKilobytes);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IndexedDBBrowserTestWithLowQuota);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTestWithLowQuota, QuotaTest) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "quota_test.html"));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IndexedDBBrowserTestWithGCExposed : public IndexedDBBrowserTest {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  IndexedDBBrowserTestWithGCExposed() {}
265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose-gc");
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IndexedDBBrowserTestWithGCExposed);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTestWithGCExposed,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DatabaseCallbacksTest) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "database_callbacks_first.html"));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void CopyLevelDBToProfile(Shell* shell,
2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 scoped_refptr<IndexedDBContextImpl> context,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& test_directory) {
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(context->TaskRunner()->RunsTasksOnCurrentThread());
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath leveldb_dir(FILE_PATH_LITERAL("file__0.indexeddb.leveldb"));
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_data_dir =
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetTestFilePath("indexeddb", test_directory.c_str()).Append(leveldb_dir);
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath dest = context->data_path().Append(leveldb_dir);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we don't create the destination directory first, the contents of the
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // leveldb directory are copied directly into profile/IndexedDB instead of
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile/IndexedDB/file__0.xxx/
290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(dest));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kRecursive = true;
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::CopyDirectory(test_data_dir,
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                  context->data_path(),
2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                  kRecursive));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IndexedDBBrowserTestWithPreexistingLevelDB : public IndexedDBBrowserTest {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  IndexedDBBrowserTestWithPreexistingLevelDB() {}
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<IndexedDBContextImpl> context = GetContext();
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    context->TaskRunner()->PostTask(
303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        FROM_HERE,
304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::Bind(
305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            &CopyLevelDBToProfile, shell(), context, EnclosingLevelDBDir()));
306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<base::ThreadTestHelper> helper(new base::ThreadTestHelper(
307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        BrowserMainLoop::GetInstance()->indexed_db_thread()->
308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            message_loop_proxy()));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(helper->Run());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string EnclosingLevelDBDir() = 0;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IndexedDBBrowserTestWithPreexistingLevelDB);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IndexedDBBrowserTestWithVersion0Schema : public
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IndexedDBBrowserTestWithPreexistingLevelDB {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual std::string EnclosingLevelDBDir() OVERRIDE {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "migration_from_0";
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTestWithVersion0Schema, MigrationTest) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "migration_test.html"));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IndexedDBBrowserTestWithVersion123456Schema : public
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IndexedDBBrowserTestWithPreexistingLevelDB {
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual std::string EnclosingLevelDBDir() OVERRIDE {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "schema_version_123456";
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTestWithVersion123456Schema,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DestroyTest) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 original_size = RequestDiskUsage();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(original_size, 0);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "open_bad_db.html"));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 new_size = RequestDiskUsage();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(original_size, new_size);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IndexedDBBrowserTestWithVersion987654SSVData : public
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IndexedDBBrowserTestWithPreexistingLevelDB {
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual std::string EnclosingLevelDBDir() OVERRIDE {
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return "ssv_version_987654";
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTestWithVersion987654SSVData,
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DestroyTest) {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 original_size = RequestDiskUsage();
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(original_size, 0);
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "open_bad_db.html"));
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 new_size = RequestDiskUsage();
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(original_size, new_size);
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IndexedDBBrowserTestWithCorruptLevelDB : public
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IndexedDBBrowserTestWithPreexistingLevelDB {
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual std::string EnclosingLevelDBDir() OVERRIDE {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "corrupt_leveldb";
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTestWithCorruptLevelDB,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DestroyTest) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 original_size = RequestDiskUsage();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(original_size, 0);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "open_bad_db.html"));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 new_size = RequestDiskUsage();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(original_size, new_size);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IndexedDBBrowserTestWithMissingSSTFile : public
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IndexedDBBrowserTestWithPreexistingLevelDB {
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual std::string EnclosingLevelDBDir() OVERRIDE {
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return "missing_sst";
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTestWithMissingSSTFile,
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DestroyTest) {
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 original_size = RequestDiskUsage();
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(original_size, 0);
3880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "open_missing_table.html"));
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 new_size = RequestDiskUsage();
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(original_size, new_size);
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, LevelDBLogFileTest) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Any page that opens an IndexedDB will work here.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "database_test.html"));
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath leveldb_dir(FILE_PATH_LITERAL("file__0.indexeddb.leveldb"));
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath log_file(FILE_PATH_LITERAL("LOG"));
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath log_file_path =
3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetContext()->data_path().Append(leveldb_dir).Append(log_file);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 size;
401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(base::GetFileSize(log_file_path, &size));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(size, 0);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, CanDeleteWhenOverQuotaTest) {
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "fill_up_5k.html"));
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 size = RequestDiskUsage();
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int kQuotaKilobytes = 2;
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(size, kQuotaKilobytes * 1024);
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetQuota(kQuotaKilobytes);
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "delete_over_quota.html"));
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
414e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace {
415e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
416e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochstatic void CompactIndexedDBBackingStore(
417e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    scoped_refptr<IndexedDBContextImpl> context,
418e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const GURL& origin_url) {
419e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  IndexedDBFactory* factory = context->GetIDBFactory();
420e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
421e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  std::pair<IndexedDBFactory::OriginDBMapIterator,
422e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            IndexedDBFactory::OriginDBMapIterator> range =
423e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      factory->GetOpenDatabasesForOrigin(origin_url);
424e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
425e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (range.first == range.second)  // If no open db's for this origin
426e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
427e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
428e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Compact the first db's backing store since all the db's are in the same
429e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // backing store.
430e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  IndexedDBDatabase* db = range.first->second;
431e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  IndexedDBBackingStore* backing_store = db->backing_store();
432e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  backing_store->Compact();
433e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
434e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
435e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochstatic void CorruptIndexedDBDatabase(
436e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    IndexedDBContextImpl* context,
437e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const GURL& origin_url,
438e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    base::WaitableEvent* signal_when_finished) {
439e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
440e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  CompactIndexedDBBackingStore(context, origin_url);
441e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
442e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  int numFiles = 0;
443e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  int numErrors = 0;
444e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  base::FilePath idb_data_path = context->GetFilePath(origin_url);
445e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  const bool recursive = false;
446e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  base::FileEnumerator enumerator(
447e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      idb_data_path, recursive, base::FileEnumerator::FILES);
448e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  for (base::FilePath idb_file = enumerator.Next(); !idb_file.empty();
449e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch       idb_file = enumerator.Next()) {
450e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    int64 size(0);
451e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    GetFileSize(idb_file, &size);
452e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
453e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    if (idb_file.Extension() == FILE_PATH_LITERAL(".ldb")) {
454e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      numFiles++;
455c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      base::File file(idb_file,
456c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                      base::File::FLAG_WRITE | base::File::FLAG_OPEN_TRUNCATED);
457c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      if (file.IsValid()) {
458e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        // Was opened truncated, expand back to the original
459e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        // file size and fill with zeros (corrupting the file).
460c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        file.SetLength(size);
461e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      } else {
462e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        numErrors++;
463e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      }
464e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
465e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
466e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
467e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  VLOG(0) << "There were " << numFiles << " in " << idb_data_path.value()
468e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          << " with " << numErrors << " errors";
469e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  signal_when_finished->Signal();
470e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
471e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
472e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochconst std::string s_corrupt_db_test_prefix = "/corrupt/test/";
473e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
474e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochstatic scoped_ptr<net::test_server::HttpResponse> CorruptDBRequestHandler(
475e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    IndexedDBContextImpl* context,
476e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const GURL& origin_url,
477e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const std::string& path,
4786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    IndexedDBBrowserTest* test,
479e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const net::test_server::HttpRequest& request) {
480e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  std::string request_path;
481e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (path.find(s_corrupt_db_test_prefix) != std::string::npos)
482e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    request_path = request.relative_url.substr(s_corrupt_db_test_prefix.size());
483e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  else
484e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return scoped_ptr<net::test_server::HttpResponse>();
485e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
486e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Remove the query string if present.
487e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  std::string request_query;
488e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  size_t query_pos = request_path.find('?');
489e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (query_pos != std::string::npos) {
490e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    request_query = request_path.substr(query_pos + 1);
491e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    request_path = request_path.substr(0, query_pos);
492e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
493e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
494e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (request_path == "corruptdb" && !request_query.empty()) {
495e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    VLOG(0) << "Requested to corrupt IndexedDB: " << request_query;
496e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    base::WaitableEvent signal_when_finished(false, false);
497e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    context->TaskRunner()->PostTask(FROM_HERE,
498e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                    base::Bind(&CorruptIndexedDBDatabase,
499e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                               base::ConstRef(context),
500e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                               origin_url,
501e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                               &signal_when_finished));
502e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    signal_when_finished.Wait();
503e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
504e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    scoped_ptr<net::test_server::BasicHttpResponse> http_response(
505e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        new net::test_server::BasicHttpResponse);
506e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    http_response->set_code(net::HTTP_OK);
507e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return http_response.PassAs<net::test_server::HttpResponse>();
5086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  } else if (request_path == "fail" && !request_query.empty()) {
5096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    FailClass failure_class = FAIL_CLASS_NOTHING;
5106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    FailMethod failure_method = FAIL_METHOD_NOTHING;
5116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    int instance_num = 1;
5126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    int call_num = 1;
5136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    std::string fail_class;
5146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    std::string fail_method;
5156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    url::Component query(0, request_query.length()), key_pos, value_pos;
5176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    while (url::ExtractQueryKeyValue(
5186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        request_query.c_str(), &query, &key_pos, &value_pos)) {
5196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      std::string escaped_key(request_query.substr(key_pos.begin, key_pos.len));
5206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      std::string escaped_value(
5216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          request_query.substr(value_pos.begin, value_pos.len));
5226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      std::string key = net::UnescapeURLComponent(
5246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          escaped_key,
5256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          net::UnescapeRule::NORMAL | net::UnescapeRule::SPACES |
5266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)              net::UnescapeRule::URL_SPECIAL_CHARS);
5276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      std::string value = net::UnescapeURLComponent(
5296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          escaped_value,
5306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          net::UnescapeRule::NORMAL | net::UnescapeRule::SPACES |
5316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)              net::UnescapeRule::URL_SPECIAL_CHARS);
5326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      if (key == "method")
5346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        fail_method = value;
5356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      else if (key == "class")
5366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        fail_class = value;
5376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      else if (key == "instNum")
5386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        instance_num = atoi(value.c_str());
5396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      else if (key == "callNum")
5406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        call_num = atoi(value.c_str());
5416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      else
5426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        NOTREACHED() << "Unknown param: \"" << key << "\"";
5436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    }
5446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    if (fail_class == "LevelDBTransaction") {
5466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      failure_class = FAIL_CLASS_LEVELDB_TRANSACTION;
5476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      if (fail_method == "Get")
5486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        failure_method = FAIL_METHOD_GET;
5496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      else if (fail_method == "Commit")
5506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        failure_method = FAIL_METHOD_COMMIT;
5515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      else
5526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        NOTREACHED() << "Unknown method: \"" << fail_method << "\"";
553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } else if (fail_class == "LevelDBIterator") {
554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      failure_class = FAIL_CLASS_LEVELDB_ITERATOR;
555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (fail_method == "Seek")
556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        failure_method = FAIL_METHOD_SEEK;
557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      else
558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        NOTREACHED() << "Unknown method: \"" << fail_method << "\"";
559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } else {
560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NOTREACHED() << "Unknown class: \"" << fail_class << "\"";
5616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    }
5626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    DCHECK_GE(instance_num, 1);
5646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    DCHECK_GE(call_num, 1);
5656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    test->FailOperation(failure_class, failure_method, instance_num, call_num);
5676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    scoped_ptr<net::test_server::BasicHttpResponse> http_response(
5696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        new net::test_server::BasicHttpResponse);
5706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    http_response->set_code(net::HTTP_OK);
5716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return http_response.PassAs<net::test_server::HttpResponse>();
572e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
573e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
574e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // A request for a test resource
575e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  base::FilePath resourcePath =
576e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      content::GetTestFilePath("indexeddb", request_path.c_str());
577e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<net::test_server::BasicHttpResponse> http_response(
578e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      new net::test_server::BasicHttpResponse);
579e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  http_response->set_code(net::HTTP_OK);
580e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  std::string file_contents;
581e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!base::ReadFileToString(resourcePath, &file_contents))
582e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return scoped_ptr<net::test_server::HttpResponse>();
583e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  http_response->set_content(file_contents);
584e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return http_response.PassAs<net::test_server::HttpResponse>();
585e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
586e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
587e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}  // namespace
588e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
5890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass IndexedDBBrowserCorruptionTest
5900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : public IndexedDBBrowserTest,
5910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      public ::testing::WithParamInterface<const char*> {};
5920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5930529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_P(IndexedDBBrowserCorruptionTest,
5940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                       OperationOnCorruptedOpenDatabase) {
595e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_TRUE(embedded_test_server()->Started() ||
596e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch              embedded_test_server()->InitializeAndWaitUntilReady());
597e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  const GURL& origin_url = embedded_test_server()->base_url();
598e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  embedded_test_server()->RegisterRequestHandler(
599e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      base::Bind(&CorruptDBRequestHandler,
6006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 base::Unretained(GetContext()),
601e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                 origin_url,
6026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 s_corrupt_db_test_prefix,
6036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 this));
604e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
6050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string test_file = s_corrupt_db_test_prefix +
6060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                          "corrupted_open_db_detection.html#" + GetParam();
607e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SimpleTest(embedded_test_server()->GetURL(test_file));
608e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
609e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  test_file = s_corrupt_db_test_prefix + "corrupted_open_db_recovery.html";
610e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SimpleTest(embedded_test_server()->GetURL(test_file));
611e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
612e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
6130529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochINSTANTIATE_TEST_CASE_P(IndexedDBBrowserCorruptionTestInstantiation,
6140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        IndexedDBBrowserCorruptionTest,
615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        ::testing::Values("failGetBlobJournal",
616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          "get",
617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          "failWebkitGetDatabaseNames",
6180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                          "iterate",
619116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          "failTransactionCommit",
6200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                          "clearObjectStore"));
6210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest,
623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       DeleteCompactsBackingStore) {
6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GURL test_url = GetTestUrl("indexeddb", "delete_compact.html");
6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimpleTest(GURL(test_url.spec() + "#fill"));
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 after_filling = RequestDiskUsage();
6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_GT(after_filling, 0);
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimpleTest(GURL(test_url.spec() + "#purge"));
6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 after_deleting = RequestDiskUsage();
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_LT(after_deleting, after_filling);
6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The above tests verify basic assertions - that filling writes data and
6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // deleting reduces the amount stored.
6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The below tests make assumptions about implementation specifics, such as
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // data compression, compaction efficiency, and the maximum amount of
6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // metadata and log data remains after a deletion. It is possible that
6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // changes to the implementation may require these constants to be tweaked.
6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int kTestFillBytes = 1024 * 1024 * 5;  // 5MB
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_GT(after_filling, kTestFillBytes);
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const int kTestCompactBytes = 1024 * 10;  // 10kB
6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_LT(after_deleting, kTestCompactBytes);
6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Complex multi-step (converted from pyauto) tests begin here.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify null key path persists after restarting browser.
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, PRE_NullKeyPathPersistence) {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndWaitForTitle(shell(), "bug_90635.html", "#part1",
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "pass - first run");
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify null key path persists after restarting browser.
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, NullKeyPathPersistence) {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndWaitForTitle(shell(), "bug_90635.html", "#part2",
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "pass - second run");
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that a VERSION_CHANGE transaction is rolled back after a
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// renderer/browser crash
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       PRE_PRE_VersionChangeCrashResilience) {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndWaitForTitle(shell(), "version_change_crash.html", "#part1",
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "pass - part1 - complete");
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, PRE_VersionChangeCrashResilience) {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndWaitForTitle(shell(), "version_change_crash.html", "#part2",
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "pass - part2 - crash me");
673116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // If we actually crash here then googletest will not run the next step
674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // (VersionChangeCrashResilience) as an optimization. googletest's
675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // ASSERT_DEATH/EXIT fails to work properly (on Windows) due to how we
676116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // implement the PRE_* test mechanism.
677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  exit(0);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, VersionChangeCrashResilience) {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndWaitForTitle(shell(), "version_change_crash.html", "#part3",
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "pass - part3 - rolled back");
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that open DB connections are closed when a tab is destroyed.
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, ConnectionsClosedOnTabClose) {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndWaitForTitle(shell(), "version_change_blocked.html", "#tab1",
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "setVersion(2) complete");
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start on a different URL to force a new renderer process.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = CreateBrowser();
692f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NavigateToURL(new_shell, GURL(url::kAboutBlankURL));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndWaitForTitle(new_shell, "version_change_blocked.html", "#tab2",
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "setVersion(3) blocked");
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 expected_title16(ASCIIToUTF16("setVersion(3) complete"));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TitleWatcher title_watcher(new_shell->web_contents(), expected_title16);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::KillProcess(
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetRenderProcessHost()->GetHandle(), 0, true);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shell()->Close();
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_title16, title_watcher.WaitAndGetTitle());
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Verify that a "close" event is fired at database connections when
7077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// the backing store is deleted.
7087dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(IndexedDBBrowserTest, ForceCloseEventTest) {
7097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NavigateAndWaitForTitle(shell(), "force_close_event.html", NULL,
7107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          "connection ready");
7117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GetContext()->TaskRunner()->PostTask(
7137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FROM_HERE,
7147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&IndexedDBContextImpl::DeleteForOrigin,
7157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 GetContext(),
7167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 GURL("file:///")));
7177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 expected_title16(ASCIIToUTF16("connection closed"));
7197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  TitleWatcher title_watcher(shell()->web_contents(), expected_title16);
720e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  title_watcher.AlsoWaitForTitle(ASCIIToUTF16("connection closed with error"));
7217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(expected_title16, title_watcher.WaitAndGetTitle());
7227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
7237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class IndexedDBBrowserTestSingleProcess : public IndexedDBBrowserTest {
725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    command_line->AppendSwitch(switches::kSingleProcess);
728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(IndexedDBBrowserTestSingleProcess,
7325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       RenderThreadShutdownTest) {
733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimpleTest(GetTestUrl("indexeddb", "shutdown_with_requests.html"));
734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
737