1// Copyright Joyent, Inc. and other Node contributors.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and associated documentation files (the
5// "Software"), to deal in the Software without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Software, and to permit
8// persons to whom the Software is furnished to do so, subject to the
9// following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Software.
13//
14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20// USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22'use strict';
23const common = require('../common');
24const assert = require('assert');
25
26const path = require('path');
27const fs = require('fs');
28const tmpdir = require('../common/tmpdir');
29const fn = path.join(tmpdir.path, 'write.txt');
30tmpdir.refresh();
31const file = fs.createWriteStream(fn, {
32  highWaterMark: 10
33});
34
35const EXPECTED = '012345678910';
36
37const callbacks = {
38  open: -1,
39  drain: -2,
40  close: -1
41};
42
43file
44  .on('open', function(fd) {
45    console.error('open!');
46    callbacks.open++;
47    assert.strictEqual(typeof fd, 'number');
48  })
49  .on('drain', function() {
50    console.error('drain!', callbacks.drain);
51    callbacks.drain++;
52    if (callbacks.drain === -1) {
53      assert.strictEqual(fs.readFileSync(fn, 'utf8'), EXPECTED);
54      file.write(EXPECTED);
55    } else if (callbacks.drain === 0) {
56      assert.strictEqual(fs.readFileSync(fn, 'utf8'), EXPECTED + EXPECTED);
57      file.end();
58    }
59  })
60  .on('close', function() {
61    console.error('close!');
62    assert.strictEqual(file.bytesWritten, EXPECTED.length * 2);
63
64    callbacks.close++;
65    file.write('should not work anymore', common.expectsError({
66      code: 'ERR_STREAM_WRITE_AFTER_END',
67      name: 'Error',
68      message: 'write after end'
69    }));
70    file.on('error', common.mustNotCall());
71
72    fs.unlinkSync(fn);
73  });
74
75for (let i = 0; i < 11; i++) {
76  file.write(`${i}`);
77}
78
79process.on('exit', function() {
80  for (const k in callbacks) {
81    assert.strictEqual(callbacks[k], 0, `${k} count off by ${callbacks[k]}`);
82  }
83  console.log('ok');
84});
85