[Pkg-javascript-commits] [uglifyjs] 191/228: upgrade fuzzer (#1754)

Jonas Smedegaard dr at jones.dk
Sat Apr 15 14:25:29 UTC 2017


This is an automated email from the git hooks/post-receive script.

js pushed a commit to branch master
in repository uglifyjs.

commit 28ecea50a6ae0cc8c5bddca7764e5fd198a7730e
Author: Alex Lam S.L <alexlamsl at gmail.com>
Date:   Sun Apr 2 02:10:50 2017 +0800

    upgrade fuzzer (#1754)
    
    - configurable set of `minify()` options
    - test and report suspects upon failure
    - continue after failure if infinite iterations is specified
---
 test/ufuzz.js   | 103 ++++++++++++++++++++++++++++++++++++++++++++------------
 test/ufuzz.json |  34 +++++++++++++++++++
 2 files changed, 115 insertions(+), 22 deletions(-)

diff --git a/test/ufuzz.js b/test/ufuzz.js
index f0c0ea6..241e043 100644
--- a/test/ufuzz.js
+++ b/test/ufuzz.js
@@ -12,7 +12,7 @@
         stream._handle.setBlocking(true);
 });
 
-var minify = require("..").minify;
+var UglifyJS = require("..");
 var randomBytes = require("crypto").randomBytes;
 var sandbox = require("./sandbox");
 
@@ -116,7 +116,6 @@ for (var i = 2; i < process.argv.length; ++i) {
         console.log('<number>: generate this many cases (if used must be first arg)');
         console.log('-v: print every generated test case');
         console.log('-V: print every 100th generated test case');
-        console.log('-b: also run beautifier');
         console.log('-t <int>: generate this many toplevels per run (more take longer)');
         console.log('-r <int>: maximum recursion depth for generator (higher takes longer)');
         console.log('-s1 <statement name>: force the first level statement to be this one (see list below)');
@@ -630,7 +629,7 @@ function createVarName(maybe, dontStore) {
 
 function try_beautify(code, result) {
     try {
-        var beautified = minify(code, {
+        var beautified = UglifyJS.minify(code, {
             fromString: true,
             compress: false,
             mangle: false,
@@ -652,7 +651,55 @@ function try_beautify(code, result) {
     console.log(code);
 }
 
-function log() {
+function infer_options(ctor) {
+    try {
+        ctor({ 0: 0 });
+    } catch (e) {
+        return e.defs;
+    }
+}
+
+var default_options = {
+    compress: infer_options(UglifyJS.Compressor),
+    mangle: {
+        "cache": null,
+        "eval": false,
+        "keep_fnames": false,
+        "screw_ie8": true,
+        "toplevel": false,
+    },
+    output: infer_options(UglifyJS.OutputStream),
+};
+
+function log_suspects(minify_options, component) {
+    var options = component in minify_options ? minify_options[component] : true;
+    if (!options) return;
+    options = UglifyJS.defaults(options, default_options[component]);
+    var suspects = Object.keys(default_options[component]).filter(function(name) {
+        if (options[name]) {
+            var m = JSON.parse(JSON.stringify(minify_options));
+            var o = JSON.parse(JSON.stringify(options));
+            o[name] = false;
+            m[component] = o;
+            try {
+                var r = sandbox.run_code(UglifyJS.minify(original_code, m).code);
+                return sandbox.same_stdout(original_result, r);
+            } catch (e) {
+                console.log("Error testing options." + component + "." + name);
+                console.log(e);
+            }
+        }
+    });
+    if (suspects.length > 0) {
+        console.log("Suspicious", component, "options:");
+        suspects.forEach(function(name) {
+            console.log("  " + name);
+        });
+        console.log();
+    }
+}
+
+function log(options) {
     if (!ok) console.log('\n\n\n\n\n\n!!!!!!!!!!\n\n\n');
     console.log("//=============================================================");
     if (!ok) console.log("// !!!!!! Failed... round", round);
@@ -674,9 +721,22 @@ function log() {
         console.log("// !!! uglify failed !!!");
         console.log(uglify_code.stack);
     }
-    if (!ok) console.log("!!!!!! Failed... round", round);
+    console.log("minify(options):");
+    options = JSON.parse(options);
+    console.log(options);
+    console.log();
+    if (!ok) {
+        Object.keys(default_options).forEach(log_suspects.bind(null, options));
+        console.log("!!!!!! Failed... round", round);
+    }
 }
 
+var minify_options = require("./ufuzz.json").map(function(options) {
+    options.fromString = true;
+    return JSON.stringify(options);
+});
+var original_code, original_result;
+var uglify_code, uglify_result, ok;
 for (var round = 0; round < num_iterations; round++) {
     process.stdout.write(round + " of " + num_iterations + "\r");
 
@@ -684,27 +744,26 @@ for (var round = 0; round < num_iterations; round++) {
     loops = 0;
     funcs = 0;
 
-    var original_code = [
+    original_code = [
         "var a = 100, b = 10, c = 0;",
         createTopLevelCodes(rng(MAX_GENERATED_TOPLEVELS_PER_RUN) + 1),
         "console.log(null, a, b, c);" // preceding `null` makes for a cleaner output (empty string still shows up etc)
     ].join("\n");
 
-    var uglify_code;
-    try {
-        uglify_code = minify(original_code, {
-            fromString: true,
-        }).code;
-    } catch (e) {
-        uglify_code = e;
-    }
+    minify_options.forEach(function(options) {
+        try {
+            uglify_code = UglifyJS.minify(original_code, JSON.parse(options)).code;
+        } catch (e) {
+            uglify_code = e;
+        }
 
-    var ok = typeof uglify_code == "string";
-    if (ok) {
-        var original_result = sandbox.run_code(original_code);
-        var uglify_result = sandbox.run_code(uglify_code);
-        ok = sandbox.same_stdout(original_result, uglify_result);
-    }
-    if (verbose || (verbose_interval && !(round % INTERVAL_COUNT)) || !ok) log();
-    if (!ok) process.exit(1);
+        ok = typeof uglify_code == "string";
+        if (ok) {
+            original_result = sandbox.run_code(original_code);
+            uglify_result = sandbox.run_code(uglify_code);
+            ok = sandbox.same_stdout(original_result, uglify_result);
+        }
+        if (verbose || (verbose_interval && !(round % INTERVAL_COUNT)) || !ok) log(options);
+        if (!ok && isFinite(num_iterations)) process.exit(1);
+    });
 }
diff --git a/test/ufuzz.json b/test/ufuzz.json
new file mode 100644
index 0000000..8db03d2
--- /dev/null
+++ b/test/ufuzz.json
@@ -0,0 +1,34 @@
+[
+    {
+        "compress": {
+            "warnings": false
+        }
+    },
+    {
+        "compress": {
+            "warnings": false
+        },
+        "mangle": false
+    },
+    {
+        "compress": false,
+        "mangle": true
+    },
+    {
+        "compress": false,
+        "mangle": false,
+        "output": {
+            "beautify": true,
+            "bracketize": true
+        }
+    },
+    {
+        "compress": {
+            "keep_fargs": false,
+            "passes": 3,
+            "pure_getters": true,
+            "unsafe": true,
+            "warnings": false
+        }
+    }
+]

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/uglifyjs.git



More information about the Pkg-javascript-commits mailing list