Bug 1413501 - Test for SpinningSynchronousClose unregisterConnection edge-case. r=mak
authorAndrew Sutherland <asutherland@asutherland.org>
Wed, 08 Nov 2017 09:31:31 -0800
changeset 435996 4b34fc8bfe40da9748d014f3562e9468eab18a89
parent 435995 47f845a860d85465af6df2827cf40f77432deafb
child 435997 607fd3ab695341b591ef712cf4011ba6111ce423
push id117
push userfmarier@mozilla.com
push dateTue, 28 Nov 2017 20:17:16 +0000
reviewersmak
bugs1413501
milestone59.0a1
Bug 1413501 - Test for SpinningSynchronousClose unregisterConnection edge-case. r=mak
storage/test/unit/test_connection_failsafe_close.js
storage/test/unit/xpcshell.ini
new file mode 100644
--- /dev/null
+++ b/storage/test/unit/test_connection_failsafe_close.js
@@ -0,0 +1,34 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * This file tests edge-cases related to mozStorageService::unregisterConnection
+ * in the face of failsafe closing at destruction time which results in
+ * SpinningSynchronousClose being invoked which can "resurrect" the connection
+ * and result in a second call to unregisterConnection.
+ *
+ * See https://bugzilla.mozilla.org/show_bug.cgi?id=1413501 for more context.
+ */
+
+add_task(async function test_failsafe_close_of_async_connection() {
+  // get the db
+  let db = getOpenedDatabase();
+
+  // do something async
+  let callbackInvoked = new Promise((resolve) => {
+    db.executeSimpleSQLAsync("CREATE TABLE test (id INTEGER)",
+                             { handleCompletion: resolve });
+  });
+
+  // drop our reference and force a GC so the only live reference is owned by
+  // the async statement.
+  db = gDBConn = null;
+  // (we don't need to cycle collect)
+  Components.utils.forceGC();
+
+  // now we need to wait for that callback to have completed.
+  await callbackInvoked;
+
+  Assert.ok(true, "if we shutdown cleanly and do not crash, then we succeeded");
+});
--- a/storage/test/unit/xpcshell.ini
+++ b/storage/test/unit/xpcshell.ini
@@ -13,16 +13,20 @@ support-files =
 [test_bug-444233.js]
 [test_cache_size.js]
 [test_chunk_growth.js]
 # Bug 676981: test fails consistently on Android
 fail-if = os == "android"
 [test_connection_asyncClose.js]
 [test_connection_executeAsync.js]
 [test_connection_executeSimpleSQLAsync.js]
+[test_connection_failsafe_close.js]
+# The failsafe close mechanism asserts when performing SpinningSynchronousClose
+# on debug builds, so we can only test on non-debug builds.
+skip-if = debug
 [test_connection_interrupt.js]
 [test_js_helpers.js]
 [test_levenshtein.js]
 [test_like.js]
 [test_like_escape.js]
 [test_locale_collation.js]
 [test_page_size_is_32k.js]
 [test_sqlite_secure_delete.js]