| Index: chrome/test/functional/databases.py
|
| ===================================================================
|
| --- chrome/test/functional/databases.py (revision 152782)
|
| +++ chrome/test/functional/databases.py (working copy)
|
| @@ -1,305 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright (c) 2011 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.
|
| -
|
| -import simplejson
|
| -import os
|
| -
|
| -import pyauto_functional
|
| -import pyauto
|
| -
|
| -
|
| -class SQLExecutionError(RuntimeError):
|
| - """Represents an error that occurs while executing an SQL statement."""
|
| - pass
|
| -
|
| -
|
| -class DatabasesTest(pyauto.PyUITest):
|
| - """Test of Web SQL Databases."""
|
| -
|
| - def __init__(self, methodName='runTest'):
|
| - super(DatabasesTest, self).__init__(methodName)
|
| - # HTML page used for database testing.
|
| - self.TEST_PAGE_URL = self.GetFileURLForDataPath(
|
| - 'database', 'database_tester.html')
|
| -
|
| - def _ParseAndCheckResultFromTestPage(self, json):
|
| - """Helper function that parses the message sent from |TEST_PAGE_URL| and
|
| - checks that it succeeded.
|
| -
|
| - Args:
|
| - json: the message, encoded in JSON, that the test page sent to us
|
| -
|
| - Returns:
|
| - dictionary representing the result from the test page, with format:
|
| - {
|
| - 'succeeded': boolean
|
| - 'errorMsg': optional string
|
| - 'returnValue': optional any type
|
| - }
|
| -
|
| - Raises:
|
| - SQLExecutionError if the message contains an error message
|
| - """
|
| - result_dict = simplejson.loads(json)
|
| - if result_dict['succeeded'] == False:
|
| - raise SQLExecutionError(result_dict['errorMsg'])
|
| - return result_dict
|
| -
|
| - def _CreateTable(self, tab_index=0, windex=0):
|
| - """Creates a table in the database.
|
| -
|
| - This should only be called once per database. This should be called before
|
| - attempting to insert, update, delete, or get the records in the database.
|
| -
|
| - Defaults to first tab in first window.
|
| -
|
| - Args:
|
| - tab_index: index of the tab that will create the database
|
| - windex: index of the window containing the tab that will create the
|
| - database
|
| - """
|
| - json = self.CallJavascriptFunc('createTable', [], tab_index, windex)
|
| - self._ParseAndCheckResultFromTestPage(json)
|
| -
|
| - def _InsertRecord(self, record, tab_index=0, windex=0):
|
| - """Inserts a record, i.e., a row, into the database.
|
| -
|
| - Defaults to first tab in first window.
|
| -
|
| - Args:
|
| - record: string that will be added as a new row in the database
|
| - tab_index: index of the tab that will insert the record
|
| - windex: index of the window containing the tab that will insert the record
|
| - """
|
| - json = self.CallJavascriptFunc('insertRecord', [record], tab_index, windex)
|
| - self._ParseAndCheckResultFromTestPage(json)
|
| -
|
| - def _UpdateRecord(self, index, updated_record, tab_index=0, windex=0):
|
| - """Updates a record, i.e., a row, in the database.
|
| -
|
| - Defaults to first tab in first window.
|
| -
|
| - Args:
|
| - index: index of the record to update. Index 0 refers to the oldest item in
|
| - the database
|
| - updated_record: string that will be used to update the row in the database
|
| - tab_index: index of the tab that will update the record
|
| - windex: index of the window containing the tab that will update the record
|
| - """
|
| - json = self.CallJavascriptFunc(
|
| - 'updateRecord', [index, updated_record], tab_index, windex)
|
| - self._ParseAndCheckResultFromTestPage(json)
|
| -
|
| - def _DeleteRecord(self, index, tab_index=0, windex=0):
|
| - """Deletes a record, i.e., a row, from the database.
|
| -
|
| - Defaults to first tab in first window.
|
| -
|
| - Args:
|
| - index: index of the record to be deleted. Index 0 refers to the oldest
|
| - item in the database
|
| - tab_index: index of the tab that will delete the record
|
| - windex: index of the window containing the tab that will delete the record
|
| - """
|
| - json = self.CallJavascriptFunc('deleteRecord', [index], tab_index, windex)
|
| - self._ParseAndCheckResultFromTestPage(json)
|
| -
|
| - def _GetRecords(self, tab_index=0, windex=0):
|
| - """Returns all the records, i.e., rows, in the database.
|
| -
|
| - The records are ordererd from oldest to newest.
|
| -
|
| - Defaults to first tab in first window.
|
| -
|
| - Returns:
|
| - array of all the records in the database
|
| -
|
| - Args:
|
| - tab_index: index of the tab that will query the database
|
| - windex: index of the window containing the tab that will query the
|
| - database
|
| - """
|
| - json = self.CallJavascriptFunc('getRecords', [], tab_index, windex)
|
| - return self._ParseAndCheckResultFromTestPage(json)['returnValue']
|
| -
|
| - def _HasTable(self, tab_index=0, windex=0):
|
| - """Returns whether the page has a table in its database."""
|
| - try:
|
| - self._GetRecords(tab_index, windex)
|
| - except SQLExecutionError:
|
| - return False
|
| - return True
|
| -
|
| - def testInsertRecord(self):
|
| - """Insert records to the database."""
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self._CreateTable()
|
| - self._InsertRecord('text')
|
| - self.assertEquals(['text'], self._GetRecords())
|
| - self._InsertRecord('text2')
|
| - self.assertEquals(['text', 'text2'], self._GetRecords())
|
| -
|
| - def testUpdateRecord(self):
|
| - """Update records in the database."""
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self._CreateTable()
|
| -
|
| - # Update the first record.
|
| - self._InsertRecord('text')
|
| - self._UpdateRecord(0, '0')
|
| - records = self._GetRecords()
|
| - self.assertEquals(1, len(records))
|
| - self.assertEquals('0', records[0])
|
| -
|
| - # Update the middle record.
|
| - self._InsertRecord('1')
|
| - self._InsertRecord('2')
|
| - self._UpdateRecord(1, '1000')
|
| - self.assertEquals(['0', '1000', '2'], self._GetRecords())
|
| -
|
| - def testDeleteRecord(self):
|
| - """Delete records in the database."""
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self._CreateTable()
|
| -
|
| - # Delete the first and only record.
|
| - self._InsertRecord('text')
|
| - self._DeleteRecord(0)
|
| - self.assertFalse(self._GetRecords())
|
| -
|
| - # Delete the middle record.
|
| - self._InsertRecord('0')
|
| - self._InsertRecord('1')
|
| - self._InsertRecord('2')
|
| - self._DeleteRecord(1)
|
| - self.assertEquals(['0', '2'], self._GetRecords())
|
| -
|
| - def testDeleteNonexistentRow(self):
|
| - """Attempts to delete a nonexistent row in the table."""
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self._CreateTable()
|
| - self._InsertRecord('text')
|
| - did_throw_exception = False
|
| - try:
|
| - self._DeleteRecord(1)
|
| - except SQLExecutionError:
|
| - did_throw_exception = True
|
| - self.assertTrue(did_throw_exception)
|
| - self.assertEquals(['text'], self._GetRecords())
|
| -
|
| - def testDatabaseOperations(self):
|
| - """Insert, update, and delete records in the database."""
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self._CreateTable()
|
| -
|
| - for i in range(10):
|
| - self._InsertRecord(str(i))
|
| - records = self._GetRecords()
|
| - self.assertEqual([str(i) for i in range(10)], records)
|
| -
|
| - for i in range(10):
|
| - self._UpdateRecord(i, str(i * i))
|
| - records = self._GetRecords()
|
| - self.assertEqual([str(i * i) for i in range(10)], records)
|
| -
|
| - for i in range(10):
|
| - self._DeleteRecord(0)
|
| - self.assertEqual(0, len(self._GetRecords()))
|
| -
|
| - def testReloadActiveTab(self):
|
| - """Create records in the database and verify they persist after reload."""
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self._CreateTable()
|
| - self._InsertRecord('text')
|
| - self.ReloadActiveTab()
|
| - self.assertEquals(['text'], self._GetRecords())
|
| -
|
| - def testIncognitoCannotReadRegularDatabase(self):
|
| - """Attempt to read a database created in a regular browser from an incognito
|
| - browser.
|
| - """
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self._CreateTable()
|
| - self._InsertRecord('text')
|
| - self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)
|
| - self.NavigateToURL(self.TEST_PAGE_URL, 1, 0)
|
| - self.assertFalse(self._HasTable(windex=1))
|
| - self._CreateTable(windex=1)
|
| - self.assertFalse(self._GetRecords(windex=1))
|
| -
|
| - def testRegularCannotReadIncognitoDatabase(self):
|
| - """Attempt to read a database created in an incognito browser from a regular
|
| - browser.
|
| - """
|
| - self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)
|
| - self.NavigateToURL(self.TEST_PAGE_URL, 1, 0)
|
| - self._CreateTable(windex=1)
|
| - self._InsertRecord('text', windex=1)
|
| -
|
| - # Verify a regular browser cannot read the incognito database.
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self.assertFalse(self._HasTable())
|
| - self._CreateTable()
|
| - self.assertFalse(self._GetRecords())
|
| -
|
| - def testDbModificationPersistInSecondTab(self):
|
| - """Verify DB changes within first tab are present in the second tab."""
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self._CreateTable()
|
| - self._InsertRecord('text')
|
| - self.AppendTab(pyauto.GURL(self.TEST_PAGE_URL))
|
| - self._UpdateRecord(0, '0', tab_index=0)
|
| - tab1_records = self._GetRecords(tab_index=0)
|
| - tab2_records = self._GetRecords(tab_index=1)
|
| - self.assertEquals(1, len(tab1_records))
|
| - self.assertEquals('0', tab1_records[0])
|
| - self.assertEquals(1, len(tab2_records))
|
| - self.assertEquals(tab1_records[0], tab2_records[0])
|
| -
|
| - def testIncognitoDatabaseNotPersistent(self):
|
| - """Verify incognito database is removed after incognito window closes."""
|
| - self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)
|
| - self.NavigateToURL(self.TEST_PAGE_URL, 1, 0)
|
| - self._CreateTable(windex=1)
|
| - self._InsertRecord('text', windex=1)
|
| - self.CloseBrowserWindow(1)
|
| - self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)
|
| - self.NavigateToURL(self.TEST_PAGE_URL, 1, 0)
|
| - self.assertFalse(self._HasTable(windex=1))
|
| -
|
| - def testModificationsPersistAfterRendererCrash(self):
|
| - """Verify database modifications persist after crashing tab."""
|
| - self.AppendTab(pyauto.GURL('about:blank'))
|
| - self.ActivateTab(0)
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self._CreateTable()
|
| - self._InsertRecord('1')
|
| - self.KillRendererProcess(
|
| - self.GetBrowserInfo()['windows'][0]['tabs'][0]['renderer_pid'])
|
| - self.ReloadActiveTab()
|
| - self.assertEqual(['1'], self._GetRecords())
|
| -
|
| - def testIncognitoDBPersistentAcrossTabs(self):
|
| - """Test to check if database modifications are persistent across tabs
|
| - in incognito window.
|
| - """
|
| - self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)
|
| - self.NavigateToURL(self.TEST_PAGE_URL, 1, 0)
|
| - self._CreateTable(windex=1)
|
| - self._InsertRecord('text', windex=1)
|
| - self.AppendTab(pyauto.GURL(self.TEST_PAGE_URL), 1)
|
| - self.assertEquals(['text'], self._GetRecords(1, 1))
|
| -
|
| - def testDatabasePersistsAfterRelaunch(self):
|
| - """Verify database modifications persist after restarting browser."""
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self._CreateTable()
|
| - self._InsertRecord('text')
|
| - self.RestartBrowser(clear_profile=False)
|
| - self.NavigateToURL(self.TEST_PAGE_URL)
|
| - self.assertEquals(['text'], self._GetRecords())
|
| -
|
| -if __name__ == '__main__':
|
| - pyauto_functional.Main()
|
|
|