]> source.dussan.org Git - nextcloud-server.git/commitdiff
Added unit tests for session_keepalive / heartbeat
authorVincent Petry <pvince81@owncloud.com>
Tue, 4 Feb 2014 12:56:41 +0000 (13:56 +0100)
committerVincent Petry <pvince81@owncloud.com>
Tue, 4 Feb 2014 12:56:41 +0000 (13:56 +0100)
core/js/tests/specHelper.js
core/js/tests/specs/coreSpec.js

index 4a30878df514b8b559baa246688997ad2a98a60d..1848d08354e02c7c500dbd93e668f39aa03ef61c 100644 (file)
@@ -19,6 +19,8 @@
 *
 */
 
+/* global OC */
+
 /**
  * Simulate the variables that are normally set by PHP code
  */
@@ -57,10 +59,15 @@ window.oc_webroot = location.href + '/';
 window.oc_appswebroots = {
        "files": window.oc_webroot + '/apps/files/'
 };
+window.oc_config = {
+       session_lifetime: 600 * 1000,
+       session_keepalive: false
+};
 
 // global setup for all tests
 (function setupTests() {
-       var fakeServer = null;
+       var fakeServer = null,
+               routesRequestStub;
 
        beforeEach(function() {
                // enforce fake XHR, tests should not depend on the server and
@@ -78,9 +85,18 @@ window.oc_appswebroots = {
                // make it globally available, so that other tests can define
                // custom responses
                window.fakeServer = fakeServer;
+
+               OC.Router.routes = [];
+               OC.Router.routes_request = {
+                       state: sinon.stub().returns('resolved'),
+                       done: sinon.stub()
+               };
        });
 
        afterEach(function() {
+               OC.Router.routes_request.state.reset();
+               OC.Router.routes_request.done.reset();
+
                // uncomment this to log requests
                // console.log(window.fakeServer.requests);
                fakeServer.restore();
index 28c20a0642ee20edde16f36a1ec5b5c66761b202..18652d4177f97b3426fee48814cbeba830a7a32d 100644 (file)
@@ -104,4 +104,78 @@ describe('Core base tests', function() {
                        })).toEqual('number=123');
                });
        });
+       describe('Session heartbeat', function() {
+               var clock,
+                       oldConfig,
+                       loadedStub,
+                       routeStub,
+                       counter;
+
+               beforeEach(function() {
+                       clock = sinon.useFakeTimers();
+                       oldConfig = window.oc_config;
+                       loadedStub = sinon.stub(OC.Router, 'registerLoadedCallback');
+                       routeStub = sinon.stub(OC.Router, 'generate').returns('/heartbeat');
+                       counter = 0;
+
+                       fakeServer.autoRespond = true;
+                       fakeServer.autoRespondAfter = 0;
+                       fakeServer.respondWith(/\/heartbeat/, function(xhr) {
+                               counter++;
+                               xhr.respond(200, {'Content-Type': 'application/json'}, '{}');
+                       });
+               });
+               afterEach(function() {
+                       clock.restore();
+                       window.oc_config = oldConfig;
+                       loadedStub.restore();
+                       routeStub.restore();
+               });
+               it('sends heartbeat half the session lifetime when heartbeat enabled', function() {
+                       window.oc_config = {
+                               session_keepalive: true,
+                               session_lifetime: 300
+                       };
+                       window.initCore();
+                       expect(loadedStub.calledOnce).toEqual(true);
+                       loadedStub.yield();
+                       expect(routeStub.calledWith('heartbeat')).toEqual(true);
+
+                       expect(counter).toEqual(0);
+
+                       // less than half, still nothing
+                       clock.tick(100 * 1000);
+                       expect(counter).toEqual(0);
+
+                       // reach past half (160), one call
+                       clock.tick(55 * 1000);
+                       expect(counter).toEqual(1);
+
+                       // almost there to the next, still one
+                       clock.tick(140 * 1000);
+                       expect(counter).toEqual(1);
+
+                       // past it, second call
+                       clock.tick(20 * 1000);
+                       expect(counter).toEqual(2);
+               });
+               it('does no send heartbeat when heartbeat disabled', function() {
+                       window.oc_config = {
+                               session_keepalive: false,
+                               session_lifetime: 300
+                       };
+                       window.initCore();
+                       expect(loadedStub.notCalled).toEqual(true);
+                       expect(routeStub.notCalled).toEqual(true);
+
+                       expect(counter).toEqual(0);
+
+                       clock.tick(1000000);
+
+                       // still nothing
+                       expect(counter).toEqual(0);
+               });
+
+       });
 });
+