diff --git a/TestSelenium.js b/TestSelenium.js index 83b276a40..8e160a7f2 100644 --- a/TestSelenium.js +++ b/TestSelenium.js @@ -22,17 +22,30 @@ if (process.env.SAUCE_USERNAME !== undefined) { driver = new WebDriver.Builder().withCapabilities({ browserName: "chrome" }).build(); } +var SC_GET_LOGS = "return (window.__CRYPTPAD_TEST__) ? window.__CRYPTPAD_TEST__.getLogs() : '[]'"; + var nt = nThen; [ - '/assert/', + '/assert/#?test=test', '/auth/#?test=test' ].forEach(function (path) { var url = 'http://localhost:3000' + path; nt = nThen(function (waitFor) { driver.get(url); + var done = false; + var logMore = function (cb) { + if (done) { return; } + driver.executeScript(SC_GET_LOGS).then(waitFor(function (logs) { + JSON.parse(logs).forEach(function (l) { console.log('>' + l); }); + if (cb) { cb(); } else { setTimeout(logMore, 50); } + })); + }; + logMore(); + driver.wait(WebDriver.until.elementLocated(WebDriver.By.className("report")), 5000); var report = driver.wait(WebDriver.until.elementLocated(WebDriver.By.className("report")), 5000); report.getAttribute("class").then(waitFor(function (cls) { report.getText().then(waitFor(function (text) { + logMore(function () { done = true; }); console.log("\n-----\n" + url + ' ' + text + "\n-----"); if (!cls) { throw new Error("cls is null"); @@ -48,4 +61,4 @@ var nt = nThen; nt(function () { driver.quit(); -}); \ No newline at end of file +}) \ No newline at end of file diff --git a/www/assert/main.js b/www/assert/main.js index ffab3f5a9..560d10fd8 100644 --- a/www/assert/main.js +++ b/www/assert/main.js @@ -4,6 +4,7 @@ define([ '/bower_components/textpatcher/TextPatcher.amd.js', 'json.sortify', '/common/cryptpad-common.js', + '/common/test.js' ], function ($, Hyperjson, TextPatcher, Sortify, Cryptpad) { window.Hyperjson = Hyperjson; window.TextPatcher = TextPatcher; diff --git a/www/common/test.js b/www/common/test.js index 2d70e939f..793bfd1b4 100644 --- a/www/common/test.js +++ b/www/common/test.js @@ -1,30 +1,64 @@ define([], function () { var out = function () { }; + out.passed = out; + var mkReport = function (list, pass) { + var rpt = document.createElement('div'); + rpt.textContent = JSON.stringify(list); + rpt.setAttribute('class', 'report ' + (pass ? 'success' : 'failure')); + rpt.setAttribute('style', 'display:none;'); + document.body.appendChild(rpt); + } if (window.location.hash.indexOf("?test=test") > -1) { window.onerror = function (msg, url, lineNo, columnNo, e) { - document.body.innerHTML = '
' + - JSON.stringify([ - msg, - url, - lineNo, - columnNo, - e ? e.message : null, - e ? e.stack : null - ]).replace(/'; + mkReport([ + msg, + url, + lineNo, + columnNo, + e ? e.message : null, + e ? e.stack : null + ]); }; require.onError = function (e) { - document.body.innerHTML = '
' + - JSON.stringify([ - e ? e.message : null, - e ? e.stack : null - ]).replace(/'; + mkReport([ + e ? e.message : null, + e ? e.stack : null + ]); }; out = function (f) { f(); }; + out.passed = function () { mkReport("Test Passed", true); }; + + var cpt = window.__CRYPTPAD_TEST__ = { + logs: [], + getLogs: function () { + var logs = JSON.stringify(cpt.logs); + cpt.logs = []; + return logs; + } + }; + + // jshint -W103 + var errProto = (new Error()).__proto__; + var doLog = function (o) { + var s; + if (typeof(o) === 'object' && o.__proto__ === errProto) { + s = JSON.stringify([ o.message, o.stack ]); + } else if (typeof(s) !== 'string') { + try { + s = JSON.stringify(o); + } catch (e) { + s = String(o); + } + } + var out = [s]; + try { throw new Error(); } catch (e) { out.push(e.stack.split('\n')[3]); } + window.__CRYPTPAD_TEST__.logs.push(out); + }; + + window.console._error = window.console.error; + window.console._log = window.console.log; + window.console.error = function (e) { window.console._error(e); doLog(e); }; + window.console.log = function (l) { window.console._log(l); doLog(l); }; } - out.passed = function () { - document.body.innerHTML = '
Test Passed
'; - }; return out; }); \ No newline at end of file