pocesar/grunt-mocha-istanbul

the grunt execution is stuck

Closed this issue · 11 comments

Ciao!
How are you today?

It is very weird. I use it in like 33 projects, but I have a repo patrikx3/corifeus-builder-angular and it just stuck, it waits for something but I do not know what it does. Like 2 weeks ago it was working, not it is stuck.

All that happens is this:

patrikx3@workstation:~/Projects/patrikx3/corifeus/corifeus-builder-angular$ grunt mocha_istanbul:cory-coverage -v --force
Initializing
Command-line options: --verbose, --force

Reading "Gruntfile.js" Gruntfile...OK

Registering Gruntfile tasks.
Loading "Gruntfile.js" tasks...OK
+ cory-angular-generator, cory-build-run, cory-ensure-protractor, cory-generate-tasks, cory-generate-tasks-generator, cory-inject, cory-json2scss, cory-noop, cory-npm, cory-replace, cory-test, default

Running tasks: mocha_istanbul:cory-coverage

Loading "grunt-mocha-istanbul" plugin

Registering "/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/node_modules/grunt-mocha-istanbul/tasks" tasks.
Loading "index.js" tasks...OK
+ istanbul_check_coverage, mocha_istanbul

Running "mocha_istanbul:cory-coverage" (mocha_istanbul) task
Verifying property mocha_istanbul.cory-coverage exists in config...OK
Files: /home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/src/, /home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/test/mocha/
Options: require=[], ui=false, globals=[], reporter=false, timeout=false, coverage=false, slow=false, includes=["/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/bin/**","/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/src/**","/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/test/mocha/**"], grep=false, dryRun=false, quiet=false, recursive=false, mask="**/*.js", root=false, print=false, noColors=false, harmony=false, coverageFolder="build/coverage/", cwd="/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular", reportFormats=["clover","html","text"], check={"statements":false,"lines":false,"functions":false,"branches":false}, excludes=false, mochaOptions=false, istanbulOptions=false, nodeOptions=false, nodeExec="/usr/bin/node"
>> Skipping empty options.require array
>> Skipping empty options.globals array
>> Will execute: /usr/bin/node /home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/node_modules/istanbul/lib/cli.js cover -i /home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/bin/** -i /home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/src/** -i /home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/test/mocha/** --dir /home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/build/coverage/ --report clover --report html --report text /home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/node_modules/mocha/bin/_mocha -- /home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/src/**/*.js /home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/test/mocha/**/*.js


  CI
    ✓ test


  1 passing (7ms)

That's it and it doesn't go to the next task in grunt.

Do you have an idea what it could be?

In the patrikx3/corifues-builder it is the exact structure and it works:

patrikx3@workstation:~/Projects/patrikx3/corifeus/corifeus-builder$ grunt
Running "generate-folder" task

Running "cory-generate-tasks" task

Running "cory-ensure-protractor" task
Protractor is not on the path
Running "cory-npm" task

Running "clean:cory-build" (clean) task
>> 1 path cleaned.

Running "mocha_istanbul:cory-coverage" (mocha_istanbul) task


  async/await
    ✓ main (753ms)

  src/git
commit: 159
branch: master
date: 1507308108
repo: corifeus-builder
    ✓ branch / data / commit / repo

  src/task/json2scss
    ✓ default

  src/task/npm/exec
new name: corifeus-builder
old name: corifeus-builder
new version: 1.7.877-160
old version: 1.7.876-160
    ✓ default

  src/task/replace
    ✓ default


  5 passing (810ms)

-----------------------|----------|----------|----------|----------|----------------|
File                   |  % Stmts | % Branch |  % Funcs |  % Lines |Uncovered Lines |
-----------------------|----------|----------|----------|----------|----------------|
All files              |    52.39 |    27.66 |       28 |    52.14 |                |
 src                   |    27.38 |     2.63 |    33.33 |       25 |                |
  git.js               |      100 |       50 |      100 |      100 |             10 |
  index.js             |      100 |      100 |      100 |      100 |                |
  loader.js            |     7.58 |        0 |        0 |     7.69 |... 238,242,243 |
 src/config            |    71.43 |      100 |        0 |    71.43 |                |
  index.js             |    71.43 |      100 |        0 |    71.43 |            5,6 |
 src/config/folder     |      100 |      100 |      100 |      100 |                |
  index.js             |      100 |      100 |      100 |      100 |                |
 src/config/grunt      |      100 |      100 |      100 |      100 |                |
  index.js             |      100 |      100 |      100 |      100 |                |
 src/config/grunt/js   |       60 |      100 |        0 |       60 |                |
  index.js             |       60 |      100 |        0 |       60 |          6,101 |
 src/config/grunt/ts   |    46.15 |      100 |        0 |    46.15 |                |
  index.js             |    46.15 |      100 |        0 |    46.15 |... 24,46,48,63 |
 src/config/task       |    88.46 |       50 |      100 |    88.46 |                |
  index.js             |    88.46 |       50 |      100 |    88.46 |       46,47,50 |
 src/task              |    18.42 |        0 |        0 |    18.42 |                |
  ensure-protractor.js |    16.67 |        0 |        0 |    16.67 |... 26,28,30,31 |
  generate-tasks.js    |     12.5 |        0 |        0 |     12.5 |... 19,20,24,34 |
  index.js             |      100 |      100 |      100 |      100 |                |
  noop.js              |    33.33 |      100 |        0 |    33.33 |            2,3 |
 src/task/inject       |    22.73 |        0 |        0 |    22.73 |                |
  index.js             |       25 |        0 |        0 |       25 |   4,5,6,7,9,10 |
  inject.js            |    22.22 |        0 |        0 |    22.22 |... 47,48,49,51 |
 src/task/json2scss    |    80.49 |       75 |     62.5 |    80.49 |                |
  index.js             |       25 |        0 |        0 |       25 |  4,6,7,8,10,11 |
  json2scss.js         |    93.94 |    85.71 |      100 |    93.94 |          16,32 |
 src/task/npm          |    74.36 |       60 |    33.33 |    74.36 |                |
  index.js             |       25 |      100 |        0 |       25 |   4,5,6,7,8,10 |
  npm.js               |     87.1 |       60 |      100 |     87.1 |    18,19,31,39 |
 src/task/replace      |    71.79 |     62.5 |     37.5 |    71.79 |                |
  index.js             |       25 |        0 |        0 |       25 |  5,7,8,9,11,12 |
  replace.js           |    83.87 |    83.33 |       60 |    83.87 | 65,67,69,70,74 |
-----------------------|----------|----------|----------|----------|----------------|

=============================== Coverage summary ===============================
Statements   : 52.39% ( 186/355 )
Branches     : 27.66% ( 26/94 )
Functions    : 28% ( 14/50 )
Lines        : 52.14% ( 183/351 )
================================================================================
>> Done. Check coverage folder.

Running "cory-replace" task
Replaced: README.md, Pre:  #@corifeus-header, Post:  #@corifeus-header:end
Replaced: artifacts/readme/builds/folders.md, Pre:  #@corifeus-header, Post:  #@corifeus-header:end
Replaced: artifacts/readme/builds/tasks.md, Pre:  #@corifeus-header, Post:  #@corifeus-header:end
Replaced: artifacts/readme/builds/folders.md, Pre:  #@corifeus-footer, Post:  #@corifeus-footer:end
Replaced: artifacts/readme/builds/tasks.md, Pre:  #@corifeus-footer, Post:  #@corifeus-footer:end

Done.


Execution Time (2017-10-06 18:46:09 UTC+2)
mocha_istanbul:cory-coverage  1.8s  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 97%
Total 1.9s

No idea it is stuck. :(

With

./node_modules/.bin/istanbul cover node_modules/mocha/bin/_mocha --report clover -- -R spec test/mocha/**/*.js

It works though, just shows no coverage.

OK, I found the error. it is a webpack folder the src, it is like this:

   coverage.src = [
            `${process.cwd()}/${builder.config.folder.src.root}config/grunt/**`,
            `${process.cwd()}/${builder.config.folder.src.root}config/karma/**`,
            `${process.cwd()}/${builder.config.folder.src.root}config/protractor/**`,
//            `${process.cwd()}/${builder.config.folder.src.root}config/webpack/**`,
            `${process.cwd()}/${builder.config.folder.src.root}task/**`,
            `${process.cwd()}/${builder.config.folder.test.mocha.root}**`
        ];

Is there an exclude in the coverage.src ?
In Istanbul it works, but for me the problem is that src which is not related to Istanbul, I guess it should be in mocha somewhere?

I added this:

{
    "cory-coverage": {
        "src": [
            "!/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/src/config/webpack",
            "/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/bin/",
            "/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/src/",
            "/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/test/mocha/"
        ],
        "options": {
            "mask": "**/*.js",
            "includes": [
                "/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/bin/**",
                "/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/src/**",
                "/home/patrikx3/Projects/patrikx3/corifeus/corifeus-builder-angular/test/mocha/**"
            ],
            "coverageFolder": "build/coverage/",
            "reportFormats": [
                "clover",
                "html",
                "text"
            ]
        }
    }
}

But it doesn't allow me to exclude with ! .
Is there an options like that?

I found the file that stops, do you have an idea why it stops the processing?

(function(window, document, navigator) {
    'use strict';
    if (window.corifeusCssFiles === undefined && window.corifeusScriptFiles === undefined) {
        window.corifeusCssFiles = [];
        window.corifeusScriptFiles = [];
    }
    window.corifeus = {
        booted: false,
        core: {
            http: {
                counter: 0
            }
        }
    }
    window.corifeusPreloader = {
        wait: navigator.userAgent === 'corifeus-server-renderer',
        status: {
            corifeus: window.corifeus
        }
    }

    'GENERATED-HEAD';

    if (!document.getElementById) {
        document.getElementById = function() {};
    }

    var cssFiles = window.corifeusCssFiles;
    var scriptFiles = window.corifeusScriptFiles;
    var files = cssFiles.concat(scriptFiles);
    var progress = {};
    var responseText = {};
    var started = new Date().getTime();

    function formatBytes(bytes,decimals) {
        if(bytes == 0) return '0 Byte';
        var k = 1000; // or 1024 for binary
        var dm = decimals + 1 || 3;
        var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
        var i = Math.floor(Math.log(bytes) / Math.log(k));
        return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
    }
    var formatTime = function(time) {
        var seconds = Math.floor(time / 1000);
        var minutes = Math.floor(seconds / 60);
        var hours = Math.floor(minutes / 60);
        var days = Math.floor(hours / 24);

        hours = hours - (days * 24);
        minutes = minutes - (days * 24 * 60) - (hours * 60);
        seconds = seconds - (days * 24 * 60 * 60) - (hours * 60 * 60) - (minutes * 60);
        if (days < 10) days = '0' + days;
        if (hours < 10) hours = '0' + hours;
        if (minutes < 10) minutes = '0' + minutes;
        if (seconds < 10) seconds = '0' + seconds;

        var template = '';
        if (days != '00') {
            template += days + ':';
        }
        if (hours != '00' || days != '00') {
            template += hours + ':';
        }
        template += minutes + ':';
        template += seconds

        return template;
    }
    function loadFile(url) {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", url, true);
        xhr.onreadystatechange = function() {
            if (this.readyState == this.DONE) {
                responseText[url] = xhr.responseText;
                fire(true, this.responseText);
            }
        };
        xhr.onprogress = function(event) {
            progress[url] = event;
            fire();
        }
        xhr.send();
    }
    function iterate(cb) {
        for(var index = 0; index < files.length; index++) {
            var file = files[index];
            cb(file);
        }
    }
    function includesCss(file) {
        for(var index = 0; index < cssFiles.length; index++) {
            var cssFile = cssFiles[index];
            if (cssFile === file) {
                return true;
            }
        }
        return false;
    }
    var total = 0;
    var loaded = 0;
    var counter = 0;
    var totalDone = false;
    var frame = 33;
    var computable = true;
    var overlayPercent = function(percent) {
        document.getElementById('cory-loader-progress-overlay').style.height = Math.round(percent) + '%';
        document.getElementById('cory-loader-progress-overlay').style.width = '100%';
    }

    var loop = (function() {
        if (totalDone) {
            return;
        }
        if (document.getElementById('cory-loader-progress-bottom')) {
            var percentRaw = (loaded / total);
            var percent = (percentRaw * 100).toFixed(2);
            var totalMB = formatBytes(total, 1);
            var loadedMB = formatBytes(loaded, 1);
            if (isNaN(percent)) {
                percent = 0.5;
            }
            var current = new Date().getTime() - started;
            var maxTime = current / percent * 100;
            var left = maxTime - current;

            overlayPercent(percent);
            var top = document.getElementById('cory-loader-progress-top');
            var bottom = document.getElementById('cory-loader-progress-bottom');

            if (computable) {
                top.innerHTML = formatTime(left);
                bottom.innerHTML  = percent + '%' + '<div class="cory-loader-progress-info">' + loadedMB + ' / ' + totalMB + '</br>' + formatTime(current) + ' / ' + formatTime(maxTime) + '</div>';
            } else {
                top.innerHTML = '<div class="cory-loader-progress-info">gzip</div>';
                bottom.innerHTML = formatTime(current) + '</br></br>' + loadedMB;
            }
        }
        setTimeout(loop, frame);
    });
    loop();

    function fire(isDone) {
        total = 0;
        loaded = 0;
        iterate(function(file) {
            if (progress[file] !== undefined) {
                if (progress[file].lengthComputable === false) {
                    computable = false;
                    total += progress[file].loaded;
                } else {
                    total += progress[file].total;
                }
                loaded += progress[file].loaded;
            }
        })

        totalDone = isDone === true && ++counter == files.length;

    }
    var final = function() {
//        document.getElementById('cory-loader-progress-top').innerHTML = '<div></div>';
//        document.getElementById('cory-loader-progress-bottom').innerHTML = '<span class="cory-loader-progress-start">START</span>';
        overlayPercent(100);
        setTimeout(function() {
            iterate(function(file) {
                var body = document.querySelector('body');
                var head = document.querySelector('head');
                // it is important so that the css is in the head
                if (includesCss(file)) {
                    /*
                    var style = document.createElement('style');
                    style.type = 'text/css';
                    style.innerHTML = responseText[file];
                     head.appendChild(style)
                    */
                    var link = document.createElement('link');
                    link.rel = 'stylesheet';
                    link.href = file;
                    link.type = 'text/css';
                    head.appendChild(link);
                } else {
                    var script = document.createElement("script");
                    script.type = 'text/javascript';
                    script.defer = true;
                    script.src = file;
                    /*
                    script.innerHTML= responseText[file];
                    */
                    body.appendChild(script);
                }
            })
            var booted = function() {
                if (window.corifeus.booted === true) {
                    var removeMe = document.getElementById('cory-loader');
                    if (removeMe !== null) {
                        removeMe.parentNode.removeChild(removeMe);
                    }
                }
                else {
                    setTimeout(booted, 100);
                }

            }
            booted();
        }, frame)
    }

    iterate(function(file) {
        loadFile(file, fire)
    })

    var waitForDone = function() {
        if (totalDone && !window.corifeusPreloader.wait) {
            final();
            return;
        }
        window.corifeusPreloader.status.corifeus = window.corifeus;
        setTimeout(waitForDone, frame);
    }
    waitForDone();
})(typeof(window) === 'undefined' ? this : window, typeof(document) === 'undefined' ? {} : document, typeof(navigator) === 'undefined' ? { userAgent : 'corifeus-server-renderer'} : navigator);

This is a plugin client side function.

weird, maybe it's a mocha issue, but the only line that is awkward "js-wise" speaking is 'GENERATED-HEAD';

yeah i removed it, but still it keeps the stuck. i guess mocha 4 changed something that i don't know.

because this grunt plugin is actually just a "exec thin layer", with only a few utilities added, it's either mocha or istanbul that is crapping out

I am having exact same issue. I pushed some minor change to my code today, and Travis is failing on all nodejs versions.

@p3x-robot you are right: they changed a default behavior in v4 to not "exit" but rather let the test program end. So if you use some libraries and don't clean up after them, your test program will be stuck indefinitely. To change the behavior to be like v3, we need to add flag --exit to mocha runner.

#2879: By default, Mocha will no longer force the process to exit once all tests complete.
This means any test code (or code under test) which would normally prevent node from exiting
will do so when run in Mocha. Supply the --exit flag to revert to pre-v4.0.0 behavior (@ScottFreeCode, @boneskull)

More info: mochajs/mocha#2879

ahh. thanks

yeah, it works, just added 👍

 mocha_istanbul: {
            'cory-coverage': {
                src: [
//                    `${process.cwd()}/${folder.bin.root}` ,
                    `${process.cwd()}/${folder.src.root}` ,
                    `${process.cwd()}/${folder.test.mocha.root}`,
                ], // the folder, not the files
                options: {
                    mochaOptions: ['--exit'],
                    mask: '**/*.js',
                    includes: [
//                        `${process.cwd()}/${folder.bin.root}**` ,
                        `${process.cwd()}/${folder.src.root}**` ,
                        `${process.cwd()}/${folder.test.mocha.root}**`,
                    ],
                    /*
                    to add more local files, outside directories
                     mochaOptions: [
                         'cli.js'
                     ],
                     */
                    coverageFolder: folder.build.coverage.root,
                    reportFormats: [
                        'clover',
                        'html',
                        'text'
                    ]
                }
            }
        },