Bug 674738 - Geolocation XPCShell test really slow on Windows 7 build slave. r=jdm/dougt
authorJosh Matthews <josh@joshmatthews.net>
Wed, 24 Aug 2011 11:36:00 -0400
changeset 75866 9311205748c32bc145ec6c6c42299c1beb735f2f
parent 75865 1a1dbcc15b7e7374a5c1368e5a29ab0060feef5d
child 75867 31c4c7ad46d88516ed660bb6abfa6c0891c4e2bf
push id3
push userfelipc@gmail.com
push dateFri, 30 Sep 2011 20:09:13 +0000
reviewersjdm, dougt
bugs674738
milestone9.0a1
Bug 674738 - Geolocation XPCShell test really slow on Windows 7 build slave. r=jdm/dougt
dom/tests/unit/test_geolocation_provider.js
--- a/dom/tests/unit/test_geolocation_provider.js
+++ b/dom/tests/unit/test_geolocation_provider.js
@@ -1,41 +1,80 @@
+do_load_httpd_js();
 
-const Ci = Components.interfaces;
-const Cc = Components.classes;
+var httpserver = null;
+var geolocation = null;
+var success = false;
+var watchId = -1;
 
-function successCallback(pos){}
+function terminate(succ) {
+      success = succ;
+      geolocation.clearWatch(watchID);
+    }
+
+function successCallback(pos){ terminate(true); }
+function errorCallback(pos) { terminate(false); } 
 
 var observer = {
     QueryInterface: function(iid) {
 	if (iid.equals(Components.interfaces.nsISupports) ||
 	    iid.equals(Components.interfaces.nsIObserver))
 	    return this;
 	throw Components.results.NS_ERROR_NO_INTERFACE;
     },
 
     observe: function(subject, topic, data) {
-	if (data == "shutdown") {
-	    do_check_true(1)
-	    do_test_finished();
-	}
-	else if (data == "starting") {
-	    do_check_true(1)
-	}
+        if (data == "shutdown") {
+            do_check_true(1);
+            this._numProviders--;
+            if (!this._numProviders) {
+                httpserver.stop(function() {
+                        do_check_true(success);
+                        do_test_finished();
+                    });
+            }
+        }
+        else if (data == "starting") {
+            do_check_true(1);
+            this._numProviders++;
+        }
+    },
 
-    },
+    _numProviders: 0,
 };
 
+function geoHandler(metadata, response)
+{
+    var georesponse = {
+        status: "OK",
+        location: {
+            lat: 42,
+            lng: 42,
+        },
+        accuracy: 42,
+    };
+  var position = JSON.stringify(georesponse);
+  response.setStatusLine("1.0", 200, "OK");
+  response.setHeader("Cache-Control", "no-cache", false);
+  response.setHeader("Content-Type", "aplication/x-javascript", false);
+  response.write(position);
+}
 
 function run_test()
 {
     // only kill this test when shutdown is called on the provider.
     do_test_pending();
+  
+    httpserver = new nsHttpServer();
+    httpserver.registerPathHandler("/geo", geoHandler);
+    httpserver.start(4444);
+  
+    var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
+    prefs.setCharPref("geo.wifi.uri", "http://localhost:4444/geo");
 
     var obs = Cc["@mozilla.org/observer-service;1"].getService();
     obs = obs.QueryInterface(Ci.nsIObserverService);
     obs.addObserver(observer, "geolocation-device-events", false); 
 
-    var geolocation = Cc["@mozilla.org/geolocation;1"].getService(Ci.nsIDOMGeoGeolocation);
-    var watchID = geolocation.watchPosition(successCallback);
-    do_timeout(1000, function() { geolocation.clearWatch(watchID);})
+    geolocation = Cc["@mozilla.org/geolocation;1"].getService(Ci.nsIDOMGeoGeolocation);
+    watchID = geolocation.watchPosition(successCallback, errorCallback);
 }