caolan / caolan/nodeunit

process.exit before console buffer flushed in Windows

Ouverte
#282 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
JavaScript
Étoiles
1.9k
Forks
359
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

## Symptoms

If any test fails, not all the console output is shown (console output is truncated).

Problem does not show up in standard Windows `cmd`, but does show up if tests are run from Cygwin or within Sublime Text build system. In Cygwin, if the output is piped to a file instead of being displayed on the console then all the results show in the file, even though they did not show in the console when not piped.
## Environment
- nodeunit 0.9.0,
- node 0.10.17
- Windows 7
## Minimal Example

I have the following test file, `tests.js`:

```
for (var i = 0; i < 30; i++)
console.log('' + i);

exports.dummy = function(test) {
test.fail();
test.done();
}
```

Running from Cygwin, the result is:

```
$ nodeunit tests.js
0
```

(I.e., only the first console.log appears). But if I remove the `test.fail` line then all the output appears.
## Cause

My guess of the cause is given in the title. It appears that under different circumstances, sometimes the node console is _asynchronous_ (perhaps due to the way Windows pipes work, I'm not sure), and doesn't flush the output after every write. When a test fails, [line 130 in nodeunit/nodeunit](https://github.com/caolan/nodeunit/blob/60b7d67250a8005fcca6d71a18697c9bdc6613bd/bin/nodeunit#L130) `process.exit(1);` seems to recognize the error and exit the process, but `process.exit` does not seem to always wait for the console output to be received by the terminal. To confirm this hypothesis, if I remove the `process.exit` line, then the output is displayed correctly.
## Solution

A work-around seems to be to change [lines 128-132](https://github.com/caolan/nodeunit/blob/60b7d67250a8005fcca6d71a18697c9bdc6613bd/bin/nodeunit#L128-132) to the following:

```
testrunner.run(files, options, function(err) {
if (err) {
process.on('exit', function() {
process.exit(1);
});
}
});
```

This seems to produce the correct error code for the process and also show all the output. I don't know if there are any other side effects of not ending the process immediately in the callback function.

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Piste de recherche

Commencez dans bin/nodeunit autour des lignes 128-132, en particulier sur process.exit(1) à la ligne 130, et reproduisez le problème avec le tests.js fourni sous Cygwin. Confirmez que les exécutions échouées affichent toute la sortie de la console tout en renvoyant toujours le code de sortie 1 ; le contournement existant fournit le comportement attendu à vérifier.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
javascript
Domaine
cli, operating-systems, testing
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
38/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.