jlaskey@3: /* jlaskey@7: * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. jlaskey@3: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. jlaskey@475: * jlaskey@3: * This code is free software; you can redistribute it and/or modify it jlaskey@3: * under the terms of the GNU General Public License version 2 only, as jlaskey@3: * published by the Free Software Foundation. jlaskey@475: * jlaskey@3: * This code is distributed in the hope that it will be useful, but WITHOUT jlaskey@3: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or jlaskey@3: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License jlaskey@3: * version 2 for more details (a copy is included in the LICENSE file that jlaskey@3: * accompanied this code). jlaskey@475: * jlaskey@3: * You should have received a copy of the GNU General Public License version jlaskey@3: * 2 along with this work; if not, write to the Free Software Foundation, jlaskey@3: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. jlaskey@475: * jlaskey@3: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA jlaskey@3: * or visit www.oracle.com if you need additional information or have any jlaskey@3: * questions. jlaskey@3: */ jlaskey@3: jlaskey@3: /** jlaskey@3: * runsunspider : runs the sunspider tests and checks for compliance jlaskey@3: * attila@963: * @test attila@963: * @option -timezone=PST attila@963: * @runif external.sunspider jlaskey@3: */ jlaskey@3: jlaskey@3: /** jlaskey@3: * This is not a test, but a test "framework" for running sunspider tests. jlaskey@3: */ jlaskey@3: jlaskey@3: function assertEq(a, b) { jlaskey@3: if (a !== b) { jlaskey@475: throw "ASSERTION FAILED: " + a + " should be " + b; jlaskey@3: } jlaskey@3: } jlaskey@3: attila@963: function pprint(x) { attila@963: if (verbose_run) { attila@963: print(x); attila@963: } attila@963: } attila@963: jlaskey@3: var runs = 0; jlaskey@3: var total_time = 0; jlaskey@3: jlaskey@3: function runbench(name) { jlaskey@3: var filename = name.split("/").pop(); attila@963: pprint("Running (warmup/sanity) " + filename); jlaskey@3: jlaskey@3: var start = new Date; attila@963: load(name); attila@963: jlaskey@3: var stop = new Date - start; jlaskey@3: total_time += stop; jlaskey@475: attila@963: pprint(filename + " done in " + stop + " ms"); jlaskey@3: runs++; jlaskey@3: } lagergren@20: attila@963: var m_w; attila@963: var m_z; attila@963: var MAXINT; lagergren@20: lagergren@20: //produce deterministic random numbers for test suite lagergren@20: function pseudorandom() { lagergren@20: m_z = 36969 * (m_z & 65535) + (m_z >> 16); lagergren@20: m_w = 18000 * (m_w & 65535) + (m_w >> 16); lagergren@20: return (Math.abs((m_z << 16) + m_w) & MAXINT) / MAXINT; lagergren@20: } lagergren@20: attila@963: function initrandom() { attila@963: m_w = 4711; attila@963: m_z = 17; attila@963: MAXINT = 0x7fffffff; attila@963: Math.random = pseudorandom; attila@963: } attila@963: attila@963: var rtimes = 0; attila@963: var dir = (typeof(__DIR__) == 'undefined') ? "test/script/basic/" : __DIR__; attila@963: var single; attila@963: var verbose_run = false; attila@963: var runall = false; attila@963: attila@963: var args = []; attila@963: if (typeof $ARGS !== 'undefined') { attila@963: args = $ARGS; attila@963: } else if (typeof arguments !== 'undefined' && arguments.length != 0) { attila@963: args = arguments; attila@963: } attila@963: attila@963: for (var i = 0; i < args.length; i++) { attila@963: if (args[i] === '--verbose') { attila@963: verbose_run = true; attila@963: } else if (args[i] === '--times') { attila@963: i++; attila@963: rtimes = +args[i]; attila@963: } else if (args[i] === '--single') { attila@963: i++; attila@963: single = args[i]; attila@963: } else if (args[i] === '--runall') { attila@963: i++; attila@963: runall = true; attila@963: } attila@963: } attila@963: lagergren@20: function runsuite(tests) { attila@963: var changed = false; attila@963: var res = []; lagergren@20: var oldRandom = Math.random; jlaskey@475: jlaskey@3: try { attila@963: for (var n = 0; n < tests.length; n++) { attila@963: try { attila@963: path = dir + '../external/sunspider/tests/sunspider-1.0.2/' + tests[n].name attila@963: attila@963: initrandom(); attila@963: attila@963: var dd = new Date; attila@963: attila@963: runbench(path); attila@963: if (typeof tests[n].actual !== 'undefined') { attila@963: assertEq(tests[n].actual(), tests[n].expected()); attila@963: } attila@963: attila@963: var times = 0; attila@963: if (typeof tests[n].rerun !== 'undefined' && tests[n].times > 0) { attila@963: pprint("rerunning " + tests[n].name + " " + tests[n].times + " times..."); attila@963: var to = tests[n].times; attila@963: attila@963: var elemsPerPercent = to / 100; attila@963: var po = 0|(to / 10); attila@963: attila@963: pprint("Doing warmup."); attila@963: for (times = 0; times < to; times++) { attila@963: initrandom(); attila@963: tests[n].rerun(); attila@963: } attila@963: attila@963: pprint("Doing hot runs."); attila@963: for (times = 0; times < to; times++) { attila@963: initrandom(); attila@963: tests[n].rerun(); attila@963: if ((times % (po|0)) == 0) { attila@963: pprint("\t" + times/to * 100 + "%"); attila@963: } attila@963: } attila@963: } attila@963: attila@963: var t = Math.round(((new Date - dd) / (times == 0 ? 1 : times)) * 100 / 100); attila@963: pprint("time per iteration: " + t + " ms"); attila@963: if (typeof tests[n].actual !== 'undefined') { attila@963: assertEq(tests[n].actual(), tests[n].expected()); attila@963: } attila@963: res.push(t); attila@963: attila@963: pprint(""); attila@963: attila@963: changed = true; attila@963: } catch(e) { attila@963: if (runall) { attila@963: print("FAIL!"); attila@963: } else { attila@963: throw e; attila@963: } jlaskey@475: } jlaskey@475: } attila@963: } catch (e) { attila@963: print("FAIL!"); attila@963: throw e; jlaskey@475: // no scripting or something, silently fail lagergren@20: } finally { attila@963: Math.random = oldRandom; jlaskey@3: } attila@963: attila@963: for (var n = 0; n < tests.length; n++) { attila@963: attila@963: var time = "" + res[n]; attila@963: while (time.length < 6) { attila@963: time = " " + time; attila@963: } attila@963: time += " ms"; attila@963: if (res[n] == -1) { attila@963: time = ""; attila@963: } attila@963: var str = tests[n].name; attila@963: for (var spaces = str.length; spaces < 32; spaces++) { attila@963: str += " "; attila@963: } attila@963: str += " "; attila@963: str += time; attila@963: attila@963: if (tests[n].times > 0) { attila@963: str += " ["; attila@963: str += tests[n].times + " reruns]"; attila@963: } attila@963: pprint(str); attila@963: } lagergren@20: jlaskey@3: return changed; jlaskey@3: } jlaskey@3: lagergren@20: function hash(str) { lagergren@20: var s = "" + str; lagergren@20: var h = 0; lagergren@20: var off = 0; lagergren@20: for (var i = 0; i < s.length; i++) { jlaskey@475: h = 31 * h + s.charCodeAt(off++); jlaskey@475: h &= 0x7fffffff; lagergren@20: } lagergren@20: return h ^ s.length; lagergren@20: } jlaskey@3: jlaskey@3: var tests = [ attila@963: attila@963: { name: 'regexp-dna.js', attila@963: actual: function() { attila@963: return dnaOutputString + dnaInput; attila@963: }, attila@963: expected: function() { attila@963: return expectedDNAOutputString + expectedDNAInput; attila@963: }, attila@963: }, attila@963: lagergren@20: { name: 'string-base64.js', jlaskey@475: actual: function() { jlaskey@475: return hash(str); lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 1544571068; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: toBinaryTable = [ attila@963: -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, attila@963: -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, attila@963: -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, attila@963: 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, attila@963: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, attila@963: 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, attila@963: -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, attila@963: 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 attila@963: ]; attila@963: var str = ""; attila@963: for (var i = 0; i < 8192; i++) attila@963: str += String.fromCharCode((25 * Math.random()) + 97); attila@963: attila@963: for (var i = 8192; i <= 16384; i *= 2) { attila@963: var base64; attila@963: base64 = toBase64(str); attila@963: var encoded = base64ToString(base64); attila@963: attila@963: str += str; lagergren@20: } attila@963: toBinaryTable = null; lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'date-format-xparb.js', jlaskey@475: actual: function() { jlaskey@475: return shortFormat + longFormat; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return "2017-09-05Tuesday, September 05, 2017 8:43:48 AM"; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: date = new Date("1/1/2007 1:11:11"); attila@963: for (i = 0; i < 4000; ++i) { attila@963: var shortFormat = date.dateFormat("Y-m-d"); attila@963: var longFormat = date.dateFormat("l, F d, Y g:i:s A"); attila@963: date.setTime(date.getTime() + 84266956); lagergren@20: } attila@963: } attila@963: attila@963: }, attila@963: { name: 'string-validate-input.js', attila@963: actual: function() { attila@963: return hash(endResult); attila@963: }, attila@963: expected: function() { attila@963: return 726038055; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: doTest(); attila@963: }, jlaskey@475: }, lagergren@20: { name: '3d-morph.js', lagergren@20: actual: function() { jlaskey@475: var acceptableDelta = 4e-15; jlaskey@475: return (testOutput - 6.394884621840902e-14) < acceptableDelta; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return true; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: a = Array() attila@963: for (var i=0; i < nx*nz*3; ++i) attila@963: a[i] = 0 attila@963: for (var i = 0; i < loops; ++i) { attila@963: morph(a, i/loops) attila@963: } attila@963: testOutput = 0; attila@963: for (var i = 0; i < nx; i++) attila@963: testOutput += a[3*(i*nx+i)+1]; attila@963: a = null; attila@963: lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'crypto-aes.js', lagergren@20: actual: function() { jlaskey@475: return plainText; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return decryptedText; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: cipherText = AESEncryptCtr(plainText, password, 256); attila@963: decryptedText = AESDecryptCtr(cipherText, password, 256); attila@963: lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'crypto-md5.js', lagergren@20: actual: function() { jlaskey@475: return md5Output; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return "a831e91e0f70eddcb70dc61c6f82f6cd"; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: md5Output = hex_md5(plainText); lagergren@20: } jlaskey@475: }, attila@963: lagergren@20: { name: 'crypto-sha1.js', lagergren@20: actual: function() { jlaskey@475: return sha1Output; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return "2524d264def74cce2498bf112bedf00e6c0b796d"; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: sha1Output = hex_sha1(plainText); lagergren@20: } jlaskey@475: }, attila@963: jlaskey@475: { name: 'bitops-bitwise-and.js', lagergren@20: actual: function() { jlaskey@475: return result; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 0; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: bitwiseAndValue = 4294967296; attila@963: for (var i = 0; i < 600000; i++) { attila@963: bitwiseAndValue = bitwiseAndValue & i; attila@963: } attila@963: result = bitwiseAndValue; lagergren@20: } jlaskey@475: }, attila@963: jlaskey@475: { name: 'bitops-bits-in-byte.js', lagergren@20: actual: function() { jlaskey@475: return result; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 358400; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: result = TimeFunc(bitsinbyte); lagergren@20: } jlaskey@475: }, attila@963: jlaskey@475: { name: 'bitops-nsieve-bits.js', lagergren@20: actual: function() { jlaskey@475: var ret = 0; jlaskey@475: for (var i = 0; i < result.length; ++i) { jlaskey@475: ret += result[i]; jlaskey@475: } jlaskey@475: ret += result.length; jlaskey@475: return ret; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return -1286749539853; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: result = sieve(); lagergren@20: } jlaskey@475: }, attila@963: jlaskey@475: { name: 'bitops-3bit-bits-in-byte.js', lagergren@20: actual: function() { jlaskey@475: return sum; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 512000; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: sum = TimeFunc(fast3bitlookup); lagergren@20: } jlaskey@475: }, attila@963: jlaskey@475: { name: 'access-nbody.js', lagergren@20: actual: function() { jlaskey@475: return ret; lagergren@20: }, lagergren@20: expected: function() { jlaskey@624: return -1.3524862408537381; attila@963: }, attila@963: times: rtimes, attila@963: rerun: function() { attila@963: var ret = 0; attila@963: for (var n = 3; n <= 24; n *= 2) { attila@963: (function(){ attila@963: var bodies = new NBodySystem( Array( attila@963: Sun(),Jupiter(),Saturn(),Uranus(),Neptune() attila@963: )); attila@963: var max = n * 100; attila@963: attila@963: ret += bodies.energy(); attila@963: for (var i=0; i'; lagergren@20: }, lagergren@20: expected: function() { attila@963: return true; attila@963: }, jlaskey@475: }, attila@963: lagergren@20: ]; jlaskey@3: attila@963: tests.sort(function(a,b) { return a.name.localeCompare(b.name); }); attila@963: if (typeof single !== 'undefined') { attila@963: for (i in tests) { attila@963: if (tests[i].name === single) { attila@963: singleTest = tests[i]; attila@963: tests = [singleTest]; attila@963: break; attila@963: } attila@963: } attila@963: if (tests.length != 1) { attila@963: throw "unknown single test '" + single + "'"; attila@963: } attila@963: } attila@963: attila@963: jlaskey@3: // handle the case this script may be run by a JS engine that doesn't jlaskey@3: // support __DIR__ global variable. jlaskey@3: lagergren@20: runsuite(tests); jlaskey@3: attila@963: pprint('\n' + runs + "/" + tests.length + " tests were successfully run in " + total_time + " ms "); jlaskey@3: jlaskey@3: print("Sunspider finished!");