Skip to content

Commit b8d4715

Browse files
pmarchinitargos
authored andcommitted
tools: support environment variables via comments
PR-URL: #58186 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
1 parent 130c135 commit b8d4715

9 files changed

+115
-7
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
3+
// Env: A_SET_ENV_VAR=A_SET_ENV_VAR_VALUE B_SET_ENV_VAR=B_SET_ENV_VAR_VALUE
4+
// Flags: --test-isolation=none --expose-internals
5+
6+
require('../common');
7+
const assert = require('node:assert');
8+
9+
// This test verifies that the Python test runner can set environment variables
10+
// via comments in the test file, similar to how we set flags via comments.
11+
// Ref: https://github.com/nodejs/node/issues/58179
12+
assert.strictEqual(process.env.A_SET_ENV_VAR, 'A_SET_ENV_VAR_VALUE');
13+
assert.strictEqual(process.env.B_SET_ENV_VAR, 'B_SET_ENV_VAR_VALUE');
14+
// Check interop with flags
15+
const flag = require('internal/options').getOptionValue('--test-isolation');
16+
assert.strictEqual(flag, 'none');

test/message/test-testpy-env-var-via-comment.out

Whitespace-only changes.

test/message/testcfg.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
from functools import reduce
3434

3535
FLAGS_PATTERN = re.compile(r"//\s+Flags:(.*)")
36+
ENV_PATTERN = re.compile(r"//\s+Env:(.*)")
3637

3738
class MessageTestCase(test.TestCase):
3839

@@ -89,20 +90,33 @@ def IsFailureOutput(self, output):
8990
return True
9091
return False
9192

93+
def _parse_source_env(self, source):
94+
env_match = ENV_PATTERN.search(source)
95+
env = {}
96+
if env_match:
97+
for env_pair in env_match.group(1).strip().split():
98+
var, value = env_pair.split('=')
99+
env[var] = value
100+
return env
101+
92102
def GetLabel(self):
93103
return "%s %s" % (self.mode, self.GetName())
94104

95105
def GetName(self):
96106
return self.path[-1]
97107

98-
def GetCommand(self):
108+
def GetRunConfiguration(self):
99109
result = [self.config.context.GetVm(self.arch, self.mode)]
100110
source = open(self.file).read()
101111
flags_match = FLAGS_PATTERN.search(source)
112+
envs = self._parse_source_env(source)
102113
if flags_match:
103114
result += flags_match.group(1).strip().split()
104115
result.append(self.file)
105-
return result
116+
return {
117+
'command': result,
118+
'envs': envs
119+
}
106120

107121
def GetSource(self):
108122
return (open(self.file).read()
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
'use strict';
2+
3+
// Env: A_SET_ENV_VAR=A_SET_ENV_VAR_VALUE B_SET_ENV_VAR=B_SET_ENV_VAR_VALUE
4+
// Flags: --test-isolation=none --expose-internals
5+
6+
require('../common');
7+
const assert = require('node:assert');
8+
const { describe, it } = require('node:test');
9+
10+
11+
// This test verifies that the Python test runner can set environment variables
12+
// via comments in the test file, similar to how we set flags via comments.
13+
// Ref: https://github.com/nodejs/node/issues/58179
14+
describe('testpy env var via comment', () => {
15+
it('should set env var A_SET_ENV_VAR', () => {
16+
assert.strictEqual(process.env.A_SET_ENV_VAR, 'A_SET_ENV_VAR_VALUE');
17+
});
18+
it('should set env var B_SET_ENV_VAR', () => {
19+
assert.strictEqual(process.env.B_SET_ENV_VAR, 'B_SET_ENV_VAR_VALUE');
20+
});
21+
22+
it('should interop with flags', () => {
23+
const flag = require('internal/options').getOptionValue('--test-isolation');
24+
assert.strictEqual(flag, 'none');
25+
});
26+
});
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
3+
// Env: A_SET_ENV_VAR=A_SET_ENV_VAR_VALUE B_SET_ENV_VAR=B_SET_ENV_VAR_VALUE
4+
// Flags: --test-isolation=none --expose-internals
5+
6+
require('../common');
7+
const assert = require('node:assert');
8+
9+
// This test verifies that the Python test runner can set environment variables
10+
// via comments in the test file, similar to how we set flags via comments.
11+
// Ref: https://github.com/nodejs/node/issues/58179
12+
assert.strictEqual(process.env.A_SET_ENV_VAR, 'A_SET_ENV_VAR_VALUE');
13+
assert.strictEqual(process.env.B_SET_ENV_VAR, 'B_SET_ENV_VAR_VALUE');
14+
// Check interop with flags
15+
const flag = require('internal/options').getOptionValue('--test-isolation');
16+
assert.strictEqual(flag, 'none');

test/pseudo-tty/test-testpy-env-var-via-comment.out

Whitespace-only changes.

test/pseudo-tty/testcfg.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
FLAGS_PATTERN = re.compile(r"//\s+Flags:(.*)")
3939
PTY_HELPER = join(dirname(__file__), '../../tools/pseudo-tty.py')
40+
ENV_PATTERN = re.compile(r"//\s+Env:(.*)")
4041

4142
class TTYTestCase(test.TestCase):
4243

@@ -90,20 +91,33 @@ def IsFailureOutput(self, output):
9091
return True
9192
return False
9293

94+
def _parse_source_env(self, source):
95+
env_match = ENV_PATTERN.search(source)
96+
env = {}
97+
if env_match:
98+
for env_pair in env_match.group(1).strip().split():
99+
var, value = env_pair.split('=')
100+
env[var] = value
101+
return env
102+
93103
def GetLabel(self):
94104
return "%s %s" % (self.mode, self.GetName())
95105

96106
def GetName(self):
97107
return self.path[-1]
98108

99-
def GetCommand(self):
109+
def GetRunConfiguration(self):
100110
result = [self.config.context.GetVm(self.arch, self.mode)]
101111
source = open(self.file).read()
102112
flags_match = FLAGS_PATTERN.search(source)
113+
envs = self._parse_source_env(source)
103114
if flags_match:
104115
result += flags_match.group(1).strip().split()
105116
result.append(self.file)
106-
return result
117+
return {
118+
'command': result,
119+
'envs': envs
120+
}
107121

108122
def GetSource(self):
109123
return (open(self.file).read()

test/testpy/__init__.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
FLAGS_PATTERN = re.compile(r"//\s+Flags:(.*)")
3636
LS_RE = re.compile(r'^test-.*\.m?js$')
37+
ENV_PATTERN = re.compile(r"//\s+Env:(.*)")
3738

3839
class SimpleTestCase(test.TestCase):
3940

@@ -48,17 +49,26 @@ def __init__(self, path, file, arch, mode, context, config, additional=None):
4849
else:
4950
self.additional_flags = []
5051

52+
def _parse_source_env(self, source):
53+
env_match = ENV_PATTERN.search(source)
54+
env = {}
55+
if env_match:
56+
for env_pair in env_match.group(1).strip().split():
57+
var, value = env_pair.split('=')
58+
env[var] = value
59+
return env
5160

5261
def GetLabel(self):
5362
return "%s %s" % (self.mode, self.GetName())
5463

5564
def GetName(self):
5665
return self.path[-1]
5766

58-
def GetCommand(self):
67+
def GetRunConfiguration(self):
5968
result = [self.config.context.GetVm(self.arch, self.mode)]
6069
source = open(self.file, encoding='utf8').read()
6170
flags_match = FLAGS_PATTERN.search(source)
71+
envs = self._parse_source_env(source)
6272
if flags_match:
6373
flags = flags_match.group(1).strip().split()
6474
# The following block reads config.gypi to extract the v8_enable_inspector
@@ -93,7 +103,10 @@ def GetCommand(self):
93103

94104
result += [self.file]
95105

96-
return result
106+
return {
107+
'command': result,
108+
'envs': envs
109+
}
97110

98111
def GetSource(self):
99112
return open(self.file).read()

tools/test.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -602,12 +602,21 @@ def RunCommand(self, command, env):
602602

603603
def Run(self):
604604
try:
605-
result = self.RunCommand(self.GetCommand(), {
605+
run_configuration = self.GetRunConfiguration()
606+
command = run_configuration['command']
607+
envs = {}
608+
if 'envs' in run_configuration:
609+
envs.update(run_configuration['envs'])
610+
envs.update({
606611
"TEST_SERIAL_ID": "%d" % self.serial_id,
607612
"TEST_THREAD_ID": "%d" % self.thread_id,
608613
"TEST_PARALLEL" : "%d" % self.parallel,
609614
"GITHUB_STEP_SUMMARY": "",
610615
})
616+
result = self.RunCommand(
617+
command,
618+
envs
619+
)
611620
finally:
612621
# Tests can leave the tty in non-blocking mode. If the test runner
613622
# tries to print to stdout/stderr after that and the tty buffer is

0 commit comments

Comments
 (0)