[Pkg-mozext-commits] [requestpolicy] 226/280: add tests for restartlessness, resolves #608

David Prévot taffit at moszumanska.debian.org
Sat May 2 20:30:31 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository requestpolicy.

commit c7358990da4025c5b878520e2bb4f29065eac547
Author: Martin Kimmerle <dev at 256k.de>
Date:   Wed Mar 18 00:53:45 2015 +0100

    add tests for restartlessness, resolves #608
---
 .gitignore                                         |   3 +
 Makefile                                           | 125 ++++++++++++++--
 src/content/lib/default-preferences.js             |   4 +
 src/content/lib/logger.jsm                         |  16 +-
 tests/mozmill/extension/bootstrap.js               |  42 ++++++
 tests/mozmill/extension/chrome.manifest            |   1 +
 .../mozmill/extension/content/console-observer.jsm |  69 +++++++++
 tests/mozmill/extension/install.rdf                |  36 +++++
 .../initDetectingRestarts.js                       |  18 +++
 .../testAssertNoRestart.js                         |  19 +++
 .../testDetectingRestarts.js                       |  39 +++++
 .../detectErrors/initDetectingErrors.js            |  27 ++++
 .../detectErrors/testAssertNoErrors.js             |  33 +++++
 .../detectErrors/testDetectingErrors.js            |  43 ++++++
 .../repeatedTests/init-repeated-tests.ini          |   2 +
 .../repeatedTests/run-repeated-tests.ini           |   2 +
 .../repeatedTests/test-repeated-tests.ini          |   2 +
 .../restartlessness/lib/addon-manager-utils.js     | 162 +++++++++++++++++++++
 .../restartlessness/testDisableExtension.js        |  52 +++++++
 .../restartlessness/testEnableExtension.js         |  51 +++++++
 .../restartlessness/testInstallExtension.js        |  63 ++++++++
 .../restartlessness/testUninstallExtension.js      |  55 +++++++
 .../restartlessness/testUpgradeExtension.js        |  43 ++++++
 tests/mozmill/lib/constants.js                     |   2 +
 tests/mozmill/manifest.ini                         |  72 ++++++++-
 tests/mozmill/test-ff.ini                          |  28 ++++
 tests/mozmill/test-rp.ini                          |   4 +
 27 files changed, 998 insertions(+), 15 deletions(-)

diff --git a/.gitignore b/.gitignore
index e7c1e6a..d9daf53 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,6 @@
 # build and dist directories in the root folder
 /build/
 /dist/
+
+/tests/mozmill/data
+/tests/mozmill/mozmill-tests
diff --git a/Makefile b/Makefile
index bca4202..422329e 100644
--- a/Makefile
+++ b/Makefile
@@ -79,12 +79,55 @@ endif
 signed_xpi_file := $(dist_path)$(extension_name)-signed.xpi
 
 
+# ________________________________________
+# vars for generating the unit-testing XPI
+#
+
+unit_testing__build_path := $(build_dirname)/unit-testing/
+
+unit_testing__xpi_file := $(dist_path)$(extension_name)-unit-testing.xpi
+
+# take all files from above and create their paths in the "build" directory
+unit_testing__all_files := $(patsubst $(source_path)%,$(unit_testing__build_path)%,$(source_files))
+
+unit_testing__javascript_files := $(filter %.js %.jsm,$(unit_testing__all_files))
+unit_testing__other_files := $(filter-out $(unit_testing__javascript_files),$(unit_testing__all_files))
+
+
+# detect deleted files and empty directories
+unit_testing__deleted_files :=
+unit_testing__empty_dirs :=
+ifneq "$(wildcard $(unit_testing__build_path))" ""
+# files that have been deleted but still exist in the build directory.
+unit_testing__deleted_files := \
+		$(shell find $(unit_testing__build_path) -type f | \
+		grep -v "META-INF" | \
+		grep -F -v $(addprefix -e ,$(unit_testing__all_files)))
+# empty directories. -mindepth 1 to exclude the build directory itself.
+unit_testing__empty_dirs := $(shell find $(unit_testing__build_path) -mindepth 1 -type d -empty)
+endif
+
+
+# ____________________________________
+# vars for generating the Observer XPI
+#
+
+rp_observer__source_dirname := tests/mozmill/extension
+rp_observer__source_path := $(rp_observer__source_dirname)/
+
+rp_observer__source_files := $(shell find $(rp_observer__source_dirname) -type f -regex ".*\.jsm?") \
+		$(rp_observer__source_dirname)/chrome.manifest \
+		$(rp_observer__source_dirname)/install.rdf
+
+rp_observer__xpi_file := $(dist_path)$(extension_name)-observer.xpi
+
+
 # ______________________________
 # vars for mozrunner and mozmill
 #
 
 # the default XPI to use for mozrunner and mozmill
-moz_xpi := $(xpi_file)
+moz_xpi := $(unit_testing__xpi_file)
 
 # select the default app. Can be overridden e.g. via `make run app='seamonkey'`
 app := firefox
@@ -158,6 +201,33 @@ $(signed_xpi_file): $(build_path)/META-INF/ | $(dist_path)
 		$(patsubst $(build_path)%,%,$(all_files)) META-INF \
 		-x META-INF/zigbert.rsa
 
+
+# ___________________________
+# create the unit-testing XPI
+#
+
+$(unit_testing__xpi_file): $(unit_testing__build_path) $(unit_testing__all_files) | $(dist_path)
+	@rm -f $(unit_testing__xpi_file)
+	@echo "Creating unit-testing XPI."
+	@cd $(unit_testing__build_path) && \
+	$(ZIP) $(abspath $(unit_testing__xpi_file)) $(patsubst $(unit_testing__build_path)%,%,$(unit_testing__all_files))
+	@echo "Creating unit-testing XPI: Done!"
+
+
+# _______________________
+# create the Observer XPI
+#
+
+# For now use FORCE, i.e. create the XPI every time. If the
+# 'FORCE' should be removed, deleted files have to be detected,
+# just like for the other XPIs.
+$(rp_observer__xpi_file): $(rp_observer__source_files) FORCE | $(dist_path)
+	@rm -f $(rp_observer__xpi_file)
+	@echo "Creating Observer XPI."
+	@cd $(rp_observer__source_dirname) && \
+	$(ZIP) $(abspath $(rp_observer__xpi_file)) $(patsubst $(rp_observer__source_path)%,%,$(rp_observer__source_files))
+	@echo "Creating Observer XPI: Done!"
+
 # _____________________________________
 # create the files for the "normal" XPI
 #
@@ -171,8 +241,7 @@ $(build_path): $(all_files) $(deleted_files) $(empty_dirs)
 
 $(javascript_files): $$(patsubst $$(build_path)%,$$(source_path)%,$$@)
 	@mkdir -p $(dir $@)
-	cp $(patsubst $(build_path)%,$(source_path)%,$@) $@
-	@# In case javascript files should be processed, it should be done here.
+	preprocess $(patsubst $(build_path)%,$(source_path)%,$@) > $@
 
 $(other_files): $$(patsubst $$(build_path)%,$$(source_path)%,$$@)
 	@mkdir -p $(dir $@)
@@ -188,6 +257,20 @@ $(build_path)/META-INF/: $(build_path) $(all_files)
 		-k "Open Source Developer, Martin Kimmerle's Unizeto Technologies S.A. ID" \
 		$(build_path)
 
+# _____________________________________
+# create the files for the unit-testing XPI
+#
+
+$(unit_testing__build_path): $(unit_testing__all_files) $(unit_testing__deleted_files) $(unit_testing__empty_dirs)
+
+$(unit_testing__javascript_files): $$(patsubst $$(unit_testing__build_path)%,$$(source_path)%,$$@)
+	@mkdir -p $(dir $@)
+	preprocess $(patsubst $(unit_testing__build_path)%,$(source_path)%,$@) -UNIT_TESTING=true > $@
+
+$(unit_testing__other_files): $$(patsubst $$(unit_testing__build_path)%,$$(source_path)%,$$@)
+	@mkdir -p $(dir $@)
+	cp $(patsubst $(unit_testing__build_path)%,$(source_path)%,$@) $@
+
 
 # __________________
 # "cleaning" targets
@@ -196,7 +279,7 @@ $(build_path)/META-INF/: $(build_path) $(all_files)
 # This cleans all temporary files and directories created by 'make'.
 .PHONY: clean
 clean:
-	@rm -rf $(xpi_file) $(build_dirname)/*
+	@rm -rf $(xpi_file) $(unit_testing__xpi_file) $(build_dirname)/*
 	@echo "Cleanup is done."
 
 # remove empty directories
@@ -216,13 +299,13 @@ $(deleted_files): FORCE
 #
 
 # arguments for mozrunner
-mozrunner_args := -a $(moz_xpi)
+mozrunner_args := -a $(moz_xpi) -a $(rp_observer__xpi_file)
 mozrunner_args += -b $(app_binary)
 mozrunner_args += --preferences=$(mozrunner_prefs_ini):dev
 mozrunner_args += $(moz_args)
 
 .PHONY: run
-run: $(moz_xpi)
+run: $(moz_xpi) $(rp_observer__xpi_file)
 	mozrunner $(mozrunner_args)
 
 
@@ -233,8 +316,8 @@ run: $(moz_xpi)
 # Note: currently you have to do some setup before this will work.
 # see https://github.com/RequestPolicyContinued/requestpolicy/wiki/Setting-up-a-development-environment#unit-tests-for-requestpolicy
 
-mozmill_tests_path := .mozilla/mozmill-tests/
-mozmill_requestpolicy_test_path := $(mozmill_tests_path)firefox/tests/addons/$(extension_uuid)/
+mozmill_tests_dir := .mozilla/mozmill-tests
+mozmill_requestpolicy_test_dir := $(mozmill_tests_dir)/firefox/tests/addons/$(extension_uuid)
 
 # Default mozmill manifest to use for testing
 mm_manifest := manifest.ini
@@ -242,9 +325,29 @@ mm_manifest := manifest.ini
 .PHONY: check test mozmill
 check test: mozmill
 
-mozmill: $(moz_xpi)
-	mozmill -a $(moz_xpi) -b $(app_binary) \
-		-m $(mozmill_requestpolicy_test_path)$(mm_manifest)
+mozmill: $(moz_xpi) $(rp_observer__xpi_file) mozmill-dirs
+	mozmill -a $(moz_xpi) -a $(rp_observer__xpi_file) -b $(app_binary) \
+		-m $(mozmill_requestpolicy_test_dir)/$(mm_manifest) $(moz_args)
+
+
+
+.PHONY: mozmill-dirs
+mozmill-dirs: $(mozmill_tests_dir) \
+	$(mozmill_requestpolicy_test_dir) \
+	$(mozmill_requestpolicy_test_dir)/mozmill-tests \
+	$(mozmill_requestpolicy_test_dir)/data
+
+$(mozmill_requestpolicy_test_dir): $(mozmill_tests_dir)
+	@test -L $@ \
+	|| ln -ns ../../../../../tests/mozmill $@
+
+$(mozmill_requestpolicy_test_dir)/mozmill-tests: $(mozmill_requestpolicy_test_dir)
+	@test -L tests/mozmill/mozmill-tests \
+	|| ln -ns ../../$(mozmill_tests_dir) tests/mozmill/mozmill-tests
+
+$(mozmill_requestpolicy_test_dir)/data: $(mozmill_requestpolicy_test_dir)
+	@test -L tests/mozmill/data \
+	|| ln -ns ../../ tests/mozmill/data
 
 
 # ________________
diff --git a/src/content/lib/default-preferences.js b/src/content/lib/default-preferences.js
index c218b7d..b347b32 100644
--- a/src/content/lib/default-preferences.js
+++ b/src/content/lib/default-preferences.js
@@ -28,6 +28,10 @@ pref("extensions.requestpolicy.menu.info.showNumRequests", true);
 pref("extensions.requestpolicy.lastVersion", "0.0");
 pref("extensions.requestpolicy.lastAppVersion", "0.0");
 
+// #ifdef UNIT_TESTING
+pref("extensions.requestpolicy.unitTesting.errorCount", 0);
+// #endif
+
 // Old prefs that are no longer used.
 //pref("extensions.requestpolicy.allowedOrigins", "");
 //pref("extensions.requestpolicy.allowedDestinations", "");
diff --git a/src/content/lib/logger.jsm b/src/content/lib/logger.jsm
index 0705a33..ff0c70c 100644
--- a/src/content/lib/logger.jsm
+++ b/src/content/lib/logger.jsm
@@ -136,7 +136,21 @@ let Logger = (function() {
   };
 
   let log = function(aLevel, aType, aMessage, aError) {
-    if (enabled && aLevel >= level && types & aType) {
+    let shouldLog = (enabled && aLevel >= level && types & aType);
+
+    // #ifdef UNIT_TESTING
+    if (aType === self.TYPE_ERROR || aLevel === self.LEVEL_SEVERE) {
+      // increment the error count
+      let errorCount = rpPrefBranch.getIntPref("unitTesting.errorCount");
+      rpPrefBranch.setIntPref("unitTesting.errorCount", ++errorCount);
+      Services.prefs.savePrefFile(null);
+
+      // log even if logging is disabled
+      shouldLog = true;
+    }
+    // #endif
+
+    if (shouldLog) {
       let levelName = self._LEVEL_NAMES[aLevel.toString()];
       let typeName = self._TYPE_NAMES[aType.toString()];
 
diff --git a/tests/mozmill/extension/bootstrap.js b/tests/mozmill/extension/bootstrap.js
new file mode 100644
index 0000000..500dc01
--- /dev/null
+++ b/tests/mozmill/extension/bootstrap.js
@@ -0,0 +1,42 @@
+/*
+ * ***** BEGIN LICENSE BLOCK *****
+ *
+ * RequestPolicy Observer - A helper add-on for RequestPolicy development.
+ * Copyright (c) 2015 Martin Kimmerle
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LICENSE BLOCK *****
+ */
+
+const Ci = Components.interfaces;
+const Cc = Components.classes;
+const Cu = Components.utils;
+
+
+function startup(data, reason) {
+  Cu.import("chrome://rp-observer/content/console-observer.jsm");
+  ConsoleObserver.startup();
+}
+
+function shutdown(data, reason) {
+  ConsoleObserver.shutdown();
+  Cu.unload("chrome://rp-observer/content/console-observer.jsm");
+}
+
+function install(data, reason) {
+}
+
+function uninstall(data, reason) {
+}
diff --git a/tests/mozmill/extension/chrome.manifest b/tests/mozmill/extension/chrome.manifest
new file mode 100644
index 0000000..bf67647
--- /dev/null
+++ b/tests/mozmill/extension/chrome.manifest
@@ -0,0 +1 @@
+content    rp-observer    content/
diff --git a/tests/mozmill/extension/content/console-observer.jsm b/tests/mozmill/extension/content/console-observer.jsm
new file mode 100644
index 0000000..22068bc
--- /dev/null
+++ b/tests/mozmill/extension/content/console-observer.jsm
@@ -0,0 +1,69 @@
+/*
+ * ***** BEGIN LICENSE BLOCK *****
+ *
+ * RequestPolicy Observer - A helper add-on for RequestPolicy development.
+ * Copyright (c) 2015 Martin Kimmerle
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LICENSE BLOCK *****
+ */
+
+let EXPORTED_SYMBOLS = ["ConsoleObserver"];
+
+const Ci = Components.interfaces;
+const Cc = Components.classes;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+var regEx = /(Error|Warning|Exception)/i;
+
+function isRPException(aMessage) {
+  return aMessage.indexOf("chrome://requestpolicy") !== -1 &&
+      regEx.test(aMessage);
+}
+
+/**
+ * ConsoleObserver observes all messages sent to the
+ * Browser Console and detects errors caused by
+ * RequestPolicy.
+ */
+var ConsoleObserver = (function (self) {
+  let numErrors = 0;
+
+  self.getNumErrors = function () {
+    return numErrors;
+  };
+
+  self.startup = function () {
+    numErrors = 0;
+    Services.console.registerListener(self);
+  };
+
+  self.shutdown = function () {
+    Services.console.unregisterListener(self);
+  };
+
+  self.observe = function (aSubject) {
+    var msg = aSubject.message;
+
+    if (isRPException(msg)) {
+      ++numErrors;
+      dump("[RequestPolicy] [Browser Console] " + msg + "\n");
+    }
+  };
+
+  return self;
+}({}));
diff --git a/tests/mozmill/extension/install.rdf b/tests/mozmill/extension/install.rdf
new file mode 100644
index 0000000..5a99b8d
--- /dev/null
+++ b/tests/mozmill/extension/install.rdf
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+
+<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:name>RequestPolicy Observer</em:name>
+    <em:version>dev</em:version>
+    <em:type>2</em:type>
+    <em:description>Helper Add-On for testing and developing RequestPolicy.</em:description>
+    <em:id>observer at requestpolicy.com</em:id>
+
+    <em:unpack>false</em:unpack>
+    <em:bootstrap>true</em:bootstrap>
+    <em:multiprocessCompatible>true</em:multiprocessCompatible>
+
+    <!-- Firefox -->
+    <em:targetApplication>
+      <Description>
+        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+        <em:minVersion>16.0</em:minVersion>
+        <em:maxVersion>39.0a1</em:maxVersion>
+      </Description>
+    </em:targetApplication>
+
+    <!-- SeaMonkey -->
+    <em:targetApplication>
+      <Description>
+        <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
+        <em:minVersion>2.13</em:minVersion>
+        <em:maxVersion>2.32</em:maxVersion>
+      </Description>
+    </em:targetApplication>
+
+  </Description>
+</RDF>
diff --git a/tests/mozmill/highLevelTests/repeatedTests/detectApplicationRestarts/initDetectingRestarts.js b/tests/mozmill/highLevelTests/repeatedTests/detectApplicationRestarts/initDetectingRestarts.js
new file mode 100644
index 0000000..8adaace
--- /dev/null
+++ b/tests/mozmill/highLevelTests/repeatedTests/detectApplicationRestarts/initDetectingRestarts.js
@@ -0,0 +1,18 @@
+/* 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";
+
+
+function setupModule(aModule) {
+  aModule.controller = mozmill.getBrowserController();
+}
+
+function teardownModule(aModule) {
+}
+
+
+function testInitAssertNoRestart() {
+  controller.window.markForDetectingRestarts = "MARK";
+}
diff --git a/tests/mozmill/highLevelTests/repeatedTests/detectApplicationRestarts/testAssertNoRestart.js b/tests/mozmill/highLevelTests/repeatedTests/detectApplicationRestarts/testAssertNoRestart.js
new file mode 100644
index 0000000..b73fed9
--- /dev/null
+++ b/tests/mozmill/highLevelTests/repeatedTests/detectApplicationRestarts/testAssertNoRestart.js
@@ -0,0 +1,19 @@
+/* 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";
+
+
+function setupModule(aModule) {
+  aModule.controller = mozmill.getBrowserController();
+}
+
+function teardownModule(aModule) {
+}
+
+
+function testAssertNoRestart() {
+  assert.ok(typeof controller.window.markForDetectingRestarts !== "undefined",
+            "The MARK still exists, which means the browser did not restart.");
+}
diff --git a/tests/mozmill/highLevelTests/repeatedTests/detectApplicationRestarts/testDetectingRestarts.js b/tests/mozmill/highLevelTests/repeatedTests/detectApplicationRestarts/testDetectingRestarts.js
new file mode 100644
index 0000000..0511998
--- /dev/null
+++ b/tests/mozmill/highLevelTests/repeatedTests/detectApplicationRestarts/testDetectingRestarts.js
@@ -0,0 +1,39 @@
+/* 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";
+
+
+function setupModule(aModule) {
+}
+
+function setupTest(aModule) {
+  aModule.controller = mozmill.getBrowserController();
+
+  persisted.nextTest = null;
+}
+
+function teardownTest(aModule) {
+  if (persisted.nextTest) {
+    controller.restartApplication(persisted.nextTest);
+  }
+}
+
+function teardownModule(aModule) {
+  delete persisted.nextTest;
+}
+
+
+
+
+function testAddMark() {
+  persisted.nextTest = "testMarkHasBeenRemoved";
+
+  controller.window.markForDetectingRestarts = "MARK";
+}
+
+function testMarkHasBeenRemoved() {
+  assert.ok(typeof controller.window.markForDetectingRestarts === "undefined",
+            "The MARK has been removed after a restart.");
+}
diff --git a/tests/mozmill/highLevelTests/repeatedTests/detectErrors/initDetectingErrors.js b/tests/mozmill/highLevelTests/repeatedTests/detectErrors/initDetectingErrors.js
new file mode 100644
index 0000000..6ca5bc2
--- /dev/null
+++ b/tests/mozmill/highLevelTests/repeatedTests/detectErrors/initDetectingErrors.js
@@ -0,0 +1,27 @@
+/* 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";
+
+var rpRootDir = "../../../";
+var rpConst = require(rpRootDir + "lib/constants");
+var rootDir = rpRootDir + rpConst.mozmillTestsRootDir;
+
+var {assert, expect} = require(rootDir + "lib/assertions");
+var prefs = require(rootDir + "lib/prefs");
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+
+function setupModule(aModule) {
+}
+
+function teardownModule(aModule) {
+}
+
+
+function testInitDetectingErros() {
+  prefs.setPref("extensions.requestpolicy.unitTesting.errorCount", 0);
+  Services.prefs.savePrefFile(null);
+}
diff --git a/tests/mozmill/highLevelTests/repeatedTests/detectErrors/testAssertNoErrors.js b/tests/mozmill/highLevelTests/repeatedTests/detectErrors/testAssertNoErrors.js
new file mode 100644
index 0000000..323759b
--- /dev/null
+++ b/tests/mozmill/highLevelTests/repeatedTests/detectErrors/testAssertNoErrors.js
@@ -0,0 +1,33 @@
+/* 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";
+
+var rpRootDir = "../../../";
+var rpConst = require(rpRootDir + "lib/constants");
+var rootDir = rpRootDir + rpConst.mozmillTestsRootDir;
+
+var {assert, expect} = require(rootDir + "lib/assertions");
+var prefs = require(rootDir + "lib/prefs");
+
+Components.utils.import("chrome://rp-observer/content/console-observer.jsm");
+
+
+
+function setupModule(aModule) {
+}
+
+function teardownModule(aModule) {
+}
+
+
+function testAssertNoErrors() {
+  const prefName = "extensions.requestpolicy.unitTesting.errorCount";
+  assert.equal(prefs.getPref(prefName, -1), 0,
+               "No error has been logged in RequestPolicy so far.");
+
+  assert.equal(ConsoleObserver.getNumErrors(), 0,
+               "The Console Observer didn't register any error or " +
+               "warning so far.");
+}
diff --git a/tests/mozmill/highLevelTests/repeatedTests/detectErrors/testDetectingErrors.js b/tests/mozmill/highLevelTests/repeatedTests/detectErrors/testDetectingErrors.js
new file mode 100644
index 0000000..dd238e6
--- /dev/null
+++ b/tests/mozmill/highLevelTests/repeatedTests/detectErrors/testDetectingErrors.js
@@ -0,0 +1,43 @@
+/* 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";
+
+var rpRootDir = "../../../";
+var rpConst = require(rpRootDir + "lib/constants");
+var rootDir = rpRootDir + rpConst.mozmillTestsRootDir;
+
+var {assert, expect} = require(rootDir + "lib/assertions");
+var prefs = require(rootDir + "lib/prefs");
+
+Components.utils.import("chrome://requestpolicy/content/lib/logger.jsm");
+
+
+function setupModule(aModule) {
+}
+
+function teardownModule(aModule) {
+}
+
+
+function testDetectingErrors() {
+  let previousValue = getErrorCount();
+  assert.notEqual(previousValue, -1, "The pref for the error count exists.");
+
+  Logger.warning(Logger.TYPE_ERROR, "unit test: testDetectingErrors.");
+  assert.equal(getErrorCount(), previousValue + 1,
+               "The error has been detected.");
+
+  Logger.severe(Logger.TYPE_INTERNAL, "unit test: testDetectingErrors.");
+  assert.equal(getErrorCount(), previousValue + 2,
+               "The severe log message has been detected.");
+}
+
+/**
+ * Get the preference. If it doesn't exist, -1 will be returned.
+ */
+function getErrorCount() {
+  const prefName = "extensions.requestpolicy.unitTesting.errorCount";
+  return prefs.getPref(prefName, -1);
+}
diff --git a/tests/mozmill/highLevelTests/repeatedTests/init-repeated-tests.ini b/tests/mozmill/highLevelTests/repeatedTests/init-repeated-tests.ini
new file mode 100644
index 0000000..fb29a4c
--- /dev/null
+++ b/tests/mozmill/highLevelTests/repeatedTests/init-repeated-tests.ini
@@ -0,0 +1,2 @@
+[detectApplicationRestarts/initDetectingRestarts.js]
+[detectErrors/initDetectingErrors.js]
diff --git a/tests/mozmill/highLevelTests/repeatedTests/run-repeated-tests.ini b/tests/mozmill/highLevelTests/repeatedTests/run-repeated-tests.ini
new file mode 100644
index 0000000..2a0046f
--- /dev/null
+++ b/tests/mozmill/highLevelTests/repeatedTests/run-repeated-tests.ini
@@ -0,0 +1,2 @@
+[detectApplicationRestarts/testAssertNoRestart.js]
+[detectErrors/testAssertNoErrors.js]
diff --git a/tests/mozmill/highLevelTests/repeatedTests/test-repeated-tests.ini b/tests/mozmill/highLevelTests/repeatedTests/test-repeated-tests.ini
new file mode 100644
index 0000000..e3f5e2b
--- /dev/null
+++ b/tests/mozmill/highLevelTests/repeatedTests/test-repeated-tests.ini
@@ -0,0 +1,2 @@
+[detectApplicationRestarts/testDetectingRestarts.js]
+[detectErrors/testDetectingErrors.js]
diff --git a/tests/mozmill/highLevelTests/restartlessness/lib/addon-manager-utils.js b/tests/mozmill/highLevelTests/restartlessness/lib/addon-manager-utils.js
new file mode 100644
index 0000000..1113451
--- /dev/null
+++ b/tests/mozmill/highLevelTests/restartlessness/lib/addon-manager-utils.js
@@ -0,0 +1,162 @@
+/* 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 self
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+var rpRootDir = "../../../";
+var rpConst = require(rpRootDir + "lib/constants");
+var rootDir = rpRootDir + rpConst.mozmillTestsRootDir;
+
+var addons = require(rootDir + "lib/addons");
+var modalDialog = require(rootDir + "lib/modal-dialog");
+var prefs = require(rootDir + "lib/prefs");
+var tabs = require(rootDir + "firefox/lib/tabs");
+
+var rpUtils = require(rpRootDir + "lib/rp-utils");
+
+
+
+const PREF_INSTALL_DIALOG = "security.dialog_enable_delay";
+
+const INSTALL_DIALOG_DELAY = 1000;
+const TIMEOUT_DOWNLOAD = 25000;
+
+
+function AMHelper(aController, aAddonsManager) {
+  var self = this;
+  self.controller = aController;
+  self.addonsManager = aAddonsManager;
+  self.tabBrowser = new tabs.tabBrowser(self.controller);
+}
+
+
+AMHelper.prototype.onSetupModule = function(aModule) {
+  var self = this;
+  prefs.setPref(PREF_INSTALL_DIALOG, INSTALL_DIALOG_DELAY);
+  addons.setDiscoveryPaneURL("about:home");
+};
+
+AMHelper.prototype.onSetupTest = function(aModule) {
+  var self = this;
+}
+
+AMHelper.prototype.onTeardownTest = function(aModule) {
+  var self = this;
+}
+
+AMHelper.prototype.onTeardownModule = function(aModule) {
+  var self = this;
+  prefs.clearUserPref(PREF_INSTALL_DIALOG);
+  addons.resetDiscoveryPaneURL();
+}
+
+
+
+AMHelper.prototype.forEachTab = function(callback) {
+  var self = this;
+  for (let i = 0, len = self.tabBrowser.length; i < len; ++i) {
+    let tab = self.tabBrowser.getTab(i);
+    callback(tab, i);
+  }
+}
+
+AMHelper.prototype.forEachTabReverse = function(callback) {
+  var self = this;
+  for (let i = self.tabBrowser.length - 1; i >= 0; --i) {
+    let tab = self.tabBrowser.getTab(i);
+    callback(tab, i);
+  }
+}
+
+AMHelper.prototype.findTabIndex = function(callback) {
+  var self = this;
+  var tabIndex;
+
+  try {
+    self.forEachTab(function(tab, index) {
+      if (callback.apply(null, arguments) === true) {
+        tabIndex = index;
+        throw "found";
+      }
+    });
+  } catch (e if e === "found") {
+    return tabIndex;
+  }
+
+  return -1;
+}
+
+AMHelper.prototype.getTabHref = function(tab) {
+  var self = this;
+  return tab.getNode().linkedBrowser.contentWindow.location.href;
+}
+
+AMHelper.prototype.openAddonManager = function() {
+  var self = this;
+  var tabIndex = self.findTabIndex(function(tab) {
+    return self.getTabHref(tab) === "about:addons";
+  });
+
+  if (tabIndex === -1) {
+    self.addonsManager.open();
+  }
+}
+
+AMHelper.prototype.openOnlyAddonManager = function() {
+  var self = this;
+  // Note: Sometimes when open() is called, open() needs
+  //       several seconds to finish. This is because there is no
+  //       "TabOpen" event in `tabBrowser._waitForTabOpened()`.
+  //
+  //       More specifically, self happens when
+  //         (a) the addon manager is already opened
+  //         (b) there is only one tab opened, which is `about:blank`
+  self.openAddonManager();
+
+  // close all tabs except `about:addons`.
+  // iterate frome high indexes to low indexes.
+  self.forEachTabReverse(function(tab, index) {
+    if (self.getTabHref(tab) !== "about:addons") {
+      self.tabBrowser.closeTab({method: "middleClick", index: index});
+    }
+  });
+
+  assert.equal(self.tabBrowser.length, 1, "There is only one tab left.");
+}
+
+AMHelper.prototype.getAddon = function() {
+  var self = this;
+  var addonList = self.addonsManager.getAddons({attribute: "value",
+                                               value: rpConst.ADDON_ID});
+  return addonList.length === 0 ? null : addonList[0];
+}
+
+AMHelper.prototype.setCategory = function(id) {
+  var self = this;
+  self.addonsManager.setCategory({
+    category: self.addonsManager.getCategoryById({id: id})
+  });
+}
+
+AMHelper.prototype.getSetupTabIndex = function() {
+  var self = this;
+  return self.findTabIndex(function(tab) {
+    return self.getTabHref(tab) === "about:requestpolicy?setup";
+  });
+}
+
+
+AMHelper.prototype.installAddon = function(xpiUrl) {
+  var self = this;
+  assert.ok(xpiUrl, "The XPI's URL has been specified.");
+  var md = new modalDialog.modalDialog(self.addonsManager.controller.window);
+
+  // Install the add-on
+  md.start(addons.handleInstallAddonDialog);
+  self.controller.open(xpiUrl);
+  md.waitForDialog(TIMEOUT_DOWNLOAD);
+}
+
+
+exports.AMHelper = AMHelper;
diff --git a/tests/mozmill/highLevelTests/restartlessness/testDisableExtension.js b/tests/mozmill/highLevelTests/restartlessness/testDisableExtension.js
new file mode 100644
index 0000000..1dbace3
--- /dev/null
+++ b/tests/mozmill/highLevelTests/restartlessness/testDisableExtension.js
@@ -0,0 +1,52 @@
+/* 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";
+
+var rpRootDir = "../../";
+var rpConst = require(rpRootDir + "lib/constants");
+var rootDir = rpRootDir + rpConst.mozmillTestsRootDir;
+
+var addons = require(rootDir + "lib/addons");
+
+var amUtils = require("lib/addon-manager-utils");
+
+
+function setupModule(aModule) {
+  aModule.controller = mozmill.getBrowserController();
+  aModule.addonsManager = new addons.AddonsManager(aModule.controller);
+  aModule.amHelper = new amUtils.AMHelper(aModule.controller,
+                                          aModule.addonsManager);
+  aModule.amHelper.onSetupModule(aModule);
+}
+
+function setupTest(aModule) {
+  aModule.amHelper.onSetupTest(aModule);
+}
+
+function teardownTest(aModule) {
+  aModule.amHelper.onTeardownTest(aModule);
+}
+
+function teardownModule(aModule) {
+  aModule.amHelper.onTeardownModule(aModule);
+}
+
+
+function testDisableExtension() {
+  amHelper.openOnlyAddonManager();
+  amHelper.setCategory("extension");
+
+  var addon = amHelper.getAddon();
+  assert.ok(addonsManager.isAddonEnabled({addon: addon}),
+            "The addon is enabled");
+
+  //controller.sleep(3600000);
+
+  // Disable the addon
+  addonsManager.disableAddon({addon: addon});
+
+  assert.ok(addonsManager.isAddonEnabled({addon: addon}) === false,
+            "The addon has been disabled");
+}
diff --git a/tests/mozmill/highLevelTests/restartlessness/testEnableExtension.js b/tests/mozmill/highLevelTests/restartlessness/testEnableExtension.js
new file mode 100644
index 0000000..e6fb330
--- /dev/null
+++ b/tests/mozmill/highLevelTests/restartlessness/testEnableExtension.js
@@ -0,0 +1,51 @@
+/* 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";
+
+var rpRootDir = "../../";
+var rpConst = require(rpRootDir + "lib/constants");
+var rootDir = rpRootDir + rpConst.mozmillTestsRootDir;
+
+var addons = require(rootDir + "lib/addons");
+
+var amUtils = require("lib/addon-manager-utils");
+
+
+function setupModule(aModule) {
+  aModule.controller = mozmill.getBrowserController();
+  aModule.addonsManager = new addons.AddonsManager(aModule.controller);
+  aModule.amHelper = new amUtils.AMHelper(aModule.controller,
+                                          aModule.addonsManager);
+  aModule.amHelper.onSetupModule(aModule);
+}
+
+function setupTest(aModule) {
+  aModule.amHelper.onSetupTest(aModule);
+}
+
+function teardownTest(aModule) {
+  aModule.amHelper.onTeardownTest(aModule);
+}
+
+function teardownModule(aModule) {
+  aModule.amHelper.onTeardownModule(aModule);
+}
+
+
+function testEnableExtension() {
+  amHelper.openOnlyAddonManager();
+  amHelper.setCategory("extension");
+
+  var addon = amHelper.getAddon();
+
+  assert.ok(addonsManager.isAddonEnabled({addon: addon}) === false,
+            "The addon is disabled");
+
+  // Enable the addon
+  addonsManager.enableAddon({addon: addon});
+
+  assert.ok(addonsManager.isAddonEnabled({addon: addon}),
+            "The addon has been enabled");
+}
diff --git a/tests/mozmill/highLevelTests/restartlessness/testInstallExtension.js b/tests/mozmill/highLevelTests/restartlessness/testInstallExtension.js
new file mode 100644
index 0000000..847e6de
--- /dev/null
+++ b/tests/mozmill/highLevelTests/restartlessness/testInstallExtension.js
@@ -0,0 +1,63 @@
+/* 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";
+
+var rpRootDir = "../../";
+var rpConst = require(rpRootDir + "lib/constants");
+var rootDir = rpRootDir + rpConst.mozmillTestsRootDir;
+
+var addons = require(rootDir + "lib/addons");
+var prefs = require(rootDir + "lib/prefs");
+
+var amUtils = require("lib/addon-manager-utils");
+
+const BASE_URL = collector.addHttpResource(rpRootDir + "data/");
+const XPI_URL = BASE_URL + "dist/requestpolicy-unit-testing.xpi";
+
+
+function setupModule(aModule) {
+  aModule.controller = mozmill.getBrowserController();
+  aModule.addonsManager = new addons.AddonsManager(aModule.controller);
+  aModule.amHelper = new amUtils.AMHelper(aModule.controller,
+                                          aModule.addonsManager);
+  aModule.amHelper.onSetupModule(aModule);
+}
+
+function setupTest(aModule) {
+  aModule.amHelper.onSetupTest(aModule);
+}
+
+function teardownTest(aModule) {
+  aModule.amHelper.onTeardownTest(aModule);
+}
+
+function teardownModule(aModule) {
+  aModule.amHelper.onTeardownModule(aModule);
+}
+
+
+function testInstallExtension() {
+  // Reset the 'welcomeWindowShown' pref so that the setup will be
+  // opened the next time the extension is installed.
+  prefs.prefBranch.clearUserPref("extensions.requestpolicy.welcomeWindowShown")
+
+  // The setup tab has to be closed for later being sure that
+  // *this* installation opened the tab.
+  assert.equal(amHelper.getSetupTabIndex(), -1, "The setup tab is closed.");
+
+  amHelper.installAddon(XPI_URL);
+
+  // wait for the setup tab to appear. it might not be there already.
+  controller.waitFor(function() {
+    return amHelper.getSetupTabIndex() !== -1;
+  }, "The setup tab has been opened.");
+
+  amHelper.openOnlyAddonManager();
+  amHelper.setCategory("extension");
+
+  var addon = amHelper.getAddon();
+  assert.ok(addonsManager.isAddonEnabled({addon: addon}),
+            "The addon is enabled");
+}
diff --git a/tests/mozmill/highLevelTests/restartlessness/testUninstallExtension.js b/tests/mozmill/highLevelTests/restartlessness/testUninstallExtension.js
new file mode 100644
index 0000000..91158ec
--- /dev/null
+++ b/tests/mozmill/highLevelTests/restartlessness/testUninstallExtension.js
@@ -0,0 +1,55 @@
+/* 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";
+
+var rpRootDir = "../../";
+var rpConst = require(rpRootDir + "lib/constants");
+var rootDir = rpRootDir + rpConst.mozmillTestsRootDir;
+
+var addons = require(rootDir + "lib/addons");
+
+var amUtils = require("lib/addon-manager-utils");
+
+
+function setupModule(aModule) {
+  aModule.controller = mozmill.getBrowserController();
+  aModule.addonsManager = new addons.AddonsManager(aModule.controller);
+  aModule.amHelper = new amUtils.AMHelper(aModule.controller,
+                                          aModule.addonsManager);
+  aModule.amHelper.onSetupModule(aModule);
+}
+
+function setupTest(aModule) {
+  aModule.amHelper.onSetupTest(aModule);
+}
+
+function teardownTest(aModule) {
+  aModule.amHelper.onTeardownTest(aModule);
+}
+
+function teardownModule(aModule) {
+  aModule.amHelper.onTeardownModule(aModule);
+}
+
+
+function testUninstallExtension() {
+  amHelper.openOnlyAddonManager();
+  amHelper.setCategory("extension");
+
+  var addon = amHelper.getAddon();
+  assert.notEqual(addon, null,
+                  "Extension '" + rpConst.ADDON_ID + "' is installed");
+
+  // Uninstall the extension
+  addonsManager.removeAddon({addon: addon});
+
+  // Switch categories to dispose of the undo link,
+  // i.e. switch to 'Appearance' and back to 'Extensions'.
+  amHelper.setCategory("theme");
+  amHelper.setCategory("extension");
+
+  assert.equal(amHelper.getAddon(), null,
+               "Extension '" + rpConst.ADDON_ID + "' has been uninstalled");
+}
diff --git a/tests/mozmill/highLevelTests/restartlessness/testUpgradeExtension.js b/tests/mozmill/highLevelTests/restartlessness/testUpgradeExtension.js
new file mode 100644
index 0000000..31b1ed6
--- /dev/null
+++ b/tests/mozmill/highLevelTests/restartlessness/testUpgradeExtension.js
@@ -0,0 +1,43 @@
+/* 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";
+
+var rpRootDir = "../../";
+var rpConst = require(rpRootDir + "lib/constants");
+var rootDir = rpRootDir + rpConst.mozmillTestsRootDir;
+
+var addons = require(rootDir + "lib/addons");
+var prefs = require(rootDir + "lib/prefs");
+
+var amUtils = require("lib/addon-manager-utils");
+
+const BASE_URL = collector.addHttpResource(rpRootDir + "data/");
+const XPI_URL = BASE_URL + "dist/requestpolicy-unit-testing.xpi";
+
+
+function setupModule(aModule) {
+  aModule.controller = mozmill.getBrowserController();
+  aModule.addonsManager = new addons.AddonsManager(aModule.controller);
+  aModule.amHelper = new amUtils.AMHelper(aModule.controller,
+                                          aModule.addonsManager);
+  aModule.amHelper.onSetupModule(aModule);
+}
+
+function setupTest(aModule) {
+  aModule.amHelper.onSetupTest(aModule);
+}
+
+function teardownTest(aModule) {
+  aModule.amHelper.onTeardownTest(aModule);
+}
+
+function teardownModule(aModule) {
+  aModule.amHelper.onTeardownModule(aModule);
+}
+
+
+function testUpgradeExtension() {
+  amHelper.installAddon(XPI_URL);
+}
diff --git a/tests/mozmill/lib/constants.js b/tests/mozmill/lib/constants.js
index b0c3a27..996534d 100644
--- a/tests/mozmill/lib/constants.js
+++ b/tests/mozmill/lib/constants.js
@@ -6,6 +6,8 @@
 
 exports.mozmillTestsRootDir = "../../../../";
 
+exports.ADDON_ID = "requestpolicy at requestpolicy.com";
+
 exports.PREF_DEFAULT_ALLOW = "extensions.requestpolicy.defaultPolicy.allow";
 exports.PREF_DEFAULT_ALLOW_SAME_DOMAIN =
     "extensions.requestpolicy.defaultPolicy.allowSameDomain";
diff --git a/tests/mozmill/manifest.ini b/tests/mozmill/manifest.ini
index 6975b74..f6b983f 100644
--- a/tests/mozmill/manifest.ini
+++ b/tests/mozmill/manifest.ini
@@ -1,4 +1,70 @@
-[DEFAULT]
-server-root = ../../../../data
+; PREPARATION of the repeated tests:
+;test the repeated high-level tests themselves
+[include:highLevelTests/repeatedTests/test-repeated-tests.ini]
+;initialize the repeated high-level tests
+[include:highLevelTests/repeatedTests/init-repeated-tests.ini]
 
-[include:tests/manifest.ini]
+
+;test RP
+[include:test-rp.ini]
+[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+
+;disable RP
+[highLevelTests/restartlessness/testDisableExtension.js]
+[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+;then run FF tests
+[include:test-ff.ini]
+[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+
+;activate RP
+[highLevelTests/restartlessness/testEnableExtension.js]
+[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+;then test RP again
+[include:test-rp.ini]
+[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+
+;upgrade RP
+[highLevelTests/restartlessness/testUpgradeExtension.js]
+[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+;and test RP again
+[include:test-rp.ini]
+[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+
+;uninstall RP
+[highLevelTests/restartlessness/testUninstallExtension.js]
+[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+;run FF tests again
+[include:test-ff.ini]
+[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+
+;install RP
+[highLevelTests/restartlessness/testInstallExtension.js]
+[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+;and test RP again
+[include:test-rp.ini]
+[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+
+
+
+; Below is a procedure that would need less time to run
+; than the procedure above. However, the above procedure
+; is more complete.
+
+
+;[highLevelTests/restartlessness/testDisableExtension.js]
+;[highLevelTests/restartlessness/testEnableExtension.js]
+;[highLevelTests/restartlessness/testUninstallExtension.js]
+;[highLevelTests/restartlessness/testInstallExtension.js]
+;[highLevelTests/restartlessness/testUpgradeExtension.js]
+;[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+;
+;;test RP
+;[include:test-rp.ini]
+;[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+;
+;;run FF tests
+;[highLevelTests/restartlessness/testDisableExtension.js]
+;[include:test-ff.ini]
+;[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
+;[highLevelTests/restartlessness/testEnableExtension.js]
+;[include:highLevelTests/repeatedTests/run-repeated-tests.ini]
diff --git a/tests/mozmill/test-ff.ini b/tests/mozmill/test-ff.ini
new file mode 100644
index 0000000..e06bbbf
--- /dev/null
+++ b/tests/mozmill/test-ff.ini
@@ -0,0 +1,28 @@
+; This manifest runs multiple of the tests of the official
+; "mozmill-tests" repository.
+
+; None of the firefox tests should restart firefox itself. If firefox
+; would restart, some kind of errors that RequestPolicy's might have
+; possibly could not be detected. The reason is that a restart can
+; "repair" some misbehaviour in RequestPolicy, but the intention of
+; this test is to actually *find* those bugs.
+[highLevelTests/repeatedTests/detectApplicationRestarts/initDetectingRestarts.js]
+
+[include:mozmill-tests/firefox/tests/functional/testAwesomeBar/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testBookmarks/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testFindInPage/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testFormManager/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testInstallation/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testPlacesOrganizer/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testPopups/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testPreferences/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testPrivateBrowsing/manifest.ini]
+; testSearch tests seem to fail
+;[include:mozmill-tests/firefox/tests/functional/testSearch/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testSecurity/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testTabbedBrowsing/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testTabView/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testTechnicalTools/manifest.ini]
+[include:mozmill-tests/firefox/tests/functional/testToolbar/manifest.ini]
+
+[highLevelTests/repeatedTests/detectApplicationRestarts/testAssertNoRestart.js]
diff --git a/tests/mozmill/test-rp.ini b/tests/mozmill/test-rp.ini
new file mode 100644
index 0000000..9c2055e
--- /dev/null
+++ b/tests/mozmill/test-rp.ini
@@ -0,0 +1,4 @@
+; This manifest runs the "usual" mozmill tests for
+; RequestPolicy. The full test is captured in
+; "./manifest.ini"
+[include:tests/manifest.ini]

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/requestpolicy.git



More information about the Pkg-mozext-commits mailing list