diff --git a/lib/file-list.js b/lib/file-list.js index 3878df9eb..db8316773 100644 --- a/lib/file-list.js +++ b/lib/file-list.js @@ -221,14 +221,14 @@ Object.defineProperty(List.prototype, 'files', { return pattern.served }) .map(function (p) { - return from(self.buckets.get(p.pattern)).sort(byPath) + return from(self.buckets.get(p.pattern) || []).sort(byPath) }) var included = this._patterns.filter(function (pattern) { return pattern.included }) .map(function (p) { - return from(self.buckets.get(p.pattern)).sort(byPath) + return from(self.buckets.get(p.pattern) || []).sort(byPath) }) var uniqFlat = function (list) { diff --git a/lib/middleware/common.js b/lib/middleware/common.js index 84da281e0..b098790f2 100644 --- a/lib/middleware/common.js +++ b/lib/middleware/common.js @@ -9,7 +9,7 @@ var PromiseContainer = function () { var promise this.then = function (success, error) { - return promise.then(success, error) + return promise.then(success).catch(error) } this.set = function (newPromise) { diff --git a/lib/web-server.js b/lib/web-server.js index f607ba230..139b5e3ea 100644 --- a/lib/web-server.js +++ b/lib/web-server.js @@ -29,12 +29,16 @@ var createCustomHandler = function (customFileHandlers, /* config.basePath */ ba createCustomHandler.$inject = ['customFileHandlers', 'config.basePath'] -var createWebServer = function (injector, emitter) { +var createWebServer = function (injector, emitter, fileList) { var config = injector.get('config') var serveStaticFile = common.createServeFile(fs, path.normalize(__dirname + '/../static')) var serveFile = common.createServeFile(fs) var filesPromise = new common.PromiseContainer() + // Set an empty list of files to avoid race issues with + // file_list_modified not having been emitted yet + filesPromise.set(Promise.resolve(fileList.files)) + emitter.on('file_list_modified', function (files) { filesPromise.set(Promise.resolve(files)) }) diff --git a/test/unit/web-server.spec.js b/test/unit/web-server.spec.js index 5b038b51d..1cb9362be 100644 --- a/test/unit/web-server.spec.js +++ b/test/unit/web-server.spec.js @@ -47,7 +47,7 @@ describe('web-server', () => { config: ['value', {basePath: '/base/path', urlRoot: '/'}], customFileHandlers: ['value', customFileHandlers], emitter: ['value', emitter], - fileList: ['value', null], + fileList: ['value', {files: {served: [], included: []}}], capturedBrowsers: ['value', null], reporter: ['value', null], executor: ['value', null], @@ -82,6 +82,19 @@ describe('web-server', () => { .expect(200, 'new-js-source') }) + it('should serve no files when they are not available yet', () => { + return request(server) + .get('/base/new.js') + .expect(404) + .then(() => { + servedFiles(new Set([new File('/base/path/new.js')])) + + return request(server) + .get('/base/new.js') + .expect(200, 'new-js-source') + }) + }) + it('should load custom handlers', () => { servedFiles(new Set()) @@ -125,7 +138,7 @@ describe('web-server', () => { config: ['value', {basePath: '/base/path', urlRoot: '/', protocol: 'https:', httpsServerOptions: credentials}], customFileHandlers: ['value', customFileHandlers], emitter: ['value', emitter], - fileList: ['value', null], + fileList: ['value', {files: {served: [], included: []}}], capturedBrowsers: ['value', null], reporter: ['value', null], executor: ['value', null],