Bug 888373: Simple API for detecting startup/shutdown crashes - tests;r=yoric,gps
authorMichael Brennan <brennan.brisad@gmail.com>
Tue, 20 Aug 2013 22:46:38 +0200
changeset 161229 0ecaf7b5bc926a7c12e84e37187f83fe766ba151
parent 161228 2bb13ecf0297b7a46312765337f9d220b3ebe21a
child 161230 9f97b68c6bdf00bfcfd246be4bd8d5d9985da36a
push id4083
push userttaubert@mozilla.com
push dateThu, 19 Dec 2013 17:58:54 +0000
treeherderfx-team@0ecaf7b5bc92 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersyoric, gps
bugs888373
milestone29.0a1
Bug 888373: Simple API for detecting startup/shutdown crashes - tests;r=yoric,gps
toolkit/components/crashmonitor/moz.build
toolkit/components/crashmonitor/test/unit/head.js
toolkit/components/crashmonitor/test/unit/test_init.js
toolkit/components/crashmonitor/test/unit/test_invalid_file.js
toolkit/components/crashmonitor/test/unit/test_missing_file.js
toolkit/components/crashmonitor/test/unit/test_register.js
toolkit/components/crashmonitor/test/unit/test_valid_file.js
toolkit/components/crashmonitor/test/unit/xpcshell.ini
--- a/toolkit/components/crashmonitor/moz.build
+++ b/toolkit/components/crashmonitor/moz.build
@@ -1,14 +1,16 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # 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/.
 
+XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini']
+
 EXTRA_JS_MODULES = [
     'CrashMonitor.jsm',
 ]
 
 EXTRA_COMPONENTS += [
     'crashmonitor.manifest',
 ]
 
new file mode 100644
--- /dev/null
+++ b/toolkit/components/crashmonitor/test/unit/head.js
@@ -0,0 +1,22 @@
+/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "OS",
+                                  "resource://gre/modules/osfile.jsm");
+
+let sessionCheckpointsPath;
+
+/**
+ * Start the tasks of the different tests
+ */
+function run_test()
+{
+  do_get_profile();
+  sessionCheckpointsPath = OS.Path.join(OS.Constants.Path.profileDir,
+                                        "sessionCheckpoints.json");
+  Components.utils.import("resource://gre/modules/CrashMonitor.jsm");
+  run_next_test();
+}
new file mode 100644
--- /dev/null
+++ b/toolkit/components/crashmonitor/test/unit/test_init.js
@@ -0,0 +1,17 @@
+/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+/**
+ * Test that calling |init| twice throws an error
+ */
+add_task(function test_init() {
+  CrashMonitor.init();
+  try {
+    CrashMonitor.init();
+    do_check_true(false);
+  } catch (ex) {
+    do_check_true(true);
+  }
+});
new file mode 100644
--- /dev/null
+++ b/toolkit/components/crashmonitor/test/unit/test_invalid_file.js
@@ -0,0 +1,30 @@
+/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+/**
+ * Test with sessionCheckpoints.json containing invalid data
+ */
+add_task(function test_invalid_file() {
+  // Write bogus data to checkpoint file
+  let data = "1234";
+  yield OS.File.writeAtomic(sessionCheckpointsPath, data,
+                            {tmpPath: sessionCheckpointsPath + ".tmp"});
+
+  // An invalid file will cause |init| to throw an exception
+  try {
+    let status = yield CrashMonitor.init();
+    do_check_true(false);
+  } catch (ex) {
+    do_check_true(true);
+  }
+
+  // and |previousCheckpoints| will be rejected
+  try {
+    let checkpoints = yield CrashMonitor.previousCheckpoints;
+    do_check_true(false);
+  } catch (ex) {
+    do_check_true(true);
+  }
+});
new file mode 100644
--- /dev/null
+++ b/toolkit/components/crashmonitor/test/unit/test_missing_file.js
@@ -0,0 +1,13 @@
+/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+/**
+ * Test with non-existing sessionCheckpoints.json
+ */
+add_task(function test_missing_file() {
+  CrashMonitor.init();
+  let checkpoints = yield CrashMonitor.previousCheckpoints;
+  do_check_eq(checkpoints, null);
+});
new file mode 100644
--- /dev/null
+++ b/toolkit/components/crashmonitor/test/unit/test_register.js
@@ -0,0 +1,24 @@
+/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+/**
+ * Test that CrashMonitor.jsm is correctly loaded from XPCOM component
+ */
+add_task(function test_register() {
+  let cm = Components.classes["@mozilla.org/toolkit/crashmonitor;1"]
+                             .createInstance(Components.interfaces.nsIObserver);
+
+  // Send "profile-after-change" to trigger the initialization
+  cm.observe(null, "profile-after-change", null);
+
+  // If CrashMonitor was initialized properly a new call to |init|
+  // should fail
+  try {
+    CrashMonitor.init();
+    do_check_true(false);
+  } catch (ex) {
+    do_check_true(true);
+  }
+});
new file mode 100644
--- /dev/null
+++ b/toolkit/components/crashmonitor/test/unit/test_valid_file.js
@@ -0,0 +1,20 @@
+/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+/**
+ * Test with sessionCheckpoints.json containing valid data
+ */
+add_task(function test_valid_file() {
+  // Write valid data to checkpoint file
+  let data = JSON.stringify({"final-ui-startup": true});
+  yield OS.File.writeAtomic(sessionCheckpointsPath, data,
+                            {tmpPath: sessionCheckpointsPath + ".tmp"});
+
+  CrashMonitor.init();
+  let checkpoints = yield CrashMonitor.previousCheckpoints;
+
+  do_check_true(checkpoints["final-ui-startup"]);
+  do_check_eq(Object.keys(checkpoints).length, 1);
+});
new file mode 100644
--- /dev/null
+++ b/toolkit/components/crashmonitor/test/unit/xpcshell.ini
@@ -0,0 +1,9 @@
+[DEFAULT]
+head = head.js
+tail =
+
+[test_init.js]
+[test_valid_file.js]
+[test_invalid_file.js]
+[test_missing_file.js]
+[test_register.js]