From 8215bfa3c1e069aae9d9aff64fb620bcb8e92dfd Mon Sep 17 00:00:00 2001 From: Oleg Romashin Date: Sun, 21 Aug 2011 08:32:38 -0400 Subject: [PATCH 01/10] Bug 679733 - Widget Qt should send system notifications (display, taskswitcher, flight modes); f=azakai,jeremias.bosch r=dougt --- toolkit/xre/Makefile.in | 3 + toolkit/xre/nsNativeAppSupportQt.cpp | 95 ++++++++++++++++++++++------ toolkit/xre/nsNativeAppSupportQt.h | 80 +++++++++++++++++++++++ widget/src/qt/mozqwidget.h | 18 +++++- 4 files changed, 177 insertions(+), 19 deletions(-) create mode 100644 toolkit/xre/nsNativeAppSupportQt.h diff --git a/toolkit/xre/Makefile.in b/toolkit/xre/Makefile.in index 0082e448eb4..9c1e49fdaa6 100644 --- a/toolkit/xre/Makefile.in +++ b/toolkit/xre/Makefile.in @@ -102,6 +102,9 @@ ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2) CPPSRCS += nsNativeAppSupportUnix.cpp else ifeq ($(MOZ_WIDGET_TOOLKIT),qt) +MOCSRCS += moc_nsNativeAppSupportQt.cpp + $(NULL) +CPPSRCS += $(MOCSRCS) CPPSRCS += nsNativeAppSupportQt.cpp CPPSRCS += nsQAppInstance.cpp EXPORTS += nsQAppInstance.h diff --git a/toolkit/xre/nsNativeAppSupportQt.cpp b/toolkit/xre/nsNativeAppSupportQt.cpp index fe9b9075c17..8d696ae7404 100644 --- a/toolkit/xre/nsNativeAppSupportQt.cpp +++ b/toolkit/xre/nsNativeAppSupportQt.cpp @@ -37,33 +37,92 @@ * ***** END LICENSE BLOCK ***** */ #include -#include "nsNativeAppSupportBase.h" -#include "nsString.h" +#include +#include "mozilla/ipc/GeckoChildProcessHost.h" +#include "nsNativeAppSupportQt.h" +#include "nsCOMPtr.h" +#include "nsIObserverService.h" +#include "mozilla/Services.h" -#ifdef MOZ_ENABLE_LIBCONIC -#include -#endif - -#if (MOZ_PLATFORM_MAEMO == 5) -#include -#endif - -class nsNativeAppSupportQt : public nsNativeAppSupportBase +#ifdef MOZ_ENABLE_QMSYSTEM2 +void +nsNativeAppSupportQt::activityChanged(MeeGo::QmActivity::Activity activity) { -public: - NS_IMETHOD Start(PRBool* aRetVal); - NS_IMETHOD Stop(PRBool* aResult); -#if (MOZ_PLATFORM_MAEMO == 5) - // Osso context must be initialized for maemo5 otherwise we will be killed in ~20 seconds - osso_context_t *m_osso_context; + nsCOMPtr os = mozilla::services::GetObserverService(); + if (!os) + return; + + if (MeeGo::QmActivity::Inactive == activity) { + os->NotifyObservers(nsnull, "system-idle", nsnull); + } else { + os->NotifyObservers(nsnull, "system-active", nsnull); + } +} + +void +nsNativeAppSupportQt::displayStateChanged(MeeGo::QmDisplayState::DisplayState state) +{ + nsCOMPtr os = mozilla::services::GetObserverService(); + if (!os) + return; + + switch (state) { + case MeeGo::QmDisplayState::On: + os->NotifyObservers(nsnull, "system-display-on", nsnull); + break; + case MeeGo::QmDisplayState::Off: + os->NotifyObservers(nsnull, "system-display-dimmed", nsnull); + break; + case MeeGo::QmDisplayState::Dimmed: + os->NotifyObservers(nsnull, "system-display-off", nsnull); + break; + default: + NS_WARNING("Unknown display state"); + break; + } +} + +void nsNativeAppSupportQt::deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode mode) +{ + nsCOMPtr os = mozilla::services::GetObserverService(); + if (!os) + return; + + switch (mode) { + case MeeGo::QmDeviceMode::DeviceMode::Normal: + os->NotifyObservers(nsnull, "profile-change-net-restore", nsnull); + break; + case MeeGo::QmDeviceMode::DeviceMode::Flight: + os->NotifyObservers(nsnull, "profile-change-net-teardown", nsnull); + break; + case MeeGo::QmDeviceMode::DeviceMode::Error: + default: + NS_WARNING("Unknown DeviceMode"); + break; + } +} + +void nsNativeAppSupportQt::RefreshStates() +{ + activityChanged(mActivity.get()); + displayStateChanged(mDisplayState.get()); + deviceModeChanged(mDeviceMode.getMode()); +} #endif -}; NS_IMETHODIMP nsNativeAppSupportQt::Start(PRBool* aRetVal) { NS_ASSERTION(gAppData, "gAppData must not be null."); +#ifdef MOZ_ENABLE_QMSYSTEM2 + connect(&mActivity, SIGNAL(activityChanged(MeeGo::QmActivity::Activity)), this, SLOT(activityChanged(MeeGo::QmActivity::Activity))); + connect(&mDeviceMode, SIGNAL(deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode)), this, SLOT(deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode))); + connect(&mDisplayState, SIGNAL(displayStateChanged(MeeGo::QmDisplayState::DisplayState)), this, SLOT(displayStateChanged(MeeGo::QmDisplayState::DisplayState))); + // Init states withing next event loop iteration + QTimer::singleShot(0, this, SLOT(RefreshStates())); +#endif + *aRetVal = PR_TRUE; #ifdef MOZ_ENABLE_LIBCONIC g_type_init(); diff --git a/toolkit/xre/nsNativeAppSupportQt.h b/toolkit/xre/nsNativeAppSupportQt.h new file mode 100644 index 00000000000..a95b88bc0aa --- /dev/null +++ b/toolkit/xre/nsNativeAppSupportQt.h @@ -0,0 +1,80 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 et sw=2 tw=80: */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Corporation code. + * + * The Initial Developer of the Original Code is Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Oleg Romashin + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include +#include +#ifdef MOZ_ENABLE_QMSYSTEM2 +#include "qmdevicemode.h" +#include "qmdisplaystate.h" +#include "qmactivity.h" +#endif +#include "nsNativeAppSupportBase.h" +#include "nsString.h" + +#ifdef MOZ_ENABLE_LIBCONIC +#include +#endif + +#if (MOZ_PLATFORM_MAEMO == 5) +#include +#endif + +class nsNativeAppSupportQt : public QObject, public nsNativeAppSupportBase +{ + Q_OBJECT +public: + NS_IMETHOD Start(PRBool* aRetVal); + NS_IMETHOD Stop(PRBool* aResult); +#if (MOZ_PLATFORM_MAEMO == 5) + // Osso context must be initialized for maemo5 otherwise we will be killed in ~20 seconds + osso_context_t *m_osso_context; +#endif +#ifdef MOZ_ENABLE_QMSYSTEM2 +public Q_SLOTS: + void activityChanged(MeeGo::QmActivity::Activity activity); + void deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode mode); + void displayStateChanged(MeeGo::QmDisplayState::DisplayState state); + void RefreshStates(); + +private: + MeeGo::QmDeviceMode mDeviceMode; + MeeGo::QmDisplayState mDisplayState; + MeeGo::QmActivity mActivity; +#endif +}; + diff --git a/widget/src/qt/mozqwidget.h b/widget/src/qt/mozqwidget.h index 19de1f927b0..7d4be296e98 100644 --- a/widget/src/qt/mozqwidget.h +++ b/widget/src/qt/mozqwidget.h @@ -321,7 +321,7 @@ private: */ class MozMGraphicsView : public MWindow { - + Q_OBJECT public: MozMGraphicsView(MozQWidget* aTopLevel, QWidget* aParent = nsnull) : MWindow(aParent) @@ -330,6 +330,22 @@ public: { MozMSceneWindow* page = new MozMSceneWindow(aTopLevel); page->appear(this); + QObject::connect(this, SIGNAL(switcherEntered()), this, SLOT(onSwitcherEntered())); + QObject::connect(this, SIGNAL(switcherExited()), this, SLOT(onSwitcherExited())); + } + +public Q_SLOTS: + void onSwitcherEntered() { + nsCOMPtr os = mozilla::services::GetObserverService(); + if (!os) + return; + os->NotifyObservers(nsnull, "application-background", nsnull); + } + void onSwitcherExited() { + nsCOMPtr os = mozilla::services::GetObserverService(); + if (!os) + return; + os->NotifyObservers(nsnull, "application-foreground", nsnull); } protected: From 35cd3bb1b8a7a385540161cf3657bc87e955656c Mon Sep 17 00:00:00 2001 From: Oleg Romashin Date: Sun, 21 Aug 2011 20:11:31 +0100 Subject: [PATCH 02/10] Bug 679923 - Fennec must deactivate last selected tab when it goes to background; r=mbrubeck,blassey,mfinkle --- embedding/android/GeckoApp.java | 1 + embedding/android/GeckoEvent.java | 1 + mobile/chrome/content/browser.js | 40 ++++++++++++++++++++++++ widget/src/android/AndroidJavaWrappers.h | 1 + widget/src/android/nsAppShell.cpp | 9 ++++++ 5 files changed, 52 insertions(+) diff --git a/embedding/android/GeckoApp.java b/embedding/android/GeckoApp.java index 7c2fad4197b..060fed6b7ec 100644 --- a/embedding/android/GeckoApp.java +++ b/embedding/android/GeckoApp.java @@ -421,6 +421,7 @@ abstract public class GeckoApp public void onStart() { Log.i(LOG_FILE_NAME, "start"); + GeckoAppShell.sendEventToGecko(new GeckoEvent(GeckoEvent.ACTIVITY_START)); super.onStart(); } diff --git a/embedding/android/GeckoEvent.java b/embedding/android/GeckoEvent.java index 4e808754c39..7985f2a0252 100644 --- a/embedding/android/GeckoEvent.java +++ b/embedding/android/GeckoEvent.java @@ -72,6 +72,7 @@ public class GeckoEvent { public static final int SURFACE_CREATED = 13; public static final int SURFACE_DESTROYED = 14; public static final int GECKO_EVENT_SYNC = 15; + public static final int ACTIVITY_START = 17; public static final int IME_COMPOSITION_END = 0; public static final int IME_COMPOSITION_BEGIN = 1; diff --git a/mobile/chrome/content/browser.js b/mobile/chrome/content/browser.js index 7504570a155..dc7387d21ab 100644 --- a/mobile/chrome/content/browser.js +++ b/mobile/chrome/content/browser.js @@ -322,6 +322,12 @@ var Browser = { os.addObserver(SessionHistoryObserver, "browser:purge-session-history", false); os.addObserver(ContentCrashObserver, "ipc:content-shutdown", false); os.addObserver(MemoryObserver, "memory-pressure", false); + os.addObserver(ActivityObserver, "application-background", false); + os.addObserver(ActivityObserver, "application-foreground", false); + os.addObserver(ActivityObserver, "system-active", false); + os.addObserver(ActivityObserver, "system-idle", false); + os.addObserver(ActivityObserver, "system-display-on", false); + os.addObserver(ActivityObserver, "system-display-off", false); // Listens for change in the viewable area #if MOZ_PLATFORM_MAEMO == 6 @@ -486,6 +492,12 @@ var Browser = { os.removeObserver(SessionHistoryObserver, "browser:purge-session-history"); os.removeObserver(ContentCrashObserver, "ipc:content-shutdown"); os.removeObserver(MemoryObserver, "memory-pressure"); + os.removeObserver(ActivityObserver, "application-background", false); + os.removeObserver(ActivityObserver, "application-foreground", false); + os.removeObserver(ActivityObserver, "system-active", false); + os.removeObserver(ActivityObserver, "system-idle", false); + os.removeObserver(ActivityObserver, "system-display-on", false); + os.removeObserver(ActivityObserver, "system-display-off", false); window.controllers.removeController(this); window.controllers.removeController(BrowserUI); @@ -2585,6 +2597,34 @@ var MemoryObserver = { } }; +var ActivityObserver = { + _inBackground : false, + _notActive : false, + _isDisplayOff : false, + observe: function ao_observe(aSubject, aTopic, aData) { + if (aTopic == "application-background") { + this._inBackground = true; + } else if (aTopic == "application-foreground") { + this._inBackground = false; + } else if (aTopic == "system-idle") { + this._notActive = true; + } else if (aTopic == "system-active") { + this._notActive = false; + } else if (aTopic == "system-display-on") { + this._isDisplayOff = false; + } else if (aTopic == "system-display-off") { + this._isDisplayOff = true; + } + let activeTabState = !this._inBackground && !this._notActive && !this._isDisplayOff; + if (Browser.selectedTab.active != activeTabState) { + // On Maemo all backgrounded applications getting portrait orientation + // so if browser had landscape mode then we need timeout in order + // to finish last rotate/paint operation and have nice lookine browser in TS + setTimeout(function() { Browser.selectedTab.active = activeTabState; }, 0); + } + } +}; + function getNotificationBox(aBrowser) { return Browser.getNotificationBox(aBrowser); } diff --git a/widget/src/android/AndroidJavaWrappers.h b/widget/src/android/AndroidJavaWrappers.h index caaa4e35b79..6e5af46b51b 100644 --- a/widget/src/android/AndroidJavaWrappers.h +++ b/widget/src/android/AndroidJavaWrappers.h @@ -492,6 +492,7 @@ public: SURFACE_DESTROYED = 14, GECKO_EVENT_SYNC = 15, FORCED_RESIZE = 16, + ACTIVITY_START = 17, dummy_java_enum_list_end }; diff --git a/widget/src/android/nsAppShell.cpp b/widget/src/android/nsAppShell.cpp index d746e7a91e9..6eedf54f954 100644 --- a/widget/src/android/nsAppShell.cpp +++ b/widget/src/android/nsAppShell.cpp @@ -328,6 +328,7 @@ nsAppShell::ProcessNextNativeEvent(PRBool mayWait) mozilla::services::GetObserverService(); NS_NAMED_LITERAL_STRING(minimize, "heap-minimize"); obsServ->NotifyObservers(nsnull, "memory-pressure", minimize.get()); + obsServ->NotifyObservers(nsnull, "application-background", nsnull); break; } @@ -359,6 +360,14 @@ nsAppShell::ProcessNextNativeEvent(PRBool mayWait) break; } + case AndroidGeckoEvent::ACTIVITY_START: { + nsCOMPtr obsServ = + mozilla::services::GetObserverService(); + obsServ->NotifyObservers(nsnull, "application-foreground", nsnull); + + break; + } + case AndroidGeckoEvent::LOAD_URI: { nsCOMPtr cmdline (do_CreateInstance("@mozilla.org/toolkit/command-line;1")); From e108d743167a074169cf1c56f25c0ba32f1f3399 Mon Sep 17 00:00:00 2001 From: Oleg Romashin Date: Sun, 21 Aug 2011 20:11:40 +0100 Subject: [PATCH 03/10] Bug 679575 - Aegis should be enabled for Maemo6 define; r=dougt --- mobile/installer/Makefile.in | 17 +++++++---------- mobile/installer/debian/fennec.aegis.in | 1 + 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/mobile/installer/Makefile.in b/mobile/installer/Makefile.in index 6a01d5bfb07..585e712363e 100644 --- a/mobile/installer/Makefile.in +++ b/mobile/installer/Makefile.in @@ -179,16 +179,13 @@ PP_DEB_FILES = debian/control \ debian/fennec.postinst \ $(NULL) -ifdef MOZ_ENABLE_CONTENTMANAGER -PP_DEB_FILES += debian/fennec.aegis \ - $(NULL) -endif ifeq ($(MOZ_PLATFORM_MAEMO),6) -PP_DEB_FILES += debian/backup \ - debian/restore \ - debian/fennec.conf \ - debian/fennec-cud.sh \ - debian/fennec-rfs.sh \ +PP_DEB_FILES += debian/fennec.aegis \ + debian/backup \ + debian/restore \ + debian/fennec.conf \ + debian/fennec-cud.sh \ + debian/fennec-rfs.sh \ debian/fennec.policy \ $(NULL) endif @@ -242,7 +239,7 @@ endif # a defined CONTENTMANAGER implicitly means MOZ_PLATFORM_MAEMO is equals 6 # in case you use CONTENTMANGER you need to sign your package to gain tracker access. -ifdef MOZ_ENABLE_CONTENTMANAGER +ifeq ($(MOZ_PLATFORM_MAEMO),6) if test -e "/usr/bin/aegis-deb-add"; then \ fakeroot aegis-deb-add -control $(DEBDESTDIR)/DEBIAN/control .. debian/fennec.aegis=_aegis; \ else \ diff --git a/mobile/installer/debian/fennec.aegis.in b/mobile/installer/debian/fennec.aegis.in index 04cfa2d951a..370cd385efe 100644 --- a/mobile/installer/debian/fennec.aegis.in +++ b/mobile/installer/debian/fennec.aegis.in @@ -1,3 +1,4 @@ +#filter substitution From 0d93bbb4b54413c51b12523c300bacfaea286f35 Mon Sep 17 00:00:00 2001 From: Sander van Veen Date: Sun, 21 Aug 2011 16:02:24 -0700 Subject: [PATCH 04/10] Bug 673331 - Add identifying information to system compartments. r=mrbkap. --- browser/components/feeds/src/FeedWriter.js | 3 ++- .../content/aboutSessionRestore.js | 2 +- .../sessionstore/src/nsSessionStartup.js | 2 +- browser/devtools/scratchpad/scratchpad.js | 6 +++-- js/src/xpconnect/src/nsXPConnect.cpp | 3 ++- js/src/xpconnect/src/xpccomponents.cpp | 27 +++++++++++++++++-- js/src/xpconnect/src/xpcjsruntime.cpp | 16 ++++++++--- js/src/xpconnect/src/xpcprivate.h | 3 ++- netwerk/base/src/nsProxyAutoConfig.js | 3 ++- toolkit/mozapps/extensions/XPIProvider.jsm | 10 ++++--- 10 files changed, 58 insertions(+), 17 deletions(-) diff --git a/browser/components/feeds/src/FeedWriter.js b/browser/components/feeds/src/FeedWriter.js index 4f4040cad5e..e858fa09eab 100644 --- a/browser/components/feeds/src/FeedWriter.js +++ b/browser/components/feeds/src/FeedWriter.js @@ -256,7 +256,8 @@ FeedWriter.prototype = { __contentSandbox: null, get _contentSandbox() { if (!this.__contentSandbox) - this.__contentSandbox = new Cu.Sandbox(this._window); + this.__contentSandbox = new Cu.Sandbox(this._window, + {sandboxName: 'FeedWriter'}); return this.__contentSandbox; }, diff --git a/browser/components/sessionstore/content/aboutSessionRestore.js b/browser/components/sessionstore/content/aboutSessionRestore.js index dc98407a44b..d2793e6716f 100644 --- a/browser/components/sessionstore/content/aboutSessionRestore.js +++ b/browser/components/sessionstore/content/aboutSessionRestore.js @@ -59,7 +59,7 @@ window.onload = function() { gStateObject = JSON.parse(sessionData.value); } catch (exJSON) { - var s = new Cu.Sandbox("about:blank"); + var s = new Cu.Sandbox("about:blank", {sandboxName: 'aboutSessionRestore'}); gStateObject = Cu.evalInSandbox("(" + sessionData.value + ")", s); // If we couldn't parse the string with JSON.parse originally, make sure // that the value in the textbox will be parsable. diff --git a/browser/components/sessionstore/src/nsSessionStartup.js b/browser/components/sessionstore/src/nsSessionStartup.js index 684bd8aeaa0..b59e4ec6583 100644 --- a/browser/components/sessionstore/src/nsSessionStartup.js +++ b/browser/components/sessionstore/src/nsSessionStartup.js @@ -135,7 +135,7 @@ SessionStartup.prototype = { this._initialState = JSON.parse(iniString); } catch (exJSON) { - var s = new Cu.Sandbox("about:blank"); + var s = new Cu.Sandbox("about:blank", {sandboxName: 'nsSessionStartup'}); this._initialState = Cu.evalInSandbox("(" + iniString + ")", s); } diff --git a/browser/devtools/scratchpad/scratchpad.js b/browser/devtools/scratchpad/scratchpad.js index 807b1543993..7d4edd073eb 100644 --- a/browser/devtools/scratchpad/scratchpad.js +++ b/browser/devtools/scratchpad/scratchpad.js @@ -178,7 +178,8 @@ var Scratchpad = { this._previousLocation != this.gBrowser.contentWindow.location.href) { let contentWindow = this.gBrowser.selectedBrowser.contentWindow; this._contentSandbox = new Cu.Sandbox(contentWindow, - { sandboxPrototype: contentWindow, wantXrays: false }); + { sandboxPrototype: contentWindow, wantXrays: false, + sandboxName: 'scratchpad-content'}); this._previousBrowserWindow = this.browserWindow; this._previousBrowser = this.gBrowser.selectedBrowser; @@ -211,7 +212,8 @@ var Scratchpad = { if (!this._chromeSandbox || this.browserWindow != this._previousBrowserWindow) { this._chromeSandbox = new Cu.Sandbox(this.browserWindow, - { sandboxPrototype: this.browserWindow, wantXrays: false }); + { sandboxPrototype: this.browserWindow, wantXrays: false, + sandboxName: 'scratchpad-chrome'}); this._previousBrowserWindow = this.browserWindow; } diff --git a/js/src/xpconnect/src/nsXPConnect.cpp b/js/src/xpconnect/src/nsXPConnect.cpp index 12e938c8ff4..7ad2b28aa4f 100644 --- a/js/src/xpconnect/src/nsXPConnect.cpp +++ b/js/src/xpconnect/src/nsXPConnect.cpp @@ -2073,7 +2073,8 @@ nsXPConnect::CreateSandbox(JSContext *cx, nsIPrincipal *principal, jsval rval = JSVAL_VOID; AUTO_MARK_JSVAL(ccx, &rval); - nsresult rv = xpc_CreateSandboxObject(cx, &rval, principal, NULL, false); + nsresult rv = xpc_CreateSandboxObject(cx, &rval, principal, NULL, false, + EmptyCString()); NS_ASSERTION(NS_FAILED(rv) || !JSVAL_IS_PRIMITIVE(rval), "Bad return value from xpc_CreateSandboxObject()!"); diff --git a/js/src/xpconnect/src/xpccomponents.cpp b/js/src/xpconnect/src/xpccomponents.cpp index 5fac1d3f6f3..ea5e9dddbbe 100644 --- a/js/src/xpconnect/src/xpccomponents.cpp +++ b/js/src/xpconnect/src/xpccomponents.cpp @@ -3153,7 +3153,7 @@ NS_IMPL_ISUPPORTS0(Identity) nsresult xpc_CreateSandboxObject(JSContext * cx, jsval * vp, nsISupports *prinOrSop, JSObject *proto, - bool wantXrays) + bool wantXrays, const nsACString &sandboxName) { // Create the sandbox global object nsresult rv; @@ -3240,6 +3240,10 @@ xpc_CreateSandboxObject(JSContext * cx, jsval * vp, nsISupports *prinOrSop, JSOb } } + xpc::CompartmentPrivate *compartmentPrivate = + static_cast(JS_GetCompartmentPrivate(cx, compartment)); + compartmentPrivate->location = sandboxName; + return NS_OK; } @@ -3351,6 +3355,8 @@ nsXPCComponents_utils_Sandbox::CallOrConstruct(nsIXPConnectWrappedNative *wrappe JSObject *proto = nsnull; bool wantXrays = true; + nsCString sandboxName; + if (argc > 1) { if (!JSVAL_IS_OBJECT(argv[1])) return ThrowAndFail(NS_ERROR_INVALID_ARG, cx, _retval); @@ -3382,9 +3388,26 @@ nsXPCComponents_utils_Sandbox::CallOrConstruct(nsIXPConnectWrappedNative *wrappe wantXrays = JSVAL_TO_BOOLEAN(option); } + + if (!JS_HasProperty(cx, optionsObject, "sandboxName", &found)) + return NS_ERROR_INVALID_ARG; + + if (found) { + if (!JS_GetProperty(cx, optionsObject, "sandboxName", &option) || + !JSVAL_IS_STRING(option)) { + return ThrowAndFail(NS_ERROR_INVALID_ARG, cx, _retval); + } + + char *tmp = JS_EncodeString(cx, JSVAL_TO_STRING(option)); + if (!tmp) { + return ThrowAndFail(NS_ERROR_INVALID_ARG, cx, _retval); + } + + sandboxName.Adopt(tmp, strlen(tmp)); + } } - rv = xpc_CreateSandboxObject(cx, vp, prinOrSop, proto, wantXrays); + rv = xpc_CreateSandboxObject(cx, vp, prinOrSop, proto, wantXrays, sandboxName); if (NS_FAILED(rv)) { return ThrowAndFail(rv, cx, _retval); diff --git a/js/src/xpconnect/src/xpcjsruntime.cpp b/js/src/xpconnect/src/xpcjsruntime.cpp index cbcdb1933ae..3c3791f5b91 100644 --- a/js/src/xpconnect/src/xpcjsruntime.cpp +++ b/js/src/xpconnect/src/xpcjsruntime.cpp @@ -1578,22 +1578,30 @@ CompartmentStats::CompartmentStats(JSContext *cx, JSCompartment *c) { if(c->principals->codebase) { - // A hack: replace forward slashes with '\\' so they aren't - // treated as path separators. Users of the reporters - // (such as about:memory) have to undo this change. name.Assign(c->principals->codebase); - name.ReplaceChar('/', '\\'); // If it's the system compartment, append the address. // This means that multiple system compartments (and there // can be many) can be distinguished. if(c->isSystemCompartment) { + if (c->data && + !((xpc::CompartmentPrivate*)c->data)->location.IsEmpty()) + { + name.AppendLiteral(", "); + name.Append(((xpc::CompartmentPrivate*)c->data)->location); + } + // ample; 64-bit address max is 18 chars static const int maxLength = 31; nsPrintfCString address(maxLength, ", 0x%llx", PRUint64(c)); name.Append(address); } + + // A hack: replace forward slashes with '\\' so they aren't + // treated as path separators. Users of the reporters + // (such as about:memory) have to undo this change. + name.ReplaceChar('/', '\\'); } else { diff --git a/js/src/xpconnect/src/xpcprivate.h b/js/src/xpconnect/src/xpcprivate.h index e70aa0cf721..592f88de998 100644 --- a/js/src/xpconnect/src/xpcprivate.h +++ b/js/src/xpconnect/src/xpcprivate.h @@ -4315,7 +4315,7 @@ xpc_GetJSPrivate(JSObject *obj) // and used. nsresult xpc_CreateSandboxObject(JSContext * cx, jsval * vp, nsISupports *prinOrSop, - JSObject *proto, bool preferXray); + JSObject *proto, bool preferXray, const nsACString &sandboxName); // Helper for evaluating scripts in a sandbox object created with // xpc_CreateSandboxObject(). The caller is responsible of ensuring @@ -4394,6 +4394,7 @@ struct CompartmentPrivate JSObject2JSObjectMap *waiverWrapperMap; // NB: we don't want this map to hold a strong reference to the wrapper. nsDataHashtable, JSObject *> *expandoMap; + nsCString location; bool RegisterExpandoObject(XPCWrappedNative *wn, JSObject *expando) { if (!expandoMap) { diff --git a/netwerk/base/src/nsProxyAutoConfig.js b/netwerk/base/src/nsProxyAutoConfig.js index cd80422cdfe..84b08dcbc29 100644 --- a/netwerk/base/src/nsProxyAutoConfig.js +++ b/netwerk/base/src/nsProxyAutoConfig.js @@ -75,7 +75,8 @@ nsProxyAutoConfig.prototype = { } // allocate a fresh Sandbox to clear global scope for new PAC script - this._sandBox = new Components.utils.Sandbox(pacURI); + this._sandBox = new Components.utils.Sandbox(pacURI, + {sandboxName: 'nsProxyAutoConfig'}); Components.utils.evalInSandbox(pacUtils, this._sandBox); // add predefined functions to pac diff --git a/toolkit/mozapps/extensions/XPIProvider.jsm b/toolkit/mozapps/extensions/XPIProvider.jsm index 93533f60c49..0bb75a17249 100644 --- a/toolkit/mozapps/extensions/XPIProvider.jsm +++ b/toolkit/mozapps/extensions/XPIProvider.jsm @@ -3461,13 +3461,18 @@ var XPIProvider = { let principal = Cc["@mozilla.org/systemprincipal;1"]. createInstance(Ci.nsIPrincipal); - this.bootstrapScopes[aId] = new Components.utils.Sandbox(principal); if (!aFile.exists()) { + this.bootstrapScopes[aId] = new Components.utils.Sandbox(principal, + {sandboxName: aFile.path}); ERROR("Attempted to load bootstrap scope from missing directory " + bootstrap.path); return; } + let uri = getURIForResourceInFile(aFile, "bootstrap.js").spec; + this.bootstrapScopes[aId] = new Components.utils.Sandbox(principal, + {sandboxName: uri}); + let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"]. createInstance(Ci.mozIJSSubScriptLoader); @@ -3475,8 +3480,7 @@ var XPIProvider = { // As we don't want our caller to control the JS version used for the // bootstrap file, we run loadSubScript within the context of the // sandbox with the latest JS version set explicitly. - this.bootstrapScopes[aId].__SCRIPT_URI_SPEC__ = - getURIForResourceInFile(aFile, "bootstrap.js").spec; + this.bootstrapScopes[aId].__SCRIPT_URI_SPEC__ = uri; Components.utils.evalInSandbox( "Components.classes['@mozilla.org/moz/jssubscript-loader;1'] \ .createInstance(Components.interfaces.mozIJSSubScriptLoader) \ From a2117551174b4fb9d9b08a8a43ed6de3b799db1d Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Sun, 21 Aug 2011 23:34:11 -0700 Subject: [PATCH 05/10] Bug 680827 - Undo nsPresArena workaround from bug 678422. r=roc. --- layout/base/nsPresArena.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/layout/base/nsPresArena.cpp b/layout/base/nsPresArena.cpp index 7494dad4608..5cc33b3c403 100644 --- a/layout/base/nsPresArena.cpp +++ b/layout/base/nsPresArena.cpp @@ -83,11 +83,7 @@ #endif // Size to use for PLArena block allocations. -// XXX: This should be 8192; the subtracted elements are a hack that's -// required to ensure the allocation requests are power-of-two-sized and thus -// avoid lots of wasted memory caused by the heap allocator rounding up request -// sizes. Bug 676457 will fix it properly. -static const size_t ARENA_PAGE_SIZE = 8192 - sizeof(PLArena) - PL_ARENA_CONST_ALIGN_MASK; +static const size_t ARENA_PAGE_SIZE = 8192; // Freed memory is filled with a poison value, which we arrange to // form a pointer either to an always-unmapped region of the address From 01190e61faedb501ba6e48b6a5a73c3655563e46 Mon Sep 17 00:00:00 2001 From: Brad Lassey Date: Mon, 22 Aug 2011 09:00:34 +0100 Subject: [PATCH 06/10] Bug 661282 - Follow up: Bring back the original handling for not specifying --appomni; f=gbrown r=bsmedberg --- js/src/xpconnect/shell/xpcshell.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/src/xpconnect/shell/xpcshell.cpp b/js/src/xpconnect/shell/xpcshell.cpp index e1725a2a63e..aa9318872d3 100644 --- a/js/src/xpconnect/shell/xpcshell.cpp +++ b/js/src/xpconnect/shell/xpcshell.cpp @@ -1837,7 +1837,9 @@ main(int argc, char **argv, char **envp) XRE_GetFileFromPath(argv[4], getter_AddRefs(appOmni)); argc-=2; argv+=2; - } + } else { + appOmni = greOmni; + } XRE_InitOmnijar(greOmni, appOmni); argc-=2; From 53a8826d0aa078e923f774f91b8ca11a60b853d0 Mon Sep 17 00:00:00 2001 From: Geoff Brown Date: Mon, 22 Aug 2011 09:00:50 +0100 Subject: [PATCH 07/10] Bug 678385 - Device manager needs to be updated for package name + username; r=jmaher --- build/mobile/devicemanagerADB.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/build/mobile/devicemanagerADB.py b/build/mobile/devicemanagerADB.py index 819bdec9917..3f45dd1096e 100644 --- a/build/mobile/devicemanagerADB.py +++ b/build/mobile/devicemanagerADB.py @@ -5,12 +5,17 @@ import os class DeviceManagerADB(DeviceManager): - def __init__(self, host = None, port = 20701, retrylimit = 5, packageName = "org.mozilla.fennec_unofficial"): + def __init__(self, host = None, port = 20701, retrylimit = 5, packageName = None): self.host = host self.port = port self.retrylimit = retrylimit self.retries = 0 self._sock = None + if packageName == None: + if os.getenv('USER'): + packageName = 'org.mozilla.fennec_' + os.getenv('USER') + else: + packageName = 'org.mozilla.fennec_' self.Init(packageName) def Init(self, packageName): @@ -381,18 +386,11 @@ class DeviceManagerADB(DeviceManager): return devroot + '/fennec' elif (self.dirExists(devroot + '/firefox')): return devroot + '/firefox' - elif (self.dirExists('/data/data/org.mozilla.fennec')): - return '/data/data/org.mozilla.fennec' - elif (self.dirExists('/data/data/org.mozilla.firefox')): - return '/data/data/org.mozilla.firefox' - elif (self.dirExists('/data/data/org.mozilla.fennec_unofficial')): - return '/data/data/org.mozilla.fennec_unofficial' - elif (self.dirExists('/data/data/org.mozilla.fennec_aurora')): - return '/data/data/org.mozilla.fennec_aurora' - elif (self.dirExists('/data/data/org.mozilla.firefox_beta')): - return '/data/data/org.mozilla.firefox_beta' + elif (self.packageName and self.dirExists('/data/data/' + self.packageName)): + return '/data/data/' + self.packageName # Failure (either not installed or not a recognized platform) + print "devicemanagerADB: getAppRoot failed" return None # Gets the directory location on the device for a specific test type From 5a81908004bc18f7beb077cc4230b03b7bc2c808 Mon Sep 17 00:00:00 2001 From: Geoff Brown Date: Mon, 22 Aug 2011 09:00:50 +0100 Subject: [PATCH 08/10] Bug 668349 - Add or update script to run xpcshell tests on Android; r=jmaher --- build/mobile/devicemanagerADB.py | 16 +- testing/xpcshell/remotexpcshelltests.py | 427 +++++++++++++----------- testing/xpcshell/runxpcshelltests.py | 27 +- 3 files changed, 262 insertions(+), 208 deletions(-) diff --git a/build/mobile/devicemanagerADB.py b/build/mobile/devicemanagerADB.py index 3f45dd1096e..f98fcbd4bc4 100644 --- a/build/mobile/devicemanagerADB.py +++ b/build/mobile/devicemanagerADB.py @@ -32,7 +32,11 @@ class DeviceManagerADB(DeviceManager): self.tmpDir = None try: # a test to see if we have root privs - self.checkCmd(["shell", "ls", "/sbin"]) + files = self.listFiles("/data/data") + if (len(files) == 1): + if (files[0].find("Permission denied") != -1): + print "NOT running as root" + raise Exception("not running as root") except: try: self.checkCmd(["root"]) @@ -103,7 +107,7 @@ class DeviceManagerADB(DeviceManager): try: if (not self.dirExists(remoteDir)): self.mkDirs(remoteDir+"/x") - for root, dirs, files in os.walk(localDir): + for root, dirs, files in os.walk(localDir, followlinks='true'): relRoot = os.path.relpath(root, localDir) for file in files: localFile = os.path.join(root, file) @@ -139,8 +143,12 @@ class DeviceManagerADB(DeviceManager): # success: True # failure: False def fileExists(self, filepath): - self.checkCmd(["shell", "ls", filepath]) - return True + p = self.runCmd(["shell", "ls", "-a", filepath]) + data = p.stdout.readlines() + if (len(data) == 1): + if (data[0].rstrip() == filepath): + return True + return False def removeFile(self, filename): return self.runCmd(["shell", "rm", filename]).stdout.read() diff --git a/testing/xpcshell/remotexpcshelltests.py b/testing/xpcshell/remotexpcshelltests.py index 5f07147e62a..a304f34543f 100644 --- a/testing/xpcshell/remotexpcshelltests.py +++ b/testing/xpcshell/remotexpcshelltests.py @@ -36,265 +36,302 @@ # # ***** END LICENSE BLOCK ***** */ -import re, sys, os, os.path, logging, shutil, signal -from glob import glob -from optparse import OptionParser -from subprocess import Popen, PIPE, STDOUT -from tempfile import mkdtemp - +import re, sys, os import runxpcshelltests as xpcshell from automationutils import * -import devicemanager +import devicemanager, devicemanagerADB, devicemanagerSUT +# A specialization of XPCShellTests that runs tests on an Android device +# via devicemanager. class XPCShellRemote(xpcshell.XPCShellTests, object): - def __init__(self, devmgr): - self.device = devmgr - self.testRoot = "/tests/xpcshell" + def __init__(self, devmgr, options, args): xpcshell.XPCShellTests.__init__(self) - self.profileDir = self.testRoot + '/profile' - self.device.mkDir(self.profileDir) + self.options = options + self.device = devmgr + self.pathMapping = [] + self.remoteTestRoot = self.device.getTestRoot("xpcshell") + # Terse directory names are used here ("b" for a binaries directory) + # to minimize the length of the command line used to execute + # xpcshell on the remote device. adb has a limit to the number + # of characters used in a shell command, and the xpcshell command + # line can be quite complex. + self.remoteBinDir = self.remoteJoin(self.remoteTestRoot, "b") + self.remoteScriptsDir = self.remoteTestRoot + self.remoteComponentsDir = self.remoteJoin(self.remoteTestRoot, "c") + self.profileDir = self.remoteJoin(self.remoteTestRoot, "p") + if options.setup: + self.setupUtilities() + self.setupTestDir() + self.remoteAPK = self.remoteJoin(self.remoteBinDir, os.path.basename(options.localAPK)) + self.remoteDebugger = options.debugger + self.remoteDebuggerArgs = options.debuggerArgs - #todo: figure out the remote version of this, only used for debuggerInfo - def getcwd(self): - return "/tests/" - - def readManifest(self, manifest): - """Given a manifest file containing a list of test directories, - return a list of absolute paths to the directories contained within.""" + def remoteJoin(self, path1, path2): + joined = os.path.join(path1, path2) + joined = joined.replace('\\', '/') + return joined - manifestdir = self.testRoot + '/tests' - testdirs = [] - try: - f = self.device.getFile(manifest, "temp.txt") - for line in f.split(): - dir = line.rstrip() - path = manifestdir + '/' + dir - testdirs.append(path) - f.close() - except: - pass # just eat exceptions - return testdirs + def remoteForLocal(self, local): + for mapping in self.pathMapping: + if (os.path.abspath(mapping.local) == os.path.abspath(local)): + return mapping.remote + return local - def verifyFilePath(self, fileName): - # approot - path to root of application - firefox or fennec - # xreroot - path to xulrunner binaries - firefox or fennec/xulrunner - # xpcshell - full or relative path to xpcshell binary - #given fileName, returns full path of existing file - if (self.device.fileExists(fileName)): - return fileName - - fileName = self.device.getAppRoot() + '/xulrunner/' + fileName.split('/')[-1] - if (self.device.fileExists(fileName)): - return fileName - - fileName = self.device.getAppRoot() + '/' + fileName.split('/')[-1] - if (not self.device.fileExists(fileName)): - raise devicemanager.FileError("No File found for: " + str(fileName)) + def setupUtilities(self): + remotePrefDir = self.remoteJoin(self.remoteBinDir, "defaults/pref") + if (not self.device.dirExists(remotePrefDir)): + self.device.mkDirs(self.remoteJoin(remotePrefDir, "extra")) + if (not self.device.dirExists(self.remoteScriptsDir)): + self.device.mkDir(self.remoteScriptsDir) + if (not self.device.dirExists(self.remoteComponentsDir)): + self.device.mkDir(self.remoteComponentsDir) - return fileName + local = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'head.js') + self.device.pushFile(local, self.remoteScriptsDir) - def verifyDirPath(self, fileName): - # approot - path to root of application - firefox or fennec - # xreroot - path to xulrunner binaries - firefox or fennec/xulrunner - # xpcshell - full or relative path to xpcshell binary - #given fileName, returns full path of existing file - if (self.device.dirExists(fileName)): - return fileName - - fileName = self.device.getAppRoot() + '/' + fileName.split('/')[-1] - if (self.device.dirExists(fileName)): - return fileName - - fileName = self.device.getDeviceRoot() + '/' + fileName.split('/')[-1] - if (not self.device.dirExists(fileName)): - raise devicemanager.FileError("No Dir found for: " + str(fileName)) - return fileName + localBin = os.path.join(self.options.objdir, "dist/bin") + if not os.path.exists(localBin): + localBin = os.path.join(self.options.objdir, "bin") + if not os.path.exists(localBin): + print >>sys.stderr, "Error: could not find bin in objdir" + sys.exit(1) - def setAbsPath(self): - #testharnessdir is used for head.js - self.testharnessdir = "/tests/xpcshell/" + local = os.path.join(localBin, "xpcshell") + self.device.pushFile(local, self.remoteBinDir) - # If the file exists then we have a full path (no notion of cwd) - self.xpcshell = self.verifyFilePath(self.xpcshell) - if self.xrePath is None: - # If no xrePath, assume it is the directory containing xpcshell - self.xrePath = '/'.join(self.xpcshell.split('/')[:-1]) - else: - self.xrePath = self.verifyDirPath(self.xrePath) + local = os.path.join(localBin, "plugin-container") + self.device.pushFile(local, self.remoteBinDir) - # we assume that httpd.js lives in components/ relative to xpcshell - self.httpdJSPath = self.xrePath + '/components/httpd.js' + local = os.path.join(localBin, "components/httpd.js") + self.device.pushFile(local, self.remoteComponentsDir) + + local = os.path.join(localBin, "components/httpd.manifest") + self.device.pushFile(local, self.remoteComponentsDir) + + local = os.path.join(localBin, "components/test_necko.xpt") + self.device.pushFile(local, self.remoteComponentsDir) + + self.device.pushFile(self.options.localAPK, self.remoteBinDir) + + localLib = os.path.join(self.options.objdir, "dist/fennec") + if not os.path.exists(localLib): + localLib = os.path.join(self.options.objdir, "fennec/lib") + if not os.path.exists(localLib): + print >>sys.stderr, "Error: could not find libs in objdir" + sys.exit(1) + + for file in os.listdir(localLib): + if (file.endswith(".so")): + self.device.pushFile(os.path.join(localLib, file), self.remoteBinDir) + + def setupTestDir(self): + xpcDir = os.path.join(self.options.objdir, "_tests/xpcshell") + self.device.pushDir(xpcDir, self.remoteScriptsDir) + + def buildTestList(self): + xpcshell.XPCShellTests.buildTestList(self) + uniqueTestPaths = set([]) + for test in self.alltests: + uniqueTestPaths.add(test['here']) + for testdir in uniqueTestPaths: + xpcDir = os.path.join(self.options.objdir, "_tests/xpcshell") + abbrevTestDir = os.path.relpath(testdir, xpcDir) + remoteScriptDir = self.remoteJoin(self.remoteScriptsDir, abbrevTestDir) + self.pathMapping.append(PathMapping(testdir, remoteScriptDir)) def buildXpcsCmd(self, testdir): - # has to be loaded by xpchell: it can't load itself. - self.env["XPCSHELL_TEST_PROFILE_DIR"] = self.profileDir - self.xpcsCmd = [self.xpcshell, '-g', self.xrePath, '-v', '170', '-j', '-s', \ - "--environ:CWD='" + testdir + "'", \ - "--environ:XPCSHELL_TEST_PROFILE_DIR='" + self.env["XPCSHELL_TEST_PROFILE_DIR"] + "'", \ - '-e', 'const _HTTPD_JS_PATH = \'%s\';' % self.httpdJSPath, - '-f', self.testharnessdir + '/head.js'] + self.xpcsCmd = [ + self.remoteJoin(self.remoteBinDir, "xpcshell"), + '-r', self.remoteJoin(self.remoteComponentsDir, 'httpd.manifest'), + '--greomni', self.remoteAPK, + '-j', '-s', + '-e', 'const _HTTPD_JS_PATH = "%s";' % self.remoteJoin(self.remoteComponentsDir, 'httpd.js'), + '-e', 'const _HEAD_JS_PATH = "%s";' % self.remoteJoin(self.remoteScriptsDir, 'head.js'), + '-f', self.remoteScriptsDir+'/head.js'] - if self.debuggerInfo: - self.xpcsCmd = [self.debuggerInfo["path"]] + self.debuggerInfo["args"] + self.xpcsCmd + if self.remoteDebugger: + # for example, "/data/local/gdbserver" "localhost:12345" + self.xpcsCmd = [ + self.remoteDebugger, + self.remoteDebuggerArgs, + self.xpcsCmd] - def getHeadFiles(self, testdir): - # get the list of head and tail files from the directory - testHeadFiles = [] - for f in self.device.listFiles(testdir): - hdmtch = re.compile("head_.*\.js") - if (hdmtch.match(f)): - testHeadFiles += [(testdir + '/' + f).replace('/', '//')] - - return sorted(testHeadFiles) - - def getTailFiles(self, testdir): - testTailFiles = [] - # Tails are executed in the reverse order, to "match" heads order, - # as in "h1-h2-h3 then t3-t2-t1". - for f in self.device.listFiles(testdir): - tlmtch = re.compile("tail_.*\.js") - if (tlmtch.match(f)): - testTailFiles += [(testdir + '/' + f).replace('/', '//')] - return reversed(sorted(testTailFiles)) + def getHeadFiles(self, test): + self.remoteHere = self.remoteForLocal(test['here']) + return [f.strip() for f in sorted(test['head'].split(' ')) if self.device.fileExists(self.remoteJoin(self.remoteHere, f))] + + def getTailFiles(self, test): + return [f.strip() for f in sorted(test['tail'].split(' ')) if self.device.fileExists(self.remoteJoin(self.remoteHere, f))] - def getTestFiles(self, testdir): - testfiles = [] - # if a single test file was specified, we only want to execute that test - for f in self.device.listFiles(testdir): - tstmtch = re.compile("test_.*\.js") - if (tstmtch.match(f)): - testfiles += [(testdir + '/' + f).replace('/', '//')] - - for f in testfiles: - if (self.singleFile == f.split('/')[-1]): - return [(testdir + '/' + f).replace('/', '//')] - else: - pass - return testfiles + def buildCmdTestFile(self, name): + remoteDir = self.remoteForLocal(os.path.dirname(name)) + if remoteDir == self.remoteHere: + remoteName = os.path.basename(name) + else: + remoteName = self.remoteJoin(remoteDir, os.path.basename(name)) + return ['-e', 'const _TEST_FILE = ["%s"];' % + replaceBackSlashes(remoteName)] def setupProfileDir(self): self.device.removeDir(self.profileDir) self.device.mkDir(self.profileDir) - self.env["XPCSHELL_TEST_PROFILE_DIR"] = self.profileDir + if self.interactive or self.singleFile: + self.log.info("TEST-INFO | profile dir is %s" % self.profileDir) return self.profileDir - def setupLeakLogging(self): - filename = "runxpcshelltests_leaks.log" - - # Enable leaks (only) detection to its own log file. - leakLogFile = self.profileDir + '/' + filename - self.env["XPCOM_MEM_LEAK_LOG"] = leakLogFile - return leakLogFile - def launchProcess(self, cmd, stdout, stderr, env, cwd): - print "launching : " + " ".join(cmd) - proc = self.device.launchProcess(cmd, cwd=cwd) + # Some xpcshell arguments contain characters that are interpretted + # by the adb shell; enclose these arguments in quotes. + index = 0 + for part in cmd: + if (part.find(" ")>=0 or part.find("(")>=0 or part.find(")")>=0 or part.find("\"")>=0): + part = '\''+part+'\'' + cmd[index] = part + index = index + 1 + + xpcshell = self.remoteJoin(self.remoteBinDir, "xpcshell") + + shellArgs = "cd "+self.remoteHere + shellArgs += "; LD_LIBRARY_PATH="+self.remoteBinDir + shellArgs += "; export CACHE_PATH="+self.remoteBinDir + shellArgs += "; export GRE_HOME="+self.device.getAppRoot() + shellArgs += "; export XPCSHELL_TEST_PROFILE_DIR="+self.profileDir + shellArgs += "; "+xpcshell+" " + shellArgs += " ".join(cmd[1:]) + + if self.verbose: + self.log.info(shellArgs) + + # If the adb version of devicemanager is used and the arguments passed + # to adb exceed ~1024 characters, the command may not execute. + if len(shellArgs) > 1000: + self.log.info("adb command length is excessive and may cause failure") + + proc = self.device.runCmd(["shell", shellArgs]) return proc - def setSignal(self, proc, sig1, sig2): - self.device.signal(proc, sig1, sig2) - def communicate(self, proc): - return self.device.communicate(proc) + return proc.communicate() def removeDir(self, dirname): self.device.removeDir(dirname) def getReturnCode(self, proc): - return self.device.getReturnCode(proc) + return proc.returncode #TODO: consider creating a separate log dir. We don't have the test file structure, # so we use filename.log. Would rather see ./logs/filename.log - def createLogFile(self, test, stdout): + def createLogFile(self, test, stdout, leakLogs): try: f = None filename = test.replace('\\', '/').split('/')[-1] + ".log" f = open(filename, "w") f.write(stdout) - if os.path.exists(self.leakLogFile): - leaks = open(self.leakLogFile, "r") + for leakLog in leakLogs: + if os.path.exists(leakLog): + leaks = open(leakLog, "r") f.write(leaks.read()) leaks.close() finally: if f <> None: f.close() - #NOTE: the only difference between this and parent is the " vs ' arond the filename - def buildCmdHead(self, headfiles, tailfiles, xpcscmd): - cmdH = ", ".join(['\'' + f.replace('\\', '/') + '\'' - for f in headfiles]) - cmdT = ", ".join(['\'' + f.replace('\\', '/') + '\'' - for f in tailfiles]) - cmdH = xpcscmd + \ - ['-e', 'const _HEAD_FILES = [%s];' % cmdH] + \ - ['-e', 'const _TAIL_FILES = [%s];' % cmdT] - return cmdH - class RemoteXPCShellOptions(xpcshell.XPCShellOptions): - def __init__(self): - xpcshell.XPCShellOptions.__init__(self) - self.add_option("--device", - type="string", dest="device", default='', - help="ip address for the device") + def __init__(self): + xpcshell.XPCShellOptions.__init__(self) + defaults = {} + self.add_option("--deviceIP", action="store", + type = "string", dest = "deviceIP", + help = "ip address of remote device to test") + defaults["deviceIP"] = None + + self.add_option("--devicePort", action="store", + type = "string", dest = "devicePort", + help = "port of remote device to test") + defaults["devicePort"] = 20701 + + self.add_option("--dm_trans", action="store", + type = "string", dest = "dm_trans", + help = "the transport to use to communicate with device: [adb|sut]; default=sut") + defaults["dm_trans"] = "sut" + + self.add_option("--objdir", action="store", + type = "string", dest = "objdir", + help = "local objdir, containing xpcshell binaries") + defaults["objdir"] = None + + self.add_option("--apk", action="store", + type = "string", dest = "localAPK", + help = "local path to Fennec APK") + defaults["localAPK"] = None + + self.add_option("--noSetup", action="store_false", + dest = "setup", + help = "do not copy any files to device (to be used only if device is already setup)") + defaults["setup"] = True + + self.set_defaults(**defaults) + +class PathMapping: + + def __init__(self, localDir, remoteDir): + self.local = localDir + self.remote = remoteDir def main(): - parser = RemoteXPCShellOptions() - options, args = parser.parse_args() + dm_none = devicemanagerADB.DeviceManagerADB(None, None) + parser = RemoteXPCShellOptions() + options, args = parser.parse_args() - if len(args) < 2 and options.manifest is None or \ - (len(args) < 1 and options.manifest is not None): - print "len(args): " + str(len(args)) - print >>sys.stderr, """Usage: %s - or: %s --manifest=test.manifest """ % (sys.argv[0], - sys.argv[0]) - sys.exit(1) + if len(args) < 1 and options.manifest is None: + print >>sys.stderr, """Usage: %s + or: %s --manifest=test.manifest """ % (sys.argv[0], sys.argv[0]) + sys.exit(1) - if (options.device == ''): - print >>sys.stderr, "Error: Please provide an ip address for the remote device with the --device option" - sys.exit(1) + if (options.dm_trans == "adb"): + if (options.deviceIP): + dm = devicemanagerADB.DeviceManagerADB(options.deviceIP, options.devicePort) + else: + dm = dm_none + else: + dm = devicemanagerSUT.DeviceManagerSUT(options.deviceIP, options.devicePort) + if (options.deviceIP == None): + print "Error: you must provide a device IP to connect to via the --device option" + sys.exit(1) + if options.interactive and not options.testPath: + print >>sys.stderr, "Error: You must specify a test filename in interactive mode!" + sys.exit(1) - dm = devicemanager.DeviceManager(options.device, 20701) - xpcsh = XPCShellRemote(dm) - debuggerInfo = getDebuggerInfo(xpcsh.oldcwd, options.debugger, options.debuggerArgs, - options.debuggerInteractive); + if not options.objdir: + print >>sys.stderr, "Error: You must specify an objdir" + sys.exit(1) - if options.interactive and not options.testPath: - print >>sys.stderr, "Error: You must specify a test filename in interactive mode!" - sys.exit(1) + if not options.localAPK: + for file in os.listdir(os.path.join(options.objdir, "dist")): + if (file.endswith(".apk") and file.startswith("fennec")): + options.localAPK = os.path.join(options.objdir, "dist") + options.localAPK = os.path.join(options.localAPK, file) + print >>sys.stderr, "using APK: " + options.localAPK + break + + if not options.localAPK: + print >>sys.stderr, "Error: please specify an APK" + sys.exit(1) - # Zip up the xpcshell directory: 7z a xpcshell/*, assuming we are in the xpcshell directory - # TODO: ensure the system has 7z, this is adding a new dependency to the overall system - zipName = 'xpcshell.7z' - try: - Popen(['7z', 'a', zipName, '../xpcshell']).wait() - except: - print "to run these tests remotely, we require 7z to be installed and in your path" - sys.exit(1) + xpcsh = XPCShellRemote(dm, options, args) - if dm.pushFile(zipName, '/tests/xpcshell.7z') == None: - raise devicemanager.FileError("failed to copy xpcshell.7z to device") - if dm.unpackFile('xpcshell.7z') == None: - raise devicemanager.FileError("failed to unpack xpcshell.7z on the device") + if not xpcsh.runTests(xpcshell='xpcshell', + testdirs=args[0:], + **options.__dict__): + sys.exit(1) - if not xpcsh.runTests(args[0], - xrePath=options.xrePath, - symbolsPath=options.symbolsPath, - manifest=options.manifest, - testdirs=args[1:], - testPath=options.testPath, - interactive=options.interactive, - logfiles=options.logfiles, - debuggerInfo=debuggerInfo): - sys.exit(1) if __name__ == '__main__': main() - - diff --git a/testing/xpcshell/runxpcshelltests.py b/testing/xpcshell/runxpcshelltests.py index 6424683a2ff..ecda7556ee2 100644 --- a/testing/xpcshell/runxpcshelltests.py +++ b/testing/xpcshell/runxpcshelltests.py @@ -261,7 +261,7 @@ class XPCShellTests(object): test['head'] is a whitespace delimited list of head files. return the list of head files as paths including the subdir if the head file exists - On a remote system, this is overloaded to list files in a remote directory structure. + On a remote system, this may be overloaded to list files in a remote directory structure. """ return [os.path.join(test['here'], f).strip() for f in sorted(test['head'].split(' ')) if os.path.isfile(os.path.join(test['here'], f))] @@ -270,7 +270,7 @@ class XPCShellTests(object): test['tail'] is a whitespace delimited list of head files. return the list of tail files as paths including the subdir if the tail file exists - On a remote system, this is overloaded to list files in a remote directory structure. + On a remote system, this may be overloaded to list files in a remote directory structure. """ return [os.path.join(test['here'], f).strip() for f in sorted(test['tail'].split(' ')) if os.path.isfile(os.path.join(test['here'], f))] @@ -280,7 +280,7 @@ class XPCShellTests(object): When running check-interactive and check-one, the directory is well-defined and retained for inspection once the tests complete. - On a remote system, we overload this to use a remote path structure. + On a remote system, this may be overloaded to use a remote path structure. """ if self.interactive or self.singleFile: profileDir = os.path.join(gettempdir(), self.profileName, "xpcshellprofile") @@ -301,7 +301,7 @@ class XPCShellTests(object): """ Enable leaks (only) detection to its own log file and set environment variables. - On a remote system, we overload this to use a remote filename and path structure + On a remote system, this may be overloaded to use a remote filename and path structure """ filename = "runxpcshelltests_leaks.log" @@ -381,12 +381,20 @@ class XPCShellTests(object): '-e', 'const _HEAD_FILES = [%s];' % cmdH, '-e', 'const _TAIL_FILES = [%s];' % cmdT] + def buildCmdTestFile(self, name): + """ + Build the command line arguments for the test file. + On a remote system, this may be overloaded to use a remote path structure. + """ + return ['-e', 'const _TEST_FILE = ["%s"];' % + replaceBackSlashes(name)] + def runTests(self, xpcshell, xrePath=None, appPath=None, symbolsPath=None, manifest=None, testdirs=[], testPath=None, interactive=False, verbose=False, keepGoing=False, logfiles=True, thisChunk=1, totalChunks=1, debugger=None, debuggerArgs=None, debuggerInteractive=False, - profileName=None, mozInfo=None): + profileName=None, mozInfo=None, **otherOptions): """Run xpcshell tests. |xpcshell|, is the xpcshell executable to use to run the tests. @@ -410,6 +418,7 @@ class XPCShellTests(object): |profileName|, if set, specifies the name of the application for the profile directory if running only a subset of tests. |mozInfo|, if set, specifies specifies build configuration information, either as a filename containing JSON, or a dict. + |otherOptions| may be present for the convenience of subclasses """ global gotSIGINT @@ -491,8 +500,7 @@ class XPCShellTests(object): self.leakLogFile = self.setupLeakLogging() # The test file will have to be loaded after the head files. - cmdT = ['-e', 'const _TEST_FILE = ["%s"];' % - replaceBackSlashes(name)] + cmdT = self.buildCmdTestFile(name) try: self.log.info("TEST-INFO | %s | running test ..." % name) @@ -515,8 +523,9 @@ class XPCShellTests(object): def print_stdout(stdout): """Print stdout line-by-line to avoid overflowing buffers.""" self.log.info(">>>>>>>") - for line in stdout.splitlines(): - self.log.info(line) + if (stdout): + for line in stdout.splitlines(): + self.log.info(line) self.log.info("<<<<<<<") result = not ((self.getReturnCode(proc) != 0) or From 6b2be6e629ce5c6585cb00a46e79352ef01f355e Mon Sep 17 00:00:00 2001 From: Geoff Brown Date: Mon, 22 Aug 2011 09:00:50 +0100 Subject: [PATCH 09/10] Bug 668349 - Changes to xpcshell.ini; r=jmaher --- dom/plugins/test/unit/xpcshell.ini | 4 + embedding/tests/unit/xpcshell.ini | 4 + intl/uconv/tests/unit/xpcshell.ini | 2 + ipc/testshell/tests/xpcshell.ini | 2 + js/src/xpconnect/tests/unit/xpcshell.ini | 2 + modules/libpr0n/test/unit/xpcshell.ini | 2 + netwerk/test/unit/xpcshell.ini | 34 ++++++++ security/manager/ssl/tests/unit/xpcshell.ini | 6 ++ services/crypto/tests/unit/xpcshell.ini | 2 + services/sync/tests/unit/xpcshell.ini | 18 ++-- storage/test/unit/xpcshell.ini | 4 + testing/xpcshell/xpcshell.ini | 4 + .../components/ctypes/tests/unit/xpcshell.ini | 2 + .../downloads/test/unit/xpcshell.ini | 4 + .../places/tests/autocomplete/xpcshell.ini | 6 ++ .../places/tests/expiration/xpcshell.ini | 10 +++ .../places/tests/queries/xpcshell.ini | 8 ++ .../components/places/tests/unit/xpcshell.ini | 26 ++++++ .../components/satchel/test/unit/xpcshell.ini | 2 + .../telemetry/tests/unit/xpcshell.ini | 2 + .../extensions/test/xpcshell/xpcshell.ini | 82 +++++++++++++++++++ .../test_timermanager/unit/xpcshell.ini | 2 + uriloader/exthandler/tests/unit/xpcshell.ini | 2 + .../exthandler/tests/unit_ipc/xpcshell.ini | 2 + xpcom/tests/unit/xpcshell.ini | 10 +++ 25 files changed, 236 insertions(+), 6 deletions(-) diff --git a/dom/plugins/test/unit/xpcshell.ini b/dom/plugins/test/unit/xpcshell.ini index 4a721a47f07..2043a0db3e1 100644 --- a/dom/plugins/test/unit/xpcshell.ini +++ b/dom/plugins/test/unit/xpcshell.ini @@ -3,4 +3,8 @@ head = head_plugins.js tail = [test_bug455213.js] +# Bug 676953: test fails consistently on Android +fail-if = os == "android" [test_bug471245.js] +# Bug 676953: test fails consistently on Android +fail-if = os == "android" diff --git a/embedding/tests/unit/xpcshell.ini b/embedding/tests/unit/xpcshell.ini index b3c55a1e7f0..0b65665eca1 100644 --- a/embedding/tests/unit/xpcshell.ini +++ b/embedding/tests/unit/xpcshell.ini @@ -3,4 +3,8 @@ head = tail = [test_wwauthpromptfactory.js] +# Bug 676955: test fails consistently on Android +fail-if = os == "android" [test_wwpromptfactory.js] +# Bug 676955: test fails consistently on Android +fail-if = os == "android" diff --git a/intl/uconv/tests/unit/xpcshell.ini b/intl/uconv/tests/unit/xpcshell.ini index a9a34f6b66d..809d365126c 100644 --- a/intl/uconv/tests/unit/xpcshell.ini +++ b/intl/uconv/tests/unit/xpcshell.ini @@ -111,6 +111,8 @@ tail = [test_encode_CP852.js] [test_encode_CP855.js] [test_encode_CP857.js] +# Bug 676958: test consistently hangs on Android +skip-if = os == "android" [test_encode_CP862.js] [test_encode_CP864.js] [test_encode_CP874.js] diff --git a/ipc/testshell/tests/xpcshell.ini b/ipc/testshell/tests/xpcshell.ini index 045bfabadd8..71f62801c8a 100644 --- a/ipc/testshell/tests/xpcshell.ini +++ b/ipc/testshell/tests/xpcshell.ini @@ -3,4 +3,6 @@ head = tail = [test_ipcshell.js] +# Bug 676963: test fails consistently on Android +fail-if = os == "android" [test_ipcshell_child.js] diff --git a/js/src/xpconnect/tests/unit/xpcshell.ini b/js/src/xpconnect/tests/unit/xpcshell.ini index c6bbbfba893..cd04a912f44 100644 --- a/js/src/xpconnect/tests/unit/xpcshell.ini +++ b/js/src/xpconnect/tests/unit/xpcshell.ini @@ -15,6 +15,8 @@ tail = [test_import.js] [test_js_weak_references.js] [test_localeCompare.js] +# Bug 676965: test fails consistently on Android +fail-if = os == "android" [test_recursive_import.js] [test_xpcomutils.js] [test_unload.js] diff --git a/modules/libpr0n/test/unit/xpcshell.ini b/modules/libpr0n/test/unit/xpcshell.ini index 756f31b1b1d..b1086d4e6d7 100644 --- a/modules/libpr0n/test/unit/xpcshell.ini +++ b/modules/libpr0n/test/unit/xpcshell.ini @@ -8,4 +8,6 @@ tail = [test_encoder_apng.js] [test_encoder_png.js] [test_imgtools.js] +# Bug 676968: test fails consistently on Android +fail-if = os == "android" [test_moz_icon_uri.js] diff --git a/netwerk/test/unit/xpcshell.ini b/netwerk/test/unit/xpcshell.ini index d1e99369179..e7f65ce09b5 100644 --- a/netwerk/test/unit/xpcshell.ini +++ b/netwerk/test/unit/xpcshell.ini @@ -8,6 +8,8 @@ tail = [test_aboutblank.js] [test_auth_proxy.js] [test_authentication.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_authpromptwrapper.js] [test_bug203271.js] [test_bug248970_cache.js] @@ -38,6 +40,8 @@ tail = [test_bug455311.js] [test_bug455598.js] [test_bug468426.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_bug468594.js] [test_bug470716.js] [test_bug479413.js] @@ -47,6 +51,8 @@ tail = [test_bug490095.js] [test_bug504014.js] [test_bug510359.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_bug515583.js] [test_bug528292.js] [test_bug540566.js] @@ -61,11 +67,21 @@ tail = [test_bug618835.js] [test_bug633743.js] [test_bug650955.js] +# Bug 677427: test fails consistently on Android +fail-if = os == "android" [test_bug652761.js] [test_bug651100.js] +# Bug 675044: test fails consistently on Android +fail-if = os == "android" [test_bug654926.js] +# Bug 675049: test fails consistently on Android +fail-if = os == "android" [test_bug654926_doom_and_read.js] +# Bug 675049: test fails consistently on Android +fail-if = os == "android" [test_bug654926_test_seek.js] +# Bug 675049: test fails consistently on Android +fail-if = os == "android" [test_bug659569.js] [test_bug660066.js] [test_bug651185.js] @@ -83,13 +99,29 @@ tail = [test_event_sink.js] [test_extract_charset_from_content_type.js] [test_fallback_no-cache-entry_canceled.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_fallback_no-cache-entry_passing.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_fallback_redirect-to-different-origin_canceled.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_fallback_redirect-to-different-origin_passing.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_fallback_request-error_canceled.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_fallback_request-error_passing.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_fallback_response-error_canceled.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_fallback_response-error_passing.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_file_partial_inputstream.js] [test_file_protocol.js] [test_filestreams.js] @@ -131,6 +163,8 @@ tail = [test_simple.js] [test_sockettransportsvc_available.js] [test_socks.js] +# Bug 675039: test hangs consistently on Android +skip-if = os == "android" [test_standardurl.js] [test_standardurl_port.js] [test_streamcopier.js] diff --git a/security/manager/ssl/tests/unit/xpcshell.ini b/security/manager/ssl/tests/unit/xpcshell.ini index da4a5e15e2e..0dc7801435c 100644 --- a/security/manager/ssl/tests/unit/xpcshell.ini +++ b/security/manager/ssl/tests/unit/xpcshell.ini @@ -3,5 +3,11 @@ head = tail = [test_datasignatureverifier.js] +# Bug 676972: test hangs consistently on Android +skip-if = os == "android" [test_hash_algorithms.js] +# Bug 676972: test hangs consistently on Android +skip-if = os == "android" [test_hmac.js] +# Bug 676972: test hangs consistently on Android +skip-if = os == "android" diff --git a/services/crypto/tests/unit/xpcshell.ini b/services/crypto/tests/unit/xpcshell.ini index 536e9e187c5..bee94247574 100644 --- a/services/crypto/tests/unit/xpcshell.ini +++ b/services/crypto/tests/unit/xpcshell.ini @@ -5,3 +5,5 @@ tail = [test_crypto_crypt.js] [test_crypto_deriveKey.js] [test_crypto_random.js] +# Bug 676977: test hangs consistently on Android +skip-if = os == "android" diff --git a/services/sync/tests/unit/xpcshell.ini b/services/sync/tests/unit/xpcshell.ini index fee45555166..9c3d54e1c67 100644 --- a/services/sync/tests/unit/xpcshell.ini +++ b/services/sync/tests/unit/xpcshell.ini @@ -34,7 +34,8 @@ tail = [test_interval_triggers.js] [test_jpakeclient.js] # Bug 618233: this test produces random failures on Windows 7. -skip-if = os == "win" +# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini) +skip-if = os == "win" || os == "android" [test_keys.js] [test_load_modules.js] [test_log4moz.js] @@ -60,7 +61,8 @@ skip-if = os == "win" [test_service_detect_upgrade.js] [test_service_filelog.js] # Bug 664090: this test persistently fails on Windows opt builds. -skip-if = os == "win" && !debug +# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini) +skip-if = (os == "win" && !debug) || os == "android" [test_service_getStorageInfo.js] [test_service_login.js] [test_service_migratePrefs.js] @@ -71,14 +73,17 @@ skip-if = os == "win" && !debug [test_service_sync_401.js] [test_service_sync_checkServerError.js] # Bug 604565: this test intermittently hangs on OS X debug builds. -skip-if = os == "mac" && debug +# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini) +skip-if = (os == "mac" && debug) || os == "android" [test_service_sync_locked.js] [test_service_sync_remoteSetup.js] # Bug 604565: this test intermittently hangs on OS X debug builds. -skip-if = os == "mac" && debug +# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini) +skip-if = (os == "mac" && debug) || os == "android" [test_service_sync_updateEnabledEngines.js] # Bug 604565: this test intermittently hangs on OS X debug builds. -skip-if = os == "mac" && debug +# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini) +skip-if = (os == "mac" && debug) || os == "android" [test_service_verifyLogin.js] [test_service_wipeClient.js] [test_service_wipeServer.js] @@ -87,7 +92,8 @@ skip-if = os == "mac" && debug [test_syncengine.js] [test_syncengine_sync.js] # Bug 604565: this test intermittently hangs on OS X debug builds. -skip-if = os == "mac" && debug +# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini) +skip-if = (os == "mac" && debug) || os == "android" [test_syncscheduler.js] [test_syncstoragerequest.js] [test_tab_engine.js] diff --git a/storage/test/unit/xpcshell.ini b/storage/test/unit/xpcshell.ini index 5ccf28ec485..7872158ed77 100644 --- a/storage/test/unit/xpcshell.ini +++ b/storage/test/unit/xpcshell.ini @@ -7,6 +7,8 @@ tail = [test_bug-429521.js] [test_bug-444233.js] [test_chunk_growth.js] +# Bug 676981: test fails consistently on Android +fail-if = os == "android" [test_connection_executeAsync.js] [test_js_helpers.js] [test_levenshtein.js] @@ -30,3 +32,5 @@ tail = [test_unicode.js] [test_vacuum.js] [test_telemetry_vfs.js] +# Bug 676981: test fails consistently on Android +# fail-if = os == "android" diff --git a/testing/xpcshell/xpcshell.ini b/testing/xpcshell/xpcshell.ini index 82a81276174..730cf3029a8 100644 --- a/testing/xpcshell/xpcshell.ini +++ b/testing/xpcshell/xpcshell.ini @@ -15,6 +15,8 @@ [include:toolkit/components/commandlines/test/unit/xpcshell.ini] [include:toolkit/components/contentprefs/tests/unit/xpcshell.ini] [include:toolkit/components/passwordmgr/test/unit/xpcshell.ini] +# Bug 676989: tests hang on Android +skip-if = os == "android" [include:toolkit/components/places/tests/migration/xpcshell.ini] [include:toolkit/components/places/tests/autocomplete/xpcshell.ini] [include:toolkit/components/places/tests/expiration/xpcshell.ini] @@ -59,6 +61,8 @@ [include:services/crypto/tests/unit/xpcshell.ini] [include:services/crypto/components/tests/unit/xpcshell.ini] [include:services/sync/tests/unit/xpcshell.ini] +# Bug 676978: tests hang on Android +skip-if = os == "android" [include:browser/components/dirprovider/tests/unit/xpcshell.ini] [include:browser/components/feeds/test/unit/xpcshell.ini] [include:browser/components/places/tests/unit/xpcshell.ini] diff --git a/toolkit/components/ctypes/tests/unit/xpcshell.ini b/toolkit/components/ctypes/tests/unit/xpcshell.ini index e0fc8e295b7..a91504be69e 100644 --- a/toolkit/components/ctypes/tests/unit/xpcshell.ini +++ b/toolkit/components/ctypes/tests/unit/xpcshell.ini @@ -3,3 +3,5 @@ head = tail = [test_jsctypes.js] +# Bug 676989: test fails consistently on Android +fail-if = os == "android" diff --git a/toolkit/components/downloads/test/unit/xpcshell.ini b/toolkit/components/downloads/test/unit/xpcshell.ini index 4c53f3b6bff..1215e5d9a81 100644 --- a/toolkit/components/downloads/test/unit/xpcshell.ini +++ b/toolkit/components/downloads/test/unit/xpcshell.ini @@ -11,8 +11,12 @@ tail = [test_bug_409179.js] [test_bug_420230.js] [test_cancel_download_files_removed.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_download_manager.js] [test_download_samename.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_history_expiration.js] [test_memory_db_support.js] [test_offline_support.js] diff --git a/toolkit/components/places/tests/autocomplete/xpcshell.ini b/toolkit/components/places/tests/autocomplete/xpcshell.ini index cfc542768d6..f67bfe32025 100644 --- a/toolkit/components/places/tests/autocomplete/xpcshell.ini +++ b/toolkit/components/places/tests/autocomplete/xpcshell.ini @@ -8,8 +8,14 @@ tail = [test_418257.js] [test_422277.js] [test_autocomplete_on_value_removed_479089.js] +# Bug 676989: test fails consistently on Android +fail-if = os == "android" [test_download_embed_bookmarks.js] +# Bug 676989: test fails consistently on Android +fail-if = os == "android" [test_empty_search.js] +# Bug 676989: test fails consistently on Android +fail-if = os == "android" [test_enabled.js] [test_escape_self.js] [test_ignore_protocol.js] diff --git a/toolkit/components/places/tests/expiration/xpcshell.ini b/toolkit/components/places/tests/expiration/xpcshell.ini index 7a962504cec..be26a60c37f 100644 --- a/toolkit/components/places/tests/expiration/xpcshell.ini +++ b/toolkit/components/places/tests/expiration/xpcshell.ini @@ -3,14 +3,24 @@ head = head_expiration.js tail = [test_analyze_runs.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_annos_expire_history.js] [test_annos_expire_never.js] [test_annos_expire_policy.js] [test_annos_expire_session.js] +# Bug 676989: test fails consistently on Android +fail-if = os == "android" [test_notifications.js] +# Bug 676989: test fails consistently on Android +fail-if = os == "android" [test_notifications_onDeleteURI.js] [test_notifications_onDeleteVisits.js] [test_pref_interval.js] +# Bug 676989: test fails consistently on Android +fail-if = os == "android" [test_pref_maxpages.js] +# Bug 676989: test fails consistently on Android +fail-if = os == "android" [test_removeAllPages.js] [test_debug_expiration.js] diff --git a/toolkit/components/places/tests/queries/xpcshell.ini b/toolkit/components/places/tests/queries/xpcshell.ini index d8b4f2e4b90..7f48d7a6905 100644 --- a/toolkit/components/places/tests/queries/xpcshell.ini +++ b/toolkit/components/places/tests/queries/xpcshell.ini @@ -13,6 +13,8 @@ tail = [test_onlyBookmarked.js] [test_querySerialization.js] [test_redirectsMode.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_results-as-tag-contents-query.js] [test_results-as-visit.js] [test_searchterms-domain.js] @@ -20,5 +22,11 @@ tail = [test_searchterms-bookmarklets.js] [test_sort-date-site-grouping.js] [test_sorting.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_tags.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_transitions.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" diff --git a/toolkit/components/places/tests/unit/xpcshell.ini b/toolkit/components/places/tests/unit/xpcshell.ini index 0f4c3952861..21653487885 100644 --- a/toolkit/components/places/tests/unit/xpcshell.ini +++ b/toolkit/components/places/tests/unit/xpcshell.ini @@ -5,6 +5,8 @@ tail = [test_000_frecency.js] [test_248970.js] [test_317472.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_331487.js] [test_385397.js] [test_399264_query_to_string.js] @@ -16,6 +18,8 @@ tail = [test_405497.js] [test_408221.js] [test_412132.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_413784.js] [test_415460.js] [test_415757.js] @@ -37,9 +41,13 @@ tail = [test_486978_sort_by_date_queries.js] [test_536081.js] [test_adaptive.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_adaptive_bug527311.js] [test_annotations.js] [test_asyncExecuteLegacyQueries.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_async_history_api.js] [test_autocomplete_stopSearch_no_throw.js] [test_bookmark_catobs.js] @@ -52,12 +60,20 @@ tail = [test_database_replaceOnStartup.js] [test_doSetAndLoadFaviconForPage.js] [test_doSetAndLoadFaviconForPage_failures.js] +# Bug 676989: test fails consistently on Android +fail-if = os == "android" [test_download_history.js] +# Bug 676989: test fails consistently on Android +fail-if = os == "android" [test_dynamic_containers.js] [test_exclude_livemarks.js] [test_faviconService_expireAllFavicons.js] [test_favicons.js] +# Bug 676989: test fails consistently on Android +fail-if = os == "android" [test_frecency.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_getChildIndex.js] [test_history.js] [test_history_autocomplete_tags.js] @@ -65,6 +81,8 @@ tail = [test_history_notifications.js] [test_history_observer.js] [test_history_removeAllPages.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_history_sidebar.js] [test_isvisited.js] [test_lastModified.js] @@ -79,15 +97,23 @@ tail = [test_onItemChanged_tags.js] [test_placeURIs.js] [test_preventive_maintenance.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_preventive_maintenance_checkAndFixDatabase.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_preventive_maintenance_console.js] [test_removeVisitsByTimeframe.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_resolveNullBookmarkTitles.js] [test_result_sort.js] [test_sql_guid_functions.js] [test_tag_autocomplete_search.js] [test_tagging.js] [test_update_frecency_after_delete.js] +# Bug 676989: test hangs consistently on Android +skip-if = os == "android" [test_utils_backups_create.js] [test_utils_getURLsForContainerNode.js] [test_utils_setAnnotationsFor.js] diff --git a/toolkit/components/satchel/test/unit/xpcshell.ini b/toolkit/components/satchel/test/unit/xpcshell.ini index af7ffae37fa..f3844754b69 100644 --- a/toolkit/components/satchel/test/unit/xpcshell.ini +++ b/toolkit/components/satchel/test/unit/xpcshell.ini @@ -4,6 +4,8 @@ tail = [test_autocomplete.js] [test_bug_248970.js] +# Bug 676989: test hangs on Android +skip-if = os == "android" [test_db_corrupt.js] [test_db_update_v1.js] [test_db_update_v1b.js] diff --git a/toolkit/components/telemetry/tests/unit/xpcshell.ini b/toolkit/components/telemetry/tests/unit/xpcshell.ini index 56b5dfdb08b..ee7c3a22a1c 100644 --- a/toolkit/components/telemetry/tests/unit/xpcshell.ini +++ b/toolkit/components/telemetry/tests/unit/xpcshell.ini @@ -4,3 +4,5 @@ tail = [test_nsITelemetry.js] [test_TelemetryPing.js] +# Bug 676989: test fails consistently on Android +# fail-if = os == "android" diff --git a/toolkit/mozapps/extensions/test/xpcshell/xpcshell.ini b/toolkit/mozapps/extensions/test/xpcshell/xpcshell.ini index b3538cb6da5..0f12380abf5 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/xpcshell.ini +++ b/toolkit/mozapps/extensions/test/xpcshell/xpcshell.ini @@ -3,35 +3,91 @@ head = head_addons.js tail = [test_AddonRepository.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_AddonRepository_cache.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_LightweightThemeManager.js] [test_badschema.js] [test_blocklistchange.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bootstrap.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug299716.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug299716_2.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug324121.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug335238.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug371495.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug384052.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug393285.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug394300.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug397778.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug406118.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug424262.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug425657.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug430120.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug449027.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug455906.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug465190.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug468528.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug470377_1.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug470377_2.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug470377_3.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug470377_4.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug514327_1.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug514327_2.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug514327_3.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_bug521905.js] [test_bug526598.js] [test_bug541420.js] @@ -39,6 +95,8 @@ tail = [test_bug554133.js] [test_bug559800.js] [test_bug563256.js] +# Bug 676992: test consistently fails on Android +fail-if = os == "android" [test_bug564030.js] [test_bug566626.js] [test_bug567184.js] @@ -53,6 +111,8 @@ tail = [test_bug596343.js] [test_bug596607.js] [test_bug616841.js] +# Bug 676992: test consistently fails on Android +fail-if = os == "android" [test_bug619730.js] [test_bug620837.js] [test_bug655254.js] @@ -63,9 +123,15 @@ tail = [test_disable.js] [test_distribution.js] [test_dss.js] +# Bug 676992: test consistently fails on Android +fail-if = os == "android" [test_duplicateplugins.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_error.js] [test_filepointer.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_fuel.js] [test_general.js] [test_getresource.js] @@ -83,6 +149,8 @@ tail = [test_gfxBlacklist_Vendor.js] [test_gfxBlacklist_prefs.js] [test_install.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_locale.js] [test_locked.js] [test_manifest.js] @@ -91,15 +159,29 @@ tail = [test_migrate3.js] [test_permissions.js] [test_plugins.js] +# Bug 676992: test consistently fails on Android +fail-if = os == "android" [test_registry.js] [test_safemode.js] [test_startup.js] +# Bug 676992: test consistently fails on Android +fail-if = os == "android" [test_targetPlatforms.js] [test_theme.js] +# Bug 676992: test consistently fails on Android +fail-if = os == "android" [test_types.js] [test_uninstall.js] [test_update.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_updatecheck.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_updateid.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" [test_upgrade.js] +# Bug 676992: test consistently hangs on Android +skip-if = os == "android" diff --git a/toolkit/mozapps/update/test_timermanager/unit/xpcshell.ini b/toolkit/mozapps/update/test_timermanager/unit/xpcshell.ini index 388743aa3eb..ade79f78441 100644 --- a/toolkit/mozapps/update/test_timermanager/unit/xpcshell.ini +++ b/toolkit/mozapps/update/test_timermanager/unit/xpcshell.ini @@ -3,3 +3,5 @@ head = tail = [test_0010_timermanager.js] +# Bug 676992: test consistently fails on Android +fail-if = os == "android" diff --git a/uriloader/exthandler/tests/unit/xpcshell.ini b/uriloader/exthandler/tests/unit/xpcshell.ini index 1ec0e6ce323..b7189cd2654 100644 --- a/uriloader/exthandler/tests/unit/xpcshell.ini +++ b/uriloader/exthandler/tests/unit/xpcshell.ini @@ -5,4 +5,6 @@ tail = tail_handlerService.js [test_getTypeFromExtension_ext_to_type_mapping.js] [test_getTypeFromExtension_with_empty_Content_Type.js] [test_handlerService.js] +# Bug 676997: test consistently fails on Android +fail-if = os == "android" [test_punycodeURIs.js] diff --git a/uriloader/exthandler/tests/unit_ipc/xpcshell.ini b/uriloader/exthandler/tests/unit_ipc/xpcshell.ini index a68bd041733..b77ef2600be 100644 --- a/uriloader/exthandler/tests/unit_ipc/xpcshell.ini +++ b/uriloader/exthandler/tests/unit_ipc/xpcshell.ini @@ -3,3 +3,5 @@ head = tail = [test_encoding.js] +# Bug 676995: test hangs consistently on Android +skip-if = os == "android" diff --git a/xpcom/tests/unit/xpcshell.ini b/xpcom/tests/unit/xpcshell.ini index 32a24de1666..d86c71c8b8a 100644 --- a/xpcom/tests/unit/xpcshell.ini +++ b/xpcom/tests/unit/xpcshell.ini @@ -6,8 +6,12 @@ tail = [test_bug332389.js] [test_bug333505.js] [test_bug364285-1.js] +# Bug 676998: test fails consistently on Android +fail-if = os == "android" [test_bug374754.js] [test_bug476919.js] +# Bug 676998: test fails consistently on Android +fail-if = os == "android" [test_bug478086.js] [test_bug656331.js] [test_compmgr_warnings.js] @@ -15,6 +19,8 @@ tail = [test_file_equality.js] [test_hidden_files.js] [test_home.js] +# Bug 676998: test fails consistently on Android +fail-if = os == "android" [test_iniProcessor.js] [test_ioutil.js] [test_localfile.js] @@ -28,5 +34,9 @@ skip-if = os == "win" # See bug: 676412 [test_streams.js] [test_stringstream.js] [test_symlinks.js] +# Bug 676998: test fails consistently on Android +fail-if = os == "android" [test_systemInfo.js] +# Bug 676998: test fails consistently on Android +fail-if = os == "android" [test_versioncomparator.js] From 349c3fd90dd37e1dbf82b9a49c9492e440ac6ea6 Mon Sep 17 00:00:00 2001 From: Geoff Brown Date: Mon, 22 Aug 2011 09:00:50 +0100 Subject: [PATCH 10/10] Bug 668351 - Add make targets to run xpcshell tests on Android; r=jmaher --- config/rules.mk | 31 +++++++++++++++++++++++++++++++ js/src/config/rules.mk | 31 +++++++++++++++++++++++++++++++ testing/testsuite-targets.mk | 23 +++++++++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/config/rules.mk b/config/rules.mk index 451ce614144..d2bf49060f8 100644 --- a/config/rules.mk +++ b/config/rules.mk @@ -153,6 +153,20 @@ xpcshell-tests: $(LIBXUL_DIST)/bin/xpcshell \ $(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir)) +xpcshell-tests-remote: DM_TRANS?=adb +xpcshell-tests-remote: + $(PYTHON) -u $(topsrcdir)/config/pythonpath.py \ + -I$(topsrcdir)/build \ + -I$(topsrcdir)/build/mobile \ + $(topsrcdir)/testing/xpcshell/remotexpcshelltests.py \ + --symbols-path=$(DIST)/crashreporter-symbols \ + --build-info-json=$(DEPTH)/mozinfo.json \ + $(EXTRA_TEST_ARGS) \ + --dm_trans=$(DM_TRANS) \ + --deviceIP=${TEST_DEVICE} \ + --objdir=$(DEPTH) \ + $(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir)) + # Execute a single test, specified in $(SOLO_FILE), but don't automatically # start the test. Instead, present the xpcshell prompt so the user can # attach a debugger and then start the test. @@ -182,6 +196,23 @@ check-one: $(LIBXUL_DIST)/bin/xpcshell \ $(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir)) +check-one-remote: DM_TRANS?=adb +check-one-remote: + $(PYTHON) -u $(topsrcdir)/config/pythonpath.py \ + -I$(topsrcdir)/build \ + -I$(topsrcdir)/build/mobile \ + $(testxpcsrcdir)/remotexpcshelltests.py \ + --symbols-path=$(DIST)/crashreporter-symbols \ + --build-info-json=$(DEPTH)/mozinfo.json \ + --test-path=$(SOLO_FILE) \ + --profile-name=$(MOZ_APP_NAME) \ + --verbose \ + $(EXTRA_TEST_ARGS) \ + --dm_trans=$(DM_TRANS) \ + --deviceIP=${TEST_DEVICE} \ + --objdir=$(DEPTH) \ + --noSetup \ + $(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir)) endif # XPCSHELL_TESTS ifdef CPP_UNIT_TESTS diff --git a/js/src/config/rules.mk b/js/src/config/rules.mk index 451ce614144..d2bf49060f8 100644 --- a/js/src/config/rules.mk +++ b/js/src/config/rules.mk @@ -153,6 +153,20 @@ xpcshell-tests: $(LIBXUL_DIST)/bin/xpcshell \ $(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir)) +xpcshell-tests-remote: DM_TRANS?=adb +xpcshell-tests-remote: + $(PYTHON) -u $(topsrcdir)/config/pythonpath.py \ + -I$(topsrcdir)/build \ + -I$(topsrcdir)/build/mobile \ + $(topsrcdir)/testing/xpcshell/remotexpcshelltests.py \ + --symbols-path=$(DIST)/crashreporter-symbols \ + --build-info-json=$(DEPTH)/mozinfo.json \ + $(EXTRA_TEST_ARGS) \ + --dm_trans=$(DM_TRANS) \ + --deviceIP=${TEST_DEVICE} \ + --objdir=$(DEPTH) \ + $(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir)) + # Execute a single test, specified in $(SOLO_FILE), but don't automatically # start the test. Instead, present the xpcshell prompt so the user can # attach a debugger and then start the test. @@ -182,6 +196,23 @@ check-one: $(LIBXUL_DIST)/bin/xpcshell \ $(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir)) +check-one-remote: DM_TRANS?=adb +check-one-remote: + $(PYTHON) -u $(topsrcdir)/config/pythonpath.py \ + -I$(topsrcdir)/build \ + -I$(topsrcdir)/build/mobile \ + $(testxpcsrcdir)/remotexpcshelltests.py \ + --symbols-path=$(DIST)/crashreporter-symbols \ + --build-info-json=$(DEPTH)/mozinfo.json \ + --test-path=$(SOLO_FILE) \ + --profile-name=$(MOZ_APP_NAME) \ + --verbose \ + $(EXTRA_TEST_ARGS) \ + --dm_trans=$(DM_TRANS) \ + --deviceIP=${TEST_DEVICE} \ + --objdir=$(DEPTH) \ + --noSetup \ + $(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir)) endif # XPCSHELL_TESTS ifdef CPP_UNIT_TESTS diff --git a/testing/testsuite-targets.mk b/testing/testsuite-targets.mk index c5981144829..5fa80b17886 100644 --- a/testing/testsuite-targets.mk +++ b/testing/testsuite-targets.mk @@ -201,6 +201,29 @@ xpcshell-tests: $(TEST_PATH_ARG) $(EXTRA_TEST_ARGS) \ $(LIBXUL_DIST)/bin/xpcshell +REMOTE_XPCSHELL = \ + rm -f ./$@.log && \ + $(PYTHON) -u $(topsrcdir)/config/pythonpath.py \ + -I$(topsrcdir)/build \ + -I$(topsrcdir)/build/mobile \ + $(topsrcdir)/testing/xpcshell/remotexpcshelltests.py \ + --manifest=$(DEPTH)/_tests/xpcshell/xpcshell.ini \ + --build-info-json=$(DEPTH)/mozinfo.json \ + --no-logfiles \ + --dm_trans=$(DM_TRANS) \ + --deviceIP=${TEST_DEVICE} \ + --objdir=$(DEPTH) \ + $(SYMBOLS_PATH) \ + $(TEST_PATH_ARG) $(EXTRA_TEST_ARGS) + +xpcshell-tests-remote: DM_TRANS?=adb +xpcshell-tests-remote: + @if [ "${TEST_DEVICE}" != "" -o "$(DM_TRANS)" = "adb" ]; \ + then $(call REMOTE_XPCSHELL); $(CHECK_TEST_ERROR); \ + else \ + echo "please prepare your host with environment variables for TEST_DEVICE"; \ + fi + # install and run the mozmill tests $(DEPTH)/_tests/mozmill: $(MAKE) -C $(DEPTH)/testing/mozmill install-develop PKG_STAGE=../../_tests