1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/common/tests/unit/test_async_querySpinningly.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,103 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); 1.8 +Cu.import("resource://services-common/async.js"); 1.9 +Cu.import("resource://services-common/utils.js"); 1.10 + 1.11 +_("Make sure querySpinningly will synchronously fetch rows for a query asyncly"); 1.12 + 1.13 +const SQLITE_CONSTRAINT_VIOLATION = 19; // http://www.sqlite.org/c3ref/c_abort.html 1.14 + 1.15 +let Svc = {}; 1.16 +XPCOMUtils.defineLazyServiceGetter(Svc, "Form", 1.17 + "@mozilla.org/satchel/form-history;1", 1.18 + "nsIFormHistory2"); 1.19 + 1.20 +function querySpinningly(query, names) { 1.21 + let q = Svc.Form.DBConnection.createStatement(query); 1.22 + let r = Async.querySpinningly(q, names); 1.23 + q.finalize(); 1.24 + return r; 1.25 +} 1.26 + 1.27 +function run_test() { 1.28 + initTestLogging("Trace"); 1.29 + 1.30 + _("Make sure the call is async and allows other events to process"); 1.31 + let isAsync = false; 1.32 + CommonUtils.nextTick(function() { isAsync = true; }); 1.33 + do_check_false(isAsync); 1.34 + 1.35 + _("Empty out the formhistory table"); 1.36 + let r0 = querySpinningly("DELETE FROM moz_formhistory"); 1.37 + do_check_eq(r0, null); 1.38 + 1.39 + _("Make sure there's nothing there"); 1.40 + let r1 = querySpinningly("SELECT 1 FROM moz_formhistory"); 1.41 + do_check_eq(r1, null); 1.42 + 1.43 + _("Insert a row"); 1.44 + let r2 = querySpinningly("INSERT INTO moz_formhistory (fieldname, value) VALUES ('foo', 'bar')"); 1.45 + do_check_eq(r2, null); 1.46 + 1.47 + _("Request a known value for the one row"); 1.48 + let r3 = querySpinningly("SELECT 42 num FROM moz_formhistory", ["num"]); 1.49 + do_check_eq(r3.length, 1); 1.50 + do_check_eq(r3[0].num, 42); 1.51 + 1.52 + _("Get multiple columns"); 1.53 + let r4 = querySpinningly("SELECT fieldname, value FROM moz_formhistory", ["fieldname", "value"]); 1.54 + do_check_eq(r4.length, 1); 1.55 + do_check_eq(r4[0].fieldname, "foo"); 1.56 + do_check_eq(r4[0].value, "bar"); 1.57 + 1.58 + _("Get multiple columns with a different order"); 1.59 + let r5 = querySpinningly("SELECT fieldname, value FROM moz_formhistory", ["value", "fieldname"]); 1.60 + do_check_eq(r5.length, 1); 1.61 + do_check_eq(r5[0].fieldname, "foo"); 1.62 + do_check_eq(r5[0].value, "bar"); 1.63 + 1.64 + _("Add multiple entries (sqlite doesn't support multiple VALUES)"); 1.65 + let r6 = querySpinningly("INSERT INTO moz_formhistory (fieldname, value) SELECT 'foo', 'baz' UNION SELECT 'more', 'values'"); 1.66 + do_check_eq(r6, null); 1.67 + 1.68 + _("Get multiple rows"); 1.69 + let r7 = querySpinningly("SELECT fieldname, value FROM moz_formhistory WHERE fieldname = 'foo'", ["fieldname", "value"]); 1.70 + do_check_eq(r7.length, 2); 1.71 + do_check_eq(r7[0].fieldname, "foo"); 1.72 + do_check_eq(r7[1].fieldname, "foo"); 1.73 + 1.74 + _("Make sure updates work"); 1.75 + let r8 = querySpinningly("UPDATE moz_formhistory SET value = 'updated' WHERE fieldname = 'more'"); 1.76 + do_check_eq(r8, null); 1.77 + 1.78 + _("Get the updated"); 1.79 + let r9 = querySpinningly("SELECT value, fieldname FROM moz_formhistory WHERE fieldname = 'more'", ["fieldname", "value"]); 1.80 + do_check_eq(r9.length, 1); 1.81 + do_check_eq(r9[0].fieldname, "more"); 1.82 + do_check_eq(r9[0].value, "updated"); 1.83 + 1.84 + _("Grabbing fewer fields than queried is fine"); 1.85 + let r10 = querySpinningly("SELECT value, fieldname FROM moz_formhistory", ["fieldname"]); 1.86 + do_check_eq(r10.length, 3); 1.87 + 1.88 + _("Generate an execution error"); 1.89 + let query = "INSERT INTO moz_formhistory (fieldname, value) VALUES ('one', NULL)"; 1.90 + let stmt = Svc.Form.DBConnection.createStatement(query); 1.91 + let r11, except; ; 1.92 + try { 1.93 + r11 = Async.querySpinningly(stmt); 1.94 + } catch(e) { 1.95 + except = e; 1.96 + } 1.97 + stmt.finalize() 1.98 + do_check_true(!!except); 1.99 + do_check_eq(except.result, SQLITE_CONSTRAINT_VIOLATION); 1.100 + 1.101 + _("Cleaning up"); 1.102 + querySpinningly("DELETE FROM moz_formhistory"); 1.103 + 1.104 + _("Make sure the timeout got to run before this function ends"); 1.105 + do_check_true(isAsync); 1.106 +}