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