From 3d291f8cd6fdacfaab6e471b2dace735e58df67a Mon Sep 17 00:00:00 2001 From: Stefanie Hansen Date: Mon, 16 May 2016 21:01:40 -0700 Subject: [PATCH 1/5] chat program working, need tests --- chat.js | 17 +++++++++++++++++ clients.js | 0 package.json | 22 ++++++++++++++++++++++ test/chat-test.js | 16 ++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 chat.js create mode 100644 clients.js create mode 100644 package.json create mode 100644 test/chat-test.js diff --git a/chat.js b/chat.js new file mode 100644 index 0000000..a29771d --- /dev/null +++ b/chat.js @@ -0,0 +1,17 @@ +'use strict'; +const net = require('net'); +const sockets = []; + +net.createServer((socket) => { + sockets.push(socket); + socket.on('data', (chunk) => { + sockets.forEach((sock) => { + socket.name = 'Client' + sockets.indexOf(sock); + if (socket.name !== sock.name) { + socket.write(socket.name + ' says: ' + chunk.toString() + '\n') + } + }); + }) +}).listen(3000, () => { + console.log('listening on port 3000'); +}) diff --git a/clients.js b/clients.js new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json new file mode 100644 index 0000000..5fc4677 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "stefanie-hansen", + "version": "1.0.0", + "description": "chat server", + "main": "chat.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/stefuhnee/tcp_server.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/stefuhnee/tcp_server/issues" + }, + "homepage": "https://github.com/stefuhnee/tcp_server#readme" +} diff --git a/test/chat-test.js b/test/chat-test.js new file mode 100644 index 0000000..ca33a7d --- /dev/null +++ b/test/chat-test.js @@ -0,0 +1,16 @@ +const net = require('net'); + +function createClient(username) { + var client = net.connect(3000, () => { + client.write('My name is ' + username + '!\n'); + client.on('data', (chunk) => { + console.log('Message received from ' + chunk.toString().split('\s')[0].trim() + ': \n', chunk.toString()); + }) + }).on('error', (err) => { + console.log(err); + client.end(); + }); +} + +createClient('stefanie'); +createClient('bob'); From 7c1ff1f7d39cbbbe2a608b4749b002089add34e6 Mon Sep 17 00:00:00 2001 From: Stefanie Hansen Date: Mon, 16 May 2016 22:21:59 -0700 Subject: [PATCH 2/5] working on tests --- .gitignore | 1 + chat.js | 28 +++++++++++++++++----------- clients.js | 16 ++++++++++++++++ package.json | 5 ++++- test/chat-test.js | 42 ++++++++++++++++++++++++++++++++++++------ 5 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07e6e47 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/node_modules diff --git a/chat.js b/chat.js index a29771d..d23794a 100644 --- a/chat.js +++ b/chat.js @@ -2,16 +2,22 @@ const net = require('net'); const sockets = []; -net.createServer((socket) => { - sockets.push(socket); - socket.on('data', (chunk) => { - sockets.forEach((sock) => { - socket.name = 'Client' + sockets.indexOf(sock); - if (socket.name !== sock.name) { - socket.write(socket.name + ' says: ' + chunk.toString() + '\n') - } +module.exports = function() { + net.createServer((socket) => { + sockets.push(socket); + socket.on('data', (chunk) => { + sockets.forEach((sock) => { + socket.name = 'Client' + sockets.indexOf(sock); + if (socket.name !== sock.name) { + socket.write(socket.name + ' says: ' + chunk.toString() + '\n'); + } + if (module.parent) { + // for testing + socket.write('test received'); + } + }); }); + }).listen(3000, () => { + console.log('listening on port 3000'); }) -}).listen(3000, () => { - console.log('listening on port 3000'); -}) +} diff --git a/clients.js b/clients.js index e69de29..9ba7b66 100644 --- a/clients.js +++ b/clients.js @@ -0,0 +1,16 @@ +const net = require('net'); + +function createClient(username) { + let client = net.connect(3000, () => { + client.write('My name is ' + username + '!\n'); + client.on('data', (chunk) => { + console.log('Message received from ' + chunk.toString().split('\s')[0].trim() + ': \n', chunk.toString()); + }) + }).on('error', (err) => { + console.log(err); + client.end(); + }); +} + +createClient('stefanie'); +createClient('bob'); diff --git a/package.json b/package.json index 5fc4677..3a318ae 100644 --- a/package.json +++ b/package.json @@ -18,5 +18,8 @@ "bugs": { "url": "https://github.com/stefuhnee/tcp_server/issues" }, - "homepage": "https://github.com/stefuhnee/tcp_server#readme" + "homepage": "https://github.com/stefuhnee/tcp_server#readme", + "devDependencies": { + "mocha": "^2.4.5" + } } diff --git a/test/chat-test.js b/test/chat-test.js index ca33a7d..c2f63ef 100644 --- a/test/chat-test.js +++ b/test/chat-test.js @@ -1,10 +1,20 @@ +'use strict'; + const net = require('net'); +const expect = require('chai').expect; +const createServer = require('../chat.js'); +const data = {}; -function createClient(username) { - var client = net.connect(3000, () => { - client.write('My name is ' + username + '!\n'); +function createClient(clientName, done) { + let client = net.connect(3000, () => { + client.write('test'); + if (clientName === 'secondTest') { + client.write('test'); + } client.on('data', (chunk) => { - console.log('Message received from ' + chunk.toString().split('\s')[0].trim() + ': \n', chunk.toString()); + if (!data[clientName]) data[clientName] = ''; + data[clientName] += chunk.toString(); + done(); }) }).on('error', (err) => { console.log(err); @@ -12,5 +22,25 @@ function createClient(username) { }); } -createClient('stefanie'); -createClient('bob'); +describe('chat test suite', () => { + before(() => { + createServer(); + }) + beforeEach('initializes first client for multi-client tests', (done) => { + data['test'] = ''; + createClient('test', done); + }); + it('should receive data from the server', () => { + expect(data['test']).to.eql('test received'); + }) + before((done) => { + data['test'] = ''; + createClient('secondTest', done); + }) + it('should send data to clients that did not write it', () => { + expect(data['test']).to.eql('test receivedtest received'); + }) + it('should not send data to clients that wrote it', () => { + expect(data['secondTest']).to.eql('test received'); + }) +}) From 3caad9b41a1cfbedd960f0a6260bda43c5c99343 Mon Sep 17 00:00:00 2001 From: Stefanie Hansen Date: Mon, 16 May 2016 22:23:33 -0700 Subject: [PATCH 3/5] added chai as dependency in package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 3a318ae..e650494 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ }, "homepage": "https://github.com/stefuhnee/tcp_server#readme", "devDependencies": { + "chai": "^3.5.0", "mocha": "^2.4.5" } } From 3c1fafaaf3be6810f83dd75f7c213d270cd6901e Mon Sep 17 00:00:00 2001 From: Stefanie Hansen Date: Tue, 17 May 2016 12:15:50 -0700 Subject: [PATCH 4/5] tests working except when run by gulp --- chat.js | 31 ++++++++++------------ clients.js | 5 ++-- gulpfile.js | 65 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 +++ test/chat-test.js | 49 ++++++++++++++++++++++------------- 5 files changed, 115 insertions(+), 38 deletions(-) create mode 100644 gulpfile.js diff --git a/chat.js b/chat.js index d23794a..c0740ab 100644 --- a/chat.js +++ b/chat.js @@ -2,22 +2,17 @@ const net = require('net'); const sockets = []; -module.exports = function() { - net.createServer((socket) => { - sockets.push(socket); - socket.on('data', (chunk) => { - sockets.forEach((sock) => { - socket.name = 'Client' + sockets.indexOf(sock); - if (socket.name !== sock.name) { - socket.write(socket.name + ' says: ' + chunk.toString() + '\n'); - } - if (module.parent) { - // for testing - socket.write('test received'); - } - }); +net.createServer((socket) => { + sockets.push(socket); + socket.on('data', (chunk) => { + sockets.forEach((sock) => { + socket.name = 'Client' + sockets.indexOf(sock); + console.log(socket.name); + if (socket.name !== sock.name) { + socket.write(socket.name + ' says: ' + chunk.toString() + '\n'); + } }); - }).listen(3000, () => { - console.log('listening on port 3000'); - }) -} + }); +}).listen(3000, () => { + console.log('listening on port 3000'); +}); diff --git a/clients.js b/clients.js index 9ba7b66..b820a18 100644 --- a/clients.js +++ b/clients.js @@ -1,11 +1,12 @@ +'use strict'; const net = require('net'); function createClient(username) { let client = net.connect(3000, () => { client.write('My name is ' + username + '!\n'); client.on('data', (chunk) => { - console.log('Message received from ' + chunk.toString().split('\s')[0].trim() + ': \n', chunk.toString()); - }) + console.log('Message received from ' + chunk.toString().split('\s')[0].trim() + ':\n', chunk.toString()); + }); }).on('error', (err) => { console.log(err); client.end(); diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..c259763 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,65 @@ +'use strict'; + +const gulp = require('gulp'); +const mocha = require('gulp-mocha'); +const lint = require('gulp-eslint'); +const opts = { + 'extends': 'eslint:recommended', + 'ecmaFeatures': { + 'modules': true + }, + 'rules': { + 'no-alert': 0, + 'no-bitwise': 0, + 'camelcase': 1, + 'no-console': 1, + 'curly': 1, + 'eqeqeq': 0, + 'no-eq-null': 0, + 'guard-for-in': 1, + 'no-empty': 1, + 'no-use-before-define': 0, + 'no-obj-calls': 2, + 'no-unused-vars': 0, + 'new-cap': 1, + 'no-shadow': 0, + 'strict': 1, + 'no-invalid-regexp': 2, + 'comma-dangle': 2, + 'no-undef': 1, + 'no-new': 1, + 'no-extra-semi': 1, + 'no-debugger': 2, + 'no-caller': 1, + 'semi': 1, + 'quotes': 0, + 'no-unreachable': 2 + }, + 'globals': { + '$': false + }, + 'env': { + 'node': true, + 'es6': true + } +}; + +gulp.task('linter' , () => { + return gulp.src('./**/*.js') + .pipe(lint(opts)) + .pipe(lint.format()); +}); + +gulp.task('tests', () => { + return gulp.src('./test/chat-test.js', {read: false}) + .pipe(mocha({reporter: 'spec'})); +}); + +gulp.task('watch', () => { + gulp.watch('./test/chat-test.js', ['linter', 'tests']); + gulp.watch('./**/*.js', ['linter']); +}); + +gulp.task('default', ['watch', 'linter', 'tests'], () => { + console.log('All tasks completed successfully'); +}); diff --git a/package.json b/package.json index e650494..fb6ffc0 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,9 @@ "homepage": "https://github.com/stefuhnee/tcp_server#readme", "devDependencies": { "chai": "^3.5.0", + "gulp": "^3.9.1", + "gulp-eslint": "^2.0.0", + "gulp-mocha": "^2.2.0", "mocha": "^2.4.5" } } diff --git a/test/chat-test.js b/test/chat-test.js index c2f63ef..1c45cc0 100644 --- a/test/chat-test.js +++ b/test/chat-test.js @@ -2,20 +2,37 @@ const net = require('net'); const expect = require('chai').expect; -const createServer = require('../chat.js'); const data = {}; +const sockets = []; + +function createServer() { + net.createServer((socket) => { + sockets.push(socket); + socket.on('data', (chunk) => { + sockets.forEach((sock) => { + socket.name = 'Client' + sockets.indexOf(sock); + if (sockets.length === 1 || socket.name !== sock.name) { + socket.write('test received'); + } else { + socket.write('not receiving'); + } + }); + }); + }).listen(3000, () => { + console.log('listening on port 3000'); + }); + return checkUniqueNames(sockets); +} function createClient(clientName, done) { + if (!data[clientName]) data[clientName] = ''; let client = net.connect(3000, () => { client.write('test'); - if (clientName === 'secondTest') { - client.write('test'); - } client.on('data', (chunk) => { - if (!data[clientName]) data[clientName] = ''; + console.log(chunk.toString()); data[clientName] += chunk.toString(); done(); - }) + }); }).on('error', (err) => { console.log(err); client.end(); @@ -23,24 +40,20 @@ function createClient(clientName, done) { } describe('chat test suite', () => { - before(() => { + before((done) => { createServer(); - }) - beforeEach('initializes first client for multi-client tests', (done) => { - data['test'] = ''; createClient('test', done); }); it('should receive data from the server', () => { expect(data['test']).to.eql('test received'); - }) + }); before((done) => { - data['test'] = ''; createClient('secondTest', done); - }) + }); it('should send data to clients that did not write it', () => { - expect(data['test']).to.eql('test receivedtest received'); - }) + expect(data['test']).to.eql('test received'); + }); it('should not send data to clients that wrote it', () => { - expect(data['secondTest']).to.eql('test received'); - }) -}) + expect(data['secondTest']).to.not.eql('test received'); + }); +}); From 5126c02e16fb3eea629537cd0adbd1a6bcdea561 Mon Sep 17 00:00:00 2001 From: Stefanie Hansen Date: Tue, 17 May 2016 13:32:37 -0700 Subject: [PATCH 5/5] deleted function was called.... deleted the call itself --- test/chat-test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/chat-test.js b/test/chat-test.js index 1c45cc0..e2fc105 100644 --- a/test/chat-test.js +++ b/test/chat-test.js @@ -21,7 +21,6 @@ function createServer() { }).listen(3000, () => { console.log('listening on port 3000'); }); - return checkUniqueNames(sockets); } function createClient(clientName, done) {