From 88a1cd929ac8bca22baf0cc8716c42807349b9f3 Mon Sep 17 00:00:00 2001 From: spalger Date: Thu, 19 Nov 2015 14:05:58 -0600 Subject: [PATCH 01/19] [courier/requestQueue] fix get(), added getStartable() get() implies that it will get all pending requests that match a strategy, but it is actually filtering by wether a require is startable. Added getStartable() to accomplish that task and get() now returns all requests that match a strategy. --- src/ui/public/courier/_request_queue.js | 9 ++++++--- src/ui/public/courier/data_source/_abstract.js | 2 +- src/ui/public/courier/fetch/fetch.js | 2 +- src/ui/public/courier/fetch/request/segmented.js | 1 - 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/ui/public/courier/_request_queue.js b/src/ui/public/courier/_request_queue.js index ca8ce4ad793b..e6dcf78957c6 100644 --- a/src/ui/public/courier/_request_queue.js +++ b/src/ui/public/courier/_request_queue.js @@ -16,8 +16,11 @@ define(function (require) { }); }; - queue.get = function (/* strategies.. */) { - var strategies = _.toArray(arguments); + queue.getStartable = function (...strategies) { + return queue.get(...strategies).filter(req => req.canStart()); + }; + + queue.get = function (...strategies) { return queue.filter(function (req) { var strategyMatch = !strategies.length; if (!strategyMatch) { @@ -26,7 +29,7 @@ define(function (require) { }); } - return strategyMatch && req.canStart(); + return strategyMatch; }); }; diff --git a/src/ui/public/courier/data_source/_abstract.js b/src/ui/public/courier/data_source/_abstract.js index 0099c3d2bd33..a4f3b80fe237 100644 --- a/src/ui/public/courier/data_source/_abstract.js +++ b/src/ui/public/courier/data_source/_abstract.js @@ -203,7 +203,7 @@ define(function (require) { *****/ SourceAbstract.prototype._myQueued = function () { - var reqs = requestQueue.get(this._fetchStrategy); + var reqs = requestQueue.getStartable(this._fetchStrategy); return _.where(reqs, { source: this }); }; diff --git a/src/ui/public/courier/fetch/fetch.js b/src/ui/public/courier/fetch/fetch.js index 03ce8199aa43..adf1871bb425 100644 --- a/src/ui/public/courier/fetch/fetch.js +++ b/src/ui/public/courier/fetch/fetch.js @@ -9,7 +9,7 @@ define(function (require) { var INCOMPLETE = Private(require('ui/courier/fetch/_req_status')).INCOMPLETE; function fetchQueued(strategy) { - var requests = requestQueue.get(strategy); + var requests = requestQueue.getStartable(strategy); if (!requests.length) return Promise.resolve(); else return fetchThese(requests); } diff --git a/src/ui/public/courier/fetch/request/segmented.js b/src/ui/public/courier/fetch/request/segmented.js index 8289c16d1b97..a2291b3b99c6 100644 --- a/src/ui/public/courier/fetch/request/segmented.js +++ b/src/ui/public/courier/fetch/request/segmented.js @@ -2,7 +2,6 @@ define(function (require) { return function CourierSegmentedReqProvider(es, Private, Promise, Notifier, timefilter, config) { var _ = require('lodash'); var SearchReq = Private(require('ui/courier/fetch/request/search')); - var requestQueue = Private(require('ui/courier/_request_queue')); var SegmentedHandle = Private(require('ui/courier/fetch/request/_segmented_handle')); var notify = new Notifier({ From bf556ba2b49d656566baa4402348b3a4a52c0f6a Mon Sep 17 00:00:00 2001 From: spalger Date: Thu, 19 Nov 2015 14:13:12 -0600 Subject: [PATCH 02/19] [courier/dataSource] also cancel non-startable requests --- src/ui/public/courier/data_source/_abstract.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/ui/public/courier/data_source/_abstract.js b/src/ui/public/courier/data_source/_abstract.js index a4f3b80fe237..f5e0709d70b6 100644 --- a/src/ui/public/courier/data_source/_abstract.js +++ b/src/ui/public/courier/data_source/_abstract.js @@ -163,7 +163,7 @@ define(function (require) { */ SourceAbstract.prototype.fetch = function () { var self = this; - var req = _.first(self._myQueued()); + var req = _.first(self._myStartableQueued()); if (!req) { req = self._createRequest(); @@ -179,7 +179,7 @@ define(function (require) { * @async */ SourceAbstract.prototype.fetchQueued = function () { - return courierFetch.these(this._myQueued()); + return courierFetch.these(this._myStartableQueued()); }; /** @@ -203,8 +203,15 @@ define(function (require) { *****/ SourceAbstract.prototype._myQueued = function () { - var reqs = requestQueue.getStartable(this._fetchStrategy); - return _.where(reqs, { source: this }); + return requestQueue + .get(this._fetchStrategy) + .filter(req => req.source === this); + }; + + SourceAbstract.prototype._myStartableQueued = function () { + return requestQueue + .getStartable(this._fetchStrategy) + .filter(req => req.source === this); }; SourceAbstract.prototype._createRequest = function () { From 49ab884404223e9768f7a2ef31d2e1bf26391551 Mon Sep 17 00:00:00 2001 From: spalger Date: Fri, 20 Nov 2015 15:41:40 -0600 Subject: [PATCH 03/19] [courier] added tests for requesQueue, DocSource, and SearchSource --- .../public/courier/__tests__/requestQueue.js | 92 +++++++++++++++++++ .../data_source/__tests__/DocSource.js | 59 ++++++++++++ .../data_source/__tests__/SearchSource.js | 59 ++++++++++++ 3 files changed, 210 insertions(+) create mode 100644 src/ui/public/courier/__tests__/requestQueue.js create mode 100644 src/ui/public/courier/data_source/__tests__/DocSource.js create mode 100644 src/ui/public/courier/data_source/__tests__/SearchSource.js diff --git a/src/ui/public/courier/__tests__/requestQueue.js b/src/ui/public/courier/__tests__/requestQueue.js new file mode 100644 index 000000000000..723f0f016ccd --- /dev/null +++ b/src/ui/public/courier/__tests__/requestQueue.js @@ -0,0 +1,92 @@ +import ngMock from 'ngMock'; +import expect from 'expect.js'; +import sinon from 'auto-release-sinon'; + +import RequestQueueProv from '../_request_queue'; +import SearchStrategyProv from '../fetch/strategy/search'; +import DocStrategyProv from '../fetch/strategy/doc'; + +describe('Courier Request Queue', function () { + let docStrategy; + let requestQueue; + let searchStrategy; + + beforeEach(ngMock.module('kibana')); + beforeEach(ngMock.inject(function (Private) { + docStrategy = Private(DocStrategyProv); + requestQueue = Private(RequestQueueProv); + searchStrategy = Private(SearchStrategyProv); + })); + + class MockReq { + constructor(strategy, startable = true) { + this.strategy = strategy; + this.source = {}; + this.canStart = sinon.stub().returns(startable); + } + } + + describe('#getStartable(strategy)', function () { + it('only returns requests that match one of the passed strategies', function () { + requestQueue.push( + new MockReq(docStrategy), + new MockReq(searchStrategy), + new MockReq(searchStrategy), + new MockReq(searchStrategy) + ); + + expect(requestQueue.getStartable(docStrategy)).to.have.length(1); + expect(requestQueue.getStartable(searchStrategy)).to.have.length(3); + }); + + it('returns all requests when no strategy passed', function () { + requestQueue.push( + new MockReq(docStrategy), + new MockReq(searchStrategy) + ); + + expect(requestQueue.getStartable()).to.have.length(2); + }); + + it('returns only startable requests', function () { + requestQueue.push( + new MockReq(docStrategy, true), + new MockReq(searchStrategy, false) + ); + + expect(requestQueue.getStartable()).to.have.length(1); + }); + }); + + describe('#get(strategy)', function () { + it('only returns requests that match one of the passed strategies', function () { + requestQueue.push( + new MockReq(docStrategy), + new MockReq(searchStrategy), + new MockReq(searchStrategy), + new MockReq(searchStrategy) + ); + + expect(requestQueue.get(docStrategy)).to.have.length(1); + expect(requestQueue.get(searchStrategy)).to.have.length(3); + }); + + it('returns all requests when no strategy passed', function () { + requestQueue.push( + new MockReq(docStrategy), + new MockReq(searchStrategy) + ); + + expect(requestQueue.get()).to.have.length(2); + }); + + it('returns startable and not-startable requests', function () { + requestQueue.push( + new MockReq(docStrategy, true), + new MockReq(searchStrategy, false) + ); + + expect(requestQueue.get()).to.have.length(2); + }); + }); +}); diff --git a/src/ui/public/courier/data_source/__tests__/DocSource.js b/src/ui/public/courier/data_source/__tests__/DocSource.js new file mode 100644 index 000000000000..6ff86a2c80c0 --- /dev/null +++ b/src/ui/public/courier/data_source/__tests__/DocSource.js @@ -0,0 +1,59 @@ +import ngMock from 'ngMock'; +import expect from 'expect.js'; +import sinon from 'auto-release-sinon'; + +import RequestQueueProv from '../../_request_queue'; +import DocSourceProv from '../doc_source'; + +describe('DocSource', function () { + require('testUtils/noDigestPromises').activateForSuite(); + + let requestQueue; + let DocSource; + + beforeEach(ngMock.module('kibana')); + beforeEach(ngMock.inject(function (Private) { + requestQueue = Private(RequestQueueProv); + DocSource = Private(DocSourceProv); + })); + + describe('#onUpdate()', function () { + it('adds a request to the requestQueue', function () { + const source = new DocSource(); + + expect(requestQueue).to.have.length(0); + source.onUpdate(); + expect(requestQueue).to.have.length(1); + }); + + it('returns a promise that is resolved with the results', function () { + const source = new DocSource(); + const fakeResults = {}; + + const promise = source.onUpdate().then((results) => { + expect(results).to.be(fakeResults); + }); + + requestQueue[0].defer.resolve(fakeResults); + return promise; + }); + }); + + describe('#destroy()', function () { + it('aborts all startable requests', function () { + const source = new DocSource(); + source.onUpdate(); + sinon.stub(requestQueue[0], 'canStart').returns(true); + source.destroy(); + expect(requestQueue).to.have.length(0); + }); + + it('aborts all non-startable requests', function () { + const source = new DocSource(); + source.onUpdate(); + sinon.stub(requestQueue[0], 'canStart').returns(false); + source.destroy(); + expect(requestQueue).to.have.length(0); + }); + }); +}); diff --git a/src/ui/public/courier/data_source/__tests__/SearchSource.js b/src/ui/public/courier/data_source/__tests__/SearchSource.js new file mode 100644 index 000000000000..02f4f73d2aa2 --- /dev/null +++ b/src/ui/public/courier/data_source/__tests__/SearchSource.js @@ -0,0 +1,59 @@ +import ngMock from 'ngMock'; +import expect from 'expect.js'; +import sinon from 'auto-release-sinon'; + +import RequestQueueProv from '../../_request_queue'; +import SearchSourceProv from '../search_source'; + +describe('SearchSource', function () { + require('testUtils/noDigestPromises').activateForSuite(); + + let requestQueue; + let SearchSource; + + beforeEach(ngMock.module('kibana')); + beforeEach(ngMock.inject(function (Private) { + requestQueue = Private(RequestQueueProv); + SearchSource = Private(SearchSourceProv); + })); + + describe('#onResults()', function () { + it('adds a request to the requestQueue', function () { + const source = new SearchSource(); + + expect(requestQueue).to.have.length(0); + source.onResults(); + expect(requestQueue).to.have.length(1); + }); + + it('returns a promise that is resolved with the results', function () { + const source = new SearchSource(); + const fakeResults = {}; + + const promise = source.onResults().then((results) => { + expect(results).to.be(fakeResults); + }); + + requestQueue[0].defer.resolve(fakeResults); + return promise; + }); + }); + + describe('#destroy()', function () { + it('aborts all startable requests', function () { + const source = new SearchSource(); + source.onResults(); + sinon.stub(requestQueue[0], 'canStart').returns(true); + source.destroy(); + expect(requestQueue).to.have.length(0); + }); + + it('aborts all non-startable requests', function () { + const source = new SearchSource(); + source.onResults(); + sinon.stub(requestQueue[0], 'canStart').returns(false); + source.destroy(); + expect(requestQueue).to.have.length(0); + }); + }); +}); From deaab7cd17e288660ecd9fbaec812a97fd53ae3c Mon Sep 17 00:00:00 2001 From: spalger Date: Fri, 20 Nov 2015 16:22:22 -0600 Subject: [PATCH 04/19] [courier/DataSource] remove private _myQueued method --- src/ui/public/courier/data_source/_abstract.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/ui/public/courier/data_source/_abstract.js b/src/ui/public/courier/data_source/_abstract.js index f5e0709d70b6..d5cd7238eb9e 100644 --- a/src/ui/public/courier/data_source/_abstract.js +++ b/src/ui/public/courier/data_source/_abstract.js @@ -187,7 +187,10 @@ define(function (require) { * @return {undefined} */ SourceAbstract.prototype.cancelQueued = function () { - _.invoke(this._myQueued(), 'abort'); + requestQueue + .get(this._fetchStrategy) + .filter(req => req.source === this) + .forEach(req => req.abort()); }; /** @@ -202,12 +205,6 @@ define(function (require) { * PRIVATE API *****/ - SourceAbstract.prototype._myQueued = function () { - return requestQueue - .get(this._fetchStrategy) - .filter(req => req.source === this); - }; - SourceAbstract.prototype._myStartableQueued = function () { return requestQueue .getStartable(this._fetchStrategy) From 8a5c94c941903fec11b5703ccf57c6893dff6624 Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 10:17:55 -0600 Subject: [PATCH 05/19] pass the resolved value --- test/support/pages/Common.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/support/pages/Common.js b/test/support/pages/Common.js index 401e68e186b9..6ebbdbacd373 100644 --- a/test/support/pages/Common.js +++ b/test/support/pages/Common.js @@ -148,9 +148,9 @@ define(function (require) { return Promise .try(block) - .then(function tryForTimeSuccess() { + .then(function tryForTimeSuccess(resolved) { self.debug('tryForTime success in about ' + (lastTry - start) + ' ms'); - return (lastTry - start); + return resolved; }) .catch(function tryForTimeCatch(err) { self.debug('tryForTime failure, retry in ' + retryDelay + 'ms - ' + err.message); From ca5ba4fe16475854787cbfec21d162209d3e1562 Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 10:21:37 -0600 Subject: [PATCH 06/19] fix use in navigateToApp --- test/support/pages/Common.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/support/pages/Common.js b/test/support/pages/Common.js index 6ebbdbacd373..3713051f23c3 100644 --- a/test/support/pages/Common.js +++ b/test/support/pages/Common.js @@ -51,14 +51,13 @@ define(function (require) { self.debug(msg); throw new Error(msg); } + + return currentUrl; }); }); }; return doNavigation(appUrl) - .then(function () { - return self.remote.getCurrentUrl(); - }) .then(function (currentUrl) { var lastUrl = currentUrl; return self.tryForTime(defaultTimeout, function () { From 9303c57b7b67cc14b1631191a82315592db7bdad Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 10:30:36 -0600 Subject: [PATCH 07/19] update HeaderPage helper, use defaultTimeout --- test/support/pages/HeaderPage.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/support/pages/HeaderPage.js b/test/support/pages/HeaderPage.js index 303b2cd02147..9edc658f75ff 100644 --- a/test/support/pages/HeaderPage.js +++ b/test/support/pages/HeaderPage.js @@ -13,14 +13,14 @@ define(function (require) { common = new Common(this.remote); } - var defaultTimeout = 5000; + var defaultTimeout = 60000; HeaderPage.prototype = { constructor: HeaderPage, clickSelector: function (selector) { var self = this.remote; - return common.tryForTime(5000, function () { + return common.tryForTime(defaultTimeout, function () { return self.setFindTimeout(defaultTimeout) .findByCssSelector(selector) .then(function (tab) { @@ -111,8 +111,8 @@ define(function (require) { waitForToastMessageGone: function waitForToastMessageGone() { var self = this; - return common.tryForTime(defaultTimeout * 5, function tryingForTime() { - return self.remote.setFindTimeout(1000) + return common.tryForTime(defaultTimeout * 2, function () { + return self.remote.setFindTimeout(defaultTimeout) .findAllByCssSelector('kbn-truncated.toast-message.ng-isolate-scope') .then(function toastMessage(messages) { if (messages.length > 0) { From c940bc8497d63f7e58bfc577d409d324f5ea3463 Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 11:47:02 -0600 Subject: [PATCH 08/19] put tryForTime in getCurrentQueryName --- test/functional/apps/discover/_discover.js | 10 ++++------ test/support/pages/DiscoverPage.js | 11 ++++++----- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/test/functional/apps/discover/_discover.js b/test/functional/apps/discover/_discover.js index 2e366c27b5f4..b17af315284d 100644 --- a/test/functional/apps/discover/_discover.js +++ b/test/functional/apps/discover/_discover.js @@ -92,12 +92,10 @@ define(function (require) { bdd.it('load query should show query name', function () { return discoverPage.loadSavedSearch(queryName1) .then(function () { - return common.tryForTime(15000, function () { - return discoverPage.getCurrentQueryName() - .then(function (actualQueryNameString) { - expect(actualQueryNameString).to.be(queryName1); - }); - }); + return discoverPage.getCurrentQueryName(); + }) + .then(function (actualQueryNameString) { + expect(actualQueryNameString).to.be(queryName1); }) .catch(common.handleError(this)); }); diff --git a/test/support/pages/DiscoverPage.js b/test/support/pages/DiscoverPage.js index de373f4d176b..c6c55d444c3a 100644 --- a/test/support/pages/DiscoverPage.js +++ b/test/support/pages/DiscoverPage.js @@ -5,7 +5,7 @@ define(function (require) { // at runtime var Common = require('./Common'); - var defaultTimeout = 20000; + var defaultTimeout = 60000; var common; var thisTime; @@ -76,10 +76,11 @@ define(function (require) { }, getCurrentQueryName: function getCurrentQueryName() { - return thisTime - .findByCssSelector('span.discover-info-title') - // .findByCssSelector('span[bo-bind="opts.savedSearch.title"]') - .getVisibleText(); + return common.tryForTime(defaultTimeout, function () { + return thisTime + .findByCssSelector('span.discover-info-title') + .getVisibleText(); + }); }, getBarChartData: function getBarChartData() { From 4e9b1d34de8b37ccfd9c33d7b216a356f53421cb Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 11:47:25 -0600 Subject: [PATCH 09/19] restore waitForToastMessageGone timeout --- test/support/pages/HeaderPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/support/pages/HeaderPage.js b/test/support/pages/HeaderPage.js index 9edc658f75ff..3f470432e443 100644 --- a/test/support/pages/HeaderPage.js +++ b/test/support/pages/HeaderPage.js @@ -112,7 +112,7 @@ define(function (require) { waitForToastMessageGone: function waitForToastMessageGone() { var self = this; return common.tryForTime(defaultTimeout * 2, function () { - return self.remote.setFindTimeout(defaultTimeout) + return self.remote.setFindTimeout(1000) .findAllByCssSelector('kbn-truncated.toast-message.ng-isolate-scope') .then(function toastMessage(messages) { if (messages.length > 0) { From d8d88867472bd94961f56c0811af8698a7688503 Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 11:08:19 -0600 Subject: [PATCH 10/19] speed up the waitForToastMessageGone helper --- test/support/pages/HeaderPage.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/support/pages/HeaderPage.js b/test/support/pages/HeaderPage.js index 3f470432e443..14df032fcc4c 100644 --- a/test/support/pages/HeaderPage.js +++ b/test/support/pages/HeaderPage.js @@ -111,14 +111,15 @@ define(function (require) { waitForToastMessageGone: function waitForToastMessageGone() { var self = this; - return common.tryForTime(defaultTimeout * 2, function () { - return self.remote.setFindTimeout(1000) - .findAllByCssSelector('kbn-truncated.toast-message.ng-isolate-scope') + return common.tryForTime(defaultTimeout, function () { + return self.remote.setFindTimeout(500) + .findAllByCssSelector('kbn-truncated.toast-message') .then(function toastMessage(messages) { if (messages.length > 0) { + common.debug('toast message found, waiting...'); throw new Error('waiting for toast message to clear'); } else { - common.debug('now messages = 0 "' + messages + '"'); + common.debug('toast message clear'); return messages; } }); From c9c0f34efec59d7af97b4d5bb1613feed3f8d64d Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 11:22:46 -0600 Subject: [PATCH 11/19] add a little more debugging --- test/functional/apps/discover/_discover.js | 1 + test/support/pages/Common.js | 1 + 2 files changed, 2 insertions(+) diff --git a/test/functional/apps/discover/_discover.js b/test/functional/apps/discover/_discover.js index b17af315284d..bc0546ceb9b4 100644 --- a/test/functional/apps/discover/_discover.js +++ b/test/functional/apps/discover/_discover.js @@ -75,6 +75,7 @@ define(function (require) { return headerPage.getToastMessage(); }) .then(function (toastMessage) { + common.debug('toast message: ' + toastMessage); expect(toastMessage).to.be(expectedSavedQueryMessage); }) .then(function () { diff --git a/test/support/pages/Common.js b/test/support/pages/Common.js index 3713051f23c3..0a1098c3f3ed 100644 --- a/test/support/pages/Common.js +++ b/test/support/pages/Common.js @@ -19,6 +19,7 @@ define(function (require) { navigateToApp: function (appName, testStatusPage) { var self = this; var appUrl = getUrl(config.servers.kibana, config.apps[appName]); + self.debug('navigating to ' + appName + ' url: ' + appUrl); var doNavigation = function (url) { return self.tryForTime(defaultTimeout, function () { From 4fdbc265c87cdd57a2fa2ed1ff0a42949e3616f9 Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 11:23:16 -0600 Subject: [PATCH 12/19] add catch for missing toast message --- test/support/pages/HeaderPage.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/support/pages/HeaderPage.js b/test/support/pages/HeaderPage.js index 14df032fcc4c..b55c3a3589f4 100644 --- a/test/support/pages/HeaderPage.js +++ b/test/support/pages/HeaderPage.js @@ -122,6 +122,10 @@ define(function (require) { common.debug('toast message clear'); return messages; } + }) + .catch(function () { + common.debug('toast message not found'); + return; }); }); } From 43a5e2b838e7860e4d2509fc5965ef5d99f7a3d7 Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 11:38:28 -0700 Subject: [PATCH 13/19] wrap getFieldsTabCount in tryForTime give it a chance to fail up to 10 times before failing completely --- test/support/pages/SettingsPage.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/test/support/pages/SettingsPage.js b/test/support/pages/SettingsPage.js index 3a2abc6f805d..524421553615 100644 --- a/test/support/pages/SettingsPage.js +++ b/test/support/pages/SettingsPage.js @@ -126,11 +126,13 @@ define(function (require) { var self = this; var selector = 'li.kbn-settings-tab.active a small'; - return self.remote.setFindTimeout(defaultTimeout) - .findByCssSelector(selector).getVisibleText() - .then(function (theText) { - // the value has () around it, remove them - return theText.replace(/\((.*)\)/, '$1'); + return common.tryForTime(defaultTimeout, function () { + return self.remote.setFindTimeout(defaultTimeout / 10) + .findByCssSelector(selector).getVisibleText() + .then(function (theText) { + // the value has () around it, remove them + return theText.replace(/\((.*)\)/, '$1'); + }); }); }, From b3f2d5bfed4451e5671695f7b6afc2d1c399b08a Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 14:32:24 -0700 Subject: [PATCH 14/19] add check for selected time field option --- test/support/pages/SettingsPage.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/support/pages/SettingsPage.js b/test/support/pages/SettingsPage.js index 524421553615..1348a6a0e142 100644 --- a/test/support/pages/SettingsPage.js +++ b/test/support/pages/SettingsPage.js @@ -47,12 +47,22 @@ define(function (require) { selectTimeFieldOption: function (selection) { var self = this; + // open dropdown return self.getTimeFieldNameField().click() .then(function () { + // close dropdown, keep focus return self.getTimeFieldNameField().click(); }) .then(function () { - return self.getTimeFieldOption(selection); + return common.tryForTime(defaultTimeout, function () { + return self.getTimeFieldOption(selection).click() + .then(function () { + return self.getTimeFieldOption(selection).isSelected(); + }) + .then(function (selected) { + if (!selected) throw new Error('option not selected: ' + selected); + }); + }); }); }, From 25e7d2976e8037bd48f631d2b7e6f16fbe84c7ea Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 14:48:54 -0700 Subject: [PATCH 15/19] make the tryForTime output less noisy --- test/support/pages/Common.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/test/support/pages/Common.js b/test/support/pages/Common.js index 0a1098c3f3ed..600eaf607737 100644 --- a/test/support/pages/Common.js +++ b/test/support/pages/Common.js @@ -148,12 +148,8 @@ define(function (require) { return Promise .try(block) - .then(function tryForTimeSuccess(resolved) { - self.debug('tryForTime success in about ' + (lastTry - start) + ' ms'); - return resolved; - }) .catch(function tryForTimeCatch(err) { - self.debug('tryForTime failure, retry in ' + retryDelay + 'ms - ' + err.message); + self.debug('tryForTime failure: ' + err.message); tempMessage = err.message; return Promise.delay(retryDelay).then(attempt); }); From 3e8307f8ac65292c91ca23a7d6f2073685647875 Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 15:09:07 -0700 Subject: [PATCH 16/19] increase the default timeouts --- test/functional/apps/settings/_index_pattern_results_sort.js | 4 ++-- test/support/pages/Common.js | 2 +- test/support/pages/DiscoverPage.js | 2 +- test/support/pages/HeaderPage.js | 2 +- test/support/pages/SettingsPage.js | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/functional/apps/settings/_index_pattern_results_sort.js b/test/functional/apps/settings/_index_pattern_results_sort.js index be1167b8fa85..e34b3cc45958 100644 --- a/test/functional/apps/settings/_index_pattern_results_sort.js +++ b/test/functional/apps/settings/_index_pattern_results_sort.js @@ -9,7 +9,7 @@ define(function (require) { var common; var settingsPage; var remote; - var longTimeout = 60000; + var defaultTimeout = 90000; bdd.before(function () { common = new Common(this.remote); @@ -94,7 +94,7 @@ define(function (require) { }); bdd.it('makelogs data should have expected number of fields', function () { - return common.tryForTime(longTimeout, function () { + return common.tryForTime(defaultTimeout, function () { return settingsPage.getFieldsTabCount() .then(function (tabCount) { expect(tabCount).to.be('' + expectedFieldCount); diff --git a/test/support/pages/Common.js b/test/support/pages/Common.js index 600eaf607737..e652729b3011 100644 --- a/test/support/pages/Common.js +++ b/test/support/pages/Common.js @@ -11,7 +11,7 @@ define(function (require) { this.remote = remote; } - var defaultTimeout = 60000; + var defaultTimeout = 90000; Common.prototype = { constructor: Common, diff --git a/test/support/pages/DiscoverPage.js b/test/support/pages/DiscoverPage.js index c6c55d444c3a..fd6c2e33aad7 100644 --- a/test/support/pages/DiscoverPage.js +++ b/test/support/pages/DiscoverPage.js @@ -5,7 +5,7 @@ define(function (require) { // at runtime var Common = require('./Common'); - var defaultTimeout = 60000; + var defaultTimeout = 90000; var common; var thisTime; diff --git a/test/support/pages/HeaderPage.js b/test/support/pages/HeaderPage.js index b55c3a3589f4..bd84659dfab4 100644 --- a/test/support/pages/HeaderPage.js +++ b/test/support/pages/HeaderPage.js @@ -13,7 +13,7 @@ define(function (require) { common = new Common(this.remote); } - var defaultTimeout = 60000; + var defaultTimeout = 90000; HeaderPage.prototype = { constructor: HeaderPage, diff --git a/test/support/pages/SettingsPage.js b/test/support/pages/SettingsPage.js index 1348a6a0e142..9032023f72e3 100644 --- a/test/support/pages/SettingsPage.js +++ b/test/support/pages/SettingsPage.js @@ -7,7 +7,7 @@ define(function (require) { var Promise = require('bluebird'); var Common = require('./Common'); - var defaultTimeout = 60000; + var defaultTimeout = 90000; var common; function SettingsPage(remote) { From 14daaf0f8504904176ac9d4ff79aa35d7ec698d8 Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Tue, 24 Nov 2015 15:29:56 -0700 Subject: [PATCH 17/19] move defaultTimeout into a config file --- test/functional/apps/discover/_discover.js | 1 - .../apps/settings/_index_pattern_results_sort.js | 3 ++- test/intern.js | 5 ++++- test/support/pages/Common.js | 2 +- test/support/pages/DiscoverPage.js | 6 ++---- test/support/pages/HeaderPage.js | 4 ++-- test/support/pages/SettingsPage.js | 7 ++----- 7 files changed, 13 insertions(+), 15 deletions(-) diff --git a/test/functional/apps/discover/_discover.js b/test/functional/apps/discover/_discover.js index bc0546ceb9b4..b17af315284d 100644 --- a/test/functional/apps/discover/_discover.js +++ b/test/functional/apps/discover/_discover.js @@ -75,7 +75,6 @@ define(function (require) { return headerPage.getToastMessage(); }) .then(function (toastMessage) { - common.debug('toast message: ' + toastMessage); expect(toastMessage).to.be(expectedSavedQueryMessage); }) .then(function () { diff --git a/test/functional/apps/settings/_index_pattern_results_sort.js b/test/functional/apps/settings/_index_pattern_results_sort.js index e34b3cc45958..72d7474356fe 100644 --- a/test/functional/apps/settings/_index_pattern_results_sort.js +++ b/test/functional/apps/settings/_index_pattern_results_sort.js @@ -1,4 +1,5 @@ define(function (require) { + var config = require('intern').config; var Common = require('../../../support/pages/Common'); var SettingsPage = require('../../../support/pages/SettingsPage'); var expect = require('intern/dojo/node!expect.js'); @@ -9,7 +10,7 @@ define(function (require) { var common; var settingsPage; var remote; - var defaultTimeout = 90000; + var defaultTimeout = config.timeouts.default; bdd.before(function () { common = new Common(this.remote); diff --git a/test/intern.js b/test/intern.js index b725b6101f8e..b46ee03e1e2b 100644 --- a/test/intern.js +++ b/test/intern.js @@ -23,6 +23,9 @@ define(function (require) { 'bluebird': './node_modules/bluebird/js/browser/bluebird.js', 'moment': './node_modules/moment/moment.js' } - } + }, + timeouts: { + default: 90000 + }, }, serverConfig); }); diff --git a/test/support/pages/Common.js b/test/support/pages/Common.js index e652729b3011..a531c4c177ef 100644 --- a/test/support/pages/Common.js +++ b/test/support/pages/Common.js @@ -11,7 +11,7 @@ define(function (require) { this.remote = remote; } - var defaultTimeout = 90000; + var defaultTimeout = config.timeouts.default; Common.prototype = { constructor: Common, diff --git a/test/support/pages/DiscoverPage.js b/test/support/pages/DiscoverPage.js index fd6c2e33aad7..a3dc9ac6c184 100644 --- a/test/support/pages/DiscoverPage.js +++ b/test/support/pages/DiscoverPage.js @@ -1,11 +1,9 @@ // in test/support/pages/DiscoverPage.js define(function (require) { - // the page object is created as a constructor - // so we can provide the remote Command object - // at runtime + var config = require('intern').config; var Common = require('./Common'); - var defaultTimeout = 90000; + var defaultTimeout = config.timeouts.default; var common; var thisTime; diff --git a/test/support/pages/HeaderPage.js b/test/support/pages/HeaderPage.js index bd84659dfab4..40353ade7421 100644 --- a/test/support/pages/HeaderPage.js +++ b/test/support/pages/HeaderPage.js @@ -1,6 +1,6 @@ // in test/support/pages/HeaderPage.js define(function (require) { - + var config = require('intern').config; var Common = require('./Common'); var common; @@ -13,7 +13,7 @@ define(function (require) { common = new Common(this.remote); } - var defaultTimeout = 90000; + var defaultTimeout = config.timeouts.default; HeaderPage.prototype = { constructor: HeaderPage, diff --git a/test/support/pages/SettingsPage.js b/test/support/pages/SettingsPage.js index 9032023f72e3..dbba239f40f6 100644 --- a/test/support/pages/SettingsPage.js +++ b/test/support/pages/SettingsPage.js @@ -1,13 +1,10 @@ // in test/support/pages/SettingsPage.js define(function (require) { - // the page object is created as a constructor - // so we can provide the remote Command object - // at runtime - + var config = require('intern').config; var Promise = require('bluebird'); var Common = require('./Common'); - var defaultTimeout = 90000; + var defaultTimeout = config.timeouts.default; var common; function SettingsPage(remote) { From a76b18a8d04da666fce31558fcccf9ad8bc3702d Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Wed, 25 Nov 2015 15:53:52 -0700 Subject: [PATCH 18/19] check for scope.opts.timefield, return early if missing Fixes #5509 --- src/plugins/kibana/public/discover/controllers/discover.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/kibana/public/discover/controllers/discover.js b/src/plugins/kibana/public/discover/controllers/discover.js index f144362cd7a8..88b40cd678f5 100644 --- a/src/plugins/kibana/public/discover/controllers/discover.js +++ b/src/plugins/kibana/public/discover/controllers/discover.js @@ -191,6 +191,9 @@ define(function (require) { }); $scope.$watch('vis.aggs', function () { + // no timefield, no vis, nothing to update + if (!$scope.opts.timefield) return; + var buckets = $scope.vis.aggs.bySchemaGroup.buckets; if (buckets && buckets.length === 1) { From 4f863617c54f37dbedd0853a385efc4578103ff5 Mon Sep 17 00:00:00 2001 From: Court Ewing Date: Mon, 30 Nov 2015 11:23:08 -0500 Subject: [PATCH 19/19] bump to version 5.0.0-snapshot --- README.md | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ac077c92a2eb..a30b031815eb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Kibana 4.4.0-snapshot +# Kibana 5.0.0-snapshot [![Build Status](https://travis-ci.org/elastic/kibana.svg?branch=master)](https://travis-ci.org/elastic/kibana?branch=master) @@ -37,7 +37,7 @@ For the daring, snapshot builds are available. These builds are created after ea | platform | | | | --- | --- | --- | -| OSX | [tar](http://download.elastic.co/kibana/kibana-snapshot/kibana-4.4.0-snapshot-darwin-x64.tar.gz) | [zip](http://download.elastic.co/kibana/kibana-snapshot/kibana-4.4.0-snapshot-darwin-x64.zip) | -| Linux x64 | [tar](http://download.elastic.co/kibana/kibana-snapshot/kibana-4.4.0-snapshot-linux-x64.tar.gz) | [zip](http://download.elastic.co/kibana/kibana-snapshot/kibana-4.4.0-snapshot-linux-x64.zip) | -| Linux x86 | [tar](http://download.elastic.co/kibana/kibana-snapshot/kibana-4.4.0-snapshot-linux-x86.tar.gz) | [zip](http://download.elastic.co/kibana/kibana-snapshot/kibana-4.4.0-snapshot-linux-x86.zip) | -| Windows | [tar](http://download.elastic.co/kibana/kibana-snapshot/kibana-4.4.0-snapshot-windows.tar.gz) | [zip](http://download.elastic.co/kibana/kibana-snapshot/kibana-4.4.0-snapshot-windows.zip) | +| OSX | [tar](http://download.elastic.co/kibana/kibana-snapshot/kibana-5.0.0-snapshot-darwin-x64.tar.gz) | [zip](http://download.elastic.co/kibana/kibana-snapshot/kibana-5.0.0-snapshot-darwin-x64.zip) | +| Linux x64 | [tar](http://download.elastic.co/kibana/kibana-snapshot/kibana-5.0.0-snapshot-linux-x64.tar.gz) | [zip](http://download.elastic.co/kibana/kibana-snapshot/kibana-5.0.0-snapshot-linux-x64.zip) | +| Linux x86 | [tar](http://download.elastic.co/kibana/kibana-snapshot/kibana-5.0.0-snapshot-linux-x86.tar.gz) | [zip](http://download.elastic.co/kibana/kibana-snapshot/kibana-5.0.0-snapshot-linux-x86.zip) | +| Windows | [tar](http://download.elastic.co/kibana/kibana-snapshot/kibana-5.0.0-snapshot-windows.tar.gz) | [zip](http://download.elastic.co/kibana/kibana-snapshot/kibana-5.0.0-snapshot-windows.zip) | diff --git a/package.json b/package.json index 82d78b030057..9a71d138a483 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "dashboarding" ], "private": false, - "version": "4.4.0-snapshot", + "version": "5.0.0-snapshot", "build": { "number": 8467, "sha": "6cb7fec4e154faa0a4a3fee4b33dfef91b9870d9"