/closureCompiler/trunk/closure/goog/gears/database_test.html

https://github.com/johnjbarton/JavaScriptLibraries · HTML · 699 lines · 597 code · 94 blank · 8 comment · 0 complexity · b84423d14bec0e06de9a51bd261faf52 MD5 · raw file

  1. <!DOCTYPE html>
  2. <html>
  3. <!--
  4. Copyright 2007 The Closure Library Authors. All Rights Reserved.
  5. Use of this source code is governed by the Apache License, Version 2.0.
  6. See the COPYING file for details.
  7. -->
  8. <!--
  9. -->
  10. <head>
  11. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  12. <title>Closure Unit Tests - goog.gears.Database</title>
  13. <script src="../base.js"></script>
  14. <script>
  15. goog.require('goog.gears.Database');
  16. goog.require('goog.testing.jsunit');
  17. </script>
  18. </head>
  19. <body>
  20. <script>
  21. function isGearsAllowed() {
  22. return goog.gears.hasFactory() && goog.gears.getFactory().hasPermission;
  23. }
  24. var database;
  25. function setUpPage() {
  26. if (isGearsAllowed()) {
  27. try {
  28. database = new goog.gears.Database('tester', 'database-test');
  29. } catch (e) {
  30. debug('Could not create the database');
  31. }
  32. }
  33. setUpPageStatus = 'complete'; // jsunit magic
  34. }
  35. function setUp() {
  36. if (!database) {
  37. return;
  38. }
  39. database.execute('DROP TABLE IF EXISTS Test');
  40. database.execute('CREATE TABLE IF NOT EXISTS Test (x TEXT, y TEXT)');
  41. database.execute('INSERT INTO Test VALUES (?, ?)', 'a', 'alpha');
  42. database.execute('INSERT INTO Test VALUES (?, ?)', 'b', 'beta');
  43. database.execute('INSERT INTO Test VALUES (?, ?)', 'g', 'gamma');
  44. }
  45. function tearDown() {
  46. if (database) {
  47. goog.events.removeAll(database);
  48. // Rollback to clean up transaction state.
  49. while (database.isInTransaction()) {
  50. database.rollback();
  51. }
  52. }
  53. }
  54. function testCreateDatabase() {
  55. if (!database) {
  56. return;
  57. }
  58. assertNotNull('Could not create the database', database);
  59. }
  60. function testCreateTable() {
  61. if (!database) {
  62. return;
  63. }
  64. var created = database.queryValue('SELECT 1 FROM SQLITE_MASTER ' +
  65. 'WHERE TYPE=? AND NAME=?',
  66. 'table',
  67. 'Test') != null;
  68. assertTrue('Test table could not be created', created);
  69. assertEquals('Wrong number of rows after more insertions', 3,
  70. database.queryValue('SELECT COUNT(*) FROM Test'));
  71. }
  72. function testQueryValue() {
  73. if (!database) {
  74. return;
  75. }
  76. // testing retrieving a single value
  77. var val = database.queryValue('SELECT y FROM Test WHERE x=?', 'b');
  78. assertEquals('Wrong value returned by query', 'beta', val);
  79. // testing a query that returns nothing
  80. val = database.queryValue('SELECT y FROM Test WHERE x=?', 'd');
  81. assertNull('Should not have returned a value for the query', val);
  82. // testing that the query returns the first row of the query
  83. val = database.queryValue('SELECT y FROM Test');
  84. assertEquals('Wrong value returned by query', 'alpha', val);
  85. // testing that the query returns the first element of the row of the query
  86. val = database.queryValue('SELECT * FROM Test');
  87. assertEquals('Wrong value returned by query', 'a', val);
  88. // And the same with an array.
  89. // testing retrieving a single value
  90. val = database.queryValue('SELECT y FROM Test WHERE x=?', ['b']);
  91. assertEquals('Wrong value returned by query', 'beta', val);
  92. // testing a query that returns nothing
  93. val = database.queryValue('SELECT y FROM Test WHERE x=?', ['d']);
  94. assertNull('Should not have returned a value for the query', val);
  95. }
  96. function testQueryObject() {
  97. if (!database) {
  98. return;
  99. }
  100. // testing that the query returns the correct object
  101. var obj = database.queryObject('SELECT * FROM Test WHERE x=?', 'b');
  102. assertNotNull('Should have returned a value for the query', obj);
  103. assertEquals('Wrong value returned by query', 'b', obj['x']);
  104. assertEquals('Wrong value returned by query', 'beta', obj['y']);
  105. // testing that the query returns null when there is no match
  106. obj = database.queryValue('SELECT * FROM Test WHERE x=?', 'd');
  107. assertNull('Should not have returned a value for the query', obj);
  108. // testing that the query returns the first row when there are multiple
  109. // rows returned.
  110. obj = database.queryObject('SELECT * FROM Test');
  111. assertNotNull('Should have returned a value for the query', obj);
  112. assertEquals('Wrong value returned by query', 'a', obj['x']);
  113. assertEquals('Wrong value returned by query', 'alpha', obj['y']);
  114. // And the same with an array.
  115. // testing that the query returns the correct object
  116. obj = database.queryObject('SELECT * FROM Test WHERE x=?', ['b']);
  117. assertNotNull('Should have returned a value for the query', obj);
  118. assertEquals('Wrong value returned by query', 'b', obj['x']);
  119. assertEquals('Wrong value returned by query', 'beta', obj['y']);
  120. // testing that the query returns null when there is no match
  121. obj = database.queryValue('SELECT * FROM Test WHERE x=?', ['d']);
  122. assertNull('Should not have returned a value for the query', obj);
  123. }
  124. function testQueryValueArray() {
  125. if (!database) {
  126. return;
  127. }
  128. // testing selecting returning of multiple single values
  129. var arr = database.queryValueArray('SELECT y FROM Test');
  130. assertNotNull('Should have returned a value for the query', arr);
  131. assertEquals('Wrong value returned by query', 3, arr.length);
  132. assertEquals('Wrong value returned by query', 'alpha', arr[0]);
  133. assertEquals('Wrong value returned by query', 'beta', arr[1]);
  134. assertEquals('Wrong value returned by query', 'gamma', arr[2]);
  135. // testing selecting returning of multiple single values when there
  136. // are no matches.
  137. arr = database.queryValueArray('SELECT y FROM Test WHERE x=?', 'd');
  138. assertNotNull('Should have returned a value for the query', arr);
  139. assertEquals('Wrong value returned by query', 0, arr.length);
  140. // testing selecting returning of multiple single values even when
  141. // selecting multiple columns - should return the first column
  142. arr = database.queryValueArray('SELECT * FROM Test');
  143. assertNotNull('Should have returned a value for the query', arr);
  144. assertEquals('Wrong value returned by query', 3, arr.length);
  145. assertEquals('Wrong value returned by query', 'a', arr[0]);
  146. assertEquals('Wrong value returned by query', 'b', arr[1]);
  147. assertEquals('Wrong value returned by query', 'g', arr[2]);
  148. // And the same with an array.
  149. // testing selecting returning of multiple single values when there
  150. // are no matches.
  151. arr = database.queryValueArray('SELECT y FROM Test WHERE x=?', ['d']);
  152. assertNotNull('Should have returned a value for the query', arr);
  153. assertEquals('Wrong value returned by query', 0, arr.length);
  154. }
  155. function testQueryObjectArray() {
  156. if (!database) {
  157. return;
  158. }
  159. // testing selecting returning of array of objects
  160. var arr = database.queryObjectArray('SELECT * FROM Test');
  161. assertNotNull('Should have returned a value for the query', arr);
  162. assertEquals('Wrong value returned by query', 3, arr.length);
  163. assertEquals('Wrong value returned by query', 'a', arr[0]['x']);
  164. assertEquals('Wrong value returned by query', 'alpha', arr[0]['y']);
  165. assertEquals('Wrong value returned by query', 'b', arr[1]['x']);
  166. assertEquals('Wrong value returned by query', 'beta', arr[1]['y']);
  167. assertEquals('Wrong value returned by query', 'g', arr[2]['x']);
  168. assertEquals('Wrong value returned by query', 'gamma', arr[2]['y']);
  169. // testing selecting returning of multiple objects when there
  170. // are no matches.
  171. arr = database.queryObjectArray('SELECT y FROM Test WHERE x=?', 'd');
  172. assertNotNull('Should have returned a value for the query', arr);
  173. assertEquals('Wrong value returned by query', 0, arr.length);
  174. // And the same with an array.
  175. // testing selecting returning of multiple objects when there
  176. // are no matches.
  177. arr = database.queryObjectArray('SELECT y FROM Test WHERE x=?', ['d']);
  178. assertNotNull('Should have returned a value for the query', arr);
  179. assertEquals('Wrong value returned by query', 0, arr.length);
  180. }
  181. function testQueryToArrays() {
  182. if (!database) {
  183. return;
  184. }
  185. // testing selecting returning of array of arrays
  186. var arr = database.queryArrays('SELECT * FROM Test');
  187. assertNotNull('Should have returned a value for the query', arr);
  188. assertEquals('Wrong value returned by query', 3, arr.length);
  189. assertEquals('Wrong value returned by query', 'a', arr[0][0]);
  190. assertEquals('Wrong value returned by query', 'alpha', arr[0][1]);
  191. assertEquals('Wrong value returned by query', 'b', arr[1][0]);
  192. assertEquals('Wrong value returned by query', 'beta', arr[1][1]);
  193. assertEquals('Wrong value returned by query', 'g', arr[2][0]);
  194. assertEquals('Wrong value returned by query', 'gamma', arr[2][1]);
  195. arr = database.queryArrays('SELECT * FROM Test WHERE x=?', 'd');
  196. assertNotNull('Should have returned a value for the query', arr);
  197. assertEquals('Wrong value returned by query', 0, arr.length);
  198. // And the same with an array.
  199. arr = database.queryArrays('SELECT * FROM Test WHERE x=?', ['d']);
  200. assertNotNull('Should have returned a value for the query', arr);
  201. assertEquals('Wrong value returned by query', 0, arr.length);
  202. }
  203. function testForEachValue() {
  204. if (!database) {
  205. return;
  206. }
  207. // testing the foreach value when there are matching values
  208. var vals = [];
  209. database.forEachValue('SELECT * FROM Test',
  210. function(val, row, col, name) {
  211. vals.push({val: val, row: row, col: col, name: name});
  212. return true;
  213. },
  214. null);
  215. assertEquals('Wrong value returned by query', 6, vals.length);
  216. assertEquals('Wrong value returned by query', 'a', vals[0].val);
  217. assertEquals('Wrong value returned by query', 0, vals[0].row);
  218. assertEquals('Wrong value returned by query', 0, vals[0].col);
  219. assertEquals('Wrong value returned by query', 'x', vals[0].name);
  220. assertEquals('Wrong value returned by query', 'alpha', vals[1].val);
  221. assertEquals('Wrong value returned by query', 0, vals[1].row);
  222. assertEquals('Wrong value returned by query', 1, vals[1].col);
  223. assertEquals('Wrong value returned by query', 'y', vals[1].name);
  224. assertEquals('Wrong value returned by query', 'b', vals[2].val);
  225. assertEquals('Wrong value returned by query', 1, vals[2].row);
  226. assertEquals('Wrong value returned by query', 0, vals[2].col);
  227. assertEquals('Wrong value returned by query', 'x', vals[2].name);
  228. assertEquals('Wrong value returned by query', 'beta', vals[3].val);
  229. assertEquals('Wrong value returned by query', 1, vals[3].row);
  230. assertEquals('Wrong value returned by query', 1, vals[3].col);
  231. assertEquals('Wrong value returned by query', 'y', vals[3].name);
  232. assertEquals('Wrong value returned by query', 'g', vals[4].val);
  233. assertEquals('Wrong value returned by query', 2, vals[4].row);
  234. assertEquals('Wrong value returned by query', 0, vals[4].col);
  235. assertEquals('Wrong value returned by query', 'x', vals[4].name);
  236. assertEquals('Wrong value returned by query', 'gamma', vals[5].val);
  237. assertEquals('Wrong value returned by query', 2, vals[5].row);
  238. assertEquals('Wrong value returned by query', 1, vals[5].col);
  239. assertEquals('Wrong value returned by query', 'y', vals[5].name);
  240. vals = [];
  241. database.forEachValue('SELECT * FROM Test WHERE x=?',
  242. function(val, row, col, name) {
  243. vals.push({val: val, row: row, col: col, name: name});
  244. },
  245. null,
  246. 'd');
  247. assertEquals('Wrong value returned by query', 0, vals.length);
  248. // And the same with an array.
  249. vals = [];
  250. database.forEachValue('SELECT * FROM Test WHERE x=?',
  251. function(val, row, col, name) {
  252. vals.push({val: val, row: row, col: col, name: name});
  253. },
  254. null,
  255. ['d']);
  256. assertEquals('Wrong value returned by query', 0, vals.length);
  257. }
  258. function testForEachRow() {
  259. if (!database) {
  260. return;
  261. }
  262. var vals = [];
  263. database.forEachRow('SELECT * FROM Test',
  264. function(arr, row) {
  265. vals.push({arr: arr, row: row});
  266. return true;
  267. },
  268. null);
  269. assertEquals('Wrong value returned by query', 3, vals.length);
  270. assertEquals('Wrong value returned by query', 'a', vals[0].arr[0]);
  271. assertEquals('Wrong value returned by query', 'alpha', vals[0].arr[1]);
  272. assertEquals('Wrong value returned by query', 0, vals[0].row);
  273. assertEquals('Wrong value returned by query', 'b', vals[1].arr[0]);
  274. assertEquals('Wrong value returned by query', 'beta', vals[1].arr[1]);
  275. assertEquals('Wrong value returned by query', 1, vals[1].row);
  276. assertEquals('Wrong value returned by query', 'g', vals[2].arr[0]);
  277. assertEquals('Wrong value returned by query', 'gamma', vals[2].arr[1]);
  278. assertEquals('Wrong value returned by query', 2, vals[2].row);
  279. vals = [];
  280. database.forEachRow('SELECT * FROM Test WHERE x=?',
  281. function(arr, row) {
  282. vals.push({arr: arr, row: row});
  283. return true;
  284. },
  285. null,
  286. 'd');
  287. assertEquals('Wrong value returned by query', 0, vals.length);
  288. // And the same with an array.
  289. vals = [];
  290. database.forEachRow('SELECT * FROM Test WHERE x=?',
  291. function(arr, row) {
  292. vals.push({arr: arr, row: row});
  293. return true;
  294. },
  295. null,
  296. ['d']);
  297. assertEquals('Wrong value returned by query', 0, vals.length);
  298. }
  299. function testMultipleBegins() {
  300. if (!database) {
  301. return;
  302. }
  303. var db1;
  304. var db2;
  305. try {
  306. db1 = new goog.gears.Database('tester', 'database-test');
  307. db2 = new goog.gears.Database('tester', 'database-test');
  308. } catch (e) {
  309. fail('Could not create the databases');
  310. }
  311. db1.begin();
  312. try {
  313. // This should time out as being locked.
  314. db2.begin();
  315. fail('Should not have been able to get past second begin transaction.');
  316. } catch (e) {
  317. assertFalse(
  318. 'Second begin should have failed, but claims to be in a transaction.',
  319. db2.isInTransaction());
  320. assertTrue(
  321. 'Second begin not reported as being locked',
  322. goog.gears.Database.isLockedException(e));
  323. }
  324. db1.commit();
  325. db2.begin();
  326. assertTrue('New second begin failed', db2.isInTransaction());
  327. db2.commit();
  328. };
  329. function testIsLockedExceptionMessage() {
  330. if (!database) {
  331. return;
  332. }
  333. var lockedExStr = 'Database operation failed. ERROR: database is locked ' +
  334. 'DETAILS: database is locked';
  335. assertTrue(goog.gears.Database.isLockedException(lockedExStr));
  336. assertFalse(goog.gears.Database.isLockedException(
  337. 'Database operation failed. ERROR: invalid SQL operation'));
  338. assertTrue(goog.gears.Database.isLockedException(Error(lockedExStr)));
  339. }
  340. function testNestedBegins() {
  341. if (!database) {
  342. return;
  343. }
  344. // Try normal nested begins.
  345. database.begin();
  346. try {
  347. database.begin();
  348. database.commit();
  349. database.commit();
  350. } catch (e) {
  351. fail('Could not run nested transactions');
  352. }
  353. // Now try nested begins with lower begin levels
  354. database.begin();
  355. try {
  356. database.beginDeferred();
  357. database.commit();
  358. database.commit();
  359. } catch (e) {
  360. fail('Could not run nested transactions');
  361. }
  362. // Now try begins with increasing begin levels. This should throw
  363. // an error.
  364. database.beginDeferred();
  365. try {
  366. database.beginImmediate();
  367. fail('Could not run nested transactions');
  368. database.commit();
  369. database.commit();
  370. } catch (e) {
  371. database.rollback(e);
  372. }
  373. }
  374. function testCommit() {
  375. if (!database) {
  376. return;
  377. }
  378. var db;
  379. try {
  380. db = new goog.gears.Database('tester', 'database-test');
  381. } catch (e) {
  382. debug('Could not create the database');
  383. }
  384. var committed = false;
  385. var rollbacked = false;
  386. database.begin();
  387. goog.events.listen(database, 'commit', function(e) {committed = true;});
  388. goog.events.listen(database, 'rollback', function(e) {rollbacked = true;});
  389. assertTrue('Incorrect reporting of being in a transaction',
  390. database.isInTransaction());
  391. database.execute('INSERT INTO Test VALUES(?, ?)', 'o', 'omega');
  392. var cnt = database.queryValue('SELECT COUNT(*) FROM Test');
  393. assertEquals('Found wrong number of rows', 4, cnt);
  394. cnt = db.queryValue('SELECT COUNT(*) FROM Test');
  395. assertEquals('Found wrong number of rows', 3, cnt);
  396. database.commit();
  397. cnt = db.queryValue('SELECT COUNT(*) FROM Test');
  398. assertEquals('Found wrong number of rows', 4, cnt);
  399. assertFalse('Incorrect reporting of being in a transaction',
  400. database.isInTransaction());
  401. assertTrue('Commit event not dispatched', committed);
  402. assertFalse('Rollback event wrongly dispatched', rollbacked);
  403. }
  404. function testCommit2() {
  405. if (!database) {
  406. return;
  407. }
  408. var db;
  409. try {
  410. db = new goog.gears.Database('tester', 'database-test');
  411. } catch (e) {
  412. debug('Could not create the database');
  413. }
  414. var committed = false;
  415. var rollbacked = false;
  416. database.begin();
  417. goog.events.listen(database, 'commit', function(e) {committed = true;});
  418. goog.events.listen(database, 'rollback', function(e) {rollbacked = true;});
  419. database.execute('INSERT INTO Test VALUES(?, ?)', 's', 'sigma');
  420. assertTrue('Incorrect reporting of being in a transaction',
  421. database.isInTransaction());
  422. database.begin();
  423. assertTrue('Incorrect reporting of being in a transaction',
  424. database.isInTransaction());
  425. database.execute('INSERT INTO Test VALUES(?, ?)', 's', 'sigma');
  426. database.commit();
  427. assertFalse('Commit event wrongly dispatched', committed);
  428. assertFalse('Rollback event wrongly dispatched', rollbacked);
  429. assertTrue('Incorrect reporting of being in a transaction',
  430. database.isInTransaction());
  431. // the values should not be committed at this point.
  432. cnt = database.queryValue('SELECT COUNT(*) FROM Test');
  433. assertEquals('Found wrong number of rows', 5, cnt);
  434. cnt = db.queryValue('SELECT COUNT(*) FROM Test');
  435. assertEquals('Found wrong number of rows', 3, cnt);
  436. database.commit();
  437. cnt = db.queryValue('SELECT COUNT(*) FROM Test');
  438. assertEquals('Found wrong number of rows', 5, cnt);
  439. assertFalse('Incorrect reporting of being in a transaction',
  440. database.isInTransaction());
  441. assertTrue('Commit function not called', committed);
  442. assertFalse('Rollback function wrongly called', rollbacked);
  443. }
  444. function testRollback() {
  445. if (!database) {
  446. return;
  447. }
  448. var begun = false;
  449. var committed = false;
  450. var rollbacked = false;
  451. goog.events.listen(database, 'begin', function(e) {begun = true;});
  452. database.begin();
  453. assertTrue('Begin event not dispatched', begun);
  454. goog.events.listen(database, 'commit', function(e) {committed = true;});
  455. goog.events.listen(database, 'rollback', function(e) {rollbacked = true;});
  456. database.execute('INSERT INTO Test VALUES(?, ?)', 'o', 'omega');
  457. var cnt = database.queryValue('SELECT COUNT(*) FROM Test');
  458. assertEquals('Found wrong number of rows', 4, cnt);
  459. database.rollback();
  460. cnt = database.queryValue('SELECT COUNT(*) FROM Test');
  461. assertEquals('Found wrong number of rows', 3, cnt);
  462. assertFalse('Incorrect reporting of being in a transaction',
  463. database.isInTransaction());
  464. assertFalse('Commit event wrongly dispatched', committed);
  465. assertTrue('Rollback event not dispatched', rollbacked);
  466. }
  467. function testRollback2() {
  468. if (!database) {
  469. return;
  470. }
  471. var begun = false;
  472. var committed = false;
  473. var rollbacked = false;
  474. database.begin();
  475. goog.events.listen(database, 'commit', function(e) {committed = true;});
  476. goog.events.listen(database, 'rollback', function(e) {rollbacked = true;});
  477. database.execute('INSERT INTO Test VALUES(?, ?)', 's', 'sigma');
  478. database.begin();
  479. database.execute('INSERT INTO Test VALUES(?, ?)', 's', 'sigma');
  480. database.rollback();
  481. // the values should not be rolledback at this point.
  482. cnt = database.queryValue('SELECT COUNT(*) FROM Test');
  483. assertEquals('Found wrong number of rows', 5, cnt);
  484. assertFalse('Commit event wrongly dispatched', committed);
  485. assertFalse('Rollback event wrongly dispatched', rollbacked);
  486. database.rollback();
  487. cnt = database.queryValue('SELECT COUNT(*) FROM Test');
  488. assertEquals('Found wrong number of rows', 3, cnt);
  489. assertFalse('Incorrect reporting of being in a transaction',
  490. database.isInTransaction());
  491. assertFalse('Commit event wrongly dispatched', committed);
  492. assertTrue('Rollback event not dispatched', rollbacked);
  493. }
  494. function testPreventDefault() {
  495. if (!database) {
  496. return;
  497. }
  498. var committed = false;
  499. database.begin();
  500. goog.events.listen(database, 'beforecommit', function(e) {
  501. e.preventDefault();
  502. });
  503. goog.events.listen(database, 'commit', function(e) {committed = true;});
  504. database.execute('INSERT INTO Test VALUES(?, ?)', 'd', 'delta');
  505. database.commit();
  506. assertFalse('Commit ignored beforecommit preventDefault()', committed);
  507. database.rollback();
  508. }
  509. function testPreventDefault2() {
  510. if (!database) {
  511. return;
  512. }
  513. var rollbacked = false;
  514. database.begin();
  515. goog.events.listen(database, 'beforerollback', function(e) {
  516. e.preventDefault();
  517. });
  518. goog.events.listen(database, 'rollback', function(e) {
  519. rollbacked = true;
  520. });
  521. database.execute('INSERT INTO Test VALUES(?, ?)', 'd', 'delta');
  522. database.rollback();
  523. assertFalse('Rollback ignored beforerollback preventDefault()', rollbacked);
  524. goog.events.removeAll(database);
  525. database.rollback();
  526. }
  527. function testLastInsertId() {
  528. if (!database) {
  529. return;
  530. }
  531. database.execute('INSERT INTO Test VALUES (?, ?)', 'a', 'alpha');
  532. var id = database.getLastInsertRowId();
  533. database.execute('INSERT INTO Test VALUES (?, ?)', 'b', 'beta');
  534. assertEquals('Incorrect last insert id',
  535. id + 1, database.getLastInsertRowId());
  536. }
  537. function testError() {
  538. if (!database) {
  539. return;
  540. }
  541. var sql = 'INSERT INTO Unknown VALUES(?, ?)';
  542. try {
  543. database.execute('INSERT INTO Unknown VALUES(?, ?)', 'alpha', 1);
  544. fail('Should not have gotten here');
  545. } catch (e) {
  546. assertEquals('Wrong sql information', sql + ': ["alpha",1]', e.message0);
  547. }
  548. }
  549. function testThrowInBeforeSubmit() {
  550. if (!database) {
  551. return;
  552. }
  553. var errorSentinel = Error();
  554. var committed = false;
  555. database.begin();
  556. goog.events.listen(database, 'beforecommit', function(e) {
  557. throw errorSentinel;
  558. });
  559. goog.events.listen(database, 'commit', function(e) {
  560. committed = true;
  561. });
  562. database.execute('INSERT INTO Test VALUES(?, ?)', 'd', 'delta');
  563. try {
  564. database.commit();
  565. fail('Should have thrown an error');
  566. } catch (ex) {
  567. assertEquals(errorSentinel, ex);
  568. assertTrue('Should still be in the transaction',
  569. database.isInTransaction());
  570. }
  571. assertFalse('Should not have been commited since we threw an error ' +
  572. 'in beforecommit', committed);
  573. database.rollback();
  574. }
  575. function testThrowInBeforeRollback() {
  576. if (!database) {
  577. return;
  578. }
  579. var errorSentinel = Error();
  580. var rollbacked = false;
  581. database.begin();
  582. goog.events.listen(database, 'beforerollback', function(e) {
  583. throw errorSentinel;
  584. });
  585. goog.events.listen(database, 'rollback', function(e) {
  586. rollbacked = true;
  587. });
  588. database.execute('INSERT INTO Test VALUES(?, ?)', 'd', 'delta');
  589. try {
  590. database.rollback();
  591. fail('Should have thrown an error');
  592. } catch (ex) {
  593. assertEquals(errorSentinel, ex);
  594. assertTrue('Should still be in the transaction',
  595. database.isInTransaction());
  596. }
  597. assertFalse('Should not have been rolled back since we threw an error ' +
  598. 'in beforerollback', rollbacked);
  599. goog.events.removeAll(database);
  600. database.rollback();
  601. }
  602. </script>
  603. </body>
  604. </html>