From 5a83cadf05e859319eb8b2fbe8cfe7451a0627ff Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 11 Sep 2013 13:38:11 -0300 Subject: [PATCH 01/92] add back mosto status test Signed-off-by: Tomas Neme --- test/mosto-status-test.js | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/test/mosto-status-test.js b/test/mosto-status-test.js index 8f7efc4..0abdb0b 100644 --- a/test/mosto-status-test.js +++ b/test/mosto-status-test.js @@ -1,23 +1,18 @@ var assert = require("assert"), - mosto = require('../mosto'), - melted = require('../api/Melted'); +mosto = require('../mosto'), +melted = require('../api/Melted'); //TODO: This test should be rewritten after @fabriciocosta merges his part with more usefull data! -describe.skip('Mosto status', function() { +describe('Mosto status', function() { var mosto_server = undefined; var rec = -1; before(function(done) { melted.take(function() { - console.error("MELTED 1"); melted.stop(function(){ - console.error("MELTED 2"); melted.start(function() { - console.error("MELTED 3"); melted.setup(undefined, undefined, function() { - console.error("MELTED READY"); -// melted.leave(); done(); }); }); @@ -25,6 +20,12 @@ describe.skip('Mosto status', function() { }); }); + after(function(done) { + mosto_server.finish(function() { + melted.stop(done); + }); + }); + describe('# status test: init mosto without playlists', function() { before(function(done) { @@ -57,11 +58,4 @@ describe.skip('Mosto status', function() { }); }); }); - - - after(function(done) { - mosto_server.finish(done); - }); - - }); From a90da87e4a021b507ede4681ee63da9f33c9e4ff Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 11 Sep 2013 16:17:12 -0300 Subject: [PATCH 02/92] logging Signed-off-by: Tomas Neme --- api/Melted.js | 11 +++++++++-- mosto.js | 11 ++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/api/Melted.js b/api/Melted.js index 50d7b1f..f7bba6a 100644 --- a/api/Melted.js +++ b/api/Melted.js @@ -176,6 +176,7 @@ exports.push = function(conn, commands, command_callback, close_callback) { var s = 0; conn.on('connect', function() { conn.on('data', function(data) { + logger.debug('[push] got data: "%s"', data); if (command_callback) command_callback(data); if (s < commands.length && data.indexOf("\n") > -1) { conn.write(commands[s]+"\n"); @@ -216,7 +217,10 @@ exports.setup = function(root, output, callback) { * @callback: callback function to process while take melted. * */ -exports.take = semaphore.take; +exports.take = function() { + logger.info('take'); + return semaphore.take.apply(this, arguments); +}; /** * leave @@ -224,4 +228,7 @@ exports.take = semaphore.take; * Leave execution to other melted taked. * */ -exports.leave = semaphore.leave; +exports.leave = function() { + logger.info('leave'); + return semaphore.leave.apply(this, arguments); +}; diff --git a/mosto.js b/mosto.js index 81b74e9..cda03c8 100644 --- a/mosto.js +++ b/mosto.js @@ -282,11 +282,20 @@ mosto.prototype.finish = function(callback) { clearTimeout(self.meltedInterval); this.stopDriver(); this.playlists.get("melted_medias").write.take(function() { - self.playlists.get("melted_medias").stopMvcpServer().fin(self.stopHeartbeats).fin(function() { + logger.debug("[finish] stop melted_medias mvcp server"); + self.playlists.get("melted_medias").stopMvcpServer().fin(function() { + logger.debug("[finish] stop heartbeats"); + return self.stopHeartbeats(); + }).fin(function() { + logger.debug("[finish] leave melted_medias write lock") self.playlists.get("melted_medias").write.leave(); + logger.debug("[finish] stop Melted"); Melted.stop(function(pid) { + logger.debug("[finish] melted stopped"); setTimeout( function() { + logger.debug("[finish] leaving Melted lock"); Melted.leave(); + logger.debug("[finish] calling callback"); if (callback) callback(); }, 1000 ); }); From aa691d112e86031a33e1e1d73a23c927b6178c04 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 11 Sep 2013 16:17:33 -0300 Subject: [PATCH 03/92] whitespace Signed-off-by: Tomas Neme --- test/models-test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/models-test.js b/test/models-test.js index 1e693dd..4cf958c 100644 --- a/test/models-test.js +++ b/test/models-test.js @@ -15,7 +15,7 @@ describe.skip('models.Mosto', function() { self.server = new mvcp('melted'); self.createPlaylist = function(medias, start) { - var duration = _.reduce(medias, function(acc, m) { + var duration = _.reduce(medias, function(acc, m) { return acc + m.get('length') * m.get('fps'); }, 0); start = start || moment(); @@ -58,8 +58,8 @@ describe.skip('models.Mosto', function() { before(function(done) { self.mlt_media = self.playlists().get('melted_medias'); self.pls = self.playlists().get('playlists'); - self.mediamodels = _.map(self.medias, function(media, ix) { - return new Mosto.Media(_.extend(media, {playlist_order: ix})); + self.mediamodels = _.map(self.medias, function(media, ix) { + return new Mosto.Media(_.extend(media, {playlist_order: ix})); }); done(); }); @@ -107,7 +107,7 @@ describe.skip('models.Mosto', function() { self.playlists().save(); self.mlt_media.write.take(function() { self.mlt_media.write.leave(); - done(); + done(); }); }); afterEach(function(done) { From a35e36cff130dab8ed84f07bd04da8040805c89b Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 11 Sep 2013 16:21:00 -0300 Subject: [PATCH 04/92] return models tests Signed-off-by: Tomas Neme --- test/models-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models-test.js b/test/models-test.js index 4cf958c..fcae0ab 100644 --- a/test/models-test.js +++ b/test/models-test.js @@ -7,7 +7,7 @@ var Mosto = require('../models/Mosto') , moment = require('moment') ; -describe.skip('models.Mosto', function() { +describe('models.Mosto', function() { var self = this; self.playlists = Mosto.Playlists; self.medias = helpers.getMedia(); From 8244ae24199d5f6df4390f51e2935cf58d0b45d1 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 11 Sep 2013 16:30:41 -0300 Subject: [PATCH 05/92] getWindow doesn't exist anymore Signed-off-by: Tomas Neme --- test/playlist-mongo-driver.js | 45 ----------------------------------- 1 file changed, 45 deletions(-) diff --git a/test/playlist-mongo-driver.js b/test/playlist-mongo-driver.js index 35c29c4..37e449f 100644 --- a/test/playlist-mongo-driver.js +++ b/test/playlist-mongo-driver.js @@ -106,51 +106,6 @@ describe('PlaylistMongoDriver', function(){ done(); }); - describe.skip('#getWindow()', function() { - beforeEach(function(){ - self.driver.window = undefined; - }); - it('should exist', function() { - self.driver.should.have.property('getWindow'); - self.driver.getWindow.should.be.a('function'); - }); - it('should accept two parameters and save them in window = {from, to}', function() { - var window = self.driver.getWindow(self.from, self.to); - window.from.valueOf().should.equal(self.from.valueOf()); - window.to.valueOf().should.equal(self.to.valueOf()); - }); - it('should accept an object with {from, to}', function() { - var window = self.driver.getWindow({from: self.from, to: self.to}); - window.from.valueOf().should.equal(self.from.valueOf()); - window.to.valueOf().should.equal(self.to.valueOf()); - }); - it('should accept an object with {from, timeSpan}', function() { - var window = self.driver.getWindow({from: self.from, timeSpan: self.span}); - window.from.valueOf().should.equal(self.from.valueOf()); - var to = moment(self.from.valueOf()); - to.add(self.span * 60 * 1000); - console.log('popop', window.to.valueOf(), to.valueOf()) - window.to.valueOf().should.equal(to.valueOf()); - }); - it('should accept only a "to" object and assume "from" is now', function() { - var window = self.driver.getWindow({to: self.to}); - window.should.have.property('from'); - window.from.valueOf().should.approximately((new moment()).valueOf(), 10); - }); - it('should accept no parameters, and use the config file from defaults', function(){ - var window = self.driver.getWindow(); - var config = require('mbc-common').config.Mosto.Mongo; - window.timeSpan.should.equal(config.load_time * 60 * 1000); - window.from.valueOf().should.approximately(moment().valueOf(), 10); - window.to.diff(window.from).valueOf().should.equal(window.timeSpan.valueOf()); - }); - it('should accept dates and transform them to moments', function() { - var window = self.driver.getWindow(new Date(), new Date()); - moment.isMoment(window.from).should.be.ok; - moment.isMoment(window.to).should.be.ok; - }); - }); - describe('#subscriptions', function() { before(function() { self.pubsub = mbc.pubsub(); From 21e9f62c9bb0afa9e47e09ccc2e248d7d97e1897 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Mon, 7 Oct 2013 18:31:52 -0300 Subject: [PATCH 06/92] fix 'should responde to create messages' test for new format Signed-off-by: Tomas Neme --- test/playlist-mongo-driver.js | 42 ++++++++++++++++------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/test/playlist-mongo-driver.js b/test/playlist-mongo-driver.js index 37e449f..bbd3f19 100644 --- a/test/playlist-mongo-driver.js +++ b/test/playlist-mongo-driver.js @@ -39,8 +39,7 @@ describe('PlaylistMongoDriver', function(){ var medias = helpers.getMBCMedia(); // let's create a playlist at least 1 hour long - var playlist = new Media.Playlist({_id: uuid.v1()}); - playlist.set('title', 'TestPlaylist'); + var playlist = new Media.Playlist({_id: uuid.v1(), title: 'Name'}); while(playlist.get('duration') < 3600000) { var media = _.randelem(medias); var piece = new Media.Piece(media.toJSON()); @@ -61,9 +60,9 @@ describe('PlaylistMongoDriver', function(){ var hsix = i - 3; var now = self.from; // schedules are from 1hs before now - var schtime = moment(now + (hsix * 30 * 60 * 1000)); + var schtime = moment(now + (hsix * 30 * 60 * 1000)).valueOf(); var length = moment.duration(playlist.get('duration')); - schedule.start = schtime.valueOf(); + schedule.start = schtime; schedule.end = schtime + length; var occurrence = new Media.Occurrence(schedule); self.scheds.push(occurrence); @@ -113,7 +112,7 @@ describe('PlaylistMongoDriver', function(){ var list = sched.get('playlist'); var model = sched.toJSON(); model.start = moment().valueOf() - model.end = moment().add(list.get('duration')); + model.end = moment().add(list.get('duration')).valueOf(); self.message = { backend: 'schedbackend', model: model, @@ -126,10 +125,9 @@ describe('PlaylistMongoDriver', function(){ var message = self.message; message.method = 'create'; self.driver.on('create', function(playlist) { - console.log("create received! - " + playlist.name ); - playlist.get('id').should.be.eql(message.model._id); - playlist.get('name').should.be.eql(message.model.title); - playlist.get('start').should.eql(message.model.start); + playlist.id.should.be.eql(message.model._id); + playlist.name.should.be.eql(message.model.title); + moment(playlist.start).valueOf().should.eql(message.model.start); done(); }); self.pubsub.publishJSON(message.channel(), message); @@ -157,12 +155,13 @@ describe('PlaylistMongoDriver', function(){ self.driver.getPlaylists({from: self.from, to: self.to}, function(playlists) { playlists.length.should.not.be.eql(0); playlists.forEach(function(playlist) { - playlist.get('id').should.be.ok; - playlist.get('name').should.be.ok; - playlist.get('start').should.be.ok; - playlist.get('medias').should.be.ok; - playlist.get('end').should.be.ok; - playlist.get('loaded').should.not.be.ok; + playlist.should.have.property('id'); + playlist.should.have.property('name'); + playlist.should.have.property('start'); + playlist.should.have.property('medias'); + playlist.should.have.property('end'); + playlist.should.have.property('loaded'); + playlist.should.have.property('mode'); }); done(); }); @@ -170,18 +169,15 @@ describe('PlaylistMongoDriver', function(){ it('should return only playlists within timeframe', function(done) { var inside = function(sched) { - return (sched.get('start') <= self.to.valueOf() && - sched.get('end') >= self.from.valueOf()); - }; - var sched_id = function(sched) { - return sched.get('_id'); + return (sched.get('start') <= self.to && + sched.get('end') >= self.from); }; - var in_scheds = _.chain(self.scheds).filter(inside).map(sched_id).value(); - var out_scheds = _.chain(self.scheds).reject(inside).map(sched_id).value(); + var in_scheds = _.chain(self.scheds).filter(inside).pluck('id').value(); + var out_scheds = _.chain(self.scheds).reject(inside).pluck('id').value(); self.driver.getPlaylists({from: self.from, to: self.to}, function(playlists) { - var pl_ids = _.chain(playlists).map(function(pl) { return pl.get('id') }).value(); + var pl_ids = _.chain(playlists).pluck('id').value(); pl_ids.forEach(function(playlist, ix) { playlist.should.eql(in_scheds[ix]); From a1cef114db2077f0f45d53d253f4c096f85fe12f Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Mon, 7 Oct 2013 18:35:29 -0300 Subject: [PATCH 07/92] use new commands Signed-off-by: Tomas Neme --- test/general-functional-test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 92bb27b..70cf751 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -178,7 +178,7 @@ describe.skip("Mosto functional test", function() { /* generic tests */ self.is_synced = function(done) { - var result = self.melted.sendPromisedCommand('USTA U0', '202 OK').then(function(val) { + var result = self.melted.sendCommand('USTA U0').then(function(val) { var time = moment(); var expected_media = self.get_media(time); console.log('[is_synced] time:', time.valueOf()); @@ -223,7 +223,7 @@ describe.skip("Mosto functional test", function() { }); }); it('should show black', function(done) { - var promise = self.melted.sendPromisedCommand('USTA U0', '202 OK'); + var promise = self.melted.sendCommand('USTA U0'); promise.then(function(result) { result = result.split('\r\n')[1].split(' '); var file = result[2]; @@ -309,7 +309,7 @@ describe.skip("Mosto functional test", function() { }); it('should not break'); it('should be playing blank clip', function(done) { - var promise = self.melted.sendPromisedCommand('USTA U0', '202 OK'); + var promise = self.melted.sendCommand('USTA U0'); promise.then(function(result) { result = result.split('\r\n')[1].split(' '); var file = result[2]; From 8ce59db553ba6a6c34bc5b514a6031a864ebe162 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Mon, 7 Oct 2013 18:39:52 -0300 Subject: [PATCH 08/92] fix blank clip name Signed-off-by: Tomas Neme --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 70cf751..552f8de 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -227,7 +227,7 @@ describe.skip("Mosto functional test", function() { promise.then(function(result) { result = result.split('\r\n')[1].split(' '); var file = result[2]; - file.should.include('black_id'); + file.should.include('BLANK'); }).then(done).done(); }); }); From 20f7cf34285be37d58346d278e5aaa6798629eba Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Mon, 7 Oct 2013 18:40:04 -0300 Subject: [PATCH 09/92] add functional test back Signed-off-by: Tomas Neme --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 552f8de..de4bcd1 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -13,7 +13,7 @@ var helper = require('./media_helpers.js'); var uuid = require('node-uuid'); var mosto_config = require('mbc-common').config.Mosto.General; -describe.skip("Mosto functional test", function() { +describe("Mosto functional test", function() { /* * arrancar sin playlists ** ver negro From 868fdd495ac02c0b9522f96d2f843dbf4684bf3f Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:34:50 -0300 Subject: [PATCH 10/92] require only the... required.. driver Signed-off-by: Tomas Neme --- drivers/playlists/playlists-driver.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/playlists/playlists-driver.js b/drivers/playlists/playlists-driver.js index 6468a3f..6a03a90 100644 --- a/drivers/playlists/playlists-driver.js +++ b/drivers/playlists/playlists-driver.js @@ -1,15 +1,18 @@ -var json_driver = require("./json-driver"), - mongo_driver = require("./mongo-driver"), - mbc = require("mbc-common"), - logger = mbc.logger().addLogger('PLAYLISTS-DRIVER'); +var mbc = require("mbc-common"), +logger = mbc.logger().addLogger('PLAYLISTS-DRIVER'), exports = module.exports = function(type, config) { logger.info("Creating playlists driver for type [" + type + "]"); if (type === 'json') { + var json_driver = require("./json-driver"); return new json_driver(config); } else if (type === 'mongo') { + var mongo_driver = require("./mongo-driver"); return new mongo_driver(config); + } else if (type === 'test') { + var test_driver = require("./test-driver"); + return new test_driver(config); } /****************************************************************** From 49d8127f9c0a7e35fbfd7d2ac16d26509c63b0c6 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:35:55 -0300 Subject: [PATCH 11/92] fix helper functions for new models Signed-off-by: Tomas Neme --- test/general-functional-test.js | 74 ++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index de4bcd1..023bacb 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -26,12 +26,14 @@ describe("Mosto functional test", function() { self.create_playlist = function(medias) { medias = medias || []; - var mediamodels = []; - medias.forEach(function(media) { - mediamodels.push( new Media.Piece(media.toJSON()) ); - }); - return new Media.List({ - models: mediamodels + console.log('create playlist with', medias.length, 'pieces'); + return new Media.Playlist({ + _id: uuid.v1(), + pieces: _.map(medias, function(m) { + var piece = m.toJSON(); + piece._id = uuid.v1(); + return new Media.Piece(piece); + }), }); }; @@ -50,15 +52,18 @@ describe("Mosto functional test", function() { }); var occcol = self.db.collection('scheds'); var listcol = self.db.collection('lists'); + var piececol = self.db.collection('pieces'); var log = []; for( var i = 0 ; i < self.playlists.length ; i++ ) { var playlist = self.playlists[i]; - var occurrence = { - start: timewalk.unix() - }; + var occurrence = new Media.Occurrence({ + playlist: playlist, + start: timewalk.valueOf(), + _id: uuid.v1(), + }); log.push(i+':'); - log.push('occurrence.start: ' + occurrence.start); - var medias = playlist.get('collection'); + log.push('occurrence.start: ' + occurrence.get('start')); + var medias = playlist.get('pieces'); for( var j = 0 ; j < medias.length ; j++ ) { var media = medias.at(j); media.start_time = timewalk.valueOf(); @@ -69,32 +74,35 @@ describe("Mosto functional test", function() { media.end_time = timewalk.valueOf(); log.push('media ' + j + ' end : ' + media.end_time); } - occurrence.end = timewalk.unix(); - log.push('occurrence.end : ' + occurrence.end); - var playlist_json = _.omit(playlist.toJSON(), 'collection'); - playlist_json.models = _.invoke(playlist_json.models, 'toJSON'); - playlist_json._id = uuid.v4(); + occurrence.set('end', timewalk.valueOf()); + log.push('occurrence.end : ' + occurrence.get('end')); log.forEach(function(l) { console.log('[setup_playlists]:', l) ; }); - console.log('[setup_playlists] final:', playlist_json); + console.log('[setup_playlists] final:', playlist.toJSON()); // I need to wrap this in order to keep the `playlist` variable (function(pl, oc) { - listcol.insert(playlist_json, function(err, obj) { + console.log('saving occurrence', oc.id); + console.log('inserting', pl.get('pieces').length, 'pieces'); + Q.ninvoke(piececol, 'insert', pl.get('pieces').toJSON()).then(function(obj) { + console.log(obj.length, 'pieces inserted'); + console.log('inserting playlist', pl.id); + return Q.ninvoke(listcol, 'insert', pl.toJSON()) + }).then(function(obj) { obj = obj[0]; + console.log('inserted playlist', obj._id); // update self.playlists - _.extend(pl, obj); - occurrence = new Media.Occurrence({ - list: obj._id, - start: oc.start, - end: oc.end, - _id: oc.start.toString(), - }); - occcol.insert(occurrence.toJSON(), function(err, obj) { - var obj = obj[0]; - self.occurrences.push(obj); - done(); - }); + pl.set(obj); + console.log('inserting occurrence', oc.id); + return Q.ninvoke(occcol, 'insert', oc.toJSON()); + }).then(function(obj) { + var obj = obj[0]; + console.log('inserted occurrence', obj._id); + self.occurrences.push(obj); + done(); + }).fail(function(err) { + console.log('ERROR ERROR', err); + throw new Error(err); }); })(playlist, occurrence); } @@ -147,7 +155,7 @@ describe("Mosto functional test", function() { self.get_occurrence = function(time) { time = time || moment(); return _.find(self.occurrences, function(pl) { - return pl.start <= time.unix() && pl.end >= time.unix(); + return pl.start <= time.valueOf() && pl.end >= time.valueOf(); }); }; @@ -155,7 +163,7 @@ describe("Mosto functional test", function() { time = time || moment(); var occurrence = self.get_occurrence(time); return _.find(self.playlists, function(pl) { - return pl._id === occurrence.list; + return pl.id === occurrence.playlist; }); }; @@ -163,7 +171,7 @@ describe("Mosto functional test", function() { time = time || moment(); var playlist = self.get_playlist(time); - return _.find(playlist.get('models'), function(me) { + return playlist.get('pieces').find(function(me) { return me.start_time <= time && me.end_time >= time; }); }; From bd1e4b3be70bfa9fef93d43d212c063e5d32a056 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:36:16 -0300 Subject: [PATCH 12/92] there's no more 'promisedCommand' methods Signed-off-by: Tomas Neme --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 023bacb..a07754c 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -287,7 +287,7 @@ describe("Mosto functional test", function() { var expected_occurrence = self.get_occurrence(time); var expected_media = self.get_media(time); - var result = self.melted.sendPromisedCommand('USTA U0', '202 OK'); + var result = self.melted.sendCommand('USTA U0'); result.then(function(val) { var lines = val.split("\r\n"); lines[0].should.eql('202 OK'); From 8d734d8dec59457a8359c004770b8e73f9ba48b7 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:36:43 -0300 Subject: [PATCH 13/92] the telltale string changed Signed-off-by: Tomas Neme --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index a07754c..1460971 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -321,7 +321,7 @@ describe("Mosto functional test", function() { promise.then(function(result) { result = result.split('\r\n')[1].split(' '); var file = result[2]; - file.should.include('black_id'); + file.should.include('BLANK'); }).then(done).done(); }); }); From 34e11fa1dbf8fd5f4b056735d0485da269152e57 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:37:06 -0300 Subject: [PATCH 14/92] call done(), make sure we pass no arguments Signed-off-by: Tomas Neme --- test/general-functional-test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 1460971..367c735 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -270,7 +270,9 @@ describe("Mosto functional test", function() { self.mosto = new mosto(); self.mosto.once('playing', function() { // send pubsub messages with new playlists - self.melted.connect().then(done); + self.melted.connect().then(function(){ + done(); + }).done(); }); self.mosto.init(); }); From e69ea193ca40e0314edaf87beeea9494880f972d Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:37:34 -0300 Subject: [PATCH 15/92] is_synced receives the time Signed-off-by: Tomas Neme --- test/general-functional-test.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 367c735..1f0f1b8 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -185,7 +185,7 @@ describe("Mosto functional test", function() { }); /* generic tests */ - self.is_synced = function(done) { + self.is_synced = function(time) { var result = self.melted.sendCommand('USTA U0').then(function(val) { var time = moment(); var expected_media = self.get_media(time); @@ -200,8 +200,7 @@ describe("Mosto functional test", function() { var elapsed = helper.framesToMilliseconds(frame, fps); var expected = (time - expected_media.start_time).valueOf(); console.log('[is_synced] got', lines[1], 'at', frame, ':', elapsed, 'expected', expected); - elapsed.should.be.approximately(expected, 1000); - done(); + elapsed.should.be.approximately(expected, time); }); return result; }; From ae457f98f8a15c62e9907c37ae247a986f07b23f Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 17:02:06 -0300 Subject: [PATCH 16/92] better logging on mongo driver Signed-off-by: Tomas Neme --- drivers/playlists/mongo-driver.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/playlists/mongo-driver.js b/drivers/playlists/mongo-driver.js index bb9562d..c085742 100644 --- a/drivers/playlists/mongo-driver.js +++ b/drivers/playlists/mongo-driver.js @@ -144,8 +144,9 @@ mongo_driver.prototype.createPlaylist = function(sched, callback) { } logger.debug("LIST:" + list._id); - logger.info("Processing list:", {"id": list && list._id, "clips": list && list.pieces.length}); + logger.info("Processing list:", {"id": list && list._id, "clips": list && list.pieces}); self.pieces.findItems({_id:{"$in": list.pieces}}, function(err, pieces) { + logger.info('found', (pieces && pieces.length) || 0, 'pieces'); pieces = _.chain(pieces).map(function(block){ block._id = (block._id.toHexString && block._id.toHexString()) || block._id; return block; From 55a52bb549c8d4c84738e2c5b28365816464f128 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 17:02:42 -0300 Subject: [PATCH 17/92] listen on status change on pub/sub instead of on mosto events (more blackbox'ed) Signed-off-by: Tomas Neme --- test/general-functional-test.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 1f0f1b8..b699ac8 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -309,11 +309,13 @@ describe("Mosto functional test", function() { before(function(done) { var occurrence = self.get_occurrence(); self.delete_occurrence(occurrence).then(function() { - setTimeout(function() { - self.mosto.once('status', function(status) { + self.listener.once('message', function(chan, msg) { + if(chan == 'mostoStatus') { + self.listener.unsubscribe('mostoStatus'); done(); - }); - }, mosto_config.timer_interval); + } + }); + self.listener.subscribe('mostoStatus'); }).done(); }); it('should not break'); From a3797977bd4cb4521208cdbb690c40b7e1b0efb7 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 17:02:54 -0300 Subject: [PATCH 18/92] remove dead code Signed-off-by: Tomas Neme --- utils.js | 57 -------------------------------------------------------- 1 file changed, 57 deletions(-) diff --git a/utils.js b/utils.js index 9ebbe58..84aa984 100644 --- a/utils.js +++ b/utils.js @@ -22,68 +22,11 @@ exports = module.exports = { return filename; }, - getTimeLengthFromFrames: function(frames, fps) { - var seconds = parseFloat(frames) / parseFloat(fps); - var minutes = 0; - if (seconds > 60) { - minutes = parseInt(seconds / 60); - seconds = parseInt (seconds - (minutes * 60)); - } - var hours = 0; - if (minutes > 60) { - hours = parseInt(hours / 60); - minutes = parseInt(minutes - (hours * 60)); - } - return "." + hours + ":" + minutes + ":" + seconds; - }, - getCurrentPosFromClip: function(actualFrame, totalFrames) { return parseFloat(actualFrame / totalFrames); }, - getFramePositionFromClock: function( clock_position, clip_start, frames_length, fps ) { - var millis = moment.duration( clock_position - clip_start ).asMilliseconds(); - var frame_position = Math.max( (millis / 1000.0 ) * fps, frames_length - 1); - return frame_position; - }, - convertFramesToSeconds: function ( frames, fps ) { return frames/fps; }, - - convertLengthToMilliseconds: function ( frames ) { - var m = moment( frames, "HH:mm:ss.SS"); - return m.hours()*60*60*1000 + m.minutes()*60*1000 + m.seconds()*1000 + m.milliseconds(); - }, - - convertFramesToMilliseconds: function ( frames, fps ) { - if ( isNaN(frames) || fps+""=="NaN" || fps==undefined || fps===false || fps==0) { - var m = moment( frames, "HH:mm:ss.SS"); - if (m) return m.hours()*60*60*1000 + m.minutes()*60*1000 + m.seconds()*1000 + m.milliseconds(); - } - fps = parseFloat(fps); - var millis = frames * 1000.0 / (1.0 * fps); - if (millis!==undefined) return millis; - }, - - convertDurationToString: function( moment_duration ) { - return moment_duration.hours()+":"+moment_duration.minutes()+":"+moment_duration.seconds()+"."+moment_duration.milliseconds(); - }, - - convertUnixToDate: function ( unix_timestamp ) { - //var date = new Date(unix_timestamp*1000); - var date = new moment(unix_timestamp); - return date.format("hh:mm:ss"); - }, - - convertDateToUnix: function ( date_timestamp ) { - var date = new moment(date_timestamp); - return date.unix(); - }, - - convertTimeToFrames: function(time, fps) { - var mTime = moment(time, "HH:mm:ss"); - var seconds = mTime.seconds() + (mTime.minutes() * 60) + (mTime.hours() * 60 * 60); - return seconds * fps; - } }; From c39096cde3fd28816e9836d27d07dbce37c6f5db Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Fri, 11 Oct 2013 16:49:16 -0300 Subject: [PATCH 19/92] make sure to use safe:true in inserts Signed-off-by: Tomas Neme --- test/general-functional-test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index b699ac8..300c76c 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -84,17 +84,17 @@ describe("Mosto functional test", function() { (function(pl, oc) { console.log('saving occurrence', oc.id); console.log('inserting', pl.get('pieces').length, 'pieces'); - Q.ninvoke(piececol, 'insert', pl.get('pieces').toJSON()).then(function(obj) { + Q.ninvoke(piececol, 'insert', pl.get('pieces').toJSON(), {safe:true}).then(function(obj) { console.log(obj.length, 'pieces inserted'); console.log('inserting playlist', pl.id); - return Q.ninvoke(listcol, 'insert', pl.toJSON()) + return Q.ninvoke(listcol, 'insert', pl.toJSON(), {safe:true}) }).then(function(obj) { obj = obj[0]; console.log('inserted playlist', obj._id); // update self.playlists pl.set(obj); console.log('inserting occurrence', oc.id); - return Q.ninvoke(occcol, 'insert', oc.toJSON()); + return Q.ninvoke(occcol, 'insert', oc.toJSON(), {safe:true}); }).then(function(obj) { var obj = obj[0]; console.log('inserted occurrence', obj._id); From d9b45a8eb2078cfcf852a8ed8e69937ee609e707 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Fri, 11 Oct 2013 16:57:48 -0300 Subject: [PATCH 20/92] skip 'start with playlists' Signed-off-by: Tomas Neme --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 300c76c..3146f50 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -243,7 +243,7 @@ describe("Mosto functional test", function() { ** ver que haya el play correspondiente ** ver que este en el frame correcto */ - describe('start with playlists', function() { + describe.skip('start with playlists', function() { self.playlist_count = _.randint(5, 10, self.rand()); before(function() { self.medias = helper.getMBCMedia(); From 7c4ac0933cfc9bcee2ed9ddd5631b32968210026 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:30:30 -0300 Subject: [PATCH 21/92] Took out semaphore from api/Melted Signed-off-by: Juan Martin Runge --- api/Melted.js | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/api/Melted.js b/api/Melted.js index f7bba6a..4f4c00d 100644 --- a/api/Melted.js +++ b/api/Melted.js @@ -1,7 +1,6 @@ var spawn = require('child_process').spawn; var exec = require('child_process').exec; var net = require('net'); -var semaphore = require('semaphore')(1); var mbc = require('mbc-common'); var conf = mbc.config.Mosto.Melted; var melted_bin_path = conf.root + '/melted/BUILD/bin/melted'; @@ -209,26 +208,3 @@ exports.setup = function(root, output, callback) { }) }; -/** - * take - * - * Take melted and not leave execution to other melted taked. - * - * @callback: callback function to process while take melted. - * - */ -exports.take = function() { - logger.info('take'); - return semaphore.take.apply(this, arguments); -}; - -/** - * leave - * - * Leave execution to other melted taked. - * - */ -exports.leave = function() { - logger.info('leave'); - return semaphore.leave.apply(this, arguments); -}; From 7f30e5fd1756b470d26696b447e8ee7d3e02f775 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:31:56 -0300 Subject: [PATCH 22/92] Modified mosto core to stop using melted semaphore Signed-off-by: Juan Martin Runge --- mosto.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/mosto.js b/mosto.js index cda03c8..abf2283 100644 --- a/mosto.js +++ b/mosto.js @@ -243,12 +243,10 @@ mosto.prototype.init = function(melted, callback) { self.checkMelted(startall); }; - if (melted !== undefined) { + if (melted !== undefined) Melted = melted; - check_and_start(); - } - else - Melted.take(check_and_start); + + check_and_start(); }; @@ -293,8 +291,6 @@ mosto.prototype.finish = function(callback) { Melted.stop(function(pid) { logger.debug("[finish] melted stopped"); setTimeout( function() { - logger.debug("[finish] leaving Melted lock"); - Melted.leave(); logger.debug("[finish] calling callback"); if (callback) callback(); }, 1000 ); From 6f15d7ea9f0b93b3bf2ce28dd1792be9da584cab Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:33:25 -0300 Subject: [PATCH 23/92] Added test helper with semaphore and init+finish code for each test Signed-off-by: Juan Martin Runge --- test/test_helper.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 test/test_helper.js diff --git a/test/test_helper.js b/test/test_helper.js new file mode 100644 index 0000000..ef7e423 --- /dev/null +++ b/test/test_helper.js @@ -0,0 +1,27 @@ +var semaphore = require('semaphore')(1) +, melted = require('../api/Melted') +, Mosto = require('../models/Mosto') +; + + +exports.take = function() { + return semaphore.take.apply(this, arguments); +}; + +exports.leave = function() { + return semaphore.leave.apply(this, arguments); +}; + +exports.init = function(callback) { + melted.stop(function(){ + melted.start(function(pid) { + melted.setup(undefined, undefined, function(has_err) { + callback(); + }); + }); + }); +}; + +exports.finish = function(callback) { + melted.stop(callback); +}; \ No newline at end of file From 5a1ce3116af76176c0cbce737c8ecb15abe6e882 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:35:00 -0300 Subject: [PATCH 24/92] Added init and finish calls to helper to functional test Signed-off-by: Juan Martin Runge --- test/general-functional-test.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 3146f50..4822a1d 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -10,6 +10,7 @@ var Media = require('mbc-common/models/Media'); var Q = require('q'); var moment = require('moment'); var helper = require('./media_helpers.js'); +var test = require('./test_helper.js'); var uuid = require('node-uuid'); var mosto_config = require('mbc-common').config.Mosto.General; @@ -205,11 +206,20 @@ describe("Mosto functional test", function() { return result; }; - before(function() { - self.melted = melted(); + before(function(done) { + test.take(function() { + test.init(function() { + self.melted = melted(undefined, undefined, melted_log); + done(); + }); + }); }); - after(function() { - delete self.melted; + after(function(done) { + test.finish(function() { + delete self.melted; + test.leave(); + done(); + }); }); describe('start without playlists', function() { before(function(done) { From 26a46b363f092c3bba96fad14a078c4a2bda25da Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:36:20 -0300 Subject: [PATCH 25/92] Replaced melted take with helper init and finish calls in heartbeats test Signed-off-by: Juan Martin Runge --- test/heartbeats-test.js | 46 ++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/test/heartbeats-test.js b/test/heartbeats-test.js index aea0fe4..86a0739 100644 --- a/test/heartbeats-test.js +++ b/test/heartbeats-test.js @@ -1,6 +1,6 @@ var assert = require("assert"), - melted = require('../api/Melted'), helpers = require('./media_helpers'), + test = require('./test_helper.js'); Mosto = require('../models/Mosto'), _ = require('underscore'), moment = require('moment'), @@ -10,18 +10,14 @@ var assert = require("assert"), describe('Mosto Heartbeats Test', function() { before(function(done) { - melted.take(function() { - melted.stop(function(){ - melted.start(function(pid) { - melted.setup(undefined, undefined, function(has_err) { - Mosto.Playlists().get('playlists').reset(); - Mosto.Playlists().save(); - Mosto.Playlists().get('melted_medias').initMvcpServer().then(function() { - Mosto.Playlists().get('melted_medias').write.take(function() { - Mosto.Playlists().get('melted_medias').write.leave(); - done(); - }); - }); + test.take(function() { + test.init(function() { + Mosto.Playlists().get('playlists').reset(); + Mosto.Playlists().save(); + Mosto.Playlists().get('melted_medias').initMvcpServer().then(function() { + Mosto.Playlists().get('melted_medias').write.take(function() { + Mosto.Playlists().get('melted_medias').write.leave(); + done(); }); }); }); @@ -136,9 +132,9 @@ describe('Mosto Heartbeats Test', function() { after(function(done) { this.timeout(15000); self.hb.stop().then(function() { - Mosto.Playlists().get('melted_medias').stopMvcpServer().then(function() { +// Mosto.Playlists().get('melted_medias').stopMvcpServer().then(function() { done(); - }); +// }); }); }); }); @@ -216,12 +212,12 @@ describe('Mosto Heartbeats Test', function() { playlists().addPlaylist(pl); - Mosto.Playlists().get('melted_medias').initMvcpServer().then(function() { - Mosto.Playlists().get('melted_medias').write.take(function() { - Mosto.Playlists().get('melted_medias').write.leave(); +// Mosto.Playlists().get('melted_medias').initMvcpServer().then(function() { +// Mosto.Playlists().get('melted_medias').write.take(function() { +// Mosto.Playlists().get('melted_medias').write.leave(); done(); - }); - }); +// }); +// }); }); describe('-- Starting playback and wait 3 seconds', function() { @@ -387,12 +383,10 @@ describe('Mosto Heartbeats Test', function() { }); }); - describe('#leave melted', function() { - it('-- leave melted', function(done) { - melted.stop(function(pid) { - melted.leave(); - done(); - }); + after(function(done) { + test.finish(function() { + test.leave(); + done(); }); }); From 471a597954a412e002f15029fa5d9829203cd3a0 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:38:17 -0300 Subject: [PATCH 26/92] Replaced melted take with init and finish calls to helper in models test Signed-off-by: Juan Martin Runge --- test/models-test.js | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/test/models-test.js b/test/models-test.js index fcae0ab..0bab4a0 100644 --- a/test/models-test.js +++ b/test/models-test.js @@ -1,8 +1,8 @@ var Mosto = require('../models/Mosto') , should = require('should') , mvcp = require('../drivers/mvcp/mvcp-driver') -, melted = require('../api/Melted') , helpers = require('./media_helpers') +, test = require('./test_helper.js') , _ = require('underscore') , moment = require('moment') ; @@ -31,24 +31,19 @@ describe('models.Mosto', function() { describe('MeltedCollection', function(){ before(function(done) { - // restart melted - melted.take(function() { - melted.stop(function() { - melted.start(function() { - melted.setup(undefined, undefined, function() { - self.server.initServer().fin(function() { - done(); - }); - }); + test.take(function() { + test.init(function() { + self.server.initServer().fin(function() { + done(); }); }); }); }); after(function(done) { - self.playlists().get('melted_medias').stopMvcpServer().fin(self.server.stopServer).fin(function() { - melted.stop(function() { - melted.leave(); + self.server.stopServer().fin(function() { + test.finish(function() { + test.leave(); done(); }); }); From 2a106ebbdc57f36cfd904d51ae4dffd833ae3794 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:39:25 -0300 Subject: [PATCH 27/92] Replaced melted take with init and finish calls to helper in status test Signed-off-by: Juan Martin Runge --- test/mosto-status-test.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/test/mosto-status-test.js b/test/mosto-status-test.js index 0abdb0b..8e33bcd 100644 --- a/test/mosto-status-test.js +++ b/test/mosto-status-test.js @@ -1,6 +1,6 @@ var assert = require("assert"), mosto = require('../mosto'), -melted = require('../api/Melted'); +test = require('./test_helper.js'); //TODO: This test should be rewritten after @fabriciocosta merges his part with more usefull data! describe('Mosto status', function() { @@ -9,20 +9,17 @@ describe('Mosto status', function() { var rec = -1; before(function(done) { - melted.take(function() { - melted.stop(function(){ - melted.start(function() { - melted.setup(undefined, undefined, function() { - done(); - }); - }); - }); + test.take(function() { + test.init(done); }); }); after(function(done) { mosto_server.finish(function() { - melted.stop(done); + test.finish(function() { + test.leave(); + done(); + }); }); }); @@ -34,7 +31,7 @@ describe('Mosto status', function() { rec++; done(); }); - mosto_server.init(melted); + mosto_server.init(); }); it('--should have received 1 status', function() { assert.equal(rec, 0); From 670836121beee685d19fee1050782c1833d2f25c Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:41:50 -0300 Subject: [PATCH 28/92] Replaced melted take with helper init and finish calls in mvcp driver test Signed-off-by: Juan Martin Runge --- test/mvcp-driver-test.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/mvcp-driver-test.js b/test/mvcp-driver-test.js index 0746de0..6d651d7 100644 --- a/test/mvcp-driver-test.js +++ b/test/mvcp-driver-test.js @@ -4,6 +4,8 @@ var _ = require('underscore'); var mvcp_server = require('../drivers/mvcp/mvcp-driver'); var melted = require('../api/Melted'); var helpers = require('./media_helpers'); +var test = require('./test_helper.js'); + function getMedia(id, orig_order, playlist_id, name, type, file, length, fps) { var media = {}; @@ -25,18 +27,16 @@ describe('start mvcp-driver test', function(done) { this.timeout(15000); before(function(done) { - // Make sure we start with a fresh melted - melted.take(function() { - melted.stop(function(){ + test.take(function() { + test.init(function(){ done(); }); }); }); after(function(done) { - // and leave it "clean" after we leave - melted.stop(function() { - melted.leave(); - done() + test.finish(function() { + test.leave(); + done(); }); }); From f53c36f95e90a622a9b662f98790ba618c82ae29 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:43:27 -0300 Subject: [PATCH 29/92] Replaced melted take with init and finish calls to helper in mongo test Signed-off-by: Juan Martin Runge --- test/playlist-mongo-driver.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/test/playlist-mongo-driver.js b/test/playlist-mongo-driver.js index bbd3f19..db67167 100644 --- a/test/playlist-mongo-driver.js +++ b/test/playlist-mongo-driver.js @@ -3,8 +3,8 @@ var mongo_driver = require('../drivers/playlists/mongo-driver'); var should = require('should'); var mbc = require('mbc-common'); var _ = require('underscore'); -var melted = require('../api/Melted'); var helpers = require('./media_helpers'); +var test = require('./test_helper.js') var Media = require('mbc-common/models/Media'); var uuid = require('node-uuid'); @@ -12,8 +12,8 @@ describe('PlaylistMongoDriver', function(){ var self = this; before(function(done) { - melted.take(function() { - melted.stop(function(pid){ + test.take(function() { + test.init(function(pid){ // setup mongo driver var conf = { @@ -101,8 +101,10 @@ describe('PlaylistMongoDriver', function(){ self.collections[col].drop(); } } - melted.leave(); - done(); + test.finish(function() { + test.leave(); + done(); + }); }); describe('#subscriptions', function() { From db52a3301e7881a55145ecc4bb14fb433907316c Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:44:39 -0300 Subject: [PATCH 30/92] Added pubsub the option to receive custom config to set up db Signed-off-by: Juan Martin Runge --- drivers/status/pubsub.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/status/pubsub.js b/drivers/status/pubsub.js index 17b9735..43f1fbe 100644 --- a/drivers/status/pubsub.js +++ b/drivers/status/pubsub.js @@ -33,11 +33,11 @@ function MostoMessage(value, description, message) { this.message = message; } -function CaspaDriver() { +function CaspaDriver(conf) { events.EventEmitter.call(this); var self = this; this.status = _.clone(defaults); - this.db = mbc.db(); + this.db = mbc.db(conf && conf.db); this.publisher = mbc.pubsub(); } util.inherits(CaspaDriver, events.EventEmitter); @@ -194,8 +194,8 @@ CaspaDriver.prototype.dropMessage = function(message) { this.publisher.publish("mostoMessage.delete", { model: message }); }; -exports = module.exports = function() { - var driver = new CaspaDriver(); +exports = module.exports = function(conf) { + var driver = new CaspaDriver(conf); driver.setupAll(); return driver; From 3bd3c4ed514dcc7af2500e8d04cf2f4e62014860 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:45:55 -0300 Subject: [PATCH 31/92] Removed unused dependency Signed-off-by: Juan Martin Runge --- drivers/playlists/mongo-driver.js | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/playlists/mongo-driver.js b/drivers/playlists/mongo-driver.js index c085742..4864f09 100644 --- a/drivers/playlists/mongo-driver.js +++ b/drivers/playlists/mongo-driver.js @@ -1,5 +1,4 @@ var mbc = require('mbc-common') -, config = mbc.config.Mosto.Mongo , mubsub = require("mubsub") , moment = require("moment") , async = require('async') From 187204220a5fb0c3895dd9ad99372ee0700a5975 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:46:20 -0300 Subject: [PATCH 32/92] Added logging Signed-off-by: Juan Martin Runge --- drivers/playlists/mongo-driver.js | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/playlists/mongo-driver.js b/drivers/playlists/mongo-driver.js index 4864f09..4d22112 100644 --- a/drivers/playlists/mongo-driver.js +++ b/drivers/playlists/mongo-driver.js @@ -27,6 +27,7 @@ util.inherits (mongo_driver, events.EventEmitter); mongo_driver.prototype.start = function() { var self = this; + logger.info("Opening db connection", this.conf); var db = mbc.db(this.conf && this.conf.db); self.channel = mbc.pubsub(); From 23f7424cc12c5db1ed8004647e0ff4e1764bd210 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:46:41 -0300 Subject: [PATCH 33/92] Added Models the option to send arguments to MeltedCollection.set via Playlists.save Signed-off-by: Juan Martin Runge --- models/Mosto.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/Mosto.js b/models/Mosto.js index 71c73bc..d9459a0 100644 --- a/models/Mosto.js +++ b/models/Mosto.js @@ -553,12 +553,12 @@ Mosto.LoadedPlaylists = Backbone.Model.extend({ this.get('melted_medias').on('all', bubbleEvents(this, 'melted_medias')); }, - save: function() { + save: function(options) { // set fires add, remove, change and sort var mm = this.get('melted_medias'); var pl = this.get('playlists'); mm.write.take(function() { - mm.set(pl.getMedias()); + mm.set(pl.getMedias(), options); }); }, From 81be75ede1de5fa461de59b6246398239394da9f Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:48:21 -0300 Subject: [PATCH 34/92] Added mosto core the option to receive custom db config and pass it to mongo driver and pubsub Signed-off-by: Juan Martin Runge --- mosto.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/mosto.js b/mosto.js index abf2283..9ecc0e1 100644 --- a/mosto.js +++ b/mosto.js @@ -9,6 +9,7 @@ var fs = require('fs') , utils = require('./utils') , mbc = require('mbc-common') , config = mbc.config.Mosto.General +, mongoConfig = mbc.config.Mosto.Mongo , _ = require('underscore') , heartbeats = require('./heartbeats') , models = require('./models/Mosto') @@ -16,10 +17,11 @@ var fs = require('fs') ; //TODO: Chequear window, se esta construyendo de formas distintas //INCLUSO EN EL DRIVER MISMO SE USA DE FORMAS DISTINTAS!!! -function mosto(customConfig) { +function mosto(customConfig, customMongoConfig) { /** CONFIGURATION */ this.config = customConfig || config; + this.mongoConfig = customMongoConfig || mongoConfig; this.server = undefined; this.pl_driver = undefined; this.status_driver = undefined; @@ -224,8 +226,8 @@ mosto.prototype.init = function(melted, callback) { * linkear heartbeat con status driver */ function startall() { - self.pl_driver = new playlists_driver(self.config.playlist_server); - self.status_driver = new status_driver(); + self.pl_driver = new playlists_driver(self.config.playlist_server, self.mongoConfig); + self.status_driver = new status_driver(self.mongoConfig); self.playlists = models.Playlists(); self.heartbeats = new heartbeats(); @@ -299,8 +301,8 @@ mosto.prototype.finish = function(callback) { }); }; -exports = module.exports = function(customConfig) { - var mosto_server = new mosto(customConfig); +exports = module.exports = function(customConfig, customMongoConfig) { + var mosto_server = new mosto(customConfig, customMongoConfig); return mosto_server; }; /* From 5b02da4223ebedda63894f2ebe299ec7f3f3c673 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:49:12 -0300 Subject: [PATCH 35/92] Logging Signed-off-by: Juan Martin Runge --- mosto.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mosto.js b/mosto.js index 9ecc0e1..f9714d9 100644 --- a/mosto.js +++ b/mosto.js @@ -226,6 +226,7 @@ mosto.prototype.init = function(melted, callback) { * linkear heartbeat con status driver */ function startall() { + logger.info("Starting modules..."); self.pl_driver = new playlists_driver(self.config.playlist_server, self.mongoConfig); self.status_driver = new status_driver(self.mongoConfig); self.playlists = models.Playlists(); @@ -257,9 +258,11 @@ mosto.prototype.scheduleMeltedCheck = function() { }; mosto.prototype.checkMelted = function(callback, forceLoad) { + logger.debug("Checking melted..."); var self = this; Melted.is_running(function(running) { if (!running) { + logger.error("Melted was not running!"); Melted.start(function(pid) { Melted.setup(undefined, undefined, function(result) { if (forceLoad) From c79e60984dd28592b088c0bfa79b6c4164f847cf Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:49:27 -0300 Subject: [PATCH 36/92] Incremented finish timeout in mosto core Signed-off-by: Juan Martin Runge --- mosto.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mosto.js b/mosto.js index f9714d9..0b1bff3 100644 --- a/mosto.js +++ b/mosto.js @@ -298,7 +298,7 @@ mosto.prototype.finish = function(callback) { setTimeout( function() { logger.debug("[finish] calling callback"); if (callback) callback(); - }, 1000 ); + }, 5000 ); }); }); }); From 0518d23fe937a4a8f47b747eb57359bc5b308391 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:03:46 -0300 Subject: [PATCH 37/92] Added logger to melted-node in functional test so it starts respecting log level Signed-off-by: Juan Martin Runge --- test/general-functional-test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 4822a1d..43e8a94 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -6,6 +6,7 @@ var melted = require('melted-node'); var _ = require('underscore'); var seed = require('seed-random'); var mbc = require('mbc-common'); +var melted_log = mbc.logger().addLogger('MELTED-NODE'); var Media = require('mbc-common/models/Media'); var Q = require('q'); var moment = require('moment'); From 7f45f61c0e47950e1799592565103aa8145b5341 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:04:55 -0300 Subject: [PATCH 38/92] Set mongo config to mosto so it sends it to mongo driver and pubsub Signed-off-by: Juan Martin Runge --- test/general-functional-test.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 43e8a94..d911295 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -180,11 +180,14 @@ describe("Mosto functional test", function() { self.publisher = mbc.pubsub(); self.listener = mbc.pubsub(); - self.db = mbc.db({ - dbName: 'mediatestdb', - dbHost: 'localhost', - dbPort: 27017 - }); + self.mongoConf = { + db: { + dbName: 'mediatestdb', + dbHost: 'localhost', + dbPort: 27017 + } + }; + self.db = mbc.db(self.mongoConf.db); /* generic tests */ self.is_synced = function(time) { @@ -225,7 +228,7 @@ describe("Mosto functional test", function() { describe('start without playlists', function() { before(function(done) { self.db.dropDatabase(function(err, success) { - self.mosto = new mosto(); + self.mosto = new mosto(undefined, self.mongoConf); self.mosto.once('playing', function() { done(); }); @@ -277,7 +280,7 @@ describe("Mosto functional test", function() { var setup = self.setup_playlists(moment( moment() + _.randint(0, -30000))); setup.then(function() { - self.mosto = new mosto(); + self.mosto = new mosto(undefined, self.mongoConf); self.mosto.once('playing', function() { // send pubsub messages with new playlists self.melted.connect().then(function(){ @@ -361,7 +364,7 @@ describe("Mosto functional test", function() { var setup = self.setup_playlists(moment( moment() - 5 * 60 * 1000)); setup.then(function() { - self.mosto = new mosto(); + self.mosto = new mosto(undefined, self.mongoConf); self.mosto.once('playing', function() { // send pubsub messages with new playlists done(); From 24bcc01a996cfe0eef3c0bad669f229da31f5d97 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:05:37 -0300 Subject: [PATCH 39/92] Removed skip from functional test start with playlists Signed-off-by: Juan Martin Runge --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index d911295..50cbe1d 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -257,7 +257,7 @@ describe("Mosto functional test", function() { ** ver que haya el play correspondiente ** ver que este en el frame correcto */ - describe.skip('start with playlists', function() { + describe('start with playlists', function() { self.playlist_count = _.randint(5, 10, self.rand()); before(function() { self.medias = helper.getMBCMedia(); From 6aac1f780d75bf0d61258550192096e25599d342 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:06:25 -0300 Subject: [PATCH 40/92] Wait for BLANK file in listener before continuing with the test Signed-off-by: Juan Martin Runge --- test/general-functional-test.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 50cbe1d..0a49afb 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -323,10 +323,12 @@ describe("Mosto functional test", function() { before(function(done) { var occurrence = self.get_occurrence(); self.delete_occurrence(occurrence).then(function() { - self.listener.once('message', function(chan, msg) { + self.listener.on('JSONmessage', function(chan, msg) { if(chan == 'mostoStatus') { - self.listener.unsubscribe('mostoStatus'); - done(); + if (msg.piece.current._id.indexOf('BLANK') > -1) { + self.listener.unsubscribe('mostoStatus'); + done(); + } } }); self.listener.subscribe('mostoStatus'); From 7edbfa51d76209e34ff7486e28ea6bfa66be324e Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:07:11 -0300 Subject: [PATCH 41/92] Added helper function to get medias as JSON Signed-off-by: Juan Martin Runge --- test/media_helpers.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/media_helpers.js b/test/media_helpers.js index 5f06e4d..36e7b95 100644 --- a/test/media_helpers.js +++ b/test/media_helpers.js @@ -90,6 +90,32 @@ exports.getMBCMedia = function(path) { }; +/* + * getJSONMedia(path) + * - path: optional path + * + * Scans given path (or default) getting media files and returns JSON objects array + */ +exports.getJSONMedia = function(path) { + if (path === undefined) { + path = "test/videos/"; // TODO FIXME XXX: ugly hardcoded -> should be in config? + } + + var parsed = parseXMLs(path); + var medias = parsed.map(function(elem) { + var params = {}; + params.name = elem.filename; + params._id = crypto.createHash('md5').update(params.name).digest('hex'); + params.file = process.cwd() + '/' + path + elem.filename; + params.fps = parseInt(elem.data.mlt.profile[0]["$"].frame_rate_num, 10); + var frames = parseInt(elem.data.mlt.producer[0]["$"].out, 10); + var duration = moment("0:0:0.0", "HH:mm:ss.SSS").add(exports.framesToMilliseconds(frames, params.fps)); + params.durationraw = duration.format("HH:mm:ss.SSS"); + return params; + }); + return medias; +}; + /* * getTotalMediaLength(media_array) * - media_array: an array of Media objects From 66f8168dcbe835f47d16f1d658db50137607e9e1 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:08:56 -0300 Subject: [PATCH 42/92] Changed the way of creating pieces (using JSON instead of Media.Model) and drop database before test starts Signed-off-by: Juan Martin Runge --- test/playlist-mongo-driver.js | 120 ++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 56 deletions(-) diff --git a/test/playlist-mongo-driver.js b/test/playlist-mongo-driver.js index db67167..328fc47 100644 --- a/test/playlist-mongo-driver.js +++ b/test/playlist-mongo-driver.js @@ -26,68 +26,75 @@ describe('PlaylistMongoDriver', function(){ self.driver = new mongo_driver(conf); self.db = mbc.db(conf.db); - self.driver.start(); - self.from = moment(); - self.span = 120; - self.to = moment((self.from.unix() + self.span * 60) * 1000); // add 2hs - - self.collections = { - lists: self.db.collection('lists'), - scheds: self.db.collection('scheds'), - pieces: self.db.collection('pieces'), - }; + self.db.dropDatabase(function(err, success) { + self.driver.start(); + self.from = moment(); + self.span = 120; + self.to = moment((self.from.unix() + self.span * 60) * 1000); // add 2hs + + self.collections = { + lists: self.db.collection('lists'), + scheds: self.db.collection('scheds'), + pieces: self.db.collection('pieces'), + }; - var medias = helpers.getMBCMedia(); - // let's create a playlist at least 1 hour long - var playlist = new Media.Playlist({_id: uuid.v1(), title: 'Name'}); - while(playlist.get('duration') < 3600000) { - var media = _.randelem(medias); - var piece = new Media.Piece(media.toJSON()); - piece.set('_id', uuid.v1()); - playlist.get('pieces').add(piece); - playlist.update_duration_nowait(playlist.get('pieces')); - } - self.pieces = playlist.get('pieces'); - self.lists = [playlist]; - // program at least 4hs of schedules - self.scheds = []; - for(var i = 0 ; i < 5 ; i++) { - var schedule = { - _id: uuid.v1(), - playlist: playlist, - title: playlist.get('title') + i, + var medias = helpers.getJSONMedia(); + // let's create a playlist at least 1 hour long + var playlist = new Media.Playlist({_id: uuid.v1(), title: 'Name'}); + while(playlist.get('duration') < 3600000) { + var m = _.randelem(medias); + var piece = new Media.Piece(); + piece.set('_id', uuid.v1()); + piece.set('name', m.name); + piece.set('file', m.file); + piece.set('fps', m.fps); + piece.set('durationraw', m.durationraw); + playlist.get('pieces').add(piece); + playlist.update_duration_nowait(playlist.get('pieces')); + } + self.pieces = playlist.get('pieces'); + self.lists = [playlist]; + // program at least 4hs of schedules + self.scheds = []; + for(var i = 0 ; i < 5 ; i++) { + var schedule = { + _id: uuid.v1(), + playlist: playlist, + title: playlist.get('title') + i, + }; + var hsix = i - 3; + var now = self.from; + // schedules are from 1hs before now + var schtime = moment(now + (hsix * 30 * 60 * 1000)).valueOf(); + var length = moment.duration(playlist.get('duration')); + schedule.start = schtime; + schedule.end = schtime + length; + var occurrence = new Media.Occurrence(schedule); + self.scheds.push(occurrence); }; - var hsix = i - 3; - var now = self.from; - // schedules are from 1hs before now - var schtime = moment(now + (hsix * 30 * 60 * 1000)).valueOf(); - var length = moment.duration(playlist.get('duration')); - schedule.start = schtime; - schedule.end = schtime + length; - var occurrence = new Media.Occurrence(schedule); - self.scheds.push(occurrence); - }; - var ready = _.after( - self.lists.length + self.pieces.length + self.scheds.length, - function(){ done() }); + var ready = _.after( + self.lists.length + self.pieces.length + self.scheds.length, + function(){ done() }); - self.pieces.forEach(function(piece) { - self.collections.pieces.save(piece.toJSON(), {safe:true}, function(err, list) { - ready(); + self.pieces.forEach(function(piece) { + self.collections.pieces.save(piece.toJSON(), {safe:true}, function(err, list) { + ready(); + }); }); - }); - self.lists.forEach(function(playlist) { - self.collections.lists.save(playlist.toJSON(), {safe:true}, function(err, list) { - ready(); + self.lists.forEach(function(playlist) { + self.collections.lists.save(playlist.toJSON(), {safe:true}, function(err, list) { + ready(); + }); }); - }); - self.scheds.forEach(function(occurrence) { - self.collections.scheds.save(occurrence.toJSON(), {safe:true}, function(err, sched){ - ready(); + self.scheds.forEach(function(occurrence) { + self.collections.scheds.save(occurrence.toJSON(), {safe:true}, function(err, sched){ + ready(); + }); }); + }); }); }); @@ -128,8 +135,8 @@ describe('PlaylistMongoDriver', function(){ message.method = 'create'; self.driver.on('create', function(playlist) { playlist.id.should.be.eql(message.model._id); - playlist.name.should.be.eql(message.model.title); - moment(playlist.start).valueOf().should.eql(message.model.start); + playlist.get('name').should.be.eql(message.model.title); + moment(playlist.get('start')).valueOf().should.eql(message.model.start); done(); }); self.pubsub.publishJSON(message.channel(), message); @@ -156,7 +163,8 @@ describe('PlaylistMongoDriver', function(){ it('should return playlists', function(done) { self.driver.getPlaylists({from: self.from, to: self.to}, function(playlists) { playlists.length.should.not.be.eql(0); - playlists.forEach(function(playlist) { + playlists.forEach(function(pl) { + var playlist = pl.toJSON(); playlist.should.have.property('id'); playlist.should.have.property('name'); playlist.should.have.property('start'); From 4d176dc38cc9e4cefea902db37a757c1f8c2c87c Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:28:13 -0300 Subject: [PATCH 43/92] Added LOG_LEVEL to npm test (used by travis) because it claims log becomes too large and throws error Signed-off-by: Juan Martin Runge --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7173795..f4f2a8d 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "author": "Juan Martin Runge ", "contributors": [ "Niv Sardi ", "hatcsh"], "scripts": { - "test": "make coverage" + "test": "make LOG_LEVEL=info coverage" }, "main": "mosto", "repository": { From 36065410999bfc42e0851e45a246f05f721cbc85 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 13:04:44 -0300 Subject: [PATCH 44/92] Incremented timout on mosto finish due travis errors Signed-off-by: Juan Martin Runge --- mosto.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mosto.js b/mosto.js index 0b1bff3..973de7d 100644 --- a/mosto.js +++ b/mosto.js @@ -298,7 +298,7 @@ mosto.prototype.finish = function(callback) { setTimeout( function() { logger.debug("[finish] calling callback"); if (callback) callback(); - }, 5000 ); + }, 7000 ); }); }); }); From 45282be7c3a28c8303d37c31203fd0c4e2b6e321 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 13:55:39 -0300 Subject: [PATCH 45/92] Unsuscribe from events after receive the one needed Signed-off-by: Juan Martin Runge --- test/playlist-mongo-driver.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/playlist-mongo-driver.js b/test/playlist-mongo-driver.js index 328fc47..518acc5 100644 --- a/test/playlist-mongo-driver.js +++ b/test/playlist-mongo-driver.js @@ -137,6 +137,7 @@ describe('PlaylistMongoDriver', function(){ playlist.id.should.be.eql(message.model._id); playlist.get('name').should.be.eql(message.model.title); moment(playlist.get('start')).valueOf().should.eql(message.model.start); + self.driver.removeAllListeners('create'); done(); }); self.pubsub.publishJSON(message.channel(), message); @@ -145,6 +146,7 @@ describe('PlaylistMongoDriver', function(){ var message = self.message; message.method = 'update'; self.driver.on('update', function(playlist) { + self.driver.removeAllListeners('update'); done(); }); self.pubsub.publishJSON(message.channel(), message); @@ -154,6 +156,7 @@ describe('PlaylistMongoDriver', function(){ message.method = 'delete'; self.driver.on('delete', function(id) { id.should.be.eql(message.model._id); + self.driver.removeAllListeners('delete'); done(); }); self.pubsub.publishJSON(message.channel(), message); From 3a20c47191d0b797f22cf6a5881c4a9fa2ca090c Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Mon, 2 Dec 2013 11:10:12 -0300 Subject: [PATCH 46/92] Removed node 0.8 from travis config Signed-off-by: Juan Martin Runge --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bf56b25..eb29729 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: node_js node_js: - "0.10" - - "0.8" services: - mongodb - redis From 65816d3e3bb3f0867da9344ad462f448083cb3e9 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 11 Sep 2013 13:38:11 -0300 Subject: [PATCH 47/92] add back mosto status test Signed-off-by: Tomas Neme --- test/mosto-status-test.js | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/test/mosto-status-test.js b/test/mosto-status-test.js index 8f7efc4..0abdb0b 100644 --- a/test/mosto-status-test.js +++ b/test/mosto-status-test.js @@ -1,23 +1,18 @@ var assert = require("assert"), - mosto = require('../mosto'), - melted = require('../api/Melted'); +mosto = require('../mosto'), +melted = require('../api/Melted'); //TODO: This test should be rewritten after @fabriciocosta merges his part with more usefull data! -describe.skip('Mosto status', function() { +describe('Mosto status', function() { var mosto_server = undefined; var rec = -1; before(function(done) { melted.take(function() { - console.error("MELTED 1"); melted.stop(function(){ - console.error("MELTED 2"); melted.start(function() { - console.error("MELTED 3"); melted.setup(undefined, undefined, function() { - console.error("MELTED READY"); -// melted.leave(); done(); }); }); @@ -25,6 +20,12 @@ describe.skip('Mosto status', function() { }); }); + after(function(done) { + mosto_server.finish(function() { + melted.stop(done); + }); + }); + describe('# status test: init mosto without playlists', function() { before(function(done) { @@ -57,11 +58,4 @@ describe.skip('Mosto status', function() { }); }); }); - - - after(function(done) { - mosto_server.finish(done); - }); - - }); From 34392da060344a1b8dc89d606a681690f2588c18 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 11 Sep 2013 16:17:12 -0300 Subject: [PATCH 48/92] logging Signed-off-by: Tomas Neme --- api/Melted.js | 11 +++++++++-- mosto.js | 11 ++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/api/Melted.js b/api/Melted.js index 50d7b1f..f7bba6a 100644 --- a/api/Melted.js +++ b/api/Melted.js @@ -176,6 +176,7 @@ exports.push = function(conn, commands, command_callback, close_callback) { var s = 0; conn.on('connect', function() { conn.on('data', function(data) { + logger.debug('[push] got data: "%s"', data); if (command_callback) command_callback(data); if (s < commands.length && data.indexOf("\n") > -1) { conn.write(commands[s]+"\n"); @@ -216,7 +217,10 @@ exports.setup = function(root, output, callback) { * @callback: callback function to process while take melted. * */ -exports.take = semaphore.take; +exports.take = function() { + logger.info('take'); + return semaphore.take.apply(this, arguments); +}; /** * leave @@ -224,4 +228,7 @@ exports.take = semaphore.take; * Leave execution to other melted taked. * */ -exports.leave = semaphore.leave; +exports.leave = function() { + logger.info('leave'); + return semaphore.leave.apply(this, arguments); +}; diff --git a/mosto.js b/mosto.js index 81b74e9..cda03c8 100644 --- a/mosto.js +++ b/mosto.js @@ -282,11 +282,20 @@ mosto.prototype.finish = function(callback) { clearTimeout(self.meltedInterval); this.stopDriver(); this.playlists.get("melted_medias").write.take(function() { - self.playlists.get("melted_medias").stopMvcpServer().fin(self.stopHeartbeats).fin(function() { + logger.debug("[finish] stop melted_medias mvcp server"); + self.playlists.get("melted_medias").stopMvcpServer().fin(function() { + logger.debug("[finish] stop heartbeats"); + return self.stopHeartbeats(); + }).fin(function() { + logger.debug("[finish] leave melted_medias write lock") self.playlists.get("melted_medias").write.leave(); + logger.debug("[finish] stop Melted"); Melted.stop(function(pid) { + logger.debug("[finish] melted stopped"); setTimeout( function() { + logger.debug("[finish] leaving Melted lock"); Melted.leave(); + logger.debug("[finish] calling callback"); if (callback) callback(); }, 1000 ); }); From 1033d9432ef4c57e4aca40b628ac211dfe28e73b Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 11 Sep 2013 16:17:33 -0300 Subject: [PATCH 49/92] whitespace Signed-off-by: Tomas Neme --- test/models-test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/models-test.js b/test/models-test.js index 1e693dd..4cf958c 100644 --- a/test/models-test.js +++ b/test/models-test.js @@ -15,7 +15,7 @@ describe.skip('models.Mosto', function() { self.server = new mvcp('melted'); self.createPlaylist = function(medias, start) { - var duration = _.reduce(medias, function(acc, m) { + var duration = _.reduce(medias, function(acc, m) { return acc + m.get('length') * m.get('fps'); }, 0); start = start || moment(); @@ -58,8 +58,8 @@ describe.skip('models.Mosto', function() { before(function(done) { self.mlt_media = self.playlists().get('melted_medias'); self.pls = self.playlists().get('playlists'); - self.mediamodels = _.map(self.medias, function(media, ix) { - return new Mosto.Media(_.extend(media, {playlist_order: ix})); + self.mediamodels = _.map(self.medias, function(media, ix) { + return new Mosto.Media(_.extend(media, {playlist_order: ix})); }); done(); }); @@ -107,7 +107,7 @@ describe.skip('models.Mosto', function() { self.playlists().save(); self.mlt_media.write.take(function() { self.mlt_media.write.leave(); - done(); + done(); }); }); afterEach(function(done) { From a9513ba79afe1b13e0579d666b82db4352dec99b Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 11 Sep 2013 16:21:00 -0300 Subject: [PATCH 50/92] return models tests Signed-off-by: Tomas Neme --- test/models-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models-test.js b/test/models-test.js index 4cf958c..fcae0ab 100644 --- a/test/models-test.js +++ b/test/models-test.js @@ -7,7 +7,7 @@ var Mosto = require('../models/Mosto') , moment = require('moment') ; -describe.skip('models.Mosto', function() { +describe('models.Mosto', function() { var self = this; self.playlists = Mosto.Playlists; self.medias = helpers.getMedia(); From 57a0ffd1643ef1cca6ab178fb08a71671193222d Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 11 Sep 2013 16:30:41 -0300 Subject: [PATCH 51/92] getWindow doesn't exist anymore Signed-off-by: Tomas Neme --- test/playlist-mongo-driver.js | 45 ----------------------------------- 1 file changed, 45 deletions(-) diff --git a/test/playlist-mongo-driver.js b/test/playlist-mongo-driver.js index 35c29c4..37e449f 100644 --- a/test/playlist-mongo-driver.js +++ b/test/playlist-mongo-driver.js @@ -106,51 +106,6 @@ describe('PlaylistMongoDriver', function(){ done(); }); - describe.skip('#getWindow()', function() { - beforeEach(function(){ - self.driver.window = undefined; - }); - it('should exist', function() { - self.driver.should.have.property('getWindow'); - self.driver.getWindow.should.be.a('function'); - }); - it('should accept two parameters and save them in window = {from, to}', function() { - var window = self.driver.getWindow(self.from, self.to); - window.from.valueOf().should.equal(self.from.valueOf()); - window.to.valueOf().should.equal(self.to.valueOf()); - }); - it('should accept an object with {from, to}', function() { - var window = self.driver.getWindow({from: self.from, to: self.to}); - window.from.valueOf().should.equal(self.from.valueOf()); - window.to.valueOf().should.equal(self.to.valueOf()); - }); - it('should accept an object with {from, timeSpan}', function() { - var window = self.driver.getWindow({from: self.from, timeSpan: self.span}); - window.from.valueOf().should.equal(self.from.valueOf()); - var to = moment(self.from.valueOf()); - to.add(self.span * 60 * 1000); - console.log('popop', window.to.valueOf(), to.valueOf()) - window.to.valueOf().should.equal(to.valueOf()); - }); - it('should accept only a "to" object and assume "from" is now', function() { - var window = self.driver.getWindow({to: self.to}); - window.should.have.property('from'); - window.from.valueOf().should.approximately((new moment()).valueOf(), 10); - }); - it('should accept no parameters, and use the config file from defaults', function(){ - var window = self.driver.getWindow(); - var config = require('mbc-common').config.Mosto.Mongo; - window.timeSpan.should.equal(config.load_time * 60 * 1000); - window.from.valueOf().should.approximately(moment().valueOf(), 10); - window.to.diff(window.from).valueOf().should.equal(window.timeSpan.valueOf()); - }); - it('should accept dates and transform them to moments', function() { - var window = self.driver.getWindow(new Date(), new Date()); - moment.isMoment(window.from).should.be.ok; - moment.isMoment(window.to).should.be.ok; - }); - }); - describe('#subscriptions', function() { before(function() { self.pubsub = mbc.pubsub(); From 8f8b5e2672b28f9dd8e60170013eda4133dee76f Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Mon, 7 Oct 2013 18:31:52 -0300 Subject: [PATCH 52/92] fix 'should responde to create messages' test for new format Signed-off-by: Tomas Neme --- test/playlist-mongo-driver.js | 42 ++++++++++++++++------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/test/playlist-mongo-driver.js b/test/playlist-mongo-driver.js index 37e449f..bbd3f19 100644 --- a/test/playlist-mongo-driver.js +++ b/test/playlist-mongo-driver.js @@ -39,8 +39,7 @@ describe('PlaylistMongoDriver', function(){ var medias = helpers.getMBCMedia(); // let's create a playlist at least 1 hour long - var playlist = new Media.Playlist({_id: uuid.v1()}); - playlist.set('title', 'TestPlaylist'); + var playlist = new Media.Playlist({_id: uuid.v1(), title: 'Name'}); while(playlist.get('duration') < 3600000) { var media = _.randelem(medias); var piece = new Media.Piece(media.toJSON()); @@ -61,9 +60,9 @@ describe('PlaylistMongoDriver', function(){ var hsix = i - 3; var now = self.from; // schedules are from 1hs before now - var schtime = moment(now + (hsix * 30 * 60 * 1000)); + var schtime = moment(now + (hsix * 30 * 60 * 1000)).valueOf(); var length = moment.duration(playlist.get('duration')); - schedule.start = schtime.valueOf(); + schedule.start = schtime; schedule.end = schtime + length; var occurrence = new Media.Occurrence(schedule); self.scheds.push(occurrence); @@ -113,7 +112,7 @@ describe('PlaylistMongoDriver', function(){ var list = sched.get('playlist'); var model = sched.toJSON(); model.start = moment().valueOf() - model.end = moment().add(list.get('duration')); + model.end = moment().add(list.get('duration')).valueOf(); self.message = { backend: 'schedbackend', model: model, @@ -126,10 +125,9 @@ describe('PlaylistMongoDriver', function(){ var message = self.message; message.method = 'create'; self.driver.on('create', function(playlist) { - console.log("create received! - " + playlist.name ); - playlist.get('id').should.be.eql(message.model._id); - playlist.get('name').should.be.eql(message.model.title); - playlist.get('start').should.eql(message.model.start); + playlist.id.should.be.eql(message.model._id); + playlist.name.should.be.eql(message.model.title); + moment(playlist.start).valueOf().should.eql(message.model.start); done(); }); self.pubsub.publishJSON(message.channel(), message); @@ -157,12 +155,13 @@ describe('PlaylistMongoDriver', function(){ self.driver.getPlaylists({from: self.from, to: self.to}, function(playlists) { playlists.length.should.not.be.eql(0); playlists.forEach(function(playlist) { - playlist.get('id').should.be.ok; - playlist.get('name').should.be.ok; - playlist.get('start').should.be.ok; - playlist.get('medias').should.be.ok; - playlist.get('end').should.be.ok; - playlist.get('loaded').should.not.be.ok; + playlist.should.have.property('id'); + playlist.should.have.property('name'); + playlist.should.have.property('start'); + playlist.should.have.property('medias'); + playlist.should.have.property('end'); + playlist.should.have.property('loaded'); + playlist.should.have.property('mode'); }); done(); }); @@ -170,18 +169,15 @@ describe('PlaylistMongoDriver', function(){ it('should return only playlists within timeframe', function(done) { var inside = function(sched) { - return (sched.get('start') <= self.to.valueOf() && - sched.get('end') >= self.from.valueOf()); - }; - var sched_id = function(sched) { - return sched.get('_id'); + return (sched.get('start') <= self.to && + sched.get('end') >= self.from); }; - var in_scheds = _.chain(self.scheds).filter(inside).map(sched_id).value(); - var out_scheds = _.chain(self.scheds).reject(inside).map(sched_id).value(); + var in_scheds = _.chain(self.scheds).filter(inside).pluck('id').value(); + var out_scheds = _.chain(self.scheds).reject(inside).pluck('id').value(); self.driver.getPlaylists({from: self.from, to: self.to}, function(playlists) { - var pl_ids = _.chain(playlists).map(function(pl) { return pl.get('id') }).value(); + var pl_ids = _.chain(playlists).pluck('id').value(); pl_ids.forEach(function(playlist, ix) { playlist.should.eql(in_scheds[ix]); From 963dfdb95921486b05132397f17f4f1a15e5541a Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Mon, 7 Oct 2013 18:35:29 -0300 Subject: [PATCH 53/92] use new commands Signed-off-by: Tomas Neme --- test/general-functional-test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 92bb27b..70cf751 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -178,7 +178,7 @@ describe.skip("Mosto functional test", function() { /* generic tests */ self.is_synced = function(done) { - var result = self.melted.sendPromisedCommand('USTA U0', '202 OK').then(function(val) { + var result = self.melted.sendCommand('USTA U0').then(function(val) { var time = moment(); var expected_media = self.get_media(time); console.log('[is_synced] time:', time.valueOf()); @@ -223,7 +223,7 @@ describe.skip("Mosto functional test", function() { }); }); it('should show black', function(done) { - var promise = self.melted.sendPromisedCommand('USTA U0', '202 OK'); + var promise = self.melted.sendCommand('USTA U0'); promise.then(function(result) { result = result.split('\r\n')[1].split(' '); var file = result[2]; @@ -309,7 +309,7 @@ describe.skip("Mosto functional test", function() { }); it('should not break'); it('should be playing blank clip', function(done) { - var promise = self.melted.sendPromisedCommand('USTA U0', '202 OK'); + var promise = self.melted.sendCommand('USTA U0'); promise.then(function(result) { result = result.split('\r\n')[1].split(' '); var file = result[2]; From d927cc6a934a9ebe4f38926e6455c96b9f33dba7 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Mon, 7 Oct 2013 18:39:52 -0300 Subject: [PATCH 54/92] fix blank clip name Signed-off-by: Tomas Neme --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 70cf751..552f8de 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -227,7 +227,7 @@ describe.skip("Mosto functional test", function() { promise.then(function(result) { result = result.split('\r\n')[1].split(' '); var file = result[2]; - file.should.include('black_id'); + file.should.include('BLANK'); }).then(done).done(); }); }); From 2c920917d9debe7987b592f5b5ff6fb24692cd4b Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Mon, 7 Oct 2013 18:40:04 -0300 Subject: [PATCH 55/92] add functional test back Signed-off-by: Tomas Neme --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 552f8de..de4bcd1 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -13,7 +13,7 @@ var helper = require('./media_helpers.js'); var uuid = require('node-uuid'); var mosto_config = require('mbc-common').config.Mosto.General; -describe.skip("Mosto functional test", function() { +describe("Mosto functional test", function() { /* * arrancar sin playlists ** ver negro From f06ed2090215ce18bffe8469bec13f409873e41d Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:34:50 -0300 Subject: [PATCH 56/92] require only the... required.. driver Signed-off-by: Tomas Neme --- drivers/playlists/playlists-driver.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/playlists/playlists-driver.js b/drivers/playlists/playlists-driver.js index 6468a3f..6a03a90 100644 --- a/drivers/playlists/playlists-driver.js +++ b/drivers/playlists/playlists-driver.js @@ -1,15 +1,18 @@ -var json_driver = require("./json-driver"), - mongo_driver = require("./mongo-driver"), - mbc = require("mbc-common"), - logger = mbc.logger().addLogger('PLAYLISTS-DRIVER'); +var mbc = require("mbc-common"), +logger = mbc.logger().addLogger('PLAYLISTS-DRIVER'), exports = module.exports = function(type, config) { logger.info("Creating playlists driver for type [" + type + "]"); if (type === 'json') { + var json_driver = require("./json-driver"); return new json_driver(config); } else if (type === 'mongo') { + var mongo_driver = require("./mongo-driver"); return new mongo_driver(config); + } else if (type === 'test') { + var test_driver = require("./test-driver"); + return new test_driver(config); } /****************************************************************** From bce61c27061c4b2f48de71a4b743baf7dfb4ff93 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:35:55 -0300 Subject: [PATCH 57/92] fix helper functions for new models Signed-off-by: Tomas Neme --- test/general-functional-test.js | 74 ++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index de4bcd1..023bacb 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -26,12 +26,14 @@ describe("Mosto functional test", function() { self.create_playlist = function(medias) { medias = medias || []; - var mediamodels = []; - medias.forEach(function(media) { - mediamodels.push( new Media.Piece(media.toJSON()) ); - }); - return new Media.List({ - models: mediamodels + console.log('create playlist with', medias.length, 'pieces'); + return new Media.Playlist({ + _id: uuid.v1(), + pieces: _.map(medias, function(m) { + var piece = m.toJSON(); + piece._id = uuid.v1(); + return new Media.Piece(piece); + }), }); }; @@ -50,15 +52,18 @@ describe("Mosto functional test", function() { }); var occcol = self.db.collection('scheds'); var listcol = self.db.collection('lists'); + var piececol = self.db.collection('pieces'); var log = []; for( var i = 0 ; i < self.playlists.length ; i++ ) { var playlist = self.playlists[i]; - var occurrence = { - start: timewalk.unix() - }; + var occurrence = new Media.Occurrence({ + playlist: playlist, + start: timewalk.valueOf(), + _id: uuid.v1(), + }); log.push(i+':'); - log.push('occurrence.start: ' + occurrence.start); - var medias = playlist.get('collection'); + log.push('occurrence.start: ' + occurrence.get('start')); + var medias = playlist.get('pieces'); for( var j = 0 ; j < medias.length ; j++ ) { var media = medias.at(j); media.start_time = timewalk.valueOf(); @@ -69,32 +74,35 @@ describe("Mosto functional test", function() { media.end_time = timewalk.valueOf(); log.push('media ' + j + ' end : ' + media.end_time); } - occurrence.end = timewalk.unix(); - log.push('occurrence.end : ' + occurrence.end); - var playlist_json = _.omit(playlist.toJSON(), 'collection'); - playlist_json.models = _.invoke(playlist_json.models, 'toJSON'); - playlist_json._id = uuid.v4(); + occurrence.set('end', timewalk.valueOf()); + log.push('occurrence.end : ' + occurrence.get('end')); log.forEach(function(l) { console.log('[setup_playlists]:', l) ; }); - console.log('[setup_playlists] final:', playlist_json); + console.log('[setup_playlists] final:', playlist.toJSON()); // I need to wrap this in order to keep the `playlist` variable (function(pl, oc) { - listcol.insert(playlist_json, function(err, obj) { + console.log('saving occurrence', oc.id); + console.log('inserting', pl.get('pieces').length, 'pieces'); + Q.ninvoke(piececol, 'insert', pl.get('pieces').toJSON()).then(function(obj) { + console.log(obj.length, 'pieces inserted'); + console.log('inserting playlist', pl.id); + return Q.ninvoke(listcol, 'insert', pl.toJSON()) + }).then(function(obj) { obj = obj[0]; + console.log('inserted playlist', obj._id); // update self.playlists - _.extend(pl, obj); - occurrence = new Media.Occurrence({ - list: obj._id, - start: oc.start, - end: oc.end, - _id: oc.start.toString(), - }); - occcol.insert(occurrence.toJSON(), function(err, obj) { - var obj = obj[0]; - self.occurrences.push(obj); - done(); - }); + pl.set(obj); + console.log('inserting occurrence', oc.id); + return Q.ninvoke(occcol, 'insert', oc.toJSON()); + }).then(function(obj) { + var obj = obj[0]; + console.log('inserted occurrence', obj._id); + self.occurrences.push(obj); + done(); + }).fail(function(err) { + console.log('ERROR ERROR', err); + throw new Error(err); }); })(playlist, occurrence); } @@ -147,7 +155,7 @@ describe("Mosto functional test", function() { self.get_occurrence = function(time) { time = time || moment(); return _.find(self.occurrences, function(pl) { - return pl.start <= time.unix() && pl.end >= time.unix(); + return pl.start <= time.valueOf() && pl.end >= time.valueOf(); }); }; @@ -155,7 +163,7 @@ describe("Mosto functional test", function() { time = time || moment(); var occurrence = self.get_occurrence(time); return _.find(self.playlists, function(pl) { - return pl._id === occurrence.list; + return pl.id === occurrence.playlist; }); }; @@ -163,7 +171,7 @@ describe("Mosto functional test", function() { time = time || moment(); var playlist = self.get_playlist(time); - return _.find(playlist.get('models'), function(me) { + return playlist.get('pieces').find(function(me) { return me.start_time <= time && me.end_time >= time; }); }; From 6602e51c1692fdcd5e890354e20c2c10d1889e5d Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:36:16 -0300 Subject: [PATCH 58/92] there's no more 'promisedCommand' methods Signed-off-by: Tomas Neme --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 023bacb..a07754c 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -287,7 +287,7 @@ describe("Mosto functional test", function() { var expected_occurrence = self.get_occurrence(time); var expected_media = self.get_media(time); - var result = self.melted.sendPromisedCommand('USTA U0', '202 OK'); + var result = self.melted.sendCommand('USTA U0'); result.then(function(val) { var lines = val.split("\r\n"); lines[0].should.eql('202 OK'); From 6d67320fda46fabb487a329e160693b9292f11cb Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:36:43 -0300 Subject: [PATCH 59/92] the telltale string changed Signed-off-by: Tomas Neme --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index a07754c..1460971 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -321,7 +321,7 @@ describe("Mosto functional test", function() { promise.then(function(result) { result = result.split('\r\n')[1].split(' '); var file = result[2]; - file.should.include('black_id'); + file.should.include('BLANK'); }).then(done).done(); }); }); From 60ef578d9f25708da87d1434cda9883ddffbae72 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:37:06 -0300 Subject: [PATCH 60/92] call done(), make sure we pass no arguments Signed-off-by: Tomas Neme --- test/general-functional-test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 1460971..367c735 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -270,7 +270,9 @@ describe("Mosto functional test", function() { self.mosto = new mosto(); self.mosto.once('playing', function() { // send pubsub messages with new playlists - self.melted.connect().then(done); + self.melted.connect().then(function(){ + done(); + }).done(); }); self.mosto.init(); }); From 0e06264dabda780cf329ea48fcd23cdb47f2df2a Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 16:37:34 -0300 Subject: [PATCH 61/92] is_synced receives the time Signed-off-by: Tomas Neme --- test/general-functional-test.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 367c735..1f0f1b8 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -185,7 +185,7 @@ describe("Mosto functional test", function() { }); /* generic tests */ - self.is_synced = function(done) { + self.is_synced = function(time) { var result = self.melted.sendCommand('USTA U0').then(function(val) { var time = moment(); var expected_media = self.get_media(time); @@ -200,8 +200,7 @@ describe("Mosto functional test", function() { var elapsed = helper.framesToMilliseconds(frame, fps); var expected = (time - expected_media.start_time).valueOf(); console.log('[is_synced] got', lines[1], 'at', frame, ':', elapsed, 'expected', expected); - elapsed.should.be.approximately(expected, 1000); - done(); + elapsed.should.be.approximately(expected, time); }); return result; }; From c821b306a4a5410e47607f83d0e78b9ab3e4b7a7 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 17:02:06 -0300 Subject: [PATCH 62/92] better logging on mongo driver Signed-off-by: Tomas Neme --- drivers/playlists/mongo-driver.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/playlists/mongo-driver.js b/drivers/playlists/mongo-driver.js index bb9562d..c085742 100644 --- a/drivers/playlists/mongo-driver.js +++ b/drivers/playlists/mongo-driver.js @@ -144,8 +144,9 @@ mongo_driver.prototype.createPlaylist = function(sched, callback) { } logger.debug("LIST:" + list._id); - logger.info("Processing list:", {"id": list && list._id, "clips": list && list.pieces.length}); + logger.info("Processing list:", {"id": list && list._id, "clips": list && list.pieces}); self.pieces.findItems({_id:{"$in": list.pieces}}, function(err, pieces) { + logger.info('found', (pieces && pieces.length) || 0, 'pieces'); pieces = _.chain(pieces).map(function(block){ block._id = (block._id.toHexString && block._id.toHexString()) || block._id; return block; From 345fbb868321e14423a85bb7b80d04880a48edec Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 17:02:42 -0300 Subject: [PATCH 63/92] listen on status change on pub/sub instead of on mosto events (more blackbox'ed) Signed-off-by: Tomas Neme --- test/general-functional-test.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 1f0f1b8..b699ac8 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -309,11 +309,13 @@ describe("Mosto functional test", function() { before(function(done) { var occurrence = self.get_occurrence(); self.delete_occurrence(occurrence).then(function() { - setTimeout(function() { - self.mosto.once('status', function(status) { + self.listener.once('message', function(chan, msg) { + if(chan == 'mostoStatus') { + self.listener.unsubscribe('mostoStatus'); done(); - }); - }, mosto_config.timer_interval); + } + }); + self.listener.subscribe('mostoStatus'); }).done(); }); it('should not break'); From 01162ef9fa593d66468463324775c95d512eaf1e Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Wed, 9 Oct 2013 17:02:54 -0300 Subject: [PATCH 64/92] remove dead code Signed-off-by: Tomas Neme --- utils.js | 57 -------------------------------------------------------- 1 file changed, 57 deletions(-) diff --git a/utils.js b/utils.js index 9ebbe58..84aa984 100644 --- a/utils.js +++ b/utils.js @@ -22,68 +22,11 @@ exports = module.exports = { return filename; }, - getTimeLengthFromFrames: function(frames, fps) { - var seconds = parseFloat(frames) / parseFloat(fps); - var minutes = 0; - if (seconds > 60) { - minutes = parseInt(seconds / 60); - seconds = parseInt (seconds - (minutes * 60)); - } - var hours = 0; - if (minutes > 60) { - hours = parseInt(hours / 60); - minutes = parseInt(minutes - (hours * 60)); - } - return "." + hours + ":" + minutes + ":" + seconds; - }, - getCurrentPosFromClip: function(actualFrame, totalFrames) { return parseFloat(actualFrame / totalFrames); }, - getFramePositionFromClock: function( clock_position, clip_start, frames_length, fps ) { - var millis = moment.duration( clock_position - clip_start ).asMilliseconds(); - var frame_position = Math.max( (millis / 1000.0 ) * fps, frames_length - 1); - return frame_position; - }, - convertFramesToSeconds: function ( frames, fps ) { return frames/fps; }, - - convertLengthToMilliseconds: function ( frames ) { - var m = moment( frames, "HH:mm:ss.SS"); - return m.hours()*60*60*1000 + m.minutes()*60*1000 + m.seconds()*1000 + m.milliseconds(); - }, - - convertFramesToMilliseconds: function ( frames, fps ) { - if ( isNaN(frames) || fps+""=="NaN" || fps==undefined || fps===false || fps==0) { - var m = moment( frames, "HH:mm:ss.SS"); - if (m) return m.hours()*60*60*1000 + m.minutes()*60*1000 + m.seconds()*1000 + m.milliseconds(); - } - fps = parseFloat(fps); - var millis = frames * 1000.0 / (1.0 * fps); - if (millis!==undefined) return millis; - }, - - convertDurationToString: function( moment_duration ) { - return moment_duration.hours()+":"+moment_duration.minutes()+":"+moment_duration.seconds()+"."+moment_duration.milliseconds(); - }, - - convertUnixToDate: function ( unix_timestamp ) { - //var date = new Date(unix_timestamp*1000); - var date = new moment(unix_timestamp); - return date.format("hh:mm:ss"); - }, - - convertDateToUnix: function ( date_timestamp ) { - var date = new moment(date_timestamp); - return date.unix(); - }, - - convertTimeToFrames: function(time, fps) { - var mTime = moment(time, "HH:mm:ss"); - var seconds = mTime.seconds() + (mTime.minutes() * 60) + (mTime.hours() * 60 * 60); - return seconds * fps; - } }; From 1150e1ea11284d8ce8101842c8c721af95130f68 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Fri, 11 Oct 2013 16:49:16 -0300 Subject: [PATCH 65/92] make sure to use safe:true in inserts Signed-off-by: Tomas Neme --- test/general-functional-test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index b699ac8..300c76c 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -84,17 +84,17 @@ describe("Mosto functional test", function() { (function(pl, oc) { console.log('saving occurrence', oc.id); console.log('inserting', pl.get('pieces').length, 'pieces'); - Q.ninvoke(piececol, 'insert', pl.get('pieces').toJSON()).then(function(obj) { + Q.ninvoke(piececol, 'insert', pl.get('pieces').toJSON(), {safe:true}).then(function(obj) { console.log(obj.length, 'pieces inserted'); console.log('inserting playlist', pl.id); - return Q.ninvoke(listcol, 'insert', pl.toJSON()) + return Q.ninvoke(listcol, 'insert', pl.toJSON(), {safe:true}) }).then(function(obj) { obj = obj[0]; console.log('inserted playlist', obj._id); // update self.playlists pl.set(obj); console.log('inserting occurrence', oc.id); - return Q.ninvoke(occcol, 'insert', oc.toJSON()); + return Q.ninvoke(occcol, 'insert', oc.toJSON(), {safe:true}); }).then(function(obj) { var obj = obj[0]; console.log('inserted occurrence', obj._id); From a9f6b1c8ed4e2bfabaf218a89ca009a3efb979b5 Mon Sep 17 00:00:00 2001 From: Tomas Neme Date: Fri, 11 Oct 2013 16:57:48 -0300 Subject: [PATCH 66/92] skip 'start with playlists' Signed-off-by: Tomas Neme --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 300c76c..3146f50 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -243,7 +243,7 @@ describe("Mosto functional test", function() { ** ver que haya el play correspondiente ** ver que este en el frame correcto */ - describe('start with playlists', function() { + describe.skip('start with playlists', function() { self.playlist_count = _.randint(5, 10, self.rand()); before(function() { self.medias = helper.getMBCMedia(); From 39e9de11da255c3c1477182f5b21f12dfa457fe1 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:30:30 -0300 Subject: [PATCH 67/92] Took out semaphore from api/Melted Signed-off-by: Juan Martin Runge --- api/Melted.js | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/api/Melted.js b/api/Melted.js index f7bba6a..4f4c00d 100644 --- a/api/Melted.js +++ b/api/Melted.js @@ -1,7 +1,6 @@ var spawn = require('child_process').spawn; var exec = require('child_process').exec; var net = require('net'); -var semaphore = require('semaphore')(1); var mbc = require('mbc-common'); var conf = mbc.config.Mosto.Melted; var melted_bin_path = conf.root + '/melted/BUILD/bin/melted'; @@ -209,26 +208,3 @@ exports.setup = function(root, output, callback) { }) }; -/** - * take - * - * Take melted and not leave execution to other melted taked. - * - * @callback: callback function to process while take melted. - * - */ -exports.take = function() { - logger.info('take'); - return semaphore.take.apply(this, arguments); -}; - -/** - * leave - * - * Leave execution to other melted taked. - * - */ -exports.leave = function() { - logger.info('leave'); - return semaphore.leave.apply(this, arguments); -}; From e830f57cb095f5880052c2774960d123cc4de326 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:31:56 -0300 Subject: [PATCH 68/92] Modified mosto core to stop using melted semaphore Signed-off-by: Juan Martin Runge --- mosto.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/mosto.js b/mosto.js index cda03c8..abf2283 100644 --- a/mosto.js +++ b/mosto.js @@ -243,12 +243,10 @@ mosto.prototype.init = function(melted, callback) { self.checkMelted(startall); }; - if (melted !== undefined) { + if (melted !== undefined) Melted = melted; - check_and_start(); - } - else - Melted.take(check_and_start); + + check_and_start(); }; @@ -293,8 +291,6 @@ mosto.prototype.finish = function(callback) { Melted.stop(function(pid) { logger.debug("[finish] melted stopped"); setTimeout( function() { - logger.debug("[finish] leaving Melted lock"); - Melted.leave(); logger.debug("[finish] calling callback"); if (callback) callback(); }, 1000 ); From 4311041da824e9afbcb92bf148210275f4efc158 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:33:25 -0300 Subject: [PATCH 69/92] Added test helper with semaphore and init+finish code for each test Signed-off-by: Juan Martin Runge --- test/test_helper.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 test/test_helper.js diff --git a/test/test_helper.js b/test/test_helper.js new file mode 100644 index 0000000..ef7e423 --- /dev/null +++ b/test/test_helper.js @@ -0,0 +1,27 @@ +var semaphore = require('semaphore')(1) +, melted = require('../api/Melted') +, Mosto = require('../models/Mosto') +; + + +exports.take = function() { + return semaphore.take.apply(this, arguments); +}; + +exports.leave = function() { + return semaphore.leave.apply(this, arguments); +}; + +exports.init = function(callback) { + melted.stop(function(){ + melted.start(function(pid) { + melted.setup(undefined, undefined, function(has_err) { + callback(); + }); + }); + }); +}; + +exports.finish = function(callback) { + melted.stop(callback); +}; \ No newline at end of file From 3ba00007558a1229404d4aed1d05d982c4d7d188 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:35:00 -0300 Subject: [PATCH 70/92] Added init and finish calls to helper to functional test Signed-off-by: Juan Martin Runge --- test/general-functional-test.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 3146f50..4822a1d 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -10,6 +10,7 @@ var Media = require('mbc-common/models/Media'); var Q = require('q'); var moment = require('moment'); var helper = require('./media_helpers.js'); +var test = require('./test_helper.js'); var uuid = require('node-uuid'); var mosto_config = require('mbc-common').config.Mosto.General; @@ -205,11 +206,20 @@ describe("Mosto functional test", function() { return result; }; - before(function() { - self.melted = melted(); + before(function(done) { + test.take(function() { + test.init(function() { + self.melted = melted(undefined, undefined, melted_log); + done(); + }); + }); }); - after(function() { - delete self.melted; + after(function(done) { + test.finish(function() { + delete self.melted; + test.leave(); + done(); + }); }); describe('start without playlists', function() { before(function(done) { From 780de35497434d5179fcce17b048eb412672d166 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:36:20 -0300 Subject: [PATCH 71/92] Replaced melted take with helper init and finish calls in heartbeats test Signed-off-by: Juan Martin Runge --- test/heartbeats-test.js | 46 ++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/test/heartbeats-test.js b/test/heartbeats-test.js index aea0fe4..86a0739 100644 --- a/test/heartbeats-test.js +++ b/test/heartbeats-test.js @@ -1,6 +1,6 @@ var assert = require("assert"), - melted = require('../api/Melted'), helpers = require('./media_helpers'), + test = require('./test_helper.js'); Mosto = require('../models/Mosto'), _ = require('underscore'), moment = require('moment'), @@ -10,18 +10,14 @@ var assert = require("assert"), describe('Mosto Heartbeats Test', function() { before(function(done) { - melted.take(function() { - melted.stop(function(){ - melted.start(function(pid) { - melted.setup(undefined, undefined, function(has_err) { - Mosto.Playlists().get('playlists').reset(); - Mosto.Playlists().save(); - Mosto.Playlists().get('melted_medias').initMvcpServer().then(function() { - Mosto.Playlists().get('melted_medias').write.take(function() { - Mosto.Playlists().get('melted_medias').write.leave(); - done(); - }); - }); + test.take(function() { + test.init(function() { + Mosto.Playlists().get('playlists').reset(); + Mosto.Playlists().save(); + Mosto.Playlists().get('melted_medias').initMvcpServer().then(function() { + Mosto.Playlists().get('melted_medias').write.take(function() { + Mosto.Playlists().get('melted_medias').write.leave(); + done(); }); }); }); @@ -136,9 +132,9 @@ describe('Mosto Heartbeats Test', function() { after(function(done) { this.timeout(15000); self.hb.stop().then(function() { - Mosto.Playlists().get('melted_medias').stopMvcpServer().then(function() { +// Mosto.Playlists().get('melted_medias').stopMvcpServer().then(function() { done(); - }); +// }); }); }); }); @@ -216,12 +212,12 @@ describe('Mosto Heartbeats Test', function() { playlists().addPlaylist(pl); - Mosto.Playlists().get('melted_medias').initMvcpServer().then(function() { - Mosto.Playlists().get('melted_medias').write.take(function() { - Mosto.Playlists().get('melted_medias').write.leave(); +// Mosto.Playlists().get('melted_medias').initMvcpServer().then(function() { +// Mosto.Playlists().get('melted_medias').write.take(function() { +// Mosto.Playlists().get('melted_medias').write.leave(); done(); - }); - }); +// }); +// }); }); describe('-- Starting playback and wait 3 seconds', function() { @@ -387,12 +383,10 @@ describe('Mosto Heartbeats Test', function() { }); }); - describe('#leave melted', function() { - it('-- leave melted', function(done) { - melted.stop(function(pid) { - melted.leave(); - done(); - }); + after(function(done) { + test.finish(function() { + test.leave(); + done(); }); }); From 8038ef664817ba9986c73799fdb8d3c77eec031b Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:38:17 -0300 Subject: [PATCH 72/92] Replaced melted take with init and finish calls to helper in models test Signed-off-by: Juan Martin Runge --- test/models-test.js | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/test/models-test.js b/test/models-test.js index fcae0ab..0bab4a0 100644 --- a/test/models-test.js +++ b/test/models-test.js @@ -1,8 +1,8 @@ var Mosto = require('../models/Mosto') , should = require('should') , mvcp = require('../drivers/mvcp/mvcp-driver') -, melted = require('../api/Melted') , helpers = require('./media_helpers') +, test = require('./test_helper.js') , _ = require('underscore') , moment = require('moment') ; @@ -31,24 +31,19 @@ describe('models.Mosto', function() { describe('MeltedCollection', function(){ before(function(done) { - // restart melted - melted.take(function() { - melted.stop(function() { - melted.start(function() { - melted.setup(undefined, undefined, function() { - self.server.initServer().fin(function() { - done(); - }); - }); + test.take(function() { + test.init(function() { + self.server.initServer().fin(function() { + done(); }); }); }); }); after(function(done) { - self.playlists().get('melted_medias').stopMvcpServer().fin(self.server.stopServer).fin(function() { - melted.stop(function() { - melted.leave(); + self.server.stopServer().fin(function() { + test.finish(function() { + test.leave(); done(); }); }); From 0114426d461d457b4a6121531447b5620434f895 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:39:25 -0300 Subject: [PATCH 73/92] Replaced melted take with init and finish calls to helper in status test Signed-off-by: Juan Martin Runge --- test/mosto-status-test.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/test/mosto-status-test.js b/test/mosto-status-test.js index 0abdb0b..8e33bcd 100644 --- a/test/mosto-status-test.js +++ b/test/mosto-status-test.js @@ -1,6 +1,6 @@ var assert = require("assert"), mosto = require('../mosto'), -melted = require('../api/Melted'); +test = require('./test_helper.js'); //TODO: This test should be rewritten after @fabriciocosta merges his part with more usefull data! describe('Mosto status', function() { @@ -9,20 +9,17 @@ describe('Mosto status', function() { var rec = -1; before(function(done) { - melted.take(function() { - melted.stop(function(){ - melted.start(function() { - melted.setup(undefined, undefined, function() { - done(); - }); - }); - }); + test.take(function() { + test.init(done); }); }); after(function(done) { mosto_server.finish(function() { - melted.stop(done); + test.finish(function() { + test.leave(); + done(); + }); }); }); @@ -34,7 +31,7 @@ describe('Mosto status', function() { rec++; done(); }); - mosto_server.init(melted); + mosto_server.init(); }); it('--should have received 1 status', function() { assert.equal(rec, 0); From e849fc2447b8c957ac3ce5502946274c01ba0ef6 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:41:50 -0300 Subject: [PATCH 74/92] Replaced melted take with helper init and finish calls in mvcp driver test Signed-off-by: Juan Martin Runge --- test/mvcp-driver-test.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/mvcp-driver-test.js b/test/mvcp-driver-test.js index 0746de0..6d651d7 100644 --- a/test/mvcp-driver-test.js +++ b/test/mvcp-driver-test.js @@ -4,6 +4,8 @@ var _ = require('underscore'); var mvcp_server = require('../drivers/mvcp/mvcp-driver'); var melted = require('../api/Melted'); var helpers = require('./media_helpers'); +var test = require('./test_helper.js'); + function getMedia(id, orig_order, playlist_id, name, type, file, length, fps) { var media = {}; @@ -25,18 +27,16 @@ describe('start mvcp-driver test', function(done) { this.timeout(15000); before(function(done) { - // Make sure we start with a fresh melted - melted.take(function() { - melted.stop(function(){ + test.take(function() { + test.init(function(){ done(); }); }); }); after(function(done) { - // and leave it "clean" after we leave - melted.stop(function() { - melted.leave(); - done() + test.finish(function() { + test.leave(); + done(); }); }); From 7709819eb7f22752483dee63066b823fad6bba59 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:43:27 -0300 Subject: [PATCH 75/92] Replaced melted take with init and finish calls to helper in mongo test Signed-off-by: Juan Martin Runge --- test/playlist-mongo-driver.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/test/playlist-mongo-driver.js b/test/playlist-mongo-driver.js index bbd3f19..db67167 100644 --- a/test/playlist-mongo-driver.js +++ b/test/playlist-mongo-driver.js @@ -3,8 +3,8 @@ var mongo_driver = require('../drivers/playlists/mongo-driver'); var should = require('should'); var mbc = require('mbc-common'); var _ = require('underscore'); -var melted = require('../api/Melted'); var helpers = require('./media_helpers'); +var test = require('./test_helper.js') var Media = require('mbc-common/models/Media'); var uuid = require('node-uuid'); @@ -12,8 +12,8 @@ describe('PlaylistMongoDriver', function(){ var self = this; before(function(done) { - melted.take(function() { - melted.stop(function(pid){ + test.take(function() { + test.init(function(pid){ // setup mongo driver var conf = { @@ -101,8 +101,10 @@ describe('PlaylistMongoDriver', function(){ self.collections[col].drop(); } } - melted.leave(); - done(); + test.finish(function() { + test.leave(); + done(); + }); }); describe('#subscriptions', function() { From 1cd837e7d8fd110d89bc5e87b59b76d9729797d0 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:44:39 -0300 Subject: [PATCH 76/92] Added pubsub the option to receive custom config to set up db Signed-off-by: Juan Martin Runge --- drivers/status/pubsub.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/status/pubsub.js b/drivers/status/pubsub.js index 17b9735..43f1fbe 100644 --- a/drivers/status/pubsub.js +++ b/drivers/status/pubsub.js @@ -33,11 +33,11 @@ function MostoMessage(value, description, message) { this.message = message; } -function CaspaDriver() { +function CaspaDriver(conf) { events.EventEmitter.call(this); var self = this; this.status = _.clone(defaults); - this.db = mbc.db(); + this.db = mbc.db(conf && conf.db); this.publisher = mbc.pubsub(); } util.inherits(CaspaDriver, events.EventEmitter); @@ -194,8 +194,8 @@ CaspaDriver.prototype.dropMessage = function(message) { this.publisher.publish("mostoMessage.delete", { model: message }); }; -exports = module.exports = function() { - var driver = new CaspaDriver(); +exports = module.exports = function(conf) { + var driver = new CaspaDriver(conf); driver.setupAll(); return driver; From 2c88034bd9d7d3b79a5eb102fc384f7d7e1bd1bc Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:45:55 -0300 Subject: [PATCH 77/92] Removed unused dependency Signed-off-by: Juan Martin Runge --- drivers/playlists/mongo-driver.js | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/playlists/mongo-driver.js b/drivers/playlists/mongo-driver.js index c085742..4864f09 100644 --- a/drivers/playlists/mongo-driver.js +++ b/drivers/playlists/mongo-driver.js @@ -1,5 +1,4 @@ var mbc = require('mbc-common') -, config = mbc.config.Mosto.Mongo , mubsub = require("mubsub") , moment = require("moment") , async = require('async') From 170c74135c89461e8770d034278c4bb5db5c385a Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:46:20 -0300 Subject: [PATCH 78/92] Added logging Signed-off-by: Juan Martin Runge --- drivers/playlists/mongo-driver.js | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/playlists/mongo-driver.js b/drivers/playlists/mongo-driver.js index 4864f09..4d22112 100644 --- a/drivers/playlists/mongo-driver.js +++ b/drivers/playlists/mongo-driver.js @@ -27,6 +27,7 @@ util.inherits (mongo_driver, events.EventEmitter); mongo_driver.prototype.start = function() { var self = this; + logger.info("Opening db connection", this.conf); var db = mbc.db(this.conf && this.conf.db); self.channel = mbc.pubsub(); From 2e3698e825834af8559c7ab36cad829e88f142c2 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:46:41 -0300 Subject: [PATCH 79/92] Added Models the option to send arguments to MeltedCollection.set via Playlists.save Signed-off-by: Juan Martin Runge --- models/Mosto.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/Mosto.js b/models/Mosto.js index 71c73bc..d9459a0 100644 --- a/models/Mosto.js +++ b/models/Mosto.js @@ -553,12 +553,12 @@ Mosto.LoadedPlaylists = Backbone.Model.extend({ this.get('melted_medias').on('all', bubbleEvents(this, 'melted_medias')); }, - save: function() { + save: function(options) { // set fires add, remove, change and sort var mm = this.get('melted_medias'); var pl = this.get('playlists'); mm.write.take(function() { - mm.set(pl.getMedias()); + mm.set(pl.getMedias(), options); }); }, From e6f2ca0fe17ef569ff11456592751f4070163a5d Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:48:21 -0300 Subject: [PATCH 80/92] Added mosto core the option to receive custom db config and pass it to mongo driver and pubsub Signed-off-by: Juan Martin Runge --- mosto.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/mosto.js b/mosto.js index abf2283..9ecc0e1 100644 --- a/mosto.js +++ b/mosto.js @@ -9,6 +9,7 @@ var fs = require('fs') , utils = require('./utils') , mbc = require('mbc-common') , config = mbc.config.Mosto.General +, mongoConfig = mbc.config.Mosto.Mongo , _ = require('underscore') , heartbeats = require('./heartbeats') , models = require('./models/Mosto') @@ -16,10 +17,11 @@ var fs = require('fs') ; //TODO: Chequear window, se esta construyendo de formas distintas //INCLUSO EN EL DRIVER MISMO SE USA DE FORMAS DISTINTAS!!! -function mosto(customConfig) { +function mosto(customConfig, customMongoConfig) { /** CONFIGURATION */ this.config = customConfig || config; + this.mongoConfig = customMongoConfig || mongoConfig; this.server = undefined; this.pl_driver = undefined; this.status_driver = undefined; @@ -224,8 +226,8 @@ mosto.prototype.init = function(melted, callback) { * linkear heartbeat con status driver */ function startall() { - self.pl_driver = new playlists_driver(self.config.playlist_server); - self.status_driver = new status_driver(); + self.pl_driver = new playlists_driver(self.config.playlist_server, self.mongoConfig); + self.status_driver = new status_driver(self.mongoConfig); self.playlists = models.Playlists(); self.heartbeats = new heartbeats(); @@ -299,8 +301,8 @@ mosto.prototype.finish = function(callback) { }); }; -exports = module.exports = function(customConfig) { - var mosto_server = new mosto(customConfig); +exports = module.exports = function(customConfig, customMongoConfig) { + var mosto_server = new mosto(customConfig, customMongoConfig); return mosto_server; }; /* From fde836d672bf1c699259888f0c9570f643c941b2 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:49:12 -0300 Subject: [PATCH 81/92] Logging Signed-off-by: Juan Martin Runge --- mosto.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mosto.js b/mosto.js index 9ecc0e1..f9714d9 100644 --- a/mosto.js +++ b/mosto.js @@ -226,6 +226,7 @@ mosto.prototype.init = function(melted, callback) { * linkear heartbeat con status driver */ function startall() { + logger.info("Starting modules..."); self.pl_driver = new playlists_driver(self.config.playlist_server, self.mongoConfig); self.status_driver = new status_driver(self.mongoConfig); self.playlists = models.Playlists(); @@ -257,9 +258,11 @@ mosto.prototype.scheduleMeltedCheck = function() { }; mosto.prototype.checkMelted = function(callback, forceLoad) { + logger.debug("Checking melted..."); var self = this; Melted.is_running(function(running) { if (!running) { + logger.error("Melted was not running!"); Melted.start(function(pid) { Melted.setup(undefined, undefined, function(result) { if (forceLoad) From 8507fb005fdd724650ab272b6592f4a62f80729d Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 11:49:27 -0300 Subject: [PATCH 82/92] Incremented finish timeout in mosto core Signed-off-by: Juan Martin Runge --- mosto.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mosto.js b/mosto.js index f9714d9..0b1bff3 100644 --- a/mosto.js +++ b/mosto.js @@ -298,7 +298,7 @@ mosto.prototype.finish = function(callback) { setTimeout( function() { logger.debug("[finish] calling callback"); if (callback) callback(); - }, 1000 ); + }, 5000 ); }); }); }); From 733866bcd448c766aac46fb2c3922c5a1af5c7d9 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:03:46 -0300 Subject: [PATCH 83/92] Added logger to melted-node in functional test so it starts respecting log level Signed-off-by: Juan Martin Runge --- test/general-functional-test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 4822a1d..43e8a94 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -6,6 +6,7 @@ var melted = require('melted-node'); var _ = require('underscore'); var seed = require('seed-random'); var mbc = require('mbc-common'); +var melted_log = mbc.logger().addLogger('MELTED-NODE'); var Media = require('mbc-common/models/Media'); var Q = require('q'); var moment = require('moment'); From 6efb4c3ccfe9a4ef04feeb02cf980b61a9cd3762 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:04:55 -0300 Subject: [PATCH 84/92] Set mongo config to mosto so it sends it to mongo driver and pubsub Signed-off-by: Juan Martin Runge --- test/general-functional-test.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 43e8a94..d911295 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -180,11 +180,14 @@ describe("Mosto functional test", function() { self.publisher = mbc.pubsub(); self.listener = mbc.pubsub(); - self.db = mbc.db({ - dbName: 'mediatestdb', - dbHost: 'localhost', - dbPort: 27017 - }); + self.mongoConf = { + db: { + dbName: 'mediatestdb', + dbHost: 'localhost', + dbPort: 27017 + } + }; + self.db = mbc.db(self.mongoConf.db); /* generic tests */ self.is_synced = function(time) { @@ -225,7 +228,7 @@ describe("Mosto functional test", function() { describe('start without playlists', function() { before(function(done) { self.db.dropDatabase(function(err, success) { - self.mosto = new mosto(); + self.mosto = new mosto(undefined, self.mongoConf); self.mosto.once('playing', function() { done(); }); @@ -277,7 +280,7 @@ describe("Mosto functional test", function() { var setup = self.setup_playlists(moment( moment() + _.randint(0, -30000))); setup.then(function() { - self.mosto = new mosto(); + self.mosto = new mosto(undefined, self.mongoConf); self.mosto.once('playing', function() { // send pubsub messages with new playlists self.melted.connect().then(function(){ @@ -361,7 +364,7 @@ describe("Mosto functional test", function() { var setup = self.setup_playlists(moment( moment() - 5 * 60 * 1000)); setup.then(function() { - self.mosto = new mosto(); + self.mosto = new mosto(undefined, self.mongoConf); self.mosto.once('playing', function() { // send pubsub messages with new playlists done(); From cc06dc677822536a63b64ea6d3dc071f0b785146 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:05:37 -0300 Subject: [PATCH 85/92] Removed skip from functional test start with playlists Signed-off-by: Juan Martin Runge --- test/general-functional-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index d911295..50cbe1d 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -257,7 +257,7 @@ describe("Mosto functional test", function() { ** ver que haya el play correspondiente ** ver que este en el frame correcto */ - describe.skip('start with playlists', function() { + describe('start with playlists', function() { self.playlist_count = _.randint(5, 10, self.rand()); before(function() { self.medias = helper.getMBCMedia(); From 46a7043e5f6fb840370ba2b643ea950c4116d560 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:06:25 -0300 Subject: [PATCH 86/92] Wait for BLANK file in listener before continuing with the test Signed-off-by: Juan Martin Runge --- test/general-functional-test.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/general-functional-test.js b/test/general-functional-test.js index 50cbe1d..0a49afb 100644 --- a/test/general-functional-test.js +++ b/test/general-functional-test.js @@ -323,10 +323,12 @@ describe("Mosto functional test", function() { before(function(done) { var occurrence = self.get_occurrence(); self.delete_occurrence(occurrence).then(function() { - self.listener.once('message', function(chan, msg) { + self.listener.on('JSONmessage', function(chan, msg) { if(chan == 'mostoStatus') { - self.listener.unsubscribe('mostoStatus'); - done(); + if (msg.piece.current._id.indexOf('BLANK') > -1) { + self.listener.unsubscribe('mostoStatus'); + done(); + } } }); self.listener.subscribe('mostoStatus'); From e6ed1fa3fe69556a6fd514727854138145bf902e Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:07:11 -0300 Subject: [PATCH 87/92] Added helper function to get medias as JSON Signed-off-by: Juan Martin Runge --- test/media_helpers.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/media_helpers.js b/test/media_helpers.js index 5f06e4d..36e7b95 100644 --- a/test/media_helpers.js +++ b/test/media_helpers.js @@ -90,6 +90,32 @@ exports.getMBCMedia = function(path) { }; +/* + * getJSONMedia(path) + * - path: optional path + * + * Scans given path (or default) getting media files and returns JSON objects array + */ +exports.getJSONMedia = function(path) { + if (path === undefined) { + path = "test/videos/"; // TODO FIXME XXX: ugly hardcoded -> should be in config? + } + + var parsed = parseXMLs(path); + var medias = parsed.map(function(elem) { + var params = {}; + params.name = elem.filename; + params._id = crypto.createHash('md5').update(params.name).digest('hex'); + params.file = process.cwd() + '/' + path + elem.filename; + params.fps = parseInt(elem.data.mlt.profile[0]["$"].frame_rate_num, 10); + var frames = parseInt(elem.data.mlt.producer[0]["$"].out, 10); + var duration = moment("0:0:0.0", "HH:mm:ss.SSS").add(exports.framesToMilliseconds(frames, params.fps)); + params.durationraw = duration.format("HH:mm:ss.SSS"); + return params; + }); + return medias; +}; + /* * getTotalMediaLength(media_array) * - media_array: an array of Media objects From dd4a849162028c9f711bd64f035b71d3d271899d Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:08:56 -0300 Subject: [PATCH 88/92] Changed the way of creating pieces (using JSON instead of Media.Model) and drop database before test starts Signed-off-by: Juan Martin Runge --- test/playlist-mongo-driver.js | 120 ++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 56 deletions(-) diff --git a/test/playlist-mongo-driver.js b/test/playlist-mongo-driver.js index db67167..328fc47 100644 --- a/test/playlist-mongo-driver.js +++ b/test/playlist-mongo-driver.js @@ -26,68 +26,75 @@ describe('PlaylistMongoDriver', function(){ self.driver = new mongo_driver(conf); self.db = mbc.db(conf.db); - self.driver.start(); - self.from = moment(); - self.span = 120; - self.to = moment((self.from.unix() + self.span * 60) * 1000); // add 2hs - - self.collections = { - lists: self.db.collection('lists'), - scheds: self.db.collection('scheds'), - pieces: self.db.collection('pieces'), - }; + self.db.dropDatabase(function(err, success) { + self.driver.start(); + self.from = moment(); + self.span = 120; + self.to = moment((self.from.unix() + self.span * 60) * 1000); // add 2hs + + self.collections = { + lists: self.db.collection('lists'), + scheds: self.db.collection('scheds'), + pieces: self.db.collection('pieces'), + }; - var medias = helpers.getMBCMedia(); - // let's create a playlist at least 1 hour long - var playlist = new Media.Playlist({_id: uuid.v1(), title: 'Name'}); - while(playlist.get('duration') < 3600000) { - var media = _.randelem(medias); - var piece = new Media.Piece(media.toJSON()); - piece.set('_id', uuid.v1()); - playlist.get('pieces').add(piece); - playlist.update_duration_nowait(playlist.get('pieces')); - } - self.pieces = playlist.get('pieces'); - self.lists = [playlist]; - // program at least 4hs of schedules - self.scheds = []; - for(var i = 0 ; i < 5 ; i++) { - var schedule = { - _id: uuid.v1(), - playlist: playlist, - title: playlist.get('title') + i, + var medias = helpers.getJSONMedia(); + // let's create a playlist at least 1 hour long + var playlist = new Media.Playlist({_id: uuid.v1(), title: 'Name'}); + while(playlist.get('duration') < 3600000) { + var m = _.randelem(medias); + var piece = new Media.Piece(); + piece.set('_id', uuid.v1()); + piece.set('name', m.name); + piece.set('file', m.file); + piece.set('fps', m.fps); + piece.set('durationraw', m.durationraw); + playlist.get('pieces').add(piece); + playlist.update_duration_nowait(playlist.get('pieces')); + } + self.pieces = playlist.get('pieces'); + self.lists = [playlist]; + // program at least 4hs of schedules + self.scheds = []; + for(var i = 0 ; i < 5 ; i++) { + var schedule = { + _id: uuid.v1(), + playlist: playlist, + title: playlist.get('title') + i, + }; + var hsix = i - 3; + var now = self.from; + // schedules are from 1hs before now + var schtime = moment(now + (hsix * 30 * 60 * 1000)).valueOf(); + var length = moment.duration(playlist.get('duration')); + schedule.start = schtime; + schedule.end = schtime + length; + var occurrence = new Media.Occurrence(schedule); + self.scheds.push(occurrence); }; - var hsix = i - 3; - var now = self.from; - // schedules are from 1hs before now - var schtime = moment(now + (hsix * 30 * 60 * 1000)).valueOf(); - var length = moment.duration(playlist.get('duration')); - schedule.start = schtime; - schedule.end = schtime + length; - var occurrence = new Media.Occurrence(schedule); - self.scheds.push(occurrence); - }; - var ready = _.after( - self.lists.length + self.pieces.length + self.scheds.length, - function(){ done() }); + var ready = _.after( + self.lists.length + self.pieces.length + self.scheds.length, + function(){ done() }); - self.pieces.forEach(function(piece) { - self.collections.pieces.save(piece.toJSON(), {safe:true}, function(err, list) { - ready(); + self.pieces.forEach(function(piece) { + self.collections.pieces.save(piece.toJSON(), {safe:true}, function(err, list) { + ready(); + }); }); - }); - self.lists.forEach(function(playlist) { - self.collections.lists.save(playlist.toJSON(), {safe:true}, function(err, list) { - ready(); + self.lists.forEach(function(playlist) { + self.collections.lists.save(playlist.toJSON(), {safe:true}, function(err, list) { + ready(); + }); }); - }); - self.scheds.forEach(function(occurrence) { - self.collections.scheds.save(occurrence.toJSON(), {safe:true}, function(err, sched){ - ready(); + self.scheds.forEach(function(occurrence) { + self.collections.scheds.save(occurrence.toJSON(), {safe:true}, function(err, sched){ + ready(); + }); }); + }); }); }); @@ -128,8 +135,8 @@ describe('PlaylistMongoDriver', function(){ message.method = 'create'; self.driver.on('create', function(playlist) { playlist.id.should.be.eql(message.model._id); - playlist.name.should.be.eql(message.model.title); - moment(playlist.start).valueOf().should.eql(message.model.start); + playlist.get('name').should.be.eql(message.model.title); + moment(playlist.get('start')).valueOf().should.eql(message.model.start); done(); }); self.pubsub.publishJSON(message.channel(), message); @@ -156,7 +163,8 @@ describe('PlaylistMongoDriver', function(){ it('should return playlists', function(done) { self.driver.getPlaylists({from: self.from, to: self.to}, function(playlists) { playlists.length.should.not.be.eql(0); - playlists.forEach(function(playlist) { + playlists.forEach(function(pl) { + var playlist = pl.toJSON(); playlist.should.have.property('id'); playlist.should.have.property('name'); playlist.should.have.property('start'); From 2bd4a6b6af0f8bf37a43cac428f6c4b2ea269a97 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 12:28:13 -0300 Subject: [PATCH 89/92] Added LOG_LEVEL to npm test (used by travis) because it claims log becomes too large and throws error Signed-off-by: Juan Martin Runge --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7173795..f4f2a8d 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "author": "Juan Martin Runge ", "contributors": [ "Niv Sardi ", "hatcsh"], "scripts": { - "test": "make coverage" + "test": "make LOG_LEVEL=info coverage" }, "main": "mosto", "repository": { From c1279e56b319a0876b0338f977575fccc992eaaf Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 13:04:44 -0300 Subject: [PATCH 90/92] Incremented timout on mosto finish due travis errors Signed-off-by: Juan Martin Runge --- mosto.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mosto.js b/mosto.js index 0b1bff3..973de7d 100644 --- a/mosto.js +++ b/mosto.js @@ -298,7 +298,7 @@ mosto.prototype.finish = function(callback) { setTimeout( function() { logger.debug("[finish] calling callback"); if (callback) callback(); - }, 5000 ); + }, 7000 ); }); }); }); From 7a83fbc847475c6d1e9077589bca72bdac806a70 Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Thu, 28 Nov 2013 13:55:39 -0300 Subject: [PATCH 91/92] Unsuscribe from events after receive the one needed Signed-off-by: Juan Martin Runge --- test/playlist-mongo-driver.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/playlist-mongo-driver.js b/test/playlist-mongo-driver.js index 328fc47..518acc5 100644 --- a/test/playlist-mongo-driver.js +++ b/test/playlist-mongo-driver.js @@ -137,6 +137,7 @@ describe('PlaylistMongoDriver', function(){ playlist.id.should.be.eql(message.model._id); playlist.get('name').should.be.eql(message.model.title); moment(playlist.get('start')).valueOf().should.eql(message.model.start); + self.driver.removeAllListeners('create'); done(); }); self.pubsub.publishJSON(message.channel(), message); @@ -145,6 +146,7 @@ describe('PlaylistMongoDriver', function(){ var message = self.message; message.method = 'update'; self.driver.on('update', function(playlist) { + self.driver.removeAllListeners('update'); done(); }); self.pubsub.publishJSON(message.channel(), message); @@ -154,6 +156,7 @@ describe('PlaylistMongoDriver', function(){ message.method = 'delete'; self.driver.on('delete', function(id) { id.should.be.eql(message.model._id); + self.driver.removeAllListeners('delete'); done(); }); self.pubsub.publishJSON(message.channel(), message); From 5ab5457d667cf8bd6c93572ebcc25f32c4dc232b Mon Sep 17 00:00:00 2001 From: Juan Martin Runge Date: Mon, 2 Dec 2013 13:31:37 -0300 Subject: [PATCH 92/92] Incremented timeout to check for Melted because it was to tight for node.js Signed-off-by: Juan Martin Runge --- mosto.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mosto.js b/mosto.js index 973de7d..26087e1 100644 --- a/mosto.js +++ b/mosto.js @@ -254,7 +254,8 @@ mosto.prototype.init = function(melted, callback) { }; mosto.prototype.scheduleMeltedCheck = function() { - this.meltedInterval = setTimeout(this.checkMelted.bind(this, this.scheduleMeltedCheck.bind(this), true), 100); + this.meltedInterval = setTimeout(this.checkMelted.bind(this, this.scheduleMeltedCheck.bind(this), true), 500); + logger.debug("Melted Timeout id:", this.meltedInterval); }; mosto.prototype.checkMelted = function(callback, forceLoad) { @@ -281,8 +282,10 @@ mosto.prototype.checkMelted = function(callback, forceLoad) { mosto.prototype.finish = function(callback) { var self = this; logger.info("mbc-mosto: [INFO] Finish mbc-mosto... "); - if (self.restartMelted) + if (self.restartMelted) { + logger.debug("Clearing Melted Timeout id:", self.meltedInterval); clearTimeout(self.meltedInterval); + } this.stopDriver(); this.playlists.get("melted_medias").write.take(function() { logger.debug("[finish] stop melted_medias mvcp server");