• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Flags: --expose-internals
2'use strict';
3
4const common = require('../common');
5
6const assert = require('assert');
7const {
8  validateOffsetLengthRead,
9  validateOffsetLengthWrite,
10} = require('internal/fs/utils');
11
12{
13  const offset = -1;
14  assert.throws(
15    () => validateOffsetLengthRead(offset, 0, 0),
16    common.expectsError({
17      code: 'ERR_OUT_OF_RANGE',
18      name: 'RangeError',
19      message: 'The value of "offset" is out of range. ' +
20                 `It must be >= 0. Received ${offset}`
21    })
22  );
23}
24
25{
26  const length = -1;
27  assert.throws(
28    () => validateOffsetLengthRead(0, length, 0),
29    common.expectsError({
30      code: 'ERR_OUT_OF_RANGE',
31      name: 'RangeError',
32      message: 'The value of "length" is out of range. ' +
33                 `It must be >= 0. Received ${length}`
34    })
35  );
36}
37
38{
39  const offset = 1;
40  const length = 1;
41  const byteLength = offset + length - 1;
42  assert.throws(
43    () => validateOffsetLengthRead(offset, length, byteLength),
44    common.expectsError({
45      code: 'ERR_OUT_OF_RANGE',
46      name: 'RangeError',
47      message: 'The value of "length" is out of range. ' +
48                 `It must be <= ${byteLength - offset}. Received ${length}`
49    })
50  );
51}
52
53// Most platforms don't allow reads or writes >= 2 GB.
54// See https://github.com/libuv/libuv/pull/1501.
55const kIoMaxLength = 2 ** 31 - 1;
56
57// RangeError when offset > byteLength
58{
59  const offset = 100;
60  const length = 100;
61  const byteLength = 50;
62  assert.throws(
63    () => validateOffsetLengthWrite(offset, length, byteLength),
64    common.expectsError({
65      code: 'ERR_OUT_OF_RANGE',
66      name: 'RangeError',
67      message: 'The value of "offset" is out of range. ' +
68               `It must be <= ${byteLength}. Received ${offset}`
69    })
70  );
71}
72
73// RangeError when byteLength < kIoMaxLength, and length > byteLength - offset.
74{
75  const offset = kIoMaxLength - 150;
76  const length = 200;
77  const byteLength = kIoMaxLength - 100;
78  assert.throws(
79    () => validateOffsetLengthWrite(offset, length, byteLength),
80    common.expectsError({
81      code: 'ERR_OUT_OF_RANGE',
82      name: 'RangeError',
83      message: 'The value of "length" is out of range. ' +
84               `It must be <= ${byteLength - offset}. Received ${length}`
85    })
86  );
87}
88