UNPKG

nodeforge

Version:

Fork from linuxwolf-forge, JavaScript implementations of network transports, cryptography, ciphers, PKI, message digests, and various utilities.

379 lines (356 loc) 10.8 kB
/** * Forge Tasks Test * * @author David I. Lehn <dlehn@digitalbazaar.com> * * Copyright (c) 2009-2010 Digital Bazaar, Inc. All rights reserved. */ jQuery(function($) { var cat = 'forge.tests.tasks'; var tests = []; var passed = 0; var failed = 0; var init = function() { passed = failed = 0; $('.ready,.testing,.pass,.fail') .removeClass('ready testing pass fail'); $('#status') .text('Ready.') .addClass('ready'); $('#total').text(tests.length); $('#pass').text(passed); $('#fail').text(failed); $('.expect').empty(); $('.result').empty(); $('.time').empty(); $('#start').removeAttr('disabled'); }; var start = function() { $('#start').attr('disabled', 'disabled'); // meta! use tasks to run the task tests forge.task.start({ type: 'test', run: function(task) { task.next('starting', function(task) { forge.log.debug(cat, 'start'); $('#status') .text('Testing...') .addClass('testing') .removeClass('idle'); }); $.each(tests, function(i, test) { task.next('test', function(task) { var title = $('li:first', test.container); if($('#scroll:checked').length === 1) { $('html,body').animate({scrollTop: title.offset().top}); } title.addClass('testing'); test.run(task, test); }); task.next('test', function(task) { $('li:first', test.container).removeClass('testing'); }); }); task.next('success', function(task) { forge.log.debug(cat, 'done'); if(failed === 0) { $('#status') .text('PASS') .addClass('pass') .removeClass('testing'); } else { // FIXME: should just be hitting failure() below $('#status') .text('FAIL') .addClass('fail') .removeClass('testing'); } }); }, failure: function() { $('#status') .text('FAIL') .addClass('fail') .removeClass('testing'); } }); }; $('#start').click(function() { start(); }); $('#reset').click(function() { init(); }); var addTest = function(name, run) { var container = $('<ul><li>Test ' + name + '</li><ul/></ul>'); var expect = $('<li>Expect: <span class="expect"/></li>'); var result = $('<li>Result: <span class="result"/></li>'); var time = $('<li>Time: <span class="time"/></li>'); $('ul', container).append(expect).append(result).append(time); $('#tests').append(container); var test = { container: container, startTime: null, run: function(task, test) { test.startTime = new Date(); run(task, test); }, expect: $('span', expect), result: $('span', result), check: function() { var e = test.expect.text(); var r = test.result.text(); (e == r) ? test.pass() : test.fail(); }, pass: function() { passed += 1; $('#pass').text(passed); $('li:first', container).addClass('pass'); var dt = new Date() - test.startTime; $('span.time', container).html(dt); }, fail: function() { failed += 1; $('#fail').text(failed); $('li:first', container).addClass('fail'); var dt = new Date() - test.startTime; $('span.time', container).html(dt); } }; tests.push(test); }; addTest('pass', function(task, test) { test.pass(); }); addTest('check', function(task, test) { test.check(); }); addTest('task 1', function(task, test) { task.next(function(task) { test.pass(); }); }); addTest('task check()', function(task, test) { test.expect.append('check'); task.next(function(task) { test.result.append('check'); }); task.next(function(task) { test.check(); }); }); addTest('serial 20', function(task, test) { // total var n = 20; // counter used in the tasks var taskn = 0; for(var i = 0; i < n; ++i) { test.expect.append(i + ' '); task.next(function(task) { test.result.append(taskn++ + ' '); }); } task.next(function(task) { test.check(); }); }); addTest('ajax block', function(task, test) { test.expect.append('.'); task.next(function(task) { task.parent.block(); $.ajax({ type: 'GET', url: 'tasks.html', success: function() { test.result.append('.'); task.parent.unblock(); } }); }); task.next(function(task) { test.check(); }); }); addTest('serial ajax', function(task, test) { var n = 10; for(var i = 0; i < n; ++i) { test.expect.append(i + ' '); } task.next(function(task) { // create parallel functions task.parent.block(n); for(var i = 0; i < n; ++i) { // pass value into closure (function(i) { // serial tasks task.next(function(ajaxTask) { $.ajax({ type: 'GET', url: 'tasks.html', success: function() { // results use top level task test.result.append(i + ' '); task.parent.unblock(); } }); }); })(i); } }); task.next(function(task) { test.check(); }); }); addTest('parallel ajax', function(task, test) { task.next(function(task) { var n = 10; // create parallel functions var tasks = []; for(var i = 0; i < n; ++i) { // pass value into closure (function(i) { tasks.push(function(ajaxTask) { $.ajax({ type: 'GET', url: 'tasks.html', success: function() { // results use top level task test.result.append(i + ' '); } }); }); })(i); } // launch in parallel task.parallel(tasks); }); task.next(function(task) { test.pass(); }); }); addTest('linear empty tasks rate', function(task, test) { test.expect.append('-'); // total var n = 100; var start = new Date(); for(var i = 0; i < n; ++i) { // empty task task.next(function(task) {}); } task.next(function(task) { var dt = (new Date() - start) / 1000; var res = $('<ul/>') .append('<li>Tasks: ' + n + '</li>') .append('<li>Time: ' + dt + 's</li>') .append('<li>Rate: ' + n/dt + ' tasks/s</li>') .append('<li>Task Time: ' + 1000*dt/n + ' ms/tasks</li>'); test.result.html(res); test.pass(); }); }); addTest('sleep', function(task, test) { test.expect.append('-'); var st = 1000; var start = new Date(); task.next(function(task) { task.sleep(st); }); task.next(function(task) { var dt = new Date() - start; var res = $('<ul/>') .append('<li>Sleep Time : ' + st + 'ms</li>') .append('<li>Real Time: ' + dt + 'ms</li>') .append('<li>Diff: ' + (dt-st) + 'ms</li>'); test.result.html(res); test.pass(); }); }); addTest('serial 20 + sleep', function(task, test) { // total var n = 20; // counter used in the tasks var taskn = 0; for(var i = 0; i < n; ++i) { test.expect.append(i + ' '); task.next(function(task) { task.sleep(20); test.result.append(taskn++ + ' '); }); } task.next(function(task) { test.check(); }); }); addTest('concurrent tasks', function(task, test) { var colors = [ 'red', 'green', 'blue', 'black', 'purple', 'goldenrod', 'maroon', 'gray', 'teal', 'magenta' ]; var count = colors.length; task.next(function(task) { var main = task; task.block(count); var tasks = []; for(var i = 0; i < count; ++i) { var makefunction = function(index) { return function(task) { // total var n = 20; // counter used in the tasks var taskn = 0; for(var j = 0; j < n; j++) { task.next(function(task) { test.result.append( '<span style=\"color:' + colors[index] + ';\">' + taskn++ + '</span> '); }); } task.next(function(task) { main.unblock(); }); }; }; tasks.push( { type: 'concurrent' + i, run: makefunction(i) }); } for(var i = 0; i < count; ++i) { forge.task.start(tasks[i]); } }); task.next(function(task) { test.pass(); }); }); init(); });