From c6d3a2fc13b4ea2c53125960a978b8bef76ca627 Mon Sep 17 00:00:00 2001 From: "Joshua A. Horton" Date: Mon, 12 Feb 2018 15:38:36 +0700 Subject: [PATCH] Changes the test_utils scripts to provide a more robust initiailization callback timer for automated CI testing. --- web/unit_tests/cases/attachmentAPI.js | 10 +---- web/unit_tests/cases/basics.js | 22 +++------ web/unit_tests/test_utils.js | 65 +++++++++++++++++++++------ 3 files changed, 58 insertions(+), 39 deletions(-) diff --git a/web/unit_tests/cases/attachmentAPI.js b/web/unit_tests/cases/attachmentAPI.js index 416546533f..f6dd712713 100644 --- a/web/unit_tests/cases/attachmentAPI.js +++ b/web/unit_tests/cases/attachmentAPI.js @@ -86,10 +86,7 @@ Modernizr.on('touchevents', function(result) { this.timeout(10000); fixture.setBase('unit_tests/fixtures'); - setupKMW({ attachType:'auto' }); - - // Pass the initTimer method our 'done' callback so it can handle our initialization delays for us. - initTimer(done); + setupKMW({ attachType:'auto' }, done, 10000); }); beforeEach(function() { @@ -155,10 +152,7 @@ Modernizr.on('touchevents', function(result) { this.timeout(10000); fixture.setBase('unit_tests/fixtures'); - setupKMW({ attachType:'auto' }); - - // Pass the initTimer method our 'done' callback so it can handle our initialization delays for us. - initTimer(done); + setupKMW({ attachType:'auto' }, done, 10000); }); beforeEach(function() { diff --git a/web/unit_tests/cases/basics.js b/web/unit_tests/cases/basics.js index a718f41199..62e33cf47c 100644 --- a/web/unit_tests/cases/basics.js +++ b/web/unit_tests/cases/basics.js @@ -7,10 +7,7 @@ describe('Basic KeymanWeb', function() { fixture.setBase('unit_tests/fixtures'); fixture.load("singleInput.html"); - setupKMW(); - - // Pass the initTimer method our 'done' callback so it can handle our initialization delays for us. - initTimer(done); + setupKMW(null, done, 10000); }); afterEach(function() { @@ -38,9 +35,7 @@ Modernizr.on('touchevents', function(result) { fixture.setBase('unit_tests/fixtures'); fixture.load('singleInput.html'); - setupKMW('toggle'); - - initTimer(done); + setupKMW('toggle', done, 10000, function() { return keyman.ui.initialized; }); }); afterEach(function() { @@ -73,9 +68,7 @@ Modernizr.on('touchevents', function(result) { fixture.setBase('unit_tests/fixtures'); fixture.load('singleInput.html'); - setupKMW('button'); - - initTimer(done); + setupKMW('button', done, 10000, function() { return keyman.ui.init; }); }); afterEach(function() { @@ -95,9 +88,7 @@ Modernizr.on('touchevents', function(result) { fixture.setBase('unit_tests/fixtures'); fixture.load('singleInput.html'); - setupKMW('float'); - - initTimer(done); + setupKMW('float', done, 10000, function() { return keyman.ui.initialized; }); }); afterEach(function() { @@ -130,10 +121,7 @@ Modernizr.on('touchevents', function(result) { fixture.setBase('unit_tests/fixtures'); fixture.load('singleInput.html'); - setupKMW('toolbar'); - - // The Toolbar UI has extra-special init to do... may as well feed it more time. - initTimer(done, 2500); + setupKMW('toolbar', done, 10000, function() { return keyman.ui.init; }); }); afterEach(function() { diff --git a/web/unit_tests/test_utils.js b/web/unit_tests/test_utils.js index b86cf34913..dec1fe3afa 100644 --- a/web/unit_tests/test_utils.js +++ b/web/unit_tests/test_utils.js @@ -1,7 +1,7 @@ -var setupKMW = function(kmwOptions) { +var setupKMW = function(kmwOptions, done, timeout, uiInitCheck) { var ui; - if(typeof(kmwOptions) == 'string' || typeof(kmwOptions) == 'undefined') { + if(typeof(kmwOptions) == 'string' || typeof(kmwOptions) == 'undefined' || kmwOptions == null) { ui = kmwOptions; var kmwOptions = { @@ -15,7 +15,7 @@ var setupKMW = function(kmwOptions) { } } - var kmw = setupScript('source/keymanweb.js'); + var kmw = setupScript('source/keymanweb.js', done, timeout, uiInitCheck); fixture.el.appendChild(kmw); ui = kmwOptions.ui; @@ -46,14 +46,17 @@ var setupKMW = function(kmwOptions) { */ window.setTimeout(function() { initFunc(); - }, 5); + }, 8); } -var setupScript = function(src) { +var setupScript = function(src, done, timeout, uiInitCheck) { var Lscript = document.createElement('script'); Lscript.charset="UTF-8"; // KMEW-89 Lscript.type = 'text/javascript'; Lscript.async = false; + if(done) { + Lscript.onload = initTimer(done, timeout, uiInitCheck); + } Lscript.src = src; @@ -67,15 +70,49 @@ var teardownKMW = function() { } // Make sure the main script loads... -var initTimer = function(done, timeout) { - window.setTimeout(function() { - if(window['keyman']) { - // ... and then give KMW and the UI a bit more time to init and attach. +var initTimer = function(done, timeout, uiInitCheck) { + var uiLoadDelay; + if(typeof(uiInitCheck) != 'function') { + uiInitCheck = function() { return true; }; + uiLoadDelay = false; + } else { + uiLoadDelay = true; + } + + // We need managed state for this. + var InitializationManager = function() { + this.killSwitch = false; + + this.initCheckCallback = function() { + if(window['keyman'] && window['keyman'].initialized == 2 && uiInitCheck()) { + if(done) { + this.timer = window.setTimeout(function() { + // There can be some odd cross-interference with the UI modules and their initialization. + // We use a significant delay here to avoid said problems. + done(); + }, uiLoadDelay ? 2000 : 0); + } + } else if(!this.killSwitch) { + this.timer = window.setTimeout(this.initCheckCallback, 50); + } + }.bind(this); + + if(timeout) { window.setTimeout(function() { - done(); - }, timeout ? timeout : 1000); - } else { - initTimer(done); + this.killSwitch = true; + + if(this.observer) { + this.observer.end(); + } + + if(this.timer) { + window.clearTimeout(this.timer); + this.timer = 0; + } + }.bind(this), timeout); } - }, 50); + } + + var im = new InitializationManager(); + return im.initCheckCallback; }; \ No newline at end of file