Fix server crash on invalid LiveQuery socket event (#4533)

* add failing test for missing command message

* don't mock tv4.validate

* fix existing tests

* make request.op required

* Update comment
This commit is contained in:
fridays
2018-02-16 14:40:04 +01:00
committed by Florent Vilmart
parent ae349f3888
commit 8be7491595
2 changed files with 30 additions and 10 deletions

View File

@@ -41,11 +41,6 @@ describe('ParseLiveQueryServer', function() {
// Mock matchesQuery // Mock matchesQuery
var mockMatchesQuery = jasmine.createSpy('matchesQuery').and.returnValue(true); var mockMatchesQuery = jasmine.createSpy('matchesQuery').and.returnValue(true);
jasmine.mockLibrary('../src/LiveQuery/QueryTools', 'matchesQuery', mockMatchesQuery); jasmine.mockLibrary('../src/LiveQuery/QueryTools', 'matchesQuery', mockMatchesQuery);
// Mock tv4
var mockValidate = function() {
return true;
}
jasmine.mockLibrary('tv4', 'validate', mockValidate);
// Mock ParsePubSub // Mock ParsePubSub
var mockParsePubSub = { var mockParsePubSub = {
createPublisher: function() { createPublisher: function() {
@@ -350,7 +345,8 @@ describe('ParseLiveQueryServer', function() {
// Check connect request // Check connect request
var connectRequest = { var connectRequest = {
op: 'connect' op: 'connect',
applicationId: '1'
}; };
// Trigger message event // Trigger message event
parseWebSocket.emit('message', connectRequest); parseWebSocket.emit('message', connectRequest);
@@ -370,7 +366,11 @@ describe('ParseLiveQueryServer', function() {
parseLiveQueryServer._onConnect(parseWebSocket); parseLiveQueryServer._onConnect(parseWebSocket);
// Check subscribe request // Check subscribe request
var subscribeRequest = '{"op":"subscribe"}'; var subscribeRequest = JSON.stringify({
op: 'subscribe',
requestId: 1,
query: {className: 'Test', where: {}}
});
// Trigger message event // Trigger message event
parseWebSocket.emit('message', subscribeRequest); parseWebSocket.emit('message', subscribeRequest);
// Make sure _handleSubscribe is called // Make sure _handleSubscribe is called
@@ -390,7 +390,7 @@ describe('ParseLiveQueryServer', function() {
parseLiveQueryServer._onConnect(parseWebSocket); parseLiveQueryServer._onConnect(parseWebSocket);
// Check unsubscribe request // Check unsubscribe request
var unsubscribeRequest = '{"op":"unsubscribe"}'; var unsubscribeRequest = JSON.stringify({op: 'unsubscribe', requestId: 1});
// Trigger message event // Trigger message event
parseWebSocket.emit('message', unsubscribeRequest); parseWebSocket.emit('message', unsubscribeRequest);
// Make sure _handleUnsubscribe is called // Make sure _handleUnsubscribe is called
@@ -414,7 +414,11 @@ describe('ParseLiveQueryServer', function() {
parseLiveQueryServer._onConnect(parseWebSocket); parseLiveQueryServer._onConnect(parseWebSocket);
// Check updateRequest request // Check updateRequest request
var updateRequest = '{"op":"update"}'; var updateRequest = JSON.stringify({
op: 'update',
requestId: 1,
query: {className: 'Test', where: {}}
});
// Trigger message event // Trigger message event
parseWebSocket.emit('message', updateRequest); parseWebSocket.emit('message', updateRequest);
// Make sure _handleUnsubscribe is called // Make sure _handleUnsubscribe is called
@@ -428,6 +432,22 @@ describe('ParseLiveQueryServer', function() {
expect(parseLiveQueryServer._handleSubscribe).toHaveBeenCalled(); expect(parseLiveQueryServer._handleSubscribe).toHaveBeenCalled();
}); });
it('can set missing command message handler for a parseWebSocket', function() {
var parseLiveQueryServer = new ParseLiveQueryServer(10, 10, {});
// Make mock parseWebsocket
var EventEmitter = require('events');
var parseWebSocket = new EventEmitter();
// Register message handlers for the parseWebSocket
parseLiveQueryServer._onConnect(parseWebSocket);
// Check invalid request
var invalidRequest = '{}';
// Trigger message event
parseWebSocket.emit('message', invalidRequest);
var Client = require('../src/LiveQuery/Client').Client;
expect(Client.pushError).toHaveBeenCalled();
});
it('can set unknown command message handler for a parseWebSocket', function() { it('can set unknown command message handler for a parseWebSocket', function() {
var parseLiveQueryServer = new ParseLiveQueryServer(10, 10, {}); var parseLiveQueryServer = new ParseLiveQueryServer(10, 10, {});
// Make mock parseWebsocket // Make mock parseWebsocket
@@ -1193,7 +1213,6 @@ describe('ParseLiveQueryServer', function() {
jasmine.restoreLibrary('../src/LiveQuery/Subscription', 'Subscription'); jasmine.restoreLibrary('../src/LiveQuery/Subscription', 'Subscription');
jasmine.restoreLibrary('../src/LiveQuery/QueryTools', 'queryHash'); jasmine.restoreLibrary('../src/LiveQuery/QueryTools', 'queryHash');
jasmine.restoreLibrary('../src/LiveQuery/QueryTools', 'matchesQuery'); jasmine.restoreLibrary('../src/LiveQuery/QueryTools', 'matchesQuery');
jasmine.restoreLibrary('tv4', 'validate');
jasmine.restoreLibrary('../src/LiveQuery/ParsePubSub', 'ParsePubSub'); jasmine.restoreLibrary('../src/LiveQuery/ParsePubSub', 'ParsePubSub');
jasmine.restoreLibrary('../src/LiveQuery/SessionTokenCache', 'SessionTokenCache'); jasmine.restoreLibrary('../src/LiveQuery/SessionTokenCache', 'SessionTokenCache');
}); });

View File

@@ -7,6 +7,7 @@ const general = {
'enum': ['connect', 'subscribe', 'unsubscribe', 'update'] 'enum': ['connect', 'subscribe', 'unsubscribe', 'update']
}, },
}, },
'required': ['op']
}; };
const connect = { const connect = {