| 'use strict'; |
| |
| // This tests that --trace-env-js-stack and --trace-env-native-stack works. |
| require('../common'); |
| const { spawnSyncAndAssert } = require('../common/child_process'); |
| const assert = require('assert'); |
| const fixtures = require('../common/fixtures'); |
| |
| // Check reads from the Node.js internals. |
| // The stack trace may vary depending on internal refactorings, but it's relatively |
| // stable that: |
| // 1. Some C++ code would check the environment variables using |
| // node::credentials::SafeGetenv. |
| // 2. Some JavaScript code would access process.env which goes to node::EnvGetter |
| // 3. Some JavaScript code would access process.env from pre_execution where |
| // the run time states are used to finish bootstrap. |
| spawnSyncAndAssert(process.execPath, ['--trace-env-native-stack', fixtures.path('empty.js')], { |
| stderr(output) { |
| if (output.includes('PrintTraceEnvStack')) { // Some platforms do not support back traces. |
| assert.match(output, /node::credentials::SafeGetenv/); // This is usually not optimized away. |
| } |
| } |
| }); |
| |
| spawnSyncAndAssert(process.execPath, ['--trace-env-js-stack', fixtures.path('empty.js')], { |
| stderr: /internal\/process\/pre_execution/ |
| }); |
| |
| // Check get from user land. |
| spawnSyncAndAssert(process.execPath, ['--trace-env-js-stack', fixtures.path('process-env', 'get.js')], { |
| env: { |
| ...process.env, |
| FOO: 'FOO', |
| BAR: undefined, |
| } |
| }, { |
| stderr(output) { |
| assert.match(output, /get\.js:1:25/); |
| assert.match(output, /get\.js:2:25/); |
| } |
| }); |
| |
| // Check set from user land. |
| spawnSyncAndAssert(process.execPath, ['--trace-env-js-stack', fixtures.path('process-env', 'set.js')], { |
| stderr(output) { |
| assert.match(output, /set\.js:1:17/); |
| } |
| }); |
| |
| // // Check define from user land. |
| spawnSyncAndAssert(process.execPath, ['--trace-env-js-stack', fixtures.path('process-env', 'define.js')], { |
| stderr(output) { |
| assert.match(output, /define\.js:1:8/); |
| } |
| }); |
| |
| // Check query from user land. |
| spawnSyncAndAssert(process.execPath, ['--trace-env-js-stack', fixtures.path('process-env', 'query.js')], { |
| ...process.env, |
| FOO: 'FOO', |
| BAR: undefined, |
| BAZ: undefined, |
| }, { |
| stderr(output) { |
| assert.match(output, /query\.js:1:19/); |
| assert.match(output, /query\.js:2:20/); |
| assert.match(output, /query\.js:3:25/); |
| } |
| }); |
| |
| // Check delete from user land. |
| spawnSyncAndAssert(process.execPath, ['--trace-env-js-stack', fixtures.path('process-env', 'delete.js')], { |
| stderr(output) { |
| assert.match(output, /delete\.js:1:16/); |
| } |
| }); |
| |
| // Check enumeration from user land. |
| spawnSyncAndAssert(process.execPath, ['--trace-env-js-stack', fixtures.path('process-env', 'enumerate.js') ], { |
| stderr(output) { |
| assert.match(output, /enumerate\.js:1:8/); |
| assert.match(output, /enumerate\.js:3:26/); |
| } |
| }); |