UNPKG

3.49 kBJavaScriptView Raw
1/*eslint no-magic-numbers: "off"*/
2/*eslint no-invalid-this: "off"*/
3const _ = require('lodash');
4const expect = require('chai').expect;
5const Promise = require('bluebird');
6const TestConfig = require('../config');
7const Utils = require('../utils');
8const Manager = require('../../app/services/manager');
9const createEsClient = require('../../config/elasticsearch');
10const createRedisClient = require('../../config/redis');
11const config = require('../../config/index');
12
13const log = config.log;
14
15Promise.longStackTraces();
16Promise.onPossiblyUnhandledRejection((error) => log.error('Likely error: ', error.stack));
17
18describe('job manager', function () {
19 this.timeout(5000);
20
21 let source = null;
22 let redis = null;
23 let manager = null;
24 let utils = null;
25
26 before((done) => {
27 source = createEsClient(TestConfig.elasticsearch.source);
28 redis = createRedisClient(TestConfig.redis.host, TestConfig.redis.port);
29 manager = new Manager(redis);
30 utils = new Utils();
31
32 utils.deleteAllTemplates(source)
33 .finally(() => utils.deleteAllIndices(source))
34 .finally(() => redis.flushdb())
35 .finally(() => done());
36 });
37
38 afterEach((done) => {
39 utils.deleteAllTemplates(source)
40 .finally(() => utils.deleteAllIndices(source))
41 .finally(() => redis.flushdb())
42 .finally(() => done());
43 });
44
45 it('should not accept the same name twice', (done) => {
46 const names = [
47 'same',
48 'same',
49 'different'
50 ];
51
52 const getName = () => {
53 return names.shift();
54 };
55
56 manager._setWorkerName(getName).then((name) => {
57 expect(name).to.be.equals('same');
58 return manager._setWorkerName(getName);
59 }).then((name) => {
60 expect(name).to.be.equals('different');
61 done();
62 }).catch(done);
63 });
64
65 it('should expire old names', function (done) {
66 this.timeout(2000);
67 const names = [
68 'same',
69 'same'
70 ];
71
72 manager._overrideNameTimeout(1);
73
74 const getName = () => {
75 return names.shift();
76 };
77
78 manager._setWorkerName(getName).delay(1100).then((name) => {
79 expect(name).to.be.equals('same');
80 return manager._setWorkerName(getName);
81 }).then((name) => {
82 expect(name).to.be.equals('same');
83 done();
84 }).catch(done);
85 });
86
87 it('should expire worker statuses', function (done) {
88 this.timeout(2000);
89 const names = [
90 'same',
91 'different'
92 ];
93
94 manager._overrideNameTimeout(1);
95
96 const getName = () => {
97 return names.shift();
98 };
99
100 manager._setWorkerName(getName).then((name) => {
101 expect(name).to.be.equals('same');
102 return manager._setWorkerName(getName);
103 }).then((name) => {
104 expect(name).to.be.equals('different');
105 return manager.workerHeartbeat('same', 'running');
106 }).then(() => {
107 return manager.workerHeartbeat('different', 'broken');
108 }).then(() => {
109 return manager.getWorkersStatus();
110 }).delay(500).then((status) => {
111 expect(_.size(status)).to.be.equals(2);
112 expect(status.same).to.be.equals('running');
113 expect(status.different).to.be.equals('broken');
114 return manager.workerHeartbeat('same', 'running');
115 }).delay(600).then(() => {
116 return manager.getWorkersStatus();
117 }).then((status) => {
118 expect(_.size(status)).to.be.equals(1);
119 expect(status.same).to.be.equals('running');
120 done();
121 }).catch(done);
122 });
123});