1// Flags: --expose-internals
2'use strict';
3
4// This list must be computed before we require any modules to
5// to eliminate the noise.
6const actualModules = new Set(process.moduleLoadList.slice());
7
8const common = require('../common');
9const assert = require('assert');
10
11const expectedModules = new Set([
12  'Internal Binding async_wrap',
13  'Internal Binding buffer',
14  'Internal Binding builtins',
15  'Internal Binding config',
16  'Internal Binding constants',
17  'Internal Binding contextify',
18  'Internal Binding credentials',
19  'Internal Binding errors',
20  'Internal Binding fs',
21  'Internal Binding mksnapshot',
22  'Internal Binding messaging',
23  'Internal Binding module_wrap',
24  'Internal Binding options',
25  'Internal Binding performance',
26  'Internal Binding process_methods',
27  'Internal Binding string_decoder',
28  'Internal Binding symbols',
29  'Internal Binding task_queue',
30  'Internal Binding timers',
31  'Internal Binding trace_events',
32  'Internal Binding types',
33  'Internal Binding url',
34  'Internal Binding util',
35  'Internal Binding wasm_web_api',
36  'Internal Binding worker',
37  'NativeModule buffer',
38  'NativeModule events',
39  'NativeModule fs',
40  'NativeModule internal/assert',
41  'NativeModule internal/async_hooks',
42  'NativeModule internal/buffer',
43  'NativeModule internal/console/constructor',
44  'NativeModule internal/console/global',
45  'NativeModule internal/constants',
46  'NativeModule internal/dns/utils',
47  'NativeModule internal/errors',
48  'NativeModule internal/event_target',
49  'NativeModule internal/fixed_queue',
50  'NativeModule internal/fs/utils',
51  'NativeModule internal/linkedlist',
52  'NativeModule internal/modules/cjs/loader',
53  'NativeModule internal/modules/esm/utils',
54  'NativeModule internal/modules/helpers',
55  'NativeModule internal/modules/package_json_reader',
56  'NativeModule internal/modules/run_main',
57  'NativeModule internal/net',
58  'NativeModule internal/options',
59  'NativeModule internal/perf/utils',
60  'NativeModule internal/priority_queue',
61  'NativeModule internal/process/execution',
62  'NativeModule internal/process/per_thread',
63  'NativeModule internal/process/pre_execution',
64  'NativeModule internal/process/promises',
65  'NativeModule internal/process/signal',
66  'NativeModule internal/process/task_queues',
67  'NativeModule internal/process/warning',
68  'NativeModule internal/querystring',
69  'NativeModule internal/source_map/source_map_cache',
70  'NativeModule internal/timers',
71  'NativeModule internal/url',
72  'NativeModule internal/util',
73  'NativeModule internal/util/debuglog',
74  'NativeModule internal/util/inspect',
75  'NativeModule internal/util/types',
76  'NativeModule internal/validators',
77  'NativeModule internal/vm',
78  'NativeModule internal/vm/module',
79  'NativeModule internal/webidl',
80  'NativeModule internal/worker/js_transferable',
81  'Internal Binding blob',
82  'NativeModule async_hooks',
83  'NativeModule path',
84  'NativeModule querystring',
85  'NativeModule timers',
86  'NativeModule internal/v8/startup_snapshot',
87  'NativeModule util',
88]);
89
90if (common.isMainThread) {
91  [
92    'NativeModule internal/idna',
93    'NativeModule url',
94  ].forEach(expectedModules.add.bind(expectedModules));
95} else {
96  [
97    'Internal Binding messaging',
98    'Internal Binding performance',
99    'Internal Binding symbols',
100    'Internal Binding worker',
101    'NativeModule internal/abort_controller',
102    'NativeModule internal/error_serdes',
103    'NativeModule internal/event_target',
104    'NativeModule internal/process/worker_thread_only',
105    'NativeModule internal/streams/add-abort-signal',
106    'NativeModule internal/streams/buffer_list',
107    'NativeModule internal/streams/compose',
108    'NativeModule internal/streams/destroy',
109    'NativeModule internal/streams/duplex',
110    'NativeModule internal/streams/end-of-stream',
111    'NativeModule internal/streams/from',
112    'NativeModule internal/streams/legacy',
113    'NativeModule internal/streams/operators',
114    'NativeModule internal/streams/passthrough',
115    'NativeModule internal/streams/pipeline',
116    'NativeModule internal/streams/readable',
117    'NativeModule internal/streams/state',
118    'NativeModule internal/streams/transform',
119    'NativeModule internal/streams/utils',
120    'NativeModule internal/streams/writable',
121    'NativeModule internal/worker',
122    'NativeModule internal/worker/io',
123    'NativeModule worker_threads',
124    'NativeModule stream',
125    'NativeModule stream/promises',
126    'NativeModule string_decoder',
127    'NativeModule util',
128  ].forEach(expectedModules.add.bind(expectedModules));
129}
130
131if (common.isWindows) {
132  // On Windows fs needs SideEffectFreeRegExpPrototypeExec which uses vm.
133  expectedModules.add('NativeModule vm');
134}
135
136if (common.hasIntl) {
137  expectedModules.add('Internal Binding icu');
138}
139
140if (process.features.inspector) {
141  expectedModules.add('Internal Binding inspector');
142  expectedModules.add('NativeModule internal/inspector_async_hook');
143  expectedModules.add('NativeModule internal/util/inspector');
144}
145
146const difference = (setA, setB) => {
147  return new Set([...setA].filter((x) => !setB.has(x)));
148};
149const missingModules = difference(expectedModules, actualModules);
150const extraModules = difference(actualModules, expectedModules);
151const printSet = (s) => { return `${[...s].sort().join(',\n  ')}\n`; };
152
153assert.deepStrictEqual(actualModules, expectedModules,
154                       (missingModules.size > 0 ?
155                         'These modules were not loaded:\n  ' +
156                         printSet(missingModules) : '') +
157                       (extraModules.size > 0 ?
158                         'These modules were unexpectedly loaded:\n  ' +
159                         printSet(extraModules) : ''));
160