GUI -- Created Mock WebSocket Server (runs with node.js)
- moved test scenario events to directory in test branch.

Change-Id: I1f94a9b4c844be1ea2633de0c74d49ebf5a770a7
diff --git a/web/gui/src/test/_karma/wssrv.js b/web/gui/src/test/_karma/wssrv.js
new file mode 100644
index 0000000..e0a8773
--- /dev/null
+++ b/web/gui/src/test/_karma/wssrv.js
@@ -0,0 +1,114 @@
+#!/usr/bin/env node
+// === Mock Web Socket Server - for testing the topology view
+//
+
+var readline = require('readline');
+var WebSocketServer = require('websocket').server;
+var http = require('http');
+var port = 8123;
+
+
+var server = http.createServer(function(request, response) {
+    console.log((new Date()) + ' Received request for ' + request.url);
+    response.writeHead(404);
+    response.end();
+});
+
+server.listen(port, function() {
+    console.log((new Date()) + ' Server is listening on port ' + port);
+});
+
+server.on('listening', function () {
+    console.log('ok, server is running');
+});
+
+var wsServer = new WebSocketServer({
+    httpServer: server,
+    // You should not use autoAcceptConnections for production
+    // applications, as it defeats all standard cross-origin protection
+    // facilities built into the protocol and the browser.  You should
+    // *always* verify the connection's origin and decide whether or not
+    // to accept it.
+    autoAcceptConnections: false
+});
+
+function originIsAllowed(origin) {
+    // put logic here to detect whether the specified origin is allowed.
+    return true;
+}
+
+var connection;
+
+wsServer.on('request', function(request) {
+    console.log(); // newline after prompt
+    console.log("Origin: ", request.origin);
+
+    if (!originIsAllowed(request.origin)) {
+        // Make sure we only accept requests from an allowed origin
+        request.reject();
+        console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.');
+        return;
+    }
+
+    connection = request.accept(null, request.origin);
+
+
+    console.log((new Date()) + ' Connection accepted.');
+    rl.prompt();
+
+
+    connection.on('message', function(message) {
+        if (message.type === 'utf8') {
+            console.log(); // newline after prompt
+            console.log('Received Message: ' + message.utf8Data);
+            //connection.sendUTF(message.utf8Data);
+            rl.prompt();
+        }
+        else if (message.type === 'binary') {
+            console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');
+            //connection.sendBytes(message.binaryData);
+        }
+    });
+    connection.on('close', function(reasonCode, description) {
+        console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
+    });
+});
+
+
+var rl = readline.createInterface(process.stdin, process.stdout);
+rl.setPrompt('ws> ');
+
+setTimeout(doCli, 10);
+
+function doCli() {
+    rl.prompt();
+    rl.on('line', function (line) {
+        var words = line.trim().split(' '),
+            cmd = words.shift(),
+            str = words.join(' ');
+
+        switch(cmd) {
+            case 'hello':
+                console.log('hello back: ' + str);
+                break;
+
+            case 'quit':
+                process.exit(0);
+                break;
+
+            case 'm':
+                console.log('sending message: ' + str);
+                connection.sendUTF(str);
+                break;
+
+            default:
+                console.log('Say what?! [' + line.trim() + ']');
+                break;
+        }
+        rl.prompt();
+    }).on('close', function () {
+        console.log('quitting...');
+        process.exit(0);
+    });
+
+}