diff options
Diffstat (limited to 'dom/plugins/test/mochitest/hang_test.js')
-rw-r--r-- | dom/plugins/test/mochitest/hang_test.js | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/dom/plugins/test/mochitest/hang_test.js b/dom/plugins/test/mochitest/hang_test.js new file mode 100644 index 000000000..796093fa3 --- /dev/null +++ b/dom/plugins/test/mochitest/hang_test.js @@ -0,0 +1,114 @@ + +Components.utils.import("resource://gre/modules/KeyValueParser.jsm"); + +var Cc = Components.classes; +var Ci = Components.interfaces; + +var success = false; +var observerFired = false; + +var testObserver = { + idleHang: true, + + observe: function(subject, topic, data) { + observerFired = true; + ok(true, "Observer fired"); + is(topic, "plugin-crashed", "Checking correct topic"); + is(data, null, "Checking null data"); + ok((subject instanceof Ci.nsIPropertyBag2), "got Propbag"); + ok((subject instanceof Ci.nsIWritablePropertyBag2), "got writable Propbag"); + + var pluginId = subject.getPropertyAsAString("pluginDumpID"); + isnot(pluginId, "", "got a non-empty plugin crash id"); + + // check plugin dump and extra files + let directoryService = + Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties); + let profD = directoryService.get("ProfD", Ci.nsIFile); + profD.append("minidumps"); + let pluginDumpFile = profD.clone(); + pluginDumpFile.append(pluginId + ".dmp"); + ok(pluginDumpFile.exists(), "plugin minidump exists"); + + let pluginExtraFile = profD.clone(); + pluginExtraFile.append(pluginId + ".extra"); + ok(pluginExtraFile.exists(), "plugin extra file exists"); + + let extraData = parseKeyValuePairsFromFile(pluginExtraFile); + + // check additional dumps + + ok("additional_minidumps" in extraData, "got field for additional minidumps"); + let additionalDumps = extraData.additional_minidumps.split(','); + ok(additionalDumps.indexOf('browser') >= 0, "browser in additional_minidumps"); + + let additionalDumpFiles = []; + for (let name of additionalDumps) { + let file = profD.clone(); + file.append(pluginId + "-" + name + ".dmp"); + ok(file.exists(), "additional dump '"+name+"' exists"); + if (file.exists()) { + additionalDumpFiles.push(file); + } + } + + // check cpu usage field + + ok("PluginCpuUsage" in extraData, "got extra field for plugin cpu usage"); + let cpuUsage = parseFloat(extraData["PluginCpuUsage"]); + if (this.idleHang) { + ok(cpuUsage == 0, "plugin cpu usage is 0%"); + } else { + ok(cpuUsage > 0, "plugin cpu usage is >0%"); + } + + // check processor count field + ok("NumberOfProcessors" in extraData, "got extra field for processor count"); + ok(parseInt(extraData["NumberOfProcessors"]) > 0, "number of processors is >0"); + + // cleanup, to be nice + pluginDumpFile.remove(false); + pluginExtraFile.remove(false); + for (let file of additionalDumpFiles) { + file.remove(false); + } + }, + + QueryInterface: function(iid) { + if (iid.equals(Ci.nsIObserver) || + iid.equals(Ci.nsISupportsWeakReference) || + iid.equals(Ci.nsISupports)) + return this; + throw Components.results.NS_NOINTERFACE; + } +}; + + +function onPluginCrashed(aEvent) { + ok(true, "Plugin crashed notification received"); + ok(observerFired, "Observer should have fired first"); + is(aEvent.type, "PluginCrashed", "event is correct type"); + + var pluginElement = document.getElementById("plugin1"); + is (pluginElement, aEvent.target, "Plugin crashed event target is plugin element"); + + ok(aEvent instanceof PluginCrashedEvent, + "plugin crashed event has the right interface"); + + is(typeof aEvent.pluginDumpID, "string", "pluginDumpID is correct type"); + isnot(aEvent.pluginDumpID, "", "got a non-empty dump ID"); + is(typeof aEvent.pluginName, "string", "pluginName is correct type"); + is(aEvent.pluginName, "Test Plug-in", "got correct plugin name"); + is(typeof aEvent.pluginFilename, "string", "pluginFilename is correct type"); + isnot(aEvent.pluginFilename, "", "got a non-empty filename"); + // The app itself may or may not have decided to submit the report, so + // allow either true or false here. + ok("submittedCrashReport" in aEvent, "submittedCrashReport is a property of event"); + is(typeof aEvent.submittedCrashReport, "boolean", "submittedCrashReport is correct type"); + + var os = Cc["@mozilla.org/observer-service;1"]. + getService(Ci.nsIObserverService); + os.removeObserver(testObserver, "plugin-crashed"); + + SimpleTest.finish(); +} |