You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2012/09/18 16:38:23 UTC

[4/6] spec commit: Refactor bridge benchmark page.

Refactor bridge benchmark page.

- Add an initial delay
- Add a delay between tests
- Don't use setTimeout
- Measure more permutations.


Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-mobile-spec/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-mobile-spec/commit/c0725888
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-mobile-spec/tree/c0725888
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-mobile-spec/diff/c0725888

Branch: refs/heads/master
Commit: c0725888817bf8df5a6fa11013392f7d3589f4c9
Parents: 822f5d4
Author: Andrew Grieve <ag...@chromium.org>
Authored: Fri Sep 14 16:17:53 2012 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Tue Sep 18 09:58:17 2012 -0400

----------------------------------------------------------------------
 autotest/tests/bridge.tests.js |  215 ++++++++++++-----------------------
 1 files changed, 73 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cordova-mobile-spec/blob/c0725888/autotest/tests/bridge.tests.js
----------------------------------------------------------------------
diff --git a/autotest/tests/bridge.tests.js b/autotest/tests/bridge.tests.js
index f34e2fd..ec363d7 100644
--- a/autotest/tests/bridge.tests.js
+++ b/autotest/tests/bridge.tests.js
@@ -27,50 +27,41 @@
 */
 var FENCEPOST = 9000;
 
-var exec = cordova.require('cordova/exec');
-
-var echo = cordova.require('cordova/plugin/echo'),
-            startTime = +new Date,
-            callCount = 0,
-            durationMs = 1000,
-            asyncEcho = true,
-            useSetTimeout = true,
-            payloadSize = 5,
-            callsPerSecond = 0,
-            completeSpy = null, 
-            payload = new Array(payloadSize * 10 + 1).join('012\n\n 6789');
+var exec = cordova.require('cordova/exec'),
+    echo = cordova.require('cordova/plugin/echo'),
+    startTime,
+    endTime,
+    callCount,
+    durationMs = 1000,
+    asyncEcho,
+    useSetTimeout,
+    payloadSize,
+    payload;
 
 var vanillaWin = function(result) {
-            callCount++;
-            if (result != payload) {
-                console.log('Wrong echo data!');
-            }
-            var elapsedMs = new Date - startTime;
-            if (elapsedMs < durationMs) {
-                if (useSetTimeout) {
-                    setTimeout(echoMessage, 0);
-                } else {
-                    echoMessage();
-                }
-            } else {
-               callsPerSecond = callCount * 1000 / elapsedMs;
-               console.log('Calls per second: ' + callsPerSecond);
-               if(completeSpy != null)
-                completeSpy();
-            }
+    callCount++;
+    if (result != payload) {
+        console.log('Wrong echo data!');
+    }
+    var elapsedMs = new Date - startTime;
+    if (elapsedMs < durationMs) {
+        if (useSetTimeout) {
+            setTimeout(echoMessage, 0);
+        } else {
+            echoMessage();
         }
+    } else {
+        endTime = +new Date;
+    }
+}
 
 var reset = function()
 {
-            startTime = +new Date,
-            callCount = 0,
-            durationMs = 1000,
-            asyncEcho = true,
-            useSetTimeout = true,
-            payloadSize = 5,
-            callsPerSecond = 0,
-            completeSpy = null,
-            payload = new Array(payloadSize * 10 + 1).join('012\n\n 6789');
+    endTime = null;
+    callCount = 0;
+    useSetTimeout = false;
+    payloadSize = 5;
+    callsPerSecond = 0;
 }
 
 var echoMessage = function()
@@ -78,120 +69,60 @@ var echoMessage = function()
     echo(vanillaWin, fail, payload, asyncEcho);
 }
 
-var fail = jasmine.createSpy();
-
-describe('The JS to Native Bridge', function() {
+var fail = function() {
+    expect(false).toBe(true);
+};
 
-    //Run the reset
-    beforeEach(function() {
+function createTestCase(jsToNativeModeName, nativeToJsModeName, testAsyncEcho) {
+    it(jsToNativeModeName + '+' + nativeToJsModeName, function() {
+        expect(exec.jsToNativeModes[jsToNativeModeName]).toBeDefined();
+        expect(exec.nativeToJsModes[nativeToJsModeName]).toBeDefined();
         reset();
-    });
+        payload = new Array(payloadSize * 10 + 1).join('012\n\n 6789');
+        asyncEcho = testAsyncEcho;
+        exec.setJsToNativeBridgeMode(exec.jsToNativeModes[jsToNativeModeName]);
+        exec.setNativeToJsBridgeMode(exec.nativeToJsModes[nativeToJsModeName]);
 
-    it('should work with prompt', function() {
-        exec.setJsToNativeBridgeMode(0);
-        var win = jasmine.createSpy().andCallFake(function(r) {
-            vanillaWin(r);
-        });
-        completeSpy = jasmine.createSpy();
-        runs(function() { 
-            echo(win, fail, payload, asyncEcho);
+        waits(300);
+        runs(function() {
+            startTime = +new Date,
+            echoMessage();
         });
-        waitsFor(function() { return completeSpy.wasCalled; }, "never completed", durationMs * 2);
-        runs(function() { 
+        waitsFor(function() { return endTime; }, "never completed", durationMs * 2);
+        runs(function() {
+            var elapsedMs = endTime - startTime,
+                callsPerSecond = callCount * 1000 / elapsedMs;
             expect(callsPerSecond).toBeGreaterThan(FENCEPOST);
         });
     });
-    it("should work with jsObject", function() {
-        exec.setJsToNativeBridgeMode(1);
-        var win = jasmine.createSpy().andCallFake(function(r) {
-            vanillaWin(r);
-        });
-        completeSpy = jasmine.createSpy();
-        runs(function() { 
-            echo(win, fail, payload, asyncEcho);
-        });
-        waitsFor(function() { return completeSpy.wasCalled; }, "never completed", durationMs * 2);
-        runs(function() { 
-            expect(callsPerSecond).toBeGreaterThan(FENCEPOST);
-        });
+};
+
+// Wait so that the first benchmark doesn't have contention.
+describe('Wait for page to load.', function() {
+    it('waiting...', function() {
+        waits(1000);
     });
 });
 
-describe("The Native to JS Bridge", function() {
+// Before running on Android, set the following constants in NativeToJsMessagingBridge:
+// - ENABLE_LOCATION_CHANGE_EXEC_MODE = true
+// - DISABLE_EXEC_CHAINING = true
+describe('Android bridge with', function() {
+    var testAsyncEcho = false;
+    createTestCase('PROMPT', 'POLLING', testAsyncEcho);
+    createTestCase('JS_OBJECT', 'POLLING', testAsyncEcho);
+    createTestCase('LOCATION_CHANGE', 'ONLINE_EVENT', testAsyncEcho);
 
-    //Run the reset
-    beforeEach(function() {
-        reset();
-    });
+    testAsyncEcho = true;
+    createTestCase('PROMPT', 'POLLING', testAsyncEcho);
+    createTestCase('PROMPT', 'HANGING_GET', testAsyncEcho);
+    createTestCase('PROMPT', 'LOAD_URL', testAsyncEcho);
+    createTestCase('PROMPT', 'ONLINE_EVENT', testAsyncEcho);
+    createTestCase('PROMPT', 'PRIVATE_API', testAsyncEcho);
 
-    it("should work with polling", function() {
-       exec.setNativeToJsBridgeMode(0);
-        var win = jasmine.createSpy().andCallFake(function(r) {
-            vanillaWin(r);
-        });
-        completeSpy = jasmine.createSpy();
-        runs(function() { 
-            echo(win, fail, payload, asyncEcho);
-        });
-        waitsFor(function() { return completeSpy.wasCalled; }, "never completed", durationMs * 2);
-        runs(function() { 
-            expect(callsPerSecond).toBeGreaterThan(FENCEPOST);
-        });
-    });
-    it("should work with hanging get", function() {
-        exec.setNativeToJsBridgeMode(1);
-        var win = jasmine.createSpy().andCallFake(function(r) {
-            vanillaWin(r);
-        });
-        completeSpy = jasmine.createSpy();
-        runs(function() { 
-            echo(win, fail, payload, asyncEcho);
-        });
-        waitsFor(function() { return completeSpy.wasCalled; }, "never completed", durationMs * 2);
-        runs(function() { 
-            expect(callsPerSecond).toBeGreaterThan(FENCEPOST);
-        });
-    });
-    it("should work with load_url (not on emulator)", function() {
-       exec.setNativeToJsBridgeMode(2);
-        var win = jasmine.createSpy().andCallFake(function(r) {
-            vanillaWin(r);
-        });
-        completeSpy = jasmine.createSpy();
-        runs(function() { 
-            echo(win, fail, payload, asyncEcho);
-        });
-        waitsFor(function() { return completeSpy.wasCalled; }, "never completed", durationMs * 2);
-        runs(function() { 
-            expect(callsPerSecond).toBeGreaterThan(FENCEPOST);
-        });
-    });
-    it("should work with online event", function() {
-        exec.setNativeToJsBridgeMode(3);
-        var win = jasmine.createSpy().andCallFake(function(r) {
-            vanillaWin(r);
-        });
-        completeSpy = jasmine.createSpy();
-        runs(function() { 
-            echo(win, fail, payload, asyncEcho);
-        });
-        waitsFor(function() { return completeSpy.wasCalled; }, "never completed", durationMs * 2);
-        runs(function() { 
-            expect(callsPerSecond).toBeGreaterThan(FENCEPOST);
-        });
-    });
-    it("should work with the private api", function() {
-        exec.setNativeToJsBridgeMode(4);
-        var win = jasmine.createSpy().andCallFake(function(r) {
-            vanillaWin(r);
-        });
-        completeSpy = jasmine.createSpy();
-        runs(function() { 
-            echo(win, fail, payload, asyncEcho);
-        });
-        waitsFor(function() { return completeSpy.wasCalled; }, "never completed", durationMs * 2);
-        runs(function() { 
-            expect(callsPerSecond).toBeGreaterThan(FENCEPOST);
-        });
-    });
+    createTestCase('JS_OBJECT', 'POLLING', testAsyncEcho);
+    createTestCase('JS_OBJECT', 'HANGING_GET', testAsyncEcho);
+    createTestCase('JS_OBJECT', 'LOAD_URL', testAsyncEcho);
+    createTestCase('JS_OBJECT', 'ONLINE_EVENT', testAsyncEcho);
+    createTestCase('JS_OBJECT', 'PRIVATE_API', testAsyncEcho);
 });