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 161354 0ecaf7b5bc926a7c12e84e37187f83fe766ba151
parent 161353 2bb13ecf0297b7a46312765337f9d220b3ebe21a
child 161355 9f97b68c6bdf00bfcfd246be4bd8d5d9985da36a
push id25878
push userkwierso@gmail.com
push dateFri, 20 Dec 2013 03:09:21 +0000
treeherdermozilla-central@599100c4ebfe [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersyoric, gps
bugs888373
milestone29.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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]