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/11/05 18:54:05 UTC

[1/4] js commit: [ios] Add unit tests for exec bridge.

Updated Branches:
  refs/heads/master 3ae88d121 -> 678f1dc0d


[ios] Add unit tests for exec bridge.


Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/commit/678f1dc0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/tree/678f1dc0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/diff/678f1dc0

Branch: refs/heads/master
Commit: 678f1dc0de388ea0b593b2c918b1957157cde58f
Parents: c4362c7
Author: Andrew Grieve <ag...@chromium.org>
Authored: Sun Nov 4 17:40:32 2012 -0800
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Mon Nov 5 12:53:38 2012 -0500

----------------------------------------------------------------------
 lib/test/iosexec.js   |    1 +
 test/ios/test.exec.js |  120 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 121 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/678f1dc0/lib/test/iosexec.js
----------------------------------------------------------------------
diff --git a/lib/test/iosexec.js b/lib/test/iosexec.js
new file mode 120000
index 0000000..7979e03
--- /dev/null
+++ b/lib/test/iosexec.js
@@ -0,0 +1 @@
+../ios/exec.js
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/678f1dc0/test/ios/test.exec.js
----------------------------------------------------------------------
diff --git a/test/ios/test.exec.js b/test/ios/test.exec.js
new file mode 100644
index 0000000..df4748e
--- /dev/null
+++ b/test/ios/test.exec.js
@@ -0,0 +1,120 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+describe('iOS exec', function () {
+    var SERVICE = 'TestService';
+    var ACTION = 'TestAction';
+    var VC_ADDR = '1234';
+
+    var cordova = require('cordova');
+    var exec = require('cordova/iosexec');
+    var mockxhr = require('cordova/mockxhr');
+    var winSpy = jasmine.createSpy('win');
+    var failSpy = jasmine.createSpy('fail');
+
+    beforeEach(function() {
+        winSpy.reset();
+        failSpy.reset();
+        mockxhr.install();
+        exec.setJsToNativeBridgeMode(exec.jsToNativeModes.XHR_NO_PAYLOAD);
+        cordova.iOSVCAddr = VC_ADDR;
+    });
+
+    afterEach(function() {
+        expect(mockxhr.activeXhrs.length).toBe(0);
+    });
+
+    afterEach(mockxhr.uninstall);
+
+    function expectXhr() {
+        expect(mockxhr.activeXhrs.length).toBeGreaterThan(0, 'expected an XHR to have been sent.');
+        var mockXhr = mockxhr.activeXhrs[0];
+        expect(mockXhr.url).toBe('/!gap_exec');
+        expect(mockXhr.requestHeaders['vc']).toBe(VC_ADDR, 'missing vc header');
+        expect(mockXhr.requestHeaders['rc']).toBeDefined('missing rc header.');
+        expect(mockXhr.requestHeaders['cmds']).not.toBeDefined();
+        expect(mockXhr.requestPayload).toBe(null);
+        mockXhr.simulateResponse(200, '');
+    }
+
+    function simulateNativeBehaviour(codes) {
+        var execPayload = JSON.parse(exec.nativeFetchMessages());
+        while (execPayload.length && codes.length) {
+            var curPayload = execPayload.shift();
+            var callbackId = curPayload[0];
+            var moreResults = exec.nativeCallback(callbackId, codes.shift(), 'payload', false);
+            if (moreResults) {
+                execPayload.push.apply(execPayload, JSON.parse(moreResults));
+            }
+        }
+        expect(codes.length).toBe(0, 'Wrong number of results.');
+    }
+
+    describe('exec', function() {
+        it('should return "" from nativeFetchMessages work when nothing is pending.', function() {
+            var execPayload = exec.nativeFetchMessages();
+            expect(execPayload).toBe('');
+        });
+        it('should work in the win case.', function() {
+            exec(winSpy, failSpy, SERVICE, ACTION, []);
+            expectXhr();
+            simulateNativeBehaviour([1]);
+            expect(winSpy).toHaveBeenCalledWith('payload');
+            expect(failSpy).not.toHaveBeenCalled();
+        });
+        it('should work in the fail case.', function() {
+            exec(winSpy, failSpy, SERVICE, ACTION, []);
+            expectXhr();
+            simulateNativeBehaviour([2]);
+            expect(winSpy).not.toHaveBeenCalled();
+            expect(failSpy).toHaveBeenCalledWith('payload');
+        });
+        it('should use only one XHR for multiple calls.', function() {
+            exec(winSpy, failSpy, SERVICE, ACTION, []);
+            exec(winSpy, failSpy, SERVICE, ACTION, []);
+            expectXhr();
+            simulateNativeBehaviour([1, 2]);
+            expect(winSpy).toHaveBeenCalledWith('payload');
+            expect(failSpy).toHaveBeenCalledWith('payload');
+        });
+        it('should send an extra XHR when commands flushed before XHR finishes', function() {
+            exec(winSpy, failSpy, SERVICE, ACTION, []);
+            simulateNativeBehaviour([1]);
+            exec(winSpy, failSpy, SERVICE, ACTION, []);
+            expectXhr();
+            expectXhr();
+            simulateNativeBehaviour([2]);
+            expect(winSpy).toHaveBeenCalledWith('payload');
+            expect(failSpy).toHaveBeenCalledWith('payload');
+        });
+        it('should return pending calls made from callbacks.', function() {
+            function callMore() {
+                exec(winSpy, failSpy, SERVICE, ACTION, []);
+                exec(winSpy, failSpy, SERVICE, ACTION, []);
+            }
+            exec(callMore, failSpy, SERVICE, ACTION, []);
+            expectXhr();
+            simulateNativeBehaviour([1, 1, 1]);
+            expect(winSpy.callCount).toBe(2);
+            expect(failSpy).not.toHaveBeenCalled();
+        });
+    });
+});