Bug 1277644 - Make sure browser_Addons_sample test add-on tests CPOWs when it is supposed to. r?Yoric draft
authorMike Conley <mconley@mozilla.com>
Sun, 29 May 2016 12:00:50 -0400
changeset 376746 58105a997042d3d299790df05b4c42dfc3f19e53
parent 376275 ec20b463c04f57a4bfca1edb987fcb9e9707c364
child 523223 9183ffb8d471816d2978b4555afe2e1fce465dd2
push id20655
push usermconley@mozilla.com
push dateWed, 08 Jun 2016 16:06:39 +0000
reviewersYoric
bugs1277644
milestone50.0a1
Bug 1277644 - Make sure browser_Addons_sample test add-on tests CPOWs when it is supposed to. r?Yoric browser_Addons_sample is used by the browser_AddonWatcher.js test to make sure we can properly detect when an add-on consumes a bunch of CPU or does a lot of CPOW traffic. There's a race condition in the add-on where what is supposed to be a CPOW might not always be a CPOW, so when we try to cause a bunch of CPOW traffic, we don't get the expected performance warnings. This makes sure that when we try to simulate CPOW usage, we do it with an actual CPOW. Additionally, this commit also includes the unpacked source of the add-on, which before wasn't in the tree. I've also taken the liberty of bumping the add-on version and signing it. MozReview-Commit-ID: GICLYpi8Kon
toolkit/components/perfmonitoring/tests/browser/browser_AddonWatcher.js
toolkit/components/perfmonitoring/tests/browser/browser_Addons_sample.xpi
toolkit/components/perfmonitoring/tests/browser/browser_Addons_sample/bootstrap.js
toolkit/components/perfmonitoring/tests/browser/browser_Addons_sample/build.sh
toolkit/components/perfmonitoring/tests/browser/browser_Addons_sample/chrome.manifest
toolkit/components/perfmonitoring/tests/browser/browser_Addons_sample/content/framescript.js
toolkit/components/perfmonitoring/tests/browser/browser_Addons_sample/install.rdf
--- a/toolkit/components/perfmonitoring/tests/browser/browser_AddonWatcher.js
+++ b/toolkit/components/perfmonitoring/tests/browser/browser_AddonWatcher.js
@@ -15,25 +15,31 @@ const ADDON_URL = "http://example.com/br
 const ADDON_ID = "addonwatcher-test@mozilla.com";
 
 add_task(function* init() {
   info("Installing test add-on");
   let installer = yield new Promise(resolve => AddonManager.getInstallForURL(ADDON_URL, resolve, "application/x-xpinstall"));
   if (installer.error) {
     throw installer.error;
   }
-  let ready = new Promise((resolve, reject) => installer.addListener({
+  let installed = new Promise((resolve, reject) => installer.addListener({
     onInstallEnded: (_, addon) => resolve(addon),
     onInstallFailed: reject,
     onDownloadFailed: reject
   }));
+
+  // We also need to wait for the add-on to report that it's ready
+  // to be used in the test.
+  let ready = TestUtils.topicObserved("test-addonwatcher-ready");
   installer.install();
 
   info("Waiting for installation to terminate");
-  let addon = yield ready;
+  let addon = yield installed;
+
+  yield ready;
 
   registerCleanupFunction(() => {
     info("Uninstalling test add-on");
     addon.uninstall()
   });
 
 
   let freezeThreshold = Preferences.get("browser.addon-watch.freeze-threshold-micros", /* 5 seconds */ 5000000);
index 99ea037b2b8cb17751a26eee8f97c04c78f86834..ae5bcc5ff3bdd42bb93c87bca7ea22131bf79f93
GIT binary patch
literal 7848
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
new file mode 100644
--- /dev/null
+++ b/toolkit/components/perfmonitoring/tests/browser/browser_Addons_sample/bootstrap.js
@@ -0,0 +1,105 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Sample for browser_AddonWatcher.js
+
+"use strict";
+
+const {utils: Cu, classes: Cc, interfaces: Ci} = Components;
+
+const TOPIC_BURNCPU = "test-addonwatcher-burn-some-cpu";
+const TOPIC_BURNCPOW = "test-addonwatcher-burn-some-cpow";
+const TOPIC_BURNCONTENTCPU = "test-addonwatcher-burn-some-content-cpu";
+const TOPIC_READY = "test-addonwatcher-ready";
+
+const MESSAGE_BURNCPOW = "test-addonwatcher-cpow:init";
+const URL_FRAMESCRIPT = "chrome://addonwatcher-test/content/framescript.js";
+
+Cu.import("resource://gre/modules/Services.jsm", this);
+const { setTimeout } = Cu.import("resource://gre/modules/Timer.jsm", {});
+Cu.import("resource://gre/modules/Task.jsm", this);
+
+let globalMM = Cc["@mozilla.org/globalmessagemanager;1"]
+  .getService(Ci.nsIMessageListenerManager);
+
+/**
+ * Spend some time using CPU.
+ */
+function burnCPU() {
+  let ignored = [];
+  let start = Date.now();
+  let i = 0;
+  while (Date.now() - start < 1000) {
+    ignored[i++ % 2] = i;
+  }
+}
+
+/**
+ * Spend some time in CPOW.
+ */
+function burnCPOW() {
+  gBurnCPOW();
+}
+let gBurnCPOW = null;
+
+function burnContentCPU() {
+  setTimeout(() => {try {
+    gBurnContentCPU()
+  } catch (ex) {
+    dump(`test-addon error: ${ex}\n`);
+  }}, 0);
+}
+let gBurnContentCPU = null;
+
+let gTab = null;
+let gTabBrowser = null;
+
+function startup() {
+  Services.obs.addObserver(burnCPU, TOPIC_BURNCPU, false);
+  Services.obs.addObserver(burnCPOW, TOPIC_BURNCPOW, false);
+  Services.obs.addObserver(burnContentCPU, TOPIC_BURNCONTENTCPU, false);
+
+  let windows = Services.wm.getEnumerator("navigator:browser");
+  let win = windows.getNext();
+  gTabBrowser = win.gBrowser;
+  gTab = gTabBrowser.addTab("about:robots");
+  gBurnContentCPU = function() {
+    gTab.linkedBrowser.messageManager.sendAsyncMessage("test-addonwatcher-burn-some-content-cpu", {});
+  }
+
+  gTab.linkedBrowser.messageManager.loadFrameScript(URL_FRAMESCRIPT, false);
+  globalMM.loadFrameScript(URL_FRAMESCRIPT, false);
+
+  if (Services.appinfo.browserTabsRemoteAutostart) {
+    // This profile has e10s enabled, which means we'll want to
+    // test CPOW traffic.
+    globalMM.addMessageListener("test-addonwatcher-cpow:init", function waitForCPOW(msg) {
+      if (Components.utils.isCrossProcessWrapper(msg.objects.burnCPOW)) {
+        gBurnCPOW = msg.objects.burnCPOW;
+        globalMM.removeMessageListener("test-addonwatcher-cpow:init", waitForCPOW);
+        Services.obs.notifyObservers(null, TOPIC_READY, null);
+      } else {
+        Cu.reportError("test-addonwatcher-cpow:init didn't give us a CPOW! Expect timeouts.");
+      }
+    });
+  } else {
+    // e10s is not enabled, so a CPOW is not necessary - we can report ready
+    // right away.
+    Services.obs.notifyObservers(null, TOPIC_READY, null);
+  }
+}
+
+function shutdown() {
+  Services.obs.removeObserver(burnCPU, TOPIC_BURNCPU);
+  Services.obs.removeObserver(burnCPOW, TOPIC_BURNCPOW);
+  Services.obs.removeObserver(burnContentCPU, TOPIC_BURNCONTENTCPU);
+  gTabBrowser.removeTab(gTab);
+}
+
+function install() {
+  // Nothing to do
+}
+
+function uninstall() {
+  // Nothing to do
+}
new file mode 100644
--- /dev/null
+++ b/toolkit/components/perfmonitoring/tests/browser/browser_Addons_sample/build.sh
@@ -0,0 +1,4 @@
+echo "Rebuilding browser_Addons_sample.xpi..."
+zip -r ../browser_Addons_sample.xpi .
+echo "
+Done! Don't forget to sign it: https://wiki.mozilla.org/EngineeringProductivity/HowTo/SignExtensions"
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/toolkit/components/perfmonitoring/tests/browser/browser_Addons_sample/chrome.manifest
@@ -0,0 +1,1 @@
+content addonwatcher-test content/
new file mode 100644
--- /dev/null
+++ b/toolkit/components/perfmonitoring/tests/browser/browser_Addons_sample/content/framescript.js
@@ -0,0 +1,23 @@
+/* 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/. */
+
+"use strict";
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+function burnCPOW(msg) {
+  dump(`Addon: content burnCPU start ${Math.sin(Math.random())}\n`);
+  let start = content.performance.now();
+  let ignored = [];
+  while (content.performance.now() - start < 5000) {
+    ignored[ignored.length % 2] = ignored.length;
+  }
+  dump(`Addon: content burnCPU done: ${content.performance.now() - start}\n`);
+}
+
+if (Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_CONTENT) {
+  sendAsyncMessage("test-addonwatcher-cpow:init", {}, {burnCPOW});
+}
+
+addMessageListener("test-addonwatcher-burn-some-content-cpu", burnCPOW);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/perfmonitoring/tests/browser/browser_Addons_sample/install.rdf
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+  <Description about="urn:mozilla:install-manifest">
+    <em:id>addonwatcher-test@mozilla.com</em:id>
+    <em:version>1.1</em:version>
+
+    <em:targetApplication>
+      <Description>
+        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+        <em:minVersion>0.3</em:minVersion>
+        <em:maxVersion>*</em:maxVersion>
+      </Description>
+    </em:targetApplication>
+
+    <em:targetApplication>
+     <Description>
+      <em:id>toolkit@mozilla.org</em:id>
+      <em:minVersion>1</em:minVersion>
+      <em:maxVersion>*</em:maxVersion>
+     </Description>
+    </em:targetApplication>
+
+    <em:bootstrap>true</em:bootstrap>
+
+    <em:name>Sample for browser_AddonWatcher.js</em:name>
+
+  </Description>
+</RDF>