Index: content/browser/database_browsertest.cc |
=================================================================== |
--- content/browser/database_browsertest.cc (revision 0) |
+++ content/browser/database_browsertest.cc (revision 0) |
@@ -0,0 +1,267 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/string_number_conversions.h" |
+#include "base/utf_string_conversions.h" |
+#include "content/public/browser/browser_context.h" |
+#include "content/public/browser/download_manager.h" |
+#include "content/public/browser/notification_service.h" |
+#include "content/public/browser/notification_types.h" |
+#include "content/public/browser/web_contents.h" |
+#include "content/public/test/browser_test_utils.h" |
+#include "content/public/test/test_utils.h" |
+#include "content/shell/shell.h" |
+#include "content/test/content_browser_test.h" |
+#include "content/test/content_browser_test_utils.h" |
+#include "content/test/net/url_request_mock_http_job.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace content { |
+ |
+class DatabaseTest : public ContentBrowserTest { |
+ public: |
+ DatabaseTest() {} |
+ |
+ void RunScriptAndCheckResult(Shell* shell, |
+ const std::string& script, |
+ const std::string& result) { |
+ std::string data; |
+ ASSERT_TRUE(content::ExecuteJavaScriptAndExtractString( |
+ shell->web_contents()->GetRenderViewHost(), L"", |
+ ASCIIToWide(script), &data)); |
+ ASSERT_EQ(data, result); |
+ } |
+ |
+ void Navigate(Shell* shell) { |
+ NavigateToURL(shell, GetTestUrl("", "simple_database.html")); |
+ } |
+ |
+ void CreateTable(Shell* shell) { |
+ RunScriptAndCheckResult(shell, "createTable()", "done"); |
+ } |
+ |
+ void InsertRecord(Shell* shell, const std::string& data) { |
+ RunScriptAndCheckResult(shell, "insertRecord('" + data + "')", "done"); |
+ } |
+ |
+ void UpdateRecord(Shell* shell, int index, const std::string& data) { |
+ RunScriptAndCheckResult( |
+ shell, "updateRecord(" + base::IntToString(index) + ", '" + data + "')", |
+ "done"); |
+ } |
+ |
+ void DeleteRecord(Shell* shell, int index) { |
+ RunScriptAndCheckResult( |
+ shell, "deleteRecord(" + base::IntToString(index) + ")", "done"); |
+ } |
+ |
+ void CompareRecords(Shell* shell, const std::string& expected) { |
+ RunScriptAndCheckResult(shell, "getRecords()", expected); |
+ } |
+ |
+ bool HasTable(Shell* shell) { |
+ std::string data; |
+ CHECK(content::ExecuteJavaScriptAndExtractString( |
+ shell->web_contents()->GetRenderViewHost(), L"", |
+ ASCIIToWide("getRecords()"), &data)); |
+ return data != "getRecords error: [object SQLError]"; |
+ } |
+}; |
+ |
+// Insert records to the database. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, InsertRecord) { |
+ Navigate(shell()); |
+ CreateTable(shell()); |
+ InsertRecord(shell(), "text"); |
+ CompareRecords(shell(), "text"); |
+ InsertRecord(shell(), "text2"); |
+ CompareRecords(shell(), "text, text2"); |
+} |
+ |
+// Update records in the database. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, UpdateRecord) { |
+ Navigate(shell()); |
+ CreateTable(shell()); |
+ InsertRecord(shell(), "text"); |
+ UpdateRecord(shell(), 0, "0"); |
+ CompareRecords(shell(), "0"); |
+ |
+ InsertRecord(shell(), "1"); |
+ InsertRecord(shell(), "2"); |
+ UpdateRecord(shell(), 1, "1000"); |
+ CompareRecords(shell(), "0, 1000, 2"); |
+} |
+ |
+// Delete records in the database. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, DeleteRecord) { |
+ Navigate(shell()); |
+ CreateTable(shell()); |
+ InsertRecord(shell(), "text"); |
+ DeleteRecord(shell(), 0); |
+ CompareRecords(shell(), ""); |
+ |
+ InsertRecord(shell(), "0"); |
+ InsertRecord(shell(), "1"); |
+ InsertRecord(shell(), "2"); |
+ DeleteRecord(shell(), 1); |
+ CompareRecords(shell(), "0, 2"); |
+} |
+ |
+// Attempts to delete a nonexistent row in the table. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, DeleteNonexistentRow) { |
+ Navigate(shell()); |
+ CreateTable(shell()); |
+ InsertRecord(shell(), "text"); |
+ |
+ RunScriptAndCheckResult( |
+ shell(), "deleteRecord(1)", "could not find row with index: 1"); |
+ |
+ CompareRecords(shell(), "text"); |
+} |
+ |
+// Insert, update, and delete records in the database. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, DatabaseOperations) { |
+ Navigate(shell()); |
+ CreateTable(shell()); |
+ |
+ std::string expected; |
+ for (int i = 0; i < 10; ++i) { |
+ std::string item = base::IntToString(i); |
+ InsertRecord(shell(), item); |
+ if (!expected.empty()) |
+ expected += ", "; |
+ expected += item; |
+ } |
+ CompareRecords(shell(), expected); |
+ |
+ expected.clear(); |
+ for (int i = 0; i < 10; ++i) { |
+ std::string item = base::IntToString(i * i); |
+ UpdateRecord(shell(), i, item); |
+ if (!expected.empty()) |
+ expected += ", "; |
+ expected += item; |
+ } |
+ CompareRecords(shell(), expected); |
+ |
+ for (int i = 0; i < 10; ++i) |
+ DeleteRecord(shell(), 0); |
+ |
+ CompareRecords(shell(), ""); |
+ |
+ RunScriptAndCheckResult( |
+ shell(), "deleteRecord(1)", "could not find row with index: 1"); |
+ |
+ CompareRecords(shell(), ""); |
+} |
+ |
+// Create records in the database and verify they persist after reload. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, ReloadPage) { |
+ Navigate(shell()); |
+ CreateTable(shell()); |
+ InsertRecord(shell(), "text"); |
+ |
+ WindowedNotificationObserver load_stop_observer( |
+ NOTIFICATION_LOAD_STOP, |
+ NotificationService::AllSources()); |
+ shell()->Reload(); |
+ load_stop_observer.Wait(); |
+ |
+ CompareRecords(shell(), "text"); |
+} |
+ |
+// Attempt to read a database created in a regular browser from an off the |
+// record browser. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, OffTheRecordCannotReadRegularDatabase) { |
+ Navigate(shell()); |
+ CreateTable(shell()); |
+ InsertRecord(shell(), "text"); |
+ |
+ Shell* otr = CreateOffTheRecordBrowser(); |
+ Navigate(otr); |
+ ASSERT_FALSE(HasTable(otr)); |
+ |
+ CreateTable(otr); |
+ CompareRecords(otr, ""); |
+} |
+ |
+// Attempt to read a database created in an off the record browser from a |
+// regular browser. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, RegularCannotReadOffTheRecordDatabase) { |
+ Shell* otr = CreateOffTheRecordBrowser(); |
+ Navigate(otr); |
+ CreateTable(otr); |
+ InsertRecord(otr, "text"); |
+ |
+ Navigate(shell()); |
+ ASSERT_FALSE(HasTable(shell())); |
+ CreateTable(shell()); |
+ CompareRecords(shell(), ""); |
+} |
+ |
+// Verify DB changes within first window are present in the second window. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, ModificationPersistInSecondTab) { |
+ Navigate(shell()); |
+ CreateTable(shell()); |
+ InsertRecord(shell(), "text"); |
+ |
+ Shell* shell2 = CreateBrowser(); |
+ Navigate(shell2); |
+ UpdateRecord(shell2, 0, "0"); |
+ |
+ CompareRecords(shell(), "0"); |
+ CompareRecords(shell2, "0"); |
+} |
+ |
+// Verify database modifications persist after restarting browser. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, PRE_DatabasePersistsAfterRelaunch) { |
+ Navigate(shell()); |
+ CreateTable(shell()); |
+ InsertRecord(shell(), "text"); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, DatabasePersistsAfterRelaunch) { |
+ Navigate(shell()); |
+ CompareRecords(shell(), "text"); |
+} |
+ |
+// Verify OTR database is removed after OTR window closes. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, PRE_OffTheRecordDatabaseNotPersistent) { |
+ Shell* otr = CreateOffTheRecordBrowser(); |
+ Navigate(otr); |
+ CreateTable(otr); |
+ InsertRecord(otr, "text"); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, OffTheRecordDatabaseNotPersistent) { |
+ Shell* otr = CreateOffTheRecordBrowser(); |
+ Navigate(otr); |
+ ASSERT_FALSE(HasTable(otr)); |
+} |
+ |
+// Verify database modifications persist after crashing window. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, ModificationsPersistAfterRendererCrash) { |
+ Navigate(shell()); |
+ CreateTable(shell()); |
+ InsertRecord(shell(), "1"); |
+ |
+ CrashTab(shell()->web_contents()); |
+ Navigate(shell()); |
+ CompareRecords(shell(), "1"); |
+} |
+ |
+// Test to check if database modifications are persistent across windows in |
+// off the record window. |
+IN_PROC_BROWSER_TEST_F(DatabaseTest, OffTheRecordDBPersistentAcrossWindows) { |
+ Shell* otr1 = CreateOffTheRecordBrowser(); |
+ Navigate(otr1); |
+ CreateTable(otr1); |
+ InsertRecord(otr1, "text"); |
+ |
+ Shell* otr2 = CreateOffTheRecordBrowser(); |
+ Navigate(otr2); |
+ CompareRecords(otr2, "text"); |
+} |
+ |
+} // namespace content |
Property changes on: content\browser\database_browsertest.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |