websocket-spec.js 4.14 KB
/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed 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.
 */

/*
 ONOS GUI -- Remote -- Web Socket Service - Unit Tests
 */
describe('factory: fw/remote/websocket.js', function () {
    var $log, fs, wss;

    beforeEach(module('onosRemote'));

    beforeEach(module(function($provide) {
        $provide.factory('$location', function (){
            return {
                protocol: function () { return 'http'; },
                host: function () { return 'foo'; },
                port: function () { return '80'; }
            };
        })
    }));

    beforeEach(inject(function (_$log_, FnService, WebSocketService) {
        $log = _$log_;
        fs = FnService;
        wss = WebSocketService;
    }));


    it('should define WebSocketService', function () {
        expect(wss).toBeDefined();
    });

    it('should define api functions', function () {
        expect(fs.areFunctions(wss, [
            'createWebSocket'
        ])).toBeTruthy();
    });

    it('should use the appropriate URL', function () {
        var ws = wss.createWebSocket('foo/path');
        expect(ws.meta.path).toEqual('ws://foo:80/onos/ui/ws/foo/path');
    });

    it('should use the appropriate URL with modified port', function () {
        var ws = wss.createWebSocket('foo/path', { wsport: 1243 });
        expect(ws.meta.path).toEqual('ws://foo:1243/onos/ui/ws/foo/path');
    });

    var oCalled, mCalled, cCalled, json, reason;

    function oo() {
        oCalled++;
    }
    function om(j) {
        mCalled++;
        json = j;
    }
    function oc(r) {
        cCalled++;
        reason = r;
    }

    function resetCounters() {
        oCalled = mCalled = cCalled = 0;
        json = reason = null;
    }

    function validateCallbacks(ws, op, msg, cl) {
        // we have to cheat a little, by digging into the websocket structure
        var onO = fs.isF(ws.meta.ws.onopen),
            onM = fs.isF(ws.meta.ws.onmessage),
            onC = fs.isF(ws.meta.ws.onclose);

        expect(!!onO).toEqual(op);
        expect(!!onM).toEqual(msg);
        expect(!!onC).toEqual(cl);

        onO && onO({});
        onM && onM({ data: '{ "item": "ivalue" }'});
        onC && onC({ reason: 'rvalue' });

        expect(oCalled).toEqual(op ? 1 : 0);
        expect(mCalled).toEqual(msg ? 1 : 0);
        expect(cCalled).toEqual(cl ? 1 : 0);

        expect(json).toEqual(msg ? { item: 'ivalue' } : null);
        expect(reason).toEqual(cl ? 'rvalue' : null);
    }

    it('should install the appropriate callbacks', function () {
        resetCounters();

        var ws = wss.createWebSocket('foo', {
            onOpen: oo,
            onMessage: om,
            onClose: oc
        });

        validateCallbacks(ws, true, true, true);
    });

    it('should install partial callbacks', function () {
        resetCounters();

        var ws = wss.createWebSocket('foo', {
            onOpen: oo,
            onMessage: om
        });

        validateCallbacks(ws, true, true, false);
    });

    it('should install no callbacks', function () {
        resetCounters();

        var ws = wss.createWebSocket('foo');

        validateCallbacks(ws, false, false, false);
    });

    // can't really test send without faking out the WebSocket.
/*
    it('should stringify objects for sending', function () {
        var ws = wss.createWebSocket('foo');
        ws.send({ item: 'itemVal' });

        // what to assert?
    });
*/

    it('should remove websocket reference on close', function () {
        var ws = wss.createWebSocket('foo');
        expect(ws.meta.ws instanceof WebSocket).toBeTruthy();

        ws.close();
        expect(ws.meta.ws).toBeNull();
    });
});