Skip to content

tools: support environment variables via comments #58186

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions test/message/test-testpy-env-var-via-comment.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
'use strict';

// Env: A_SET_ENV_VAR=A_SET_ENV_VAR_VALUE B_SET_ENV_VAR=B_SET_ENV_VAR_VALUE
// Flags: --test-isolation=none --expose-internals

require('../common');
const assert = require('node:assert');

// This test verifies that the Python test runner can set environment variables
// via comments in the test file, similar to how we set flags via comments.
// Ref: https://github.com/nodejs/node/issues/58179
assert.strictEqual(process.env.A_SET_ENV_VAR, 'A_SET_ENV_VAR_VALUE');
assert.strictEqual(process.env.B_SET_ENV_VAR, 'B_SET_ENV_VAR_VALUE');
// Check interop with flags
const flag = require('internal/options').getOptionValue('--test-isolation');
assert.strictEqual(flag, 'none');
Empty file.
18 changes: 16 additions & 2 deletions test/message/testcfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from functools import reduce

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

class MessageTestCase(test.TestCase):

Expand Down Expand Up @@ -89,20 +90,33 @@ def IsFailureOutput(self, output):
return True
return False

def _parse_source_env(self, source):
env_match = ENV_PATTERN.search(source)
env = {}
if env_match:
for env_pair in env_match.group(1).strip().split():
var, value = env_pair.split('=')
env[var] = value
return env

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

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

def GetCommand(self):
def GetRunConfiguration(self):
result = [self.config.context.GetVm(self.arch, self.mode)]
source = open(self.file).read()
flags_match = FLAGS_PATTERN.search(source)
envs = self._parse_source_env(source)
if flags_match:
result += flags_match.group(1).strip().split()
result.append(self.file)
return result
return {
'command': result,
'envs': envs
}

def GetSource(self):
return (open(self.file).read()
Expand Down
26 changes: 26 additions & 0 deletions test/parallel/test-testpy-env-var-via-comment.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
'use strict';

// Env: A_SET_ENV_VAR=A_SET_ENV_VAR_VALUE B_SET_ENV_VAR=B_SET_ENV_VAR_VALUE
// Flags: --test-isolation=none --expose-internals

require('../common');
const assert = require('node:assert');
const { describe, it } = require('node:test');


// This test verifies that the Python test runner can set environment variables
// via comments in the test file, similar to how we set flags via comments.
// Ref: https://github.com/nodejs/node/issues/58179
describe('testpy env var via comment', () => {
it('should set env var A_SET_ENV_VAR', () => {
assert.strictEqual(process.env.A_SET_ENV_VAR, 'A_SET_ENV_VAR_VALUE');
});
it('should set env var B_SET_ENV_VAR', () => {
assert.strictEqual(process.env.B_SET_ENV_VAR, 'B_SET_ENV_VAR_VALUE');
});

it('should interop with flags', () => {
const flag = require('internal/options').getOptionValue('--test-isolation');
assert.strictEqual(flag, 'none');
});
});
16 changes: 16 additions & 0 deletions test/pseudo-tty/test-testpy-env-var-via-comment.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
'use strict';

// Env: A_SET_ENV_VAR=A_SET_ENV_VAR_VALUE B_SET_ENV_VAR=B_SET_ENV_VAR_VALUE
// Flags: --test-isolation=none --expose-internals

require('../common');
const assert = require('node:assert');

// This test verifies that the Python test runner can set environment variables
// via comments in the test file, similar to how we set flags via comments.
// Ref: https://github.com/nodejs/node/issues/58179
assert.strictEqual(process.env.A_SET_ENV_VAR, 'A_SET_ENV_VAR_VALUE');
assert.strictEqual(process.env.B_SET_ENV_VAR, 'B_SET_ENV_VAR_VALUE');
// Check interop with flags
const flag = require('internal/options').getOptionValue('--test-isolation');
assert.strictEqual(flag, 'none');
Empty file.
18 changes: 16 additions & 2 deletions test/pseudo-tty/testcfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@

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

class TTYTestCase(test.TestCase):

Expand Down Expand Up @@ -90,20 +91,33 @@ def IsFailureOutput(self, output):
return True
return False

def _parse_source_env(self, source):
env_match = ENV_PATTERN.search(source)
env = {}
if env_match:
for env_pair in env_match.group(1).strip().split():
var, value = env_pair.split('=')
env[var] = value
return env

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

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

def GetCommand(self):
def GetRunConfiguration(self):
result = [self.config.context.GetVm(self.arch, self.mode)]
source = open(self.file).read()
flags_match = FLAGS_PATTERN.search(source)
envs = self._parse_source_env(source)
if flags_match:
result += flags_match.group(1).strip().split()
result.append(self.file)
return result
return {
'command': result,
'envs': envs
}

def GetSource(self):
return (open(self.file).read()
Expand Down
17 changes: 15 additions & 2 deletions test/testpy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@

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

class SimpleTestCase(test.TestCase):

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

def _parse_source_env(self, source):
env_match = ENV_PATTERN.search(source)
env = {}
if env_match:
for env_pair in env_match.group(1).strip().split():
var, value = env_pair.split('=')
env[var] = value
return env

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

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

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

result += [self.file]

return result
return {
'command': result,
'envs': envs
}

def GetSource(self):
return open(self.file).read()
Expand Down
11 changes: 10 additions & 1 deletion tools/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -602,12 +602,21 @@ def RunCommand(self, command, env):

def Run(self):
try:
result = self.RunCommand(self.GetCommand(), {
run_configuration = self.GetRunConfiguration()
command = run_configuration['command']
envs = {}
if 'envs' in run_configuration:
envs.update(run_configuration['envs'])
envs.update({
"TEST_SERIAL_ID": "%d" % self.serial_id,
"TEST_THREAD_ID": "%d" % self.thread_id,
"TEST_PARALLEL" : "%d" % self.parallel,
"GITHUB_STEP_SUMMARY": "",
})
result = self.RunCommand(
command,
envs
)
finally:
# Tests can leave the tty in non-blocking mode. If the test runner
# tries to print to stdout/stderr after that and the tty buffer is
Expand Down
Loading