1'use strict';
2
3const common = require('../common');
4const assert = require('assert');
5
6// Assert legit flags are allowed, and bogus flags are disallowed
7{
8  const goodFlags = [
9    '--perf_basic_prof',
10    '--perf-basic-prof',
11    'perf-basic-prof',
12    '--perf_basic-prof',
13    'perf_basic-prof',
14    'perf_basic_prof',
15    '-r',
16    'r',
17    '--stack-trace-limit=100',
18    '--stack-trace-limit=-=xX_nodejs_Xx=-',
19  ].concat(process.features.inspector ? [
20    '--inspect-brk',
21    'inspect-brk',
22    '--inspect_brk',
23  ] : []);
24
25  const badFlags = [
26    'INSPECT-BRK',
27    '--INSPECT-BRK',
28    '--r',
29    '-R',
30    '---inspect-brk',
31    '--cheeseburgers',
32  ];
33
34  goodFlags.forEach((flag) => {
35    assert.strictEqual(
36      process.allowedNodeEnvironmentFlags.has(flag),
37      true,
38      `flag should be in set: ${flag}`
39    );
40  });
41
42  badFlags.forEach((flag) => {
43    assert.strictEqual(
44      process.allowedNodeEnvironmentFlags.has(flag),
45      false,
46      `flag should not be in set: ${flag}`
47    );
48  });
49}
50
51// Assert all "canonical" flags begin with dash(es)
52{
53  process.allowedNodeEnvironmentFlags.forEach((flag) => {
54    assert.match(flag, /^--?[a-zA-Z0-9._-]+$/);
55  });
56}
57
58// Assert immutability of process.allowedNodeEnvironmentFlags
59{
60  assert.strictEqual(Object.isFrozen(process.allowedNodeEnvironmentFlags),
61                     true);
62
63  process.allowedNodeEnvironmentFlags.add('foo');
64  assert.strictEqual(process.allowedNodeEnvironmentFlags.has('foo'), false);
65  Set.prototype.add.call(process.allowedNodeEnvironmentFlags, 'foo');
66  assert.strictEqual(process.allowedNodeEnvironmentFlags.has('foo'), false);
67
68  const thisArg = {};
69  process.allowedNodeEnvironmentFlags.forEach(
70    common.mustCallAtLeast(function(flag, _, set) {
71      assert.notStrictEqual(flag, 'foo');
72      assert.strictEqual(this, thisArg);
73      assert.strictEqual(set, process.allowedNodeEnvironmentFlags);
74    }),
75    thisArg
76  );
77
78  for (const flag of process.allowedNodeEnvironmentFlags.keys()) {
79    assert.notStrictEqual(flag, 'foo');
80  }
81  for (const flag of process.allowedNodeEnvironmentFlags.values()) {
82    assert.notStrictEqual(flag, 'foo');
83  }
84  for (const flag of process.allowedNodeEnvironmentFlags) {
85    assert.notStrictEqual(flag, 'foo');
86  }
87  for (const [flag] of process.allowedNodeEnvironmentFlags.entries()) {
88    assert.notStrictEqual(flag, 'foo');
89  }
90
91  const size = process.allowedNodeEnvironmentFlags.size;
92
93  process.allowedNodeEnvironmentFlags.clear();
94  assert.strictEqual(process.allowedNodeEnvironmentFlags.size, size);
95  Set.prototype.clear.call(process.allowedNodeEnvironmentFlags);
96  assert.strictEqual(process.allowedNodeEnvironmentFlags.size, size);
97
98  process.allowedNodeEnvironmentFlags.delete('-r');
99  assert.strictEqual(process.allowedNodeEnvironmentFlags.size, size);
100  Set.prototype.delete.call(process.allowedNodeEnvironmentFlags, '-r');
101  assert.strictEqual(process.allowedNodeEnvironmentFlags.size, size);
102}
103